操作系统实战45讲-10 设置工作模式与环境:建立计算机
实验环境:
虚拟机软件:VMware® Workstation 16 Pro
虚拟机:Ubuntu 20.04
生产虚拟硬盘
用 dd 命令(用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换)生成 100MB 的纯二进制的文件(就是 1~100M 字节的文件里面填充为 0 )
xyjk1002@sheldon:~/HelloOS$ dd bs=512 if=/dev/zero of=hd.img count=204800
204800+0 records in
204800+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.492003 s, 213 MB/s
bs:表示块大小,这里是512字节。
if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0。
of:表示输出文件,即我们的硬盘文件。
count:表示输出多少块。
查看下文件类型
xyjk1002@sheldon:~/HelloOS$ stat hd.img
File: hd.img
Size: 104857600 Blocks: 204800 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 524336 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/xyjk1002) Gid: ( 1000/xyjk1002)
Access: 2022-08-08 05:54:04.414685960 +0000
Modify: 2022-08-08 05:54:04.906693703 +0000
Change: 2022-08-08 05:54:04.906693703 +0000
Birth: -
格式化虚拟硬盘
虚拟硬盘也需要格式化才能使用,所谓格式化就是在硬盘上建立文件系统。只有建立了文件系统,现有的成熟操作系统才能在其中存放数据。
如何让 Linux 在一个文件上建立文件系统呢?分成三步来解决:
• 第一步,把虚拟硬盘文件变成 Linux 下的回环设备,让 Linux 以为这是个设备
xyjk1002@sheldon:~/HelloOS$ sudo losetup /dev/loop0 hd.img #显示loop0被占用了
losetup: hd.img: failed to set up loop device: Device or resource busy
xyjk1002@sheldon:~/HelloOS$ losetup -l #确认下当前loop设备使用情况
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop1 0 0 1 1 /var/lib/snapd/snaps/snapd_15177.snap 0 512
/dev/loop4 0 0 1 1 /var/lib/snapd/snaps/lxd_21835.snap 0 512
/dev/loop2 0 0 1 1 /var/lib/snapd/snaps/lxd_22753.snap 0 512
/dev/loop0 0 0 1 1 /var/lib/snapd/snaps/core20_1587.snap 0 512
/dev/loop5 0 0 1 1 /var/lib/snapd/snaps/core20_1581.snap 0 512
/dev/loop3 0 0 1 1 /var/lib/snapd/snaps/snapd_16292.snap 0 512
xyjk1002@sheldon:~/HelloOS$ sudo losetup -f ##自动寻找可以使用的loop文件
/dev/loop6
xyjk1002@sheldon:~/HelloOS$ sudo losetup /dev/loop6 hd.img #
losetup 命令用于设置回环设备。回环设备可以把文件虚拟成 Linux 块设备,用来模拟整个文件系统
查看下loop6文件类型,
xyjk1002@sheldon:~/HelloOS$ stat /dev/loop6
File: /dev/loop6
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 5h/5d Inode: 132 Links: 1 Device type: 7,6
Access: (0660/brw-rw----) Uid: ( 0/ root) Gid: ( 6/ disk)
Access: 2022-08-08 06:17:45.742149285 +0000
Modify: 2022-08-08 06:17:45.742149285 +0000
Change: 2022-08-08 06:17:45.742149285 +0000
Birth: -
• 第二步,格式化这个 /dev/loop0 回环块设备,在里面建立 EXT4 文件系统
xyjk1002@sheldon:~/HelloOS$ sudo mkfs.ext4 -q /dev/loop6
• 第三步,用mount 命令,将 hd.img 文件当作块设备,把它挂载到事先建立的 hdisk 目录下,并在其中建立一个 boot,这也是后面安装 GRUB 需要的
xyjk1002@sheldon:~/HelloOS$ sudo mount -o loop hd.img ./hdisk/
xyjk1002@sheldon:~/HelloOS$ sudo mkdir ./hdisk/boot
xyjk1002@sheldon:~/HelloOS$ ll hdisk/
total 28
drwxr-xr-x 4 root root 4096 Aug 8 06:49 ./
drwxrwxr-x 3 xyjk1002 xyjk1002 4096 Aug 8 06:48 ../
drwxr-xr-x 2 root root 4096 Aug 8 06:49 boot/
drwx------ 2 root root 16384 Aug 8 06:43 lost+found/
◊ mount 命令只能识别在纯二进制文件上建立的文件系统,如果使用虚拟机自己生成的硬盘文件,mount 就无法识别我们的文件系统了
安装 GRUB
正常安装系统的情况下,Linux 会把 GRUB 安装在我们的物理硬盘上。利用一下手上 Linux(HOST OS),通过 GRUB 的安装程序,把 GRUB 安装到指定的设备上(虚拟硬盘)。
正常安装系统的情况下,Linux 会把 GRUB 安装在我们的物理硬盘上。利用一下手上 Linux(HOST OS),通过 GRUB 的安装程序,把 GRUB 安装到指定的设备上(虚拟硬盘)
xyjk1002@sheldon:~/HelloOS$ sudo grub-install --boot-directory=./hdisk/boot/ --force --allow-floppy /dev/loop6
Installing for i386-pc platform.
grub-install: warning: File system `ext2' doesn't support embedding.
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
Installation finished. No error reported.
;--boot-directory 指向先前我们在虚拟硬盘中建立的boot目录。
;--force --allow-floppy :指向我们的虚拟硬盘设备文件/dev/loop0
/hdisk/boot/ 目录下多了一个 grub 目录,表示我们的 GRUB 安装成功
xyjk1002@sheldon:~/HelloOS$ ll hdisk/boot/
total 12
drwxr-xr-x 3 root root 4096 Aug 8 06:59 ./
drwxr-xr-x 4 root root 4096 Aug 8 06:49 ../
drwxr-xr-x 4 root root 4096 Aug 8 07:00 grub/
在 hdisk/boot/grub/ 目录下建立一个 grub.cfg 文本文件,GRUB 正是通过这个文件内容,查找到我们的操作系统映像文件的
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 #等待10秒钟自动启动
set timeout=10
fi
}
转换虚拟硬盘格式
纯二进制格式只能被我们使用的 Linux 系统识别,但不能被vmware虚拟机本身识别,但是我们最终目的却是让这个虚拟机加载这个虚拟硬盘,从而启动其中的由我们开发的操作系统
使用StarwindConverter进行虚拟机磁盘镜像互转
创建虚拟机,并安装虚拟硬盘
创建虚拟机时,要注意,
开机
上面的错误显示,GRUB 没有找到 HelloOS.eki 文件,这是因为我们从来没有向虚拟硬盘中放入 HelloOS.eki 文件,所以才会失败。
配置好了虚拟机,手动建造了硬盘,并在其上安装了 GRUB,到这里我们运行测试环境已经准备好了
参考:
本文来自博客园,作者:miyan,转载请注明原文链接:https://www.cnblogs.com/xyjk1002-rejuvenation/p/16562505.html