操作系统--操作系统安装

创建虚拟硬盘

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

posted @ 2022-05-28 16:36  牛犁heart  阅读(195)  评论(0编辑  收藏  举报