[笔记] wsl 下使用 qemu/grub 模拟系统启动(单分区)

背景

最近在学习操作系统,需要从零开始搭建系统,由于教程中给的虚拟机搭建的方式感觉还是过于重量级,因此研究了一下通过 qemu 模拟器,配合 grub 完成启动系统的搭建。

qemu 介绍

qemu 是一款十分优秀的系统模拟器,可以用于模拟各种CPU架构硬件。你可以在 x86平台上模拟出 arm 架构的 CPU并在其上运行程序,也可以反过来。总而言之,通过 qemu 可以忽略平台间的架构差异,完成硬件模拟。

grub 介绍

grub 是一个开源的系统启动器,用于对计算机进行初始化并引导至操作系统。

操作步骤

整个操作是在 wsl2 中执行的,需要提前安装一些软件:

sudo apt install -y qemu-system-x86 qemu-utils grub2

以下命令需要在 root 权限下执行,如果由于权限问题无法执行可以通过在前面加 sudo执行

1. 使用 dd 创建一块虚拟硬盘

dd 命令在 linux 系统中主要用于创建文件如:

# 创建一个 file.bin 的空文件,写入块大小为 512字节,共2M
dd bs=512 count=20000 if=/dev/zero of=file.bin
# 创建一个随机文件
dd bs=512 count=20000 if=/dev/random of=file.bin

这里使用该命令创建了一个 raw 类型的虚拟磁盘,qemu 可以直接使用这种类型的虚拟磁盘。

# 创建了一个虚拟磁盘文件,其实就是一个全是0 的空文件
dd bs=512 count=102400 if=/dev/zero of=hd.img
# bs=512 单次写入 512字节
# count=102400 共写入 102400次,合计 50MB
# if=/dev/zero 写入源为 zero
# of=hd.img 指定输出文件名称

然后通过 losetup -f 将这个虚拟硬盘文件关联为回环设备:

losetup -f hd.img
# -f 随机找一个空闲的回环设备,并将 hd.img 附加到上面
losetup -a
/dev/loop0: [2080]:409 (/root/hd.img)
# 这里可以看到我们刚刚创建的虚拟硬盘文件被附加到了 /dev/loop0 这个回环设备上了
# 可以通过 losetup -D 移除关联

通过 mkfs.ext4 将我们刚刚创建的的虚拟硬盘文件格式化为 ext4 磁盘文件系统类型

mkfs.ext4 hd.img

挂载我们刚刚初始化好的文件系统到当前系统上:

mkdir hdisk && mount hd.img hdisk
# 创建 hdisk 文件夹,并将 hd.img 虚拟硬盘挂载到这个文件夹上

到这里准备工作就完成了,现在我们为虚拟硬盘安装 grub:

grub-install --boot-directory=./hdisk/boot --no-floppy --force /dev/loop0
# --boot-directory 指定启动目录
# --no-floppy 设置没有软盘
# --force 只要没有发生错误,就继续写入,如果不指定 --force 可能会安装报错
# /dev/loop0 指定写入的磁盘文件,这里填刚刚通过 losetup -a 查询到的关联的回环设备文件

现在我们已经可以通过 qemu 启动这块硬盘了,虽然启动后直接是进入到 grub 界面:

qemu-system-x86_64 -hda hd.img
# --nographic 没有窗口条件的话可以添加这个选项
#  qemu-system-x86_64 -drive file=hd.img,index=0,media=disk,format=raw 与上面命令效果一样

在这里插入图片描述

当然这只是一个空界面,你可以用 grub 的一些命令做一些初步的操作

insmod part_msdos #GRUB加载分区模块识别分区
insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
set root='hd0' #注意boot目录挂载的分区,这是我机器上的情况
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
boot #GRUB启动HelloOS.bin

如果想要重复练习上面的过程,可以在关闭 qemu 窗口后,接触对虚拟硬盘的关联:

umount hdisk
# 接触 hdisk 目录与 hd.img 的关联

然后接触 hd.img 与本地回环设备的关联:

losetup -D
# 移除所有关联的本地回环设备
losetup -a
# 查看是否已经解除关联

最后删除掉当前目录中的 hd.img 和 hdisk 目录.重新操作即可.

qemu-system-x86_64 --nographic 退出方式

先按下 Ctrl + A 然后按下 X.

内核加载部分不做介绍.

参考资料

  • 02 | 几行汇编几行C:实现一个最简单的内核
  • grub命令 – 交互式的管理GRUB引导程序
    原文链接:https://www.linuxcool.com/grub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/252994.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg6.0-ffplay.c源码分析(二)之整体框架大流程分析

文章目录 main()函数解读stream_open()函数解析event_loop函数解析关注公众号看全文: 想分析任何一个可执行程序,肯定从main()函数下手是比较合适的,ffplay的源代码也是如此。 main()函数解读 /* Called from the main */ int main(int argc, char **argv)

塑料检查井配套开发了注塑成型的井盖、井筒、井座

塑料检查井配套开发的注塑成型井盖、井筒、井座——城市基础设施的新选择 随着城市化进程的加快,城市基础设施建设的品质与效率日益受到重视。在这个背景下,塑料检查井及其配套开发的注塑成型井盖、井筒、井座以其独特的优势,正在逐渐取代传…

全面剖析:新页ERP系统不为人知的一面,以及系统的工作流程解析!

