0%

操作系统实战:实验环境搭建、热门问题解答

本系列文章是《操作系统实战45讲》课程学习过程中的心得体会与问题汇总。

系列文章放入「操作系统实战」分类里。如果对你有帮助,欢迎关注我。

如果你也想一起写一个属于自己的操作系统,直接翻到文末查看

话不多说,现在进入正题。本文分为两个部分:一、实验环境搭建。二、前4节课遇到的问题与解答。

实验环境搭建

1、一台电脑。电脑上装有Windows或MacOS系统。我用的是MacOS系统。

2、虚拟机。我选择的是VMware Fusion 12(若是Windows,装个最新版VMware即可)。

3、Ubuntu/CentOS系统。我选择的是Ubuntu,作为虚拟机系统,用来实现自己的操作系统。

搭建过程

  1. 安装好虚拟机软件VMware,基本都是点下一步,下一步,直到安装完成。

  2. 这里[1] 下载Ubuntu 20.04系统安装文件,是一个iso文件。

  3. 在VMware里创建一个新的虚拟机,用来安装Ubuntu 20.04系统:

新建虚拟机

选择新建,后面的步骤比较简单,跟着提示做就可以了。

记得Ubuntu需要分配至少1G的内存,不然可能无法正常启动Ubuntu。

  1. 安装完Ubuntu 20.04后,登录系统,在Ubuntu系统里安装工具(以后我们自己写的系统就叫HelloOS):
1
2
3
4
# 按下 Control+Option+T 组合键打开一个终端(Windows下是 Control+Alt+T)
# 在终端里输入如下命令行,并按 回车,开始执行
# gcc是编译工具集,包含了C语言编译器等。nasm是Ubuntu下的汇编器。
sudo apt install -y gcc nasm

截图如下:

安装编译工具

  1. 克隆HelloOS的源代码并编译(下面的命令继续在Ubuntu终端里执行):
1
2
3
4
5
sudo apt install -y git  # 安装git工具
git clone https://gitee.com/lmos/cosmos # 克隆源代码
cd cosmos/lesson02/HelloOS/ # 进入源码目录
make # 编译HelloOS内核文件HelloOS.bin
sudo cp HelloOS.bin /boot/HelloOS.bin # 拷贝内核文件到grub的引导分区里
  1. 添加grub启动项,用来启动我们的HelloOS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 编辑grub的配置文件
sudo vim /boot/grub/grub.cfg

# 在键盘上依次按下:
shift + g + o

# 把下面内容粘贴到文末
#### BEGIN HelloOS.bin ####
menuentry 'HelloOS' {
insmod part_msdos #GRUB加载分区模块识别分区
insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
set root='hd0,msdos1' #注意boot目录挂载的分区,这是我机器上的情况
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
boot #GRUB启动HelloOS.bin
}
#### End /boot/HelloOS.bin ####

# 在键盘上依次按下,然后回车,添加的内容就保存好了:
esc + shift + ; + wq!

# 在终端重启系统,输入:
reboot
  1. 重启Ubuntu系统后,在系统启动项菜单里选择 HelloOS(上下箭头选择HelloOS,然后按回车启动它):

启动HelloOS

  1. 启动成功后,如下图所示(HelloOS还没重启代码,要回到Ubuntu,直接重启虚拟机,选上图的第一项来启动):

启动成功

问题与解答

1、为什么没有出现引导菜单,让我选择HelloOS来启动?

首先,什么是引导菜单?请看上文步骤7中的截图。

答:这与grub的设置有关,菜单项可能隐藏了,按如下操作:

1
2
3
# 进入Ubuntu系统后,进入终端(还记得吗,可以按 Ctrl+Opt+T/Ctrl+Alt+T启动终端)
# 输入命令编辑grub配置文件
sudo vim /etc/default/grub

把红框的3行,修改成如下图所示(没有的行就加上):

设置grub

然后更新grub:

1
2
# 执行命令
sudo update-grub2

更新后,需要重新添加HelloOS的引导项到grub.cfg文件。见上文步骤6、步骤7。

2、重启选择HelloOS启动后显示 error: file `/boot/HelloOS.bin’ not found.

HelloOS.bin未找到

答:这与boot分区是否独立有关。重新进入Ubuntu系统,打开终端(步骤见上文),执行命令:df /boot /

boot独立分区

如上,文件系统(Filesystem)一列,两行内容不一样,/boot在/dev/sda1,那就把/boot/grub/grub.cfg文件里的 multiboot2 /boot/HelloOS.bin 改成 multiboot2 /HelloOS.bin,保存文件。然后重启系统,选择HelloOS启动。

3、重启选择HelloOS启动后显示 error: disk `hd0,msdos2’ not found. 之类的错误

答:可能是在你的Ubuntu系统上,msdos2这个分区不存在。或者你用了gpt分区,如何查看?执行如下命令:

查看是否为gpt分区方案

如果是gpt分区,那就修改grub.cfg文件,把 insmod part_msdos 改为 insmod part_gpt,保存文件。然后重启选HelloOS启动。

4、我用的是CentOS7,为什么没有成功?

答:基本步骤与Ubuntu一样,几乎无差别。但有的人开机遇到了黑屏,没有显示Hello OS!。还有的人,虚拟机显示了CPU禁止。我是这么做的:修改 grub.cfg 文件,把HelloOS启动项里的 multiboot2 改为 multiboot,保存文件。重启系统,再进入HelloOS看看。


本文源自 极客时间《操作系统实战45讲》 学习过程中的心得与问题汇总,欢迎扫码加入。

此课程的一系列文章,我都会放到「操作系统实战」分类。如果对你有帮助,可以关注我,一起学习进步

操作系统实战45讲

参考:

[1] http://mirrors.ustc.edu.cn/ubuntu-releases/20.04/ubuntu-20.04.2.0-desktop-amd64.iso