[笔记] 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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

【Hadoop_06】MapReduce的概述与wc案例

1、MapReduce概述1.1 MapReduce定义1.2 MapReduce优点1.3 MapReduce缺点1.4 MapReduce核心思想1.5 MapReduce进程1.6 常用数据序列化类型1.7 源码与MapReduce编程规范 2、WordCount案例实操2.1 本地测试2.2 提交到集群测试 1、MapReduce概述 1.1 MapReduce定义 MapReduce是一…

HPM6750系列--第九篇 GPIO详解(基本操作)

一、目的 在之前的博文中我们主要介绍了不同系统不同开发编译调试环境的配置和操作(命令行方式、Visual Studio Code、Segger Embedded Studio for RISC-V),以帮助大家准备好学习环境为目的,但是未涉及到芯片本身以及外设的讲解。…

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道:据相关人士报道,苹果希望在未来2到3年内每年在印度生产超过5000万部iphone,要是该计划得以实现,印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示:“此次iPhone15推出是苹果印度制造计划的一…

设计模式详解---策略模式

1. 策略模式简介 策略模式(Strategy Pattern)是一种行为型设计模式,用于在运行时根据不同的情境选择不同的算法或策略。该模式将算法封装成独立的类,使得它们可以相互替换,而且可以独立于客户端使用它们的方式。 1.1.…

m_map导入本地地形数据

m_map绘制地形图时,虽然自带有1的地形图以及从NOAA下载的1分的地形图(详见:Matlab下地形图绘图包m_map安装与使用),但有时需要对地形图分辨率的要求更高,便无法满足。 此时,需要导入本地地形数…

二蛋赠书十一期:《TypeScript入门与区块链项目实战》

前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…

Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)

A - Three Threes 题目大意:给你一个整数n,将这个数n输出n次。 呃呃 B - Pentagon 题目大意:给你一个正五边形ABCDE,给你任意两条边,判断是否相等 主要问题要判断一下内边:AD,AC,…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT,分为四个 part:leader election、log、persistence、log compaction。 实验环境 OS:WSL-Ubuntu-18.04 golang:go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南

作者:运维有术 前言 知识点 定级:入门级了解清单 (manifest) 和制品 (artifact) 的概念掌握 manifest 清单的编写方法根据 manifest 清单制作 artifactKubeKey 离线集群配置文件编写KubeKey 离线部署 HarborKubeKey 离线部署 KubeSphere 和 K8sKubeKey…

C++初阶-list类的模拟实现

list类的模拟实现 一、基本框架1.1 节点类1.2 迭代器类1.3 list类 二、构造函数和析构函数2.1 构造函数2.2 析构函数 三、operator的重载和拷贝构造3.1 operator的重载3.2 拷贝构造 四、迭代器的实现4.1 迭代器类中的各种操作4.1 list类中的迭代器 五、list的增容和删除5.1 尾插…

javacv的视频截图功能

之前做了一个资源库的小项目,因为上传资源文件包含视频等附件,所以就需要时用到这个功能。通过对视频截图,然后作为封面缩略图,达到美观效果。 首先呢,需要准备相关的jar包,之前我用的是低版本的1.4.2&…

Tomcat-安装部署(源码包安装)

一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说,Tomcat是一个WEB应用程序的托管平台…

基于Nexus搭建Maven私服基础入门

什么是Nexus?它有什么优势? 要了解为什么需要nexus的存在,我们不妨从以下几个问题来简单了解一下: 为什么需要搭建私服?如果没有私服会出现什么问题? 对于企业开发而言,如果没有私服,我们所有…

十九)Stable Diffusion使用教程:ai室内设计案例

今天我们聊聊如何通过SD进行室内设计装修。 方式一:controlnet的seg模型 基础起手式: 选择常用算法,抽卡: 抽到喜欢的图片之后,拖到controlnet里: 选择seg的ade20k预处理器,点击爆炸按钮,得到seg语义分割图,下载下来: 根据语义分割表里的颜色值,到PS里进行修改: 语…

SoloLinker第一次使用记录,解决新手拿到板子的无所适从

本文目录 一、简介二、进群获取资料2.1 需要下载资料2.2 SDK 包解压 三、SDK 编译3.1 依赖安装3.2 编译配置3.3 启动编译3.4 编译后的固件目录 四、固件烧录4.1 RV1106 驱动安装4.2 打开烧录工具4.3 进入boot 模式(烧录模式)4.4 烧录启动固件4.5 烧录升级…

大型网站架构演进过程

架构演进 大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得很棘手。大型网站架构主要就是解决这类问题。 架构选型是根据当前业务需要来的&…

RRC下的NAS层

无线资源控制(Radio Resource Control,RRC),又称为无线资源管理(RRM)或者无线资源分配(RRA),是指通过一定的策略和手段进行无线资源管理、控制和调度,在满足服…

数据库 02-03 补充 SQL的子查询(where,from),子查询作为集合来比较some,exists,all(某一个,存在,所有)

子查询: where字句的子查询: 通常用in关键字: 举个例子: in关键字: not in 关键字: in 也可以用于枚举集合: where中可以用子查询来作为集合来筛选元祖。 some,all的运算符号…

Spring cloud - 断路器 Resilience4J

其实文章的标题应该叫 Resilience4J,而不是Spring Cloud Resilience4J,不过由于正在对Spring cloud的一系列组件进行学习,为了统一,就这样吧。 概念区分 首先区分几个概念 Spring cloud 断路器:Spring Cloud的官网对…