创建虚拟硬盘
dd创建创建虚拟镜像文件
dd bs=512 if=/dev/zero of=hd.img count=204800
;bs:表示块大小,这里是512字节
;if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0
;of:表示输出文件,即我们的硬盘文件。
;count:表示输出多少块
格式化虚拟硬盘
虚拟硬盘毕竟是个文件,如何让 Linux 在一个文件上建立文件系统呢?这个问题要分成三步来解决。
- 第一步 -- 设置回环设备
把虚拟硬盘文件变成 Linux 下的回环设备,使用losetup
命令将 hd.img 变成 Linux 的回环设备,代码如下:
sudo losetup /dev/loop0 hd.img
losetup 命令用于设置回环设备。回环设备可以把文件虚拟成 Linux 块设备,用来模拟整个文件系统,让用户可以将其看作硬盘、光驱或软驱等设备,并且可用 mount 命令挂载当作目录来使用。
- 第二步 -- 格式化文件系统
Linux 下的 mkfs.ext4 命令格式化这个 /dev/loop0 回环块设备,在里面建立 EXT4 文件系统。
sudo mkfs.ext4 -q /dev/loop0
- 第三步 -- 挂载
inux 下的 mount 命令,将 hd.img 文件当作块设备,把它挂载到事先建立的 hdisk 目录下,并创建boot目录,用于后续安装GRUB引导
sudo mount -o loop ./hd.img ./hdisk/ ;挂载硬盘文件
sudo mkdir ./hdisk/boot/ ;建立boot目录
安装GRUB
正常安装系统的情况下,Linux 会把 GRUB 安装在我们的物理硬盘上,可是现在要把 GRUB 安装在的虚拟硬盘上,而且操作系统还没有安装程序。所以,得利用一下手上 Linux(HOST OS),通过 GRUB 的安装程序,把 GRUB 安装到指定的设备上(虚拟硬盘)。
安装 GRUB分两步:
- 第一步 -- 挂载虚拟硬盘文件为loop0回环设备
sudo losetup /dev/loop0 hd.img
sudo mount -o loop ./hd.img ./hdisk/ ;挂载硬盘文件
- 第二步 -- 安装GRUB
sudo grub-install --boot-directory=./hdisk/boot/ --force --allow-floppy /dev/loop0;
--boot-directory 指向先前我们在虚拟硬盘中建立的boot目录。;
--force --allow-floppy :指向我们的虚拟硬盘设备文件/dev/loop0
/hdisk/boot/ 目录下多了一个 grub 目录,表示我们的 GRUB 安装成功。
注意:
还要在 /hdisk/boot/grub/ 目录下建立一个 grub.cfg 文本文件,GRUB 正是通过这个文件内容,查找到我们的操作系统映像文件的。
menuentry 'HelloOS' {
insmod part_msdos
insmod ext2
set root='hd0' #只有一个硬盘,因此设置根目录为hd0(就是hd.vdi)-----修改了这里,改了之后成功了。
multiboot2 /boot/Cosmos.eki #加载boot目录下的HelloOS.eki文件
boot #引导启动
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
set timeout=10 #等待10秒钟自动启动
fi
转换虚拟硬盘格式
面好不容易生产了 mount 命令能识别的虚拟硬盘,这里为什么又要转换虚拟硬盘的格式呢?
因为这个纯二进制格式只能被我们使用的 Linux 系统识别,但不能被虚拟机本身识别,但是我们最终目的却是让这个虚拟机加载这个虚拟硬盘,从而启动其中的由我们开发的操作系统。
好在虚拟机提供了专用的转换格式的工具,我们只要输入一行命令即可。
VBoxManage convertfromraw ./hd.img --format VDI ./hd.vdi
;convertfromraw 指向原始格式文件
;--format VDI 表示转换成虚拟需要的VDI格式
将所生成的hd.vdi 拷贝出来,重新新建一个虚拟机,不要建硬盘,像安装虚拟机这样建一个空壳子,在该系统的设置中,添加我们上面生成的hd.vdi虚拟硬盘,然后保存启动
便可看到系统引导界面
因boot中并没有Cosmos.eki该文件,会出现类似下面的情况:
将Cosmos.eki文件拷贝至hdist/boot下,重新生成hd.vdi挂载虚拟硬盘,启动:
_完美撒花_
----------------------------这是分界线----------------------
注:VirtualBox 虚拟机用 UUID 管理硬盘,每次挂载硬盘时,都需要删除虚拟硬盘的 UUID 并重新分配。因此,重新挂载需要将删除虚拟硬盘的 UUID ,在下图处找到了虚拟介质管理器-虚拟硬盘:
详细参考:https://blog.nowcoder.net/n/34c8fe00da124439a940dff41864fecf