本笔记会搭建OS实战所需的虚拟机环境,主要是创建好虚拟机,设置虚拟机启动硬盘,在启动盘上安装Grub。
由于本专题是个人在业余时间除了Unity学习之外做的,没有时间和精力去解答具体的问题。本笔记中的实验个人在做的过程中除了遇到权限问题外,没有遇到大的问题。如果遇到了问题,请百度或google看看原因。
安装VirtualBox
假设Host为Ubuntu,我们直接用apt-get install安装即可(例子安装的版本是6.1):
sudo apt-get install virtualbox-6.1
安装完成后,运行Virtualbox,能正常出现以下界面就OK了。
新建虚拟机
点击VirtualBox界面上的“新建”,进入新建虚拟电脑的流程。在专家模式中选择好各种配置参数即可。需要注意的是,虚拟硬盘这里,选择“不添加虚拟硬盘”。
案例中选择的配置是:虚拟机名称HelloOS, 64 bit架构,1024MB内存,默认显卡VBoxVGA,勾选硬件加速(不用非得按照这个来,新版本的VirtualBox默认VBoxVGA的显存配置等地方可能会略有差异,根据自身机器配置修改修改即可)。
创建虚拟机用的虚拟硬盘
VirtualBox所用的硬盘,实际是Host系统上的一个文件来模拟的(*.vdi)。这个VDI文件有特殊的格式要求,我们首先在Ubuntu Host上创建一个hd.img文件,将其挂载成loop设备后,用EXT文件系统格式化一下;然后安装好grub;最后再将hd.img转换成hd.vdi,用这个vdi文件作为虚拟机的硬盘使用。
dd命令创建hd.img
我们用dd命令来生成一个100M的二进制文件:
dd bs=512 if=/dev/zero of=hd.img count=204800
;bs:表示块大小,这里是512字节
;if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0
;of:表示输出文件,即我们的硬盘文件。
;count:表示输出多少块
格式化hd.img
这个hd.img本身只是Host系统下的一个普通文件,虚拟硬盘本身也需要格式化后才能使用。要对hd.img进行格式化,首先要骗一下Host系统,让Ubuntu将它看成是一个块设备来对待。
我们用losetup命令,将hd.img从普通文件变成是一个回环设备:
sudo losetup /dev/loop0 hd.img
做完这一步后,/dev/loop0这个回环设备就和hd.img关联起来了(如果出现失败打印Device or resource busy,就用/dev/目录下的其它loop设备比如loop15看看,或者用losetup -f hd.img让系统自己去找一个没用使用的loop设备。具体用的是哪个,可以通过losetup -a来查看)。回环设备可以把文件虚拟成Linux设备,用来挂载模拟整个文件系统,让用户可以将其作为硬盘、光驱或软驱等设备使用。可以通过mount和umount等命令进行设备的挂载和卸载,也可以用mkfs.ext4对其进行格式化。下面我们用mkfs.ext4格式化一下/dev/loop0
sudo mkfs.ext4 -q /dev/loop0
Grub安装,需要硬盘中存在boot目录,接下来我们创建boot目录
sudo mount /dev/loop0 ./hdisk/ ;挂载硬盘文件
sudo mkdir ./hdisk/boot/ ;建立boot目录
安装GRUB到虚拟硬盘
这一步比较简单,在hd.img通过loop设备挂载到了hdisk目录,并且hdisk目录下存在boot目录后,通过下面的命令就能安装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用来查到所要用的OS映像文件的。我们在这个文件里输入一下内容并保存:
menuentry 'HelloOS' {
insmod part_msdos
insmod ext2
set root='hd0,msdos1' #我们的硬盘只有一个分区所以是'hd0,msdos1'
multiboot2 /boot/HelloOS.eki #加载boot目录下的HelloOS.eki文件
boot #引导启动
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
set timeout=10 #等待10秒钟自动启动
fi
做完这些步骤后,我们可以用umount hdisk卸载掉hd.img。
将hd.img转换成hd.vdi,让VirtualBox可以将其当成硬盘使用
VirtualBox本身不能直接使用hd.img,我们需要将它转换成vdi文件,以便VirtualBox能够将它作为硬盘使用。
安装VirtualBox的时候,会带一个VBoxManage工具(Windows下也有一个VBoxManage.exe存放在安装目录下),这个工具可以用来将hd.img转成VDI格式。
VBoxManage convertfromraw ./hd.img --format VDI ./hd.vdi
;convertfromraw 指向原始格式文件
;--format VDI 表示转换成虚拟需要的VDI格式
VirtualBox安装hd.vdi
有两种方法可以为HelloOS虚拟机安装hd.vdi作为其硬盘,一种是通过命令行,一种是通过图形化界面。
1. 首先,看看图形化界面方式,选中HelloOS后点击设置
在存储页面中,选择增加硬盘选项
选择注册,然后选择hd.vdi文件(通过文件浏览器导航到文件所在的目录并选择hd.vdi即可)。
2. 命令行方式,以SATA类型硬盘、控制器是IntelAHCI为例:
#第一步 SATA的硬盘其控制器是intelAHCI
VBoxManage storagectl HelloOS --name "SATA" --add sata --controller IntelAhci --portcount 1
#第二步
VBoxManage closemedium disk ./hd.vdi #删除虚拟硬盘UUID并重新分配
#将虚拟硬盘挂到虚拟机的硬盘控制器
VBoxManage storageattach HelloOS --storagectl "SATA" --port 1 --device 0 --type hdd --medium ./hd.vdi
需要注意的是: VirtualBox 虚拟机用 UUID 管理硬盘,所以每次挂载硬盘时,都需要删除虚拟硬盘的 UUID 并重新分配。
启动虚拟机
双击HelloOS或者通过VBoxManage startvm HelloOS启动虚拟机。
如果没有问题,我们应该能够看到下面的GRUB引导菜单。
此时按下回车键,Grub会尝试加载HelloOS。当然现在会失败,因为我们还没有做HelloOS.eki文件。但是这是万里长征第一步,表明我们的基本环境已经设置完毕。