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

操作系统实战45讲-10    设置工作模式与环境:建立计算机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

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

创建虚拟机时,要注意,

操作系统实战45讲-10    设置工作模式与环境:建立计算机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

开机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

操作系统实战45讲-10    设置工作模式与环境:建立计算机

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

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

参考:

操作系统45讲-第10节

Original: https://www.cnblogs.com/xyjk1002-rejuvenation/p/16562505.html
Author: miyan
Title: 操作系统实战45讲-10 设置工作模式与环境:建立计算机

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581759/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MTSP问题的简单介绍

    1. TSP问题与MTSP问题 1.1 TSP与MTSP问题的介绍: TSP:是指旅行家(1名)要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的 路程最短…

    Linux 2023年6月14日
    0158
  • 【转】windows下Redis的安装和使用

    2、在下载网页中,找到最后发行的版本(此处是3.2.100)。找到Redis-x64-3.2.100.msi和Redis-x64-3.2.100.zip,点击下载。这里说明一下,第…

    Linux 2023年5月28日
    094
  • Nuget私服老是弹输入用户名密码框

    先把vs中私服删除,然后,控制面板\用户帐户\凭据管理器,删除私服 最后输入命令: NuGet.exe Sources Update -Name <feedname> …

    Linux 2023年6月13日
    0111
  • ArchLinux安装-2022-01-12

    这篇教程,是我基于B站up住theCW的视频教程整理的,其中添加了一些我在安装n次之后的经验(虽然失败过几次,但我现在安装不会再出差错,所以请放心的看此教程) 当然,我认为theC…

    Linux 2023年5月27日
    093
  • [Linux]iptables防火墙

    一、iptables介绍 二、表(Table) 三、链(Chain) 四、规则(Rule) 五、iptables规则的增删改查 一、iptables介绍 iptables是一个针对…

    Linux 2023年6月13日
    0111
  • linux自动备份mysql数据库

    备份脚本记录一下–(单个数据库) 2021-11-15 1.新建shell脚本:vim **.sh #!/bin/bashCKUP=/data/backup/db #获…

    Linux 2023年5月27日
    0125
  • Liunx-LVM创建与扩容

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2…

    Linux 2023年6月8日
    099
  • python一键探测编码

    程序功能 按文件输出编码or按编码输出文件 源码 主要代码功能 1.实现文件遍历 2.chardet获取编码 3.传参,对符合编码条件的文件输出 4.打开文件夹选择对话框 程序功能…

    Linux 2023年6月7日
    0128
  • VR(虚拟现实)开发资源汇总

    Daydream Gear VR Algorithm ATW Bluetooth Blog Latency Tools Touch Unity Qualcomm EGL Origi…

    Linux 2023年6月7日
    093
  • k8s集群中网络实现通信原理

    1)安装Docker时,创建一个名为 docke0 的虚拟网桥,虚拟网桥使用”10.0.0.0 -10.255.255.255 “、”172.1…

    Linux 2023年6月14日
    0101
  • springboot分析——与其他组件的整合(JPA规范/atomikos/redis)

    一:与JPA规范整合 jpa是一套orm的规范,提供api接口,hirebnate就是对jpa的一套实现,下面我们看看springboot如何 与jpa整合 1:添加依赖和配置 j…

    Linux 2023年5月28日
    0115
  • 数据库常用函数

    一、数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e(自然…

    Linux 2023年6月13日
    0112
  • 高等代数:6 二次型 矩阵的合同

    6 二次型 (\cdot) 矩阵的合同 1、定义1:数域K上一个 n元二次型是系数在K中的n个变量的二次齐次多项式,它的一般形式是 [\begin{aligned} &f(…

    Linux 2023年6月8日
    0124
  • java内存调优总结

    ···bashJVM 调优,是个很简单也很复杂的话题,由于经常遇到这类问题,在这里总结一下。 先从解决bug开始,当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会G…

    Linux 2023年6月14日
    094
  • 软件工程 软件测试 第6篇随笔

    5、软件测试 1.软件测试的目的: 测试是一个为了发现错误而执行程序的过程 一个好的测试用例是指很可能找到迄今为止尚未发现的错误的测试用例 一个成功的测试是指揭示了迄今为止尚未发现…

    Linux 2023年6月7日
    0124
  • gerrit系统如何配置访问控制

    .版本:v0.3作者:河东西望日期:2022-7-13. gerrit系统的上手使用有两个难点: 想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerri…

    Linux 2023年6月7日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球