从零开始的操作系统生活03-镜像制作

0、环境配置

安装grub-legacy与xorriso,最后我们会将制作好的镜像放入虚拟机中运行,而不是在虚拟机中再安装一个虚拟机运行

但是安装grub-legacy时会发现报错了,原因应该是因为版本迭代问题导致的,最新的安装包名称应该是grub-efi-amd64

1
sudo apt-get install grub-efi-amd64 xorriso

github

1、mykernel.iso

我们在使用虚拟机安装ubuntu系统的时候,选择的虚拟盘都是.iso后缀格式的,ISO文件是光盘的镜像文件,所有我们要做的事情就是将我们目前所写的内容转换成ISO镜像然后使用虚拟机打开即可

GRUB是一款multiboot loader,在链接中我们可以看到,grub-legacy已经不再维护了,所以我们需要安装替代的包,前面我们提过loader使用multiboot规范,multiboot规范对应的就是Multiboot loader

xorriso是一个用来创建和操作ISO 9660文件系统映像文件的工具,可以用来将影响文件烧录到DVD/CD中

接下来开始制作镜像

我们在Makefile中添加如下语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mykernel.iso: mykernel.bin
mkdir iso
mkdir iso/boot
mkdir iso/boot/grub
cp $< iso/boot/
echo 'set timeout=0' >> iso/boot/grub/grub.cfg
echo 'set default=0' >> iso/boot/grub/grub.cfg
echo '' >> iso/boot/grub/grub.cfg
echo 'menuentry "My Operating System" {' >> iso/boot/grub/grub.cfg
echo ' multiboot /boot/mykernel.bin' >> iso/boot/grub/grub.cfg
echo ' boot' >> iso/boot/grub/grub.cfg
echo '}' >> iso/boot/grub/grub.cfg
grub-mkrescue --output=$@ iso
rm -rf iso

前三句命令负责创建对应文件夹,**$<**表示第一个依赖文件,也就是把mykernel.bin复制到/iso/boot/文件夹中去

grub是引导操作系统的程序,他会根据自己的配置文件去引导内核,这项配置文件就是grub.cfg

set timeout=0是设置启动等待的时间,加入我们的电脑存在两个系统,设置timeout=10,则进入系统之前会给我们10s的时间去选择进入哪一个系统

set default=0表示设置默认进入的系统,计算机都是从0开始的,也就是默认进入第一个系统。当然,我们也只有这一个系统

menuentry指设置启动菜单,My Operating System是菜单名称,multiboot /boot/mykernel.bin是指其中的一个启动项

下面的boot不清楚是干什么的,暂时码住,以后有机会回来解释

运行结束后的grub.cfg内容如下所示:

1
2
3
4
5
6
7
8
set timeout=0
set default=0

menuentry "My Operating System" {
multiboot /boot/mykernel.bin
boot
}

像看到这个文件内容则需要删除makefile的最后一句rm -rf iso,但是记得下一次编译的时候加上这句话并且先把iso文件夹删除掉

最后grub-mkrescue --output=$@ iso则是使用grub-mkrescue命令制作镜像文件,–output是指定输出文件,但是后面的iso我并不清楚是什么作用,如果是指定文件夹,那么生成的mykernel.iso会在/iso中,但实际上是与/iso同名文件夹,也不需要修改文件的后缀,甚至稍作修改也不会出现问题,此处码住,有待解决

最后的rm -rf iso就是删除无用的文件夹

2、打开mykernel.iso

激动人心的时刻到了,我们经过了三节的努力,终于可以看到一些成果了

首先,本人使用的是virtualbox虚拟机安装的ubuntu 20.04系统,生成的iso镜像文件也在ubuntu系统中,想要再次使用虚拟机运行则需要将iso文件拷贝到windows系统中,这部分使用共享文件夹或者直接拖动即可,大家根据自身情况自行解决这个问题

然后打开VirtualBox,选择新建

newVirtual

操作系统类型和版本要选择Other

点击下一步之后打开虚拟机,然后选择设备->分配光驱->选择虚拟盘

open

然后将我们制作好的iso镜像添加进去,关闭虚拟机后再次开启即可。

最后的运行效果如下:

result

3、补充

3.1、timeout

大家也可以试试修改Makefile中的set timeout=10,然后再运行看看结果

3.2、VirtualBox虚拟机中使用VirtualBox

为了方便运行我们的结果,而不是来回调换系统运行调试,并且在参考视频的提示下,我们最终选择使用VIrtualBox虚拟机中再安装VirtualBox虚拟机

首先我的ubuntu虚拟机配置 8192MB 显存 16MB

在ubuntu中安装VirtualBox之前记得设置windows的VirtualBox中的启用嵌套VT-x/AMD-V

具体设置方式如下:设置->系统->处理器->启用嵌套VT-x/AMD-V

如果启用嵌套VT-x/AMD-V是灰色的,请参考链接

然后虚拟机中安装VirtualBox

1
sudo apt-get install VirtualBox

安装完毕之后打开VIrtualBox,然后和前面的流程相同,创建新的虚拟电脑,不添加镜像,启动虚拟电脑然后添加镜像,最后重启虚拟电脑即可。

最后的最后,我们在Makefile中添加内容

1
2
3
run: mykernel.iso
(killall virtualboxvm && sleep 1) || true
virtualboxvm --startvm "wyoos" &

这样每次我们编译完成后只要执行make run即可


从零开始的操作系统生活03-镜像制作
http://example.com/2022/09/21/wyoos003/
作者
Anhongzhan
发布于
2022年9月21日
许可协议