打卡第十五天:10 | 设置工作模式与环境(上):建立计算机

本文介绍了如何使用VirtualBox创建虚拟机环境,选择64位Ubuntu20.04,通过dd命令生成及格式化虚拟硬盘,安装GRUB引导加载器,并转换虚拟硬盘格式。过程中详细讲解了每个步骤,包括创建回环设备、挂载、卸载设备,以及使用GRUB配置文件。
摘要由CSDN通过智能技术生成

(2021年11月22日打卡第十五天)



学习本节,开始动手建立运行Cosmos需要的环境。

1、学习理解内核映像格式

要把多个文件变成一个文件就需要封装,即把多个文件组装在一起形成一个文件。这个文件我们称为内核映像文件,其中包含二级引导器的模块,内核模块,图片和字库文件。为了这映像文件能被 GRUB 加载,并让它自身能够解析其中的内容,我们就要定义好具体的格式。如下图所示。
在这里插入图片描述

上图中的 GRUB 头有 4KB 大小,GRUB 正是通过这一小段代码,来识别映像文件的。另外,根据映像文件头描述符和文件头描述符里的信息,这一小段代码还可以解析映像文件中的其它文件。

我们还要有个打包映像的工具,我给你提供了一个 Linux 命令行下的工具,你只要明白使用方法就可以,如下所示。

lmoskrlimg -m k -lhf GRUB头文件 -o 映像文件 -f 输入的文件列表
-m 表示模式 只能是k内核模式
-lhf 表示后面跟上GRUB头文件
-o 表示输出的映像文件名 
-f 表示输入文件列表
例如:lmoskrlimg -m k -lhf grubhead.bin -o kernel.img -f file1.bin file2.bin file3.bin file4.bin 

2、结合课程指导安装虚拟机

  • 2.1 这里我们一致约定使用甲骨文公司的VirtualBox虚拟机

  • 2.2 确定Ubuntu的版本,建议使用64位的Ubuntu 20.04版本,查看版本方法如下:

    • 2.2.1 使用lsb_release -a命令显示Ubuntu版本,会在Description行看到Ubuntu版本信息;也可以只显示Description行,只需执行以下命令:lsb_release -d
      2.2.2 使用cat命令显示/etc/issue文件中包含系统标识文本的内容:
      cat /etc/issue
      也可以使用cat命令显示/etc/os-release文件中信息:cat /etc/os-release
      2.2.3 查看Ubuntu的位数信息:
      getconf LONG_BIT
      2.2.4 hostnamectl是一个允许用户设置主机名的命令,但也可以使用它来检查Ubuntu版本:hostnamectl

  • 2.3 生产虚拟硬盘

我们先新建一个目录myCosmos:

mkdir MyConsmos

在这里插入图片描述
进入该项目目录中 cd MyCosmos ,下面我们用 Linux 下的 dd 命令(用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换)生成 100MB 的纯二进制的文件(就是 1~100M 字节的文件里面填充为 0 ),如下所示。

dd bs=512 if=/dev/zero of=hd.img count=204800

;bs:表示块大小,这里是512字节
;if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0
;of:表示输出文件,即我们的硬盘文件。
;count:表示输出多少块

执行以上命令就可以生成 100MB 的文件。文件数据为全 0。由于我们不用转换数据,就是需要全 0 的文件,所以 dd 命令只需要这几个参数就行。
在这里插入图片描述

  • 2.4 格式化虚拟硬盘

虚拟硬盘也需要格式化才能使用,所谓格式化就是在硬盘上建立文件系统。只有建立了文件系统,现有的成熟操作系统才能在其中存放数据。
第一步,把虚拟硬盘文件变成 Linux 下的回环设备,让 Linux 以为这是个设备。下面我们用 losetup 命令,将 hd.img 变成 Linux 的回环设备,代码如下。

sudo losetup /dev/loop0 hd.img

在这里插入图片描述
如果提示上述错误,我们可以用命令 ls /dev/loop*查看在/dev目录下一共有多少个回环设备:
在这里插入图片描述

再查看所有的loop设备状态:

sudo losetup -a

在这里插入图片描述
结合上面这两张图可以发现,loop10未被占用,所以把虚拟硬盘文件hd.img变成 Linux 下的回环设备loop10,重新输入命令:

sudo losetup /dev/loop10 hd.img

第二步,用 Linux 下的 mkfs.ext4 命令格式化这个 /dev/loop10 回环块设备,在里面建立 EXT4 文件系统。

sudo mkfs.ext4 -q /dev/loop10  

在这里插入图片描述

第三步,我们用 Linux 下的 mount 命令,将 hd.img 文件当作块设备,把它挂载到事先建立的 hdisk 目录下,并在其中建立一个 boot,这也是后面安装 GRUB 需要的。如果能建立成功,就说明前面的工作都正确完成了。

挂载虚拟硬盘文件为loop10回环设备
sudo mount -o loop ./hd.img ./hdisk/ ;挂载硬盘文件
sudo mkdir ./hdisk/boot/ ;建立boot目录

在这里插入图片描述在这里插入图片描述

进行到这里,我们就挂载成功了,而且我们会发现 hdisk 目录下多了一个 boot 目录。

  • 2.5 安装 GRUB

sudo grub-install --boot-directory=./hdisk/boot/ --force --allow-floppy /dev/loop10
;--boot-directory 指向先前我们在虚拟硬盘中建立的boot目录。
;--force --allow-floppy :指向我们的虚拟硬盘设备文件/dev/loop10

