操作系统实战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进行虚拟机磁盘镜像互转

image

image

image

image

image

创建虚拟机,并安装虚拟硬盘

创建虚拟机时,要注意,
image

image

开机

image

image

上面的错误显示,GRUB 没有找到 HelloOS.eki 文件,这是因为我们从来没有向虚拟硬盘中放入 HelloOS.eki 文件,所以才会失败。

配置好了虚拟机,手动建造了硬盘,并在其上安装了 GRUB,到这里我们运行测试环境已经准备好了

参考:

操作系统45讲-第10节

posted on 2022-08-08 16:48  miyan  阅读(313)  评论(0编辑  收藏  举报