操作系统实战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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库