在这里插入图片描述
此时grub已经安装成功,出现上图这两个警告不用理会,不影响grub的安装。

第三步,在 /hdisk/boot/grub/ 目录下建立一个 grub.cfg 文本文件
在 /hdisk/boot/grub/ 目录下建立一个 grub.cfg 文本文件

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

建立grub.cfg会出现“当修改保存的时候,如果提示无法修改该只读文件”的问题,解决方法请看:打卡第一天:通过GRUB启动我们自己的操作系统HelloOS,在该文中的“7、修改/boot/grub/grub.cfg,增加HelloOS启动项“,有用vim建立、修改grub.cfg的具体步骤。
在这里插入图片描述在这里插入图片描述

  • 2.6 转换虚拟硬盘格式

VBoxManage convertfromraw ./hd.img --format VDI ./hd.vdi
;convertfromraw 指向原始格式文件
;--format VDI  表示转换成虚拟需要的VDI格式

在这里插入图片描述

  • 2.7 安装虚拟硬盘

    • 2.7.1 注意:一定要先打开VirtualBox

没有建立虚拟机的话,请参照下图步骤:
在这里插入图片描述
在这里插入图片描述

  • 2.7.2 配置虚拟硬盘分两步:

第一步,配置硬盘控制器,我们使用 SATA 的硬盘,其控制器是 intelAHCI;第二步,挂载虚拟硬盘文件。
具体操作如下所示。

#第一步 SATA的硬盘其控制器是intelAHCI
VBoxManage storagectl HelloCosmos --name "SATA" --add sata --controller IntelAhci --portcount 1
#第二步
VBoxManage closemedium disk ./hd.vdi #删除虚拟硬盘UUID并重新分配
#将虚拟硬盘挂到虚拟机的硬盘控制器
VBoxManage storageattach HelloCosmos --storagectl "SATA" --port 1 --device 0 --type hdd --medium ./hd.vdi

因为 VirtualBox 虚拟机用 UUID 管理硬盘,所以每次挂载硬盘时,都需要删除虚拟硬盘的 UUID 并重新分配。
在这里插入图片描述
在这里插入图片描述如果出现上图情况,点击确定不用管它。
在这里插入图片描述

2.8 最成功的失败 启动我们的HelloCosmos系统

在 Linux 终端中输入如下命令就可以了。

VBoxManage startvm HelloCosmos	#启动虚拟机

在这里插入图片描述
输入以上命令就会出现以下界面,出现 GRUB 引导菜单。
在这里插入图片描述直接按下回车键,就能选择我们的 HelloOS,GRUB 就会加载我们的 HelloOS,但是会出现如下错误。
在这里插入图片描述上面的错误显示,GRUB 没有找到 HelloOS.eki 文件,这是因为我们从来没有向虚拟硬盘中放入 HelloOS.eki 文件,所以才会失败。

点击管理,退出,强制退出即可。
在这里插入图片描述
但这是我们最成功的失败,因为我们配置好了虚拟机,手动建造了硬盘,并在其上安装了 GRUB,到这里我们运行测试环境已经准备好了。

其实你不必太过担心,等我们完成了二级引导器的时候,这个问题会迎刃而解。


3、一些可能会用到的命令

以下命令,在你需要重新重头开始的时候,可能会用到,以供参考。

  • 3.1 查看挂载的情况:

df -h

在这里插入图片描述

  • 3.2 可以使用 sudo losetup -l查看所有的loop设备的状态:

在这里插入图片描述

  • 3.3 卸载挂载的设备:

umount ./hdisk
或者
mount /dev/loop10
或者
mount /dev/loop10 ./hdisk

以上三个命令都可以:

注意:当你的当前路径为/mnt下,即在挂载文件的里面时,卸载会失败,提示:Dev is besy。
解决办法:退出挂载的目录;

当有别的程序正在访问挂载的文件时,也会提示卸载失败,通过 lsof /mnt 查看是哪个进程占用了/mnt,然后通过 kill -9 $pid 杀死该进程,再卸载即可;

使用:umount -l /mnt ( -l :卸载前检查占用该挂载文件的程序并迅速kill掉,以达到快速卸载的目的)

  • 3.4 卸载loop设备:

losetup -d /dev/loop10
  • 3.5 卸载硬盘控制器:

VBoxManage storagectl HelloCosmos --name "SATA" --remove
  • 3.6 删除存储设备

VBoxManage closemedium disk ./hd.vdi --delete

在这里插入图片描述

  • 3.7 删除虚拟硬盘UUID重新分配

VBoxManage clonevdi 670fd01f-6383-4d32-a089-ac42b51a5d07 /root/“VirtualBox VMs”/testvm/testvm2.vdi

* 修改

VBoxManage modifyvdi | compact 压缩指定的虚拟硬盘
VBoxManage clonevdi | 克隆指定的VDI虚拟硬盘
VBoxManage convertdd [-static] 将raw硬盘转换成vdi虚拟硬盘

* 挂载到ide

VBoxManage modifyvm testvm --hda /root/“VirtualBox VMs”/testvm/testvm.vdi
或者
VBoxManage storageattach testvm --storagectl “IDE Controller” --port 0 --device 0 --type hdd --medium /root/VirtualBox\ VMs/testvm/testvm.vdi

* 卸载

VBoxManage storageattach testvm --storagectl “IDE Controller” --port 0 --device 0 --type hdd --medium none
或者
VBoxManage modifyvm testvm --hda none

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值