操作系统实战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)

大家都在看

  • mybatis-plus详细讲解

    本文笔记都是观看狂神老师视频手敲的,视频地址:https://www.bilibili.com/video/BV17E411N7KN 学java后端的都可以去看一下,从基础到架构很…

    Linux 2023年6月7日
    0109
  • ELK 脚本自动化删除索引

    kibana有自带接口,可通过自带的API接口 通过传参来达到删除索引的目的。 删除15天前的索引 curl -XDELETE "http://10.228.81.161…

    Linux 2023年6月8日
    071
  • 保罗·艾伦的故事

    上周,保罗·艾伦逝世。《财新周刊》约我写一篇纪念文章,发表在他们杂志上面 一些个人新闻:最近,我了解到我在2009年与之抗争的非霍奇金淋巴瘤已经复发。我已经开始治疗,我的医生很乐观…

    Linux 2023年6月14日
    097
  • 06-ElasticSearch搜索结果处理

    * package com.coolman.hotel.test; import com.coolman.hotel.pojo.HotelDoc; import com.faste…

    Linux 2023年6月7日
    092
  • K8S部署之VMWare网络拓扑踩坑

    知乎上最近发现一篇好文 图解K8S(01):基于Ubuntu 20.04部署1.23版K8S集群,想着之前 K8S 部署一直不成功,那么就照着这篇文章中说的试一试。结果在实验时遇到…

    Linux 2023年6月13日
    084
  • 006 Linux 命令三剑客之-grep

    01 一起来认识 grep! Linux 命令三剑客,sed、grep、awk。 sed:擅长数据修改。 grep:擅长数据查找定位。 awk:擅长数据切片,数据格式化,功能最复杂…

    Linux 2023年5月27日
    092
  • PyQt5的使用

    PyQt5 目录 Qt Designer PyQt5基本窗口控件(QMainWindow、Qwidget、Qlabel、QLineEdit、菜单、工具栏等) PyQt5高级组件(Q…

    Linux 2023年6月14日
    093
  • Python的闭包是什么意思?

    闭包算是编程语言里一个比较常见的概念,但说实话,这个名词有点晦涩。在查看了半天网上的资料后,还是有点不明就里。 我疑惑的点主要是:这个东西是用来解决什么问题的?或者说,他的作用是什…

    Linux 2023年6月8日
    093
  • Redis相关监控命令

    1、查询Redis并发量,连续统计模式redis-cli –stat 2、redis最大连接数config get maxclients 3、redis当前连接数、阻塞…

    Linux 2023年5月28日
    082
  • Linux vim退出命令

    :w – 保存文件,不退出 vim:w file -将修改另外保存到 file 中,不退出 vim:w! -强制保存,不退出 vim:wq -保存文件,退出 vim:w…

    Linux 2023年6月13日
    080
  • MIT6.828——Lab1 partA(麻省理工操作系统课程实验)

    Lab1 基本部分 在实验给出的文档中,已经详说明了早期PC的内存布局,并且运行了 bootloader。详细地解释了,上电后BIOS所做的工作,因此这部分不再赘述。需要注意的是 …

    Linux 2023年5月27日
    0157
  • C 中的字符数组

    在C语言中没有专门的字符串变量,字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。通常用一个 字符数组来存…

    Linux 2023年6月13日
    079
  • 数据库日志

    数据库日志: 首先,在MySQL中默认只开启了错误日志 MySQL中的日志文件: 错误日志(errorlog): 一般查询日志(general log) 慢查询日志(slow qu…

    Linux 2023年6月6日
    083
  • Docker部署

    部署Docker 1.部署docker相关 此章描述在新的服务器上安装docker容器。 1.1 概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apach…

    Linux 2023年6月7日
    0126
  • 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 经典的问题 形参&实参…

    Linux 2023年6月6日
    0117
  • Ubuntu18上面一个非常有用的配置工具【gnome-tweaks】

    Ubuntu 18.04 LTS的Gnome桌面UI主打简约,但是相比前几个发行版本上的UI功能, 18.04默认的UI已经阉割掉了。其实 Ubuntu官方将我们上面所说的UI功能…

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