一.介绍erp系统 1.什么是erp系统 ERP是企业资源规划(Enterprise Resource Planning)系统的缩写,它是一种集成管理软件,旨在帮助企业有效地管理和整合各项业务流程和资源。ERP系统能够涵盖企业的各个部门和功能,包括财…

【POI的如何做大文件的写入】

🔓POI如何做大文件的写入 🏆文件和POI之间的区别是什么?🏆POI对于当今的社会发展有何重要性?🏆POI大文件的写入🎖️使用XSSF写入文件🎖️使用SXSSFWorkbook写入文件🎖️对…

设计模式——模板方法模式

引言 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 (PDF、 DOC 或 CSV&#…

【C语言】实战项目——通讯录

引言 学会创建一个通讯录,对过往知识进行加深和巩固。 文章很长,要耐心学完哦! ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 引言 实战 建…

加密的艺术:对称加密的奇妙之处(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

推荐EasyImages简单图床源码

开源好用EasyImages简单图床源码分享,虽然它是开源程序,但功能一点也不弱,不仅支持多文件上传、文字/图片水印、支持API和鉴黄、还能自定义代码,最重要的是它不强制使用数据库运行,这就给我们的部署和维护带来极大方便…

vue自定义指令及常用的自定义指令封装

vue2 自定义指令 官网链接https://v2.cn.vuejs.org/v2/guide/custom-directive.html 指令注册 这里是一个 Vue2 的指令合集,详细的指令移步下面具体的指令文章,现在我们在这里要介绍如何在项目中统一管理和使用这些指令。 注册指令 单文件引入注册 …

设计可编辑表格组件

前言 什么是可编辑表格呢?简单来说就是在一个表格里面进行表单操作,执行增删改查。这在一些后台管理系统中是尤为常见的。 今天我们根据vue2 element-ui来设计一个表单表格组件。(不涉及完整代码,想要使用完整功能可以看底部连…

[C语言]大小端及整形输出问题

假设在一个32位little endian 的机器上运行下面的程序&#xff0c;结果是多少 ? 1.1先看以下三个程序 #include <stdio.h> int main() {long long a 1, b 2, c 3;printf("%lld %lld %lld\n", a, b, c); // 1 2 3printf("%d %d %d %d %d %d\n&quo…

ensp创建配置环境,实现全网互访

文章目录 创建配置环境&#xff0c;实现全网互访配置步骤接入层交换机&#xff08;sw4、sw5&#xff09;划分vlan汇聚层交换机&#xff08;sw2、sw3&#xff09;配置ip地址作为vlan网关、与sw1 ip地址直连核心层交换机&#xff08;sw1&#xff09;配置ip地址与汇聚层交换机&…

echarts地图的常见用法:基本使用、区域颜色分级、水波动画、区域轮播、给地图添加背景图片和图标、3d地图、飞线图

前言 最近几天用echarts做中国地图&#xff0c;就把以前写的demo&#xff1a;在vue中实现中国地图 拿来用&#xff0c;结果到项目里直接报错了&#xff0c;后来发现是因为版本的问题&#xff0c;没办法只能从头进行踩坑了。以下内容基于vue3 和 echarts 5.32 基本使用 获取地…

java内置的数据结构

Java语言提供了许多内置的数据结构&#xff0c;包括&#xff1a; 1. 数组&#xff08;Array&#xff09;&#xff1a;数组是最基本的数据结构之一&#xff0c;它是一个有序的元素集合&#xff0c;每个元素都有一个对应的索引。在Java中&#xff0c;数组可以通过声明和初始化来创…

python学习1补充

大家好&#xff0c;这里是七七&#xff0c;这个专栏是用代码实例来学习的&#xff0c;不是去介绍很多知识的。 话不多说&#xff0c;开始今天的内容 目录 代码1 代码2 代码3 代码4 代码5 学习1的总代码 代码1 groupeddf.groupby(单品编码) result{} groupeddf.groupb…

Vue2-动态组件案例

1.component介绍 说明&#xff1a; Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is&#xff0c;它会被视为组件的名称&#xff0c;用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…

计算机组成原理学习(输入输出系统)

目录 输入输出系统&#xff08;i/o系统&#xff09; 一.现代计算机的结构 二.常见的&#xff08;I/O设备或者是外部设备&#xff09; ​ 三.主机如何与I/O设备进行交互 四.I/O控制方式简介 五.I/O系统的基本组成 输入输出系统&#xff08;i/o系统&#xff09; 一.现代计算…

嵌入式开发中的总线与时钟

总线 AHB总线 AHB的全称是"Advanced High-performance Bus",中文翻译就是"高级高性能总线"。这是一种在计算机系统中用于连接不同硬件组件的总线架构,它可以帮助这些组件之间高效地传输数据和信息。这个总线架构通常用于处理速度较快且对性能要求较高的…

VAR模型

VAR&#xff08;Vector Autoregression&#xff09;模型是一种用于时间序列分析的统计模型&#xff0c;它可以描述多个变量之间的相互关系和动态演化。VAR模型最初是由Sims&#xff08;1980&#xff09;提出的&#xff0c;广泛应用于宏观经济学、金融领域以及其他时间序列数据分…

嵌入式培训-数据结构-day23-线性表

线性表 线性表是包含若干数据元素的一个线性序列 记为&#xff1a; L(a0, ...... ai-1, ai, ai1 ...... an-1) L为表名&#xff0c;ai (0≤i≤n-1)为数据元素&#xff1b; n为表长,n>0 时&#xff0c;线性表L为非空表&#xff0c;否则为空表。 线性表L可用二元组形式描述…