虚拟机是一款由软件模拟的计算机系统,其硬件系统功能完善,运行环境独立,相当于一台虚拟的计算机。
在一些开发测试工作中常常需要用到虚拟机,常见的虚拟机软件有两款: VMware 和 VirtualBox。
本文实验环境:window11+virtualBox+ubuntu
1. VirtualBox虚拟机 + ubuntu系统安装
主要步骤参考文档:超级详细的 VirtualBox 虚拟机安装 及入门教程
主机和虚拟机之间的粘贴拷贝需要安装增强功能,下述补充增强功能的详细安装:
设备->分配光驱->选择虚拟盘->VBoxGuestAdditions.iso,效果如下:
此时左边会出现光盘,点击进入,看到有autorun.sh脚本。
右键open in Terminal,修改autorun.sh权限并运行,生成VBoxLinuxAdditions.run脚本。此时执行./VBoxLinuxAdditions.run会提示please install the gcc make perl packages from your distribution,需要安装gcc make perl安装包:sudo apt-get install gcc make perl。
sudo su
chmod u+rwx autorun.sh
./autorun.sh
apt-get install gcc make perl
./VBoxLinuxAdditions.run
接下来重启即可生效。
2. HelloOS系统搭建
2.1 新建HelloOS系统
选择好cpu类型,内存大小,暂时不添加虚拟硬盘。
下述将在ubuntu系统中操作生成hd.vdi文件
2.2 生产虚拟硬盘
虚拟机使用特定格式的文件来模拟硬盘,所以生产虚拟硬盘也就是生成对应格式的文件。
使用linux的dd命令,生产100MB纯二进制文件。
dd bs=512 if=/dev/zero of=hd.img count=204800
;bs:表示块大小,这里是512字节
;if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0
;of:表示输出文件,即我们的硬盘文件。
;count:表示输出多少块
2.3 格式化虚拟硬盘
losetup命令用于设置回环设备。回环设备可以把文件虚拟成Linux块设备,用来模拟整个文件系统,用户可以将其看作硬盘、光驱或软驱等设备,并且可以用mount命令挂载当作目录使用。
sudo losetup /dev/loop13 hd.img
sudo losetup -l 查看当前所有loop设备的状态
sudo losetup -f 找出当前空闲的loop文件
sudo losetup -a 找出当前已使用的loop文件
linux使用ext4文件系统,使用mkfs.ext4命令格式化回环设备。
sudo mkfs.ext4 -q /dev/loop0
将上述生产的hd.img挂载到事先建立的hdisk目录下,并在其中建立boot,后续grub将会使用到。
sudo mkdir ./hdisk
sudo mount -o loop ./hd.img ./hdisk/ ;挂载硬盘文件
sudo mkdir ./hdisk/boot/ ;建立boot目录
mount 命令只能识别在纯二进制文件上建立的文件系统,如果使用虚拟机自己生成的硬盘文件,mount 就无法识别我们的文件系统了。
2.4 安装GRUB
GRUB是Linux中最常用的引导加载程序,是计算机启动时运行的第一个软件,负责加载操作系统内核并初始化操作系统的其他部分。
#安装GRUB
sudo grub-install --boot-directory=./hdisk/boot/ --force --allow-floppy /dev/loop13
;--boot-directory 指向先前我们在虚拟硬盘中建立的boot目录。
;--force --allow-floppy :指向我们的虚拟硬盘设备文件/dev/loop13
/hdisk/boot/ 目录下多了一个 grub 目录,表示我们的 GRUB 安装成功。
然后到grub目录下,vim建立如下grub.cfg文件。
menuentry 'HelloOS' {
insmod part_msdos
insmod ext2
set root='hd0,msdos1' #我们的硬盘只有一个分区所以是'hd0,msdos1',实际使用的hd0,暂未理解为啥
multiboot2 /boot/HelloOS.eki #加载boot目录下的HelloOS.eki文件
boot #引导启动
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
set timeout=10 #等待10秒钟自动启动
fi
2.5 转换虚拟硬盘格式
前面生成了mount命令可以识别的虚拟硬盘hd.img,但是该纯二进制文件只能被linux系统识别,最终我们是要用虚拟机加载这个硬盘的,所以就需要转换为虚拟机可以使用的格式。
VBoxManage convertfromraw ./hd.img --format VDI ./hd.vdi
;convertfromraw 指向原始格式文件
;--format VDI 表示转换成虚拟需要的VDI格式
上述在Linux系统中生成了我们要的虚拟硬盘文件,接下来就是要HelloOS系统加载这个虚拟硬盘
2.6 安装虚拟硬盘
UUID不一致失败的问题,可以先到工具->虚拟硬盘中选择对应硬盘,先释放再删除,然后重新加载即可。
2.7 启动HelloOS
出现GRUB引导界面:
选择HelloOS。
2.8 最终结果—成功的失败
此处失败是因为没有HelloOS.eki文件,但是基本的运行测试环境已经ok。
下节继续。。。