You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

310 lines
24 KiB
Markdown

2 years ago
# 用户故事 | yiyang我的上机实验“爬坑指南”
你好我是yiyang。
先简单说说我自己吧我是一名编程爱好者这个爱好从小学就已经播下了种子。我从求学到就业有过很多次机会接触计算机方面的学习和相关工作可是一直没有真正动手编程。这次能接触到LMOS老师的《操作系统实战45课》让我眼前一亮当时就报名了这门课。
都说编程需要能掌握一些基础的编程语言但在这门编写操作系统的这门面前我属于“三零基础”Linux是零基础、汇编语言是零基础C语言也是零基础。但这一点也没有影响我学习这门课的热情因为我从报名那一刻就站在了LMOS老师的肩膀上;-)
我的学习思路简单粗暴,就是**先跟着老师的整个课程跑一遍,拿下整体框架**。我自己也清楚,看不懂代码是我目前的一大劣势,而这不是三天两天能速成的,那我就不纠结在这方面,先跟着老师的每节课的讲解把大概意思给硬啃下来。
至于代码部分,老师在教学辅助[石墨文档](https://shimo.im/docs/KqqCxqPYGVYKtGg3)里已经给大家推荐了非常好的学习资料。因为明白自己当前的情况,也明确了自己的目标,所以并没有出现计划容易落地难的问题,我也一直是按计划学习的。在时间安排上,我是每天安排一课,跟着老师课程里的语音,同步看文字、插图及配套的代码。
这里有一个关键点,那就是每节课后都有编程大神们的精选留言,这些是已经学完课程的同学留下的宝贵学习经验。对于正在学习的我们,也可以用来辅助参考,这是我每节课必看的内容。
专栏里大部分内容都可以实际上机体验LMOS老师都把配套的课程代码链接传到了Gitee上。我在学完每节课之后一定会亲自上机运行一遍老师的代码。虽然我目前还写不出这些代码但每次遇到有代码的课都自己跑一遍也能更直观感受到当前这节课最终可以实现出什么样的结果。**以我目前的实操能力,现在就能把这件事做到**。
就从第一次上机运行的经验开始说起吧,也就是[第二课“几行代码几行C实现一个最简单的内核”](https://time.geekbang.org/column/article/369502)。先说结果我印象里开始动手是夜里11点半一直搞到了凌晨3、4点才最终完成。虽然只是运行了老师写的代码但把自己的运行结果晒到打卡群时内心还是感受到满满的成就感。
我在这将近4个小时的折腾里因为这样那样的问题不断掉坑、爬坑。那我究竟是如何解决最终才完成了第2课的 Hello OS 呢?
## 兵马未动,配置先行
之前在介绍里给自己的标签是“三无基础”所以上机实践的每一步都是新的尝试和探索。运行课程代码前自然要先搞定运行环境主要分两个部分安装Ubuntu和各种编译连接工具。
虽说是第一次安装Ubuntu经过学习石墨文档里每一条和我的运行环境相关的文档链接以及在百度里大致搜索了一些安装教程基本就能搞定这一关安装过程中除了自己指定安装路径其余的安装设置基本上都是选择默认的选项。
安装中途遇到第一个大坑估计大部分初次安装Ubuntu的同学都可能遇到过初次安装时系统会在线安装系统的一些升级程序具体是哪些先不深究这个环节我至少等了45分钟还多。相比之前安装Windows操作系统区别很大毕竟虚拟机里安装Win10安装程序基本上是直接从iOS系统安装压缩包里把需要安装的程序文件全部解压出来感觉整个过程十几分钟就完成了。
后来再去百度搜了一些资料才知道安装中最好关闭本机网络。其中的关键点就是我们电脑主机或虚拟机在安装Ubuntu系统时有一部分程序需要从服务器下载而默认的下载服务器传输速度缓慢是这个坑的直接产生原因。这个不光会影响Ubuntu安装后续使用时安装一些程序还会给我们带来困扰你会发现下载程序速度非常慢甚至经常中断无法完成下载。
找到了原因,对症下药就能根治问题。办法就是**安装Ubuntu时记得要关闭网络或虚拟机的网络功能然后在安装完成后找一个Ubuntu大陆地区镜像站点配置到Ubuntu的设置里**。
这里我推荐[清华大学开源软件镜像站,](https://mirror.tuna.tsinghua.edu.cn/help/ubuntu)超链接里有具体的使用帮助选择跟你安装的ubuntu相同的版本跟着帮助指导就能完成配置。重启后再去下载和升级程序你会发现下载速度就变得非常快了。
其实镜像站还有很多,你可以自己搜一搜,比如还有阿里云的镜像站,有兴趣的可以多找一些备用,使用和配置方法都是相似的,只要学会配置一个,其他的也都差不多。唯一不同的就是镜像站的链接网址这方面的区别。
解决了Ubuntu的下载问题接下来就是安装课程里需要用到的代码编译等程序把它们安装或升级到最新版本。
接下来我们就安装编译链接等工具nasm、gcc、make。具体操作时在Ubuntu系统里进入终端 Terminal在命令行中输入下面这条指令
```bash
sudo apt install nasm gcc make
```
输入指令后,系统就会帮我们下载并安装这几个编译链接工具。完成安装后,第二课配套代码的程序编译环境我们就搭建好了。
## 上机运行的“爬坑指南”
### 第二课的上机经验
第二课的上机代码,老师已经帮我们写好了我们只需要下载到Ubuntu里然后进入终端Terminal 在lesson02/HelloOS目录下运行下面这条指令
```bash
make -f Makefile
```
经过上述流程,我们就会得到 HelloOS.bin 文件。当然这条指令的执行过程中整个过程里生成了好几个文件这几个文件生成的具体流程和介绍专栏里都有详细说明这里我们主要是讲如何运行代码需要的就是最终生成的这个HelloOS.bin文件。
得到HelloOS.bin后我们需要手动修改两个地方手动选择启动项还有把 Hello OS 添加进GRUB开机启动菜单。
#### 手动修改第一关
首先,我们要修改/etc/default/grub把GRUB启动菜单配置改成启动时“显示”可以让我们手动选择**启动项**。
这里我额外分享一个我的技巧在对这类系统文件进行任何改动前建议都先做一个备份这样备份后即使修改发生了错误后还能用这个备份文件还原恢复。修改grub的具体操作是在Ubuntu系统的终端 Terminal里进入 /etc/default/ 目录使用指令修改grub配置文件代码如下
```bash
sudo gedit grub
```
输入之上述指令后编辑器里会显示grub配置文件大约33行左右。
首先我们要用#号注销掉hidden行。我这个Ubuntu版本是在第7行只需要在前面加上#号,也就是“#GRUB\_TIMEOUT\_STYLE=hidden”。
有的Ubuntu版本里是第7和第8行里都有hidden那就把这两行前面都加上#号注释掉。为啥要注释掉呢hidden的作用是启动时不显示GRUB启动菜单而我们需要在启动时显示GRUB菜单选项所以需要用#号注释掉。如果实验后你不需要显示GRUB启动菜单逆向操作设置即可。
接下来需要设置GRUB启动菜单的默认等待时间。代码如下
```bash
GRUB_TIMEOUT=30
```
这里的参数30表示Ubuntu启动进入GRUB启动菜单后倒计时30秒如果没有任何手动操作就会直接进入第一个默认的启动选项系统。
接着我们需要把GRUB\_CMDLINE\_LINUX\_DEFAUL设置为text也就是打开启动菜单时默认使用文本模式代码如下
```bash
GRUB_CMDLINE_LINUX_DEFAULT="text"
```
![图片](https://static001.geekbang.org/resource/image/79/1b/79786249a8b9e5d3b9dcf91cfc4a191b.png?wh=1920x1080)
完成grub文件的这三处修改记得按右上角的Save保存然后关闭grub文件。
grub文件并不是修改后就完事了还需要提示系统我们已经更新了grub文件。操作也很简单只需要在命令行输入如下指令
```bash
sudo update-grub
```
这样grub文件的配置修改我们就搞定了。
#### 手动修改第二关
接下来我们看看添加 Hello OS 的操作 。老师在课里“安装 Hello OS”这部分提到
> 经过上述流程,我们就会得到 Hello OS.bin 文件,但是我们还要让 GRUB 能够找到它,才能在计算机启动时加载它。这个过程我们称为安装,不过这里没有写安装程序,得我们手动来做。
>
> > 经研究发现, GRUB 在启动时会加载一个 grub.cfg 的文本文件,根据其中的内容执行相应的操作,其中一部分内容就是启动项。
> > GRUB 首先会显示启动项到屏幕,然后让我们选择启动项,最后 GRUB 根据启动项对应的信息,加载 OS 文件到内存。
> > 结合课程讲解可以看到grub.cfg这个文件的路径是在/boot/grub/grub.cfg。
同样的,记得先给 grub.cfg 做个备份,然后我们就可以在终端 Terminal 里进入 /boot/grub 目录,执行下面这条指令来打开和配置 GRUB 启动选项:
```bash
sudo gedit grub.cfg
```
打开grub.cfg 文件后可以看到这个大约299行的文本文件里有很多用#号开头的英文注释基本上都是对这个cfg文件里的关键注释。对于我们要改动的这个文件可以先观察和了解这些注释这对后面的配置工作有很大帮助。
仔细观察grub.cfg文件的第287到第291行我把它这部分内容粘贴到了后面
> ###BEGIN /etc/grub.d/40\_custom ###
> #This file provides an easy way to add custom menu entries.  Simply type the
> #menu entries you want to add after this comment.  Be careful not to change
> #the exec tail line above.
> ###END /etc/grub.d/40\_custom ###
上面注释里提到,这个文件里给用户预留了可以添加自己启动项的地方,也就是用户可以把自己需要添加的启动项,紧跟着放在这段注释下面即可。
#### 手动修改第三关
老师已经把我们HelloOS的启动项的程序代码写好了我最初的做法就是直接复制老师课程里的代码进去。
```bash
menuentry 'HelloOS' {
     insmod part_msdos #GRUB加载分区模块识别分区
     insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
     set root='hd0,msdos4' #注意boot目录挂载的分区这是我机器上的情况
     multiboot2 /boot/HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
     boot #GRUB启动HelloOS.bin}
```
请注意这个环节也就是老师的这段代码如果我们只是无脑地直接复制进去那大概率无法运行出想要的结果。第二课的上机运行里这个地方是最大的一个“坑”也是我在OS打卡群和操作系统群里看到很多小伙伴都卡住的地方。
当然,这个坑当时也把我给难住了,期间整整折腾了一个多小时,才搞明白爬出了这个坑,事后看看,老师当时其实已经给了明确提示。
> 我们来仔细看下这个坑在哪里:
> “set root=hd0,msdos4 #注意boot目录挂载的分区这是我机器上的情况”
> 对,就是#号后的提示。
其实这行代码的用途是告诉操作系统GRUB我们的boot目录挂载的分区。由于每个人电脑硬件环境有差异**这个参数得根据自己电脑的具体情况来填写**,所以当你直接复制老师的这个代码时,除非电脑运行环境正好和老师的一模一样,否则是无法顺利执行下去的。
我的电脑运行环境也和老师的不同,所以这个地方一定要先确定我们自己电脑系统的这个参数,然后再填写进去,才能跑通这个运行结果。其实老师也给出了找参数的方法,在 Linux 系统的终端Terminal里输入后面的命令具体你可以对照第二课讲解回顾。
```bash
df /boot/
```
![图片](https://static001.geekbang.org/resource/image/b3/81/b30382ac7cefffdbaf6113580b55bd81.png?wh=1920x1080)
以上截图是我 Vbox 虚拟机里 Ubuntu 系统里执行 df /boot/ 后显示出的boot目录在硬盘设备挂载分区的信息里面的 /dev/sda5 就是指硬盘的第五个分区但是GRUB的menuentry中不能直接写 sda5而是要写成“hd0,msdos5”。
另一个技巧是我们可以观察grub.cfg里上面系统自带的那几个menuentry开头的启动项里面这个“set root=”后面的参数,看下它们的配置参数是怎样的,基本上你照抄即可。
![图片](https://static001.geekbang.org/resource/image/4c/7b/4c652b28fa2e200ba7a23c4d68347f7b.png?wh=1920x1080)
截图里红框圈出来的是我根据自己系统的参数添加进grub.cfg的HelloOS启动项代码。
完成了上面这个步骤后面还要把我们前面用make指令最终生成的HelloOS.bin文件复制到 /boot/ 目录里。经过上面这些步骤的配置我们就可以重启Ubuntu系统重启后你会看到弹出的GRUB启动菜单。
![图片](https://static001.geekbang.org/resource/image/4e/0b/4e4dfd79c01e7bbb0fb66d4ac87bae0b.png?wh=1920x1080)
在里面选择最后一项HelloOS就能看到系统进入了我们的Hello OS操作系统界面大功告成
![图片](https://static001.geekbang.org/resource/image/fe/fa/fe364f22cf01b49d6bd6585a6ef8f5fa.png?wh=1920x1080)
虽然,**屏幕上只显示了Hello OS这几个字符但这已经为后面我们搭建Cosmos系统打下了最初的基石**。跟着以上的操作步骤,我们把代码运行起来,相信你内心也会升起小小的成就感。
### 后续上机实验要点
下面,我再把运行后续课程里遇到的几个比较典型的坑罗列出来,如果你也正好学习到这里,可以做个参考,也许对你有帮助。
#### 第十一课 lmoskrlimg 命令执行
第十一课的上机运行代码部分,我再次卡住,扒拉了各个大神的避坑指南,再到百度里各种搜索,但依旧没能解决。
最后实在是没辙了只能硬着头皮去向LMOS东哥请教东哥看到消息简短的几句话就指出了要害我跟着他指点的思路上机实操果然问题立马就解决通关了。
这种非常基础的Linux应用问题东哥也能这样耐心解答我内心是有点小感动的。毕竟从高度来讲东哥在操作系统这个领域已经是非常高的段位从这一次的提问中能真切感受到东哥非常愿意分享他的经验帮助我这样的新手。因为这份幸运我觉得既然已经选择学习这门课程真的要珍惜机会好好学习完成这门课程。
我来讲一下这个坑的特征这个问题属于Linux的使用基础方面的问题估计大部分像我一样刚开始使用Ubuntu或对Linux操作系统不是非常熟悉的同学都可能在这里卡住。
对于没有配置过环境设置的外部程序 lmoskrlimg
在运行该程序指令时,前面一定要加./。
![图片](https://static001.geekbang.org/resource/image/19/1f/196d2496eab3271cefc91acd254d0a1f.png?wh=1920x1080)
看到没?第一次执行,前面没有加 ./ 系统就提示command not found。
第二次执行,前面加上了 ./ ,系统就能找到并执行,之后结果会提示:“需要在该指令后面加上相应参数”。
第十一课里,这个程序具体的完整指令如下:
```bash
sudo ./lmoskrlimg -m k -lhf initldrimh.bin -o Cosmos.eki -f initldrkrl.bin initldrsve.bin
```
这节课的上机实操结果完成后我复盘了一下根据以前我对DOS的命令行的理解这类外部第三方的程序在DOS系统里如果没有做环境配置只需要直接进入到程序的目录里输入程序名即可直接执行该程序指令。
但是对比Linux系统里同样的事情即使是进入了这个程序所在的目录如果没有配置环境变量那想要执行那就一定要在该程序指令前加上路径 ./ 要不然Ubuntu会报错提示“文件找不到”。
如何配置环境变量,这个目前暂时还没有深入研究,先把程序能跑起来,有兴趣的同学可以继续深入探索。基本上解决这个程序指令的问题后,就能通关第十一课的代码运行了。
#### 第十二课避坑示范
之后,第十二课里,也有一个小坑,但同样看了前人经验就能避开。而且第十二课的上机运行只要能通过,后面的课程,一直到第三十三课,都是同样的上机运行方法。
这里我就用第十二课来做一个避坑的示范,给同学们提供一些线索。我们用第十二课的代码执行后面的命令,即可得到 hd.vdi 虚拟硬盘映像文件。
```bash
sudo make vboxtest
```
我在打卡群里,看到有的同学运行到这一步时,后面的操作掉坑里了,我第一次跑第十二课代码时也一样遇到这个坑。
如果你跟我的运行环境一样的是在Win10的实体机里安装VBox虚拟机软件在Vbox里安装Ubuntu的通过上面的指令拿到 hd.vdi 这个文件的时候操作步骤应该是在VBox虚拟机里新建一个操作系统命名 Cosmos(注意大小写)选择other + unkonwn 64位内存1024M虚拟硬盘选项记得一定要选不添加虚拟硬盘新建好后检查一下硬件加速是否如下面截图里的三项都有打开。
![图片](https://static001.geekbang.org/resource/image/a5/7b/a5de2e17153073dc6b5642667842ce7b.png?wh=1920x1080)
![图片](https://static001.geekbang.org/resource/image/26/ff/26386c73c47a02dd1716c73b04b3c0ff.png?wh=1920x1080)
从上面的截图里,我们可以看到,这个新建的名称叫 Cosmos 的空系统它是与我们之前安装的Ubuntu操作系统是并列的**不是在Ubuntu操作系统里面去套娃**。我在一开始也是尝试再Ubuntu操作系统里面去套娃后来发现行不通。
当你建立好这个Cosmos 空系统后,把前面生成的 hd.vdi 这个文件加载到这个Cosmos操作系统的硬盘如下图所示
![图片](https://static001.geekbang.org/resource/image/a5/14/a5dbfe8be51f5d6c05793fd690b75414.png?wh=1920x1080)
![图片](https://static001.geekbang.org/resource/image/59/df/59yyfa2a3e41e7327cfc810e01300cdf.png?wh=1920x1080)
![图片](https://static001.geekbang.org/resource/image/6c/e8/6c4600e299aa11558c419526b66c60e8.png?wh=1920x1080)
![图片](https://static001.geekbang.org/resource/image/b6/30/b60277ef0dc9e8a7260253fb62408f30.png?wh=1920x1080)
![图片](https://static001.geekbang.org/resource/image/91/16/916eac9b6e2ea3d97688197b0215b916.png?wh=1920x1080)
然后重新启动这个Cosmos你就能看到你的Cosmos操作系统顺利启动了。
![图片](https://static001.geekbang.org/resource/image/9f/e1/9f66630ee8978887cf0efcce923829e1.png?wh=1920x1080)
跟着上面演示的步骤,这节课的上机运行也就能通关了。
#### 魔改logo和背景图
记得我把第十二课的运行结果发到打卡群里时LMOS老师说能不能把这个Cosmos的启动Logo修改一下之前一直都是复制老师的代码对于这道附加挑战我也是跃跃欲试。
我当时在下载第十二课的代码时曾经进入每一个目录了解过目录和文件的结构看到过一个图像文件logo.bmp。
这个文件的图片预览也是 Cosmos 的 Logo我当时查看了这个文件的分辨率大小 340 \* 510去百度里找了一个图案修改成bmp文件格式并调整分辨率到 340 \* 510尝试替换Cosmos系统的启动Logo图像文件。
这里请注意:**替换前记得先把原始的logo.bmp文件保存备份**。
换成你的logo.bmp图片文件后记得要再次用sudo make vboxtest 生成一个新的 hd.vdi 文件。
然后把之前在vBox里建立的Cosmos系统删除要选择删除所有文件选项。删除后重新建立一个Cosmos的空系统再加载这个新的 hd.vdi 文件重新启动就能看到开机界面的logo是你刚才自己新换的图片了。
![图片](https://static001.geekbang.org/resource/image/b8/bf/b8cab75681ed8fff2f14261e219f86bf.png?wh=1920x1080)
同理在同一目录下还有一个background.bmp文件这是后面课程里操作系统进入界面后桌面背景图案就是调用这个文件。你也可以换成自己喜欢的图片记得留意一下分辨率1024\*768选择分辨率大小一致的图片文件更换那Cosmos的系统桌面背景就能由你自己做主了是不是很酷
![图片](https://static001.geekbang.org/resource/image/47/23/479efe96f950158903608d2d1dce5023.png?wh=1920x1080)
## 我的感悟
师傅领进门,修行在个人。在我的这趟学习旅程中,课后留言和课程群的讨论文档给我带来了很大的帮助和启发。我常常是从这些内容里不断扒拉,结合里面的参考信息,一点一滴找到我遇到上机实验问题的解决思路和方案,最终才把课程的代码跑起来。
只要你开始学习,耐心跟着课程一课一课推进,课程里有代码的,动手尝试运行,先把整个课程走一遍,把整体框架顺下来还是不难的。而且把握了思路,后面在编程方面遇到这类相关问题时,也比较容易知道在哪里可以找到解决方法。
其实每天学习一课、打卡一课的设计,也给我学习编程知识和其他学科带来了启发。学习其他科目的时候,我也尝试了“**每日打卡**”的方法。
具体就是用每天打卡的方法来推进学习计划,日拱一卒,每天花固定时间推进进度。相信我会完成从量变到质变的过程,不断拉近自己跟目标之间的距离。
在学习《操作系统实战45课》的期间我用每日打卡的方法用27天时间准备我的一个专业考试然后在第28天下午连考2门都已经通过而且还拿到了合格证书。
![图片](https://static001.geekbang.org/resource/image/78/38/78a74357579f542f6d1e3d9b97dayy38.png?wh=1920x1158)
遇到一门好的课程,遇到一个好的老师,遇到一个好的群助教和编辑小姐姐,对于任何一个求学者来说,都是一次非常好的学习机会。**这次学习过程,对我来说不只是学习和了解一下操作系统,可能这是一个杠杆,一个新的起点,让我的人生剧本有了一个新的开始**。
最后感谢LMOS老师给了我这次分享机会。为了完成这次输出我再一次复习了课程内容进一步加深了理解。
课后我会把王爽老师的汇编语言、还有C语言这两门编程语言重点学习打好基础二刷这门课的时候也能继续深入代码部分深入探索操作系统的搭建、实现。那时我应该也可以在每一节课的留言区留下更加深入的学习足迹。
1996年我第一次听身边的电脑发烧友说起Linux这个开源操作系统的传奇故事。当时听得热血沸腾但自己最终却一动也没动。现在回想起来如果当时有LMOS老师这样级别的大神带来这样一门手把手带我们学习和实操的课程加上我现在“一鼓作气”的学习劲头来学习那在编程这个领域里我可能会走得更高更远。
最近在学习打卡群和打卡小程序里,我看到很多同学坚持学习,打卡群大家也是互帮互助。关键的一些问题,老师也会出来解答,这样的学习机会可遇不可求。
我的分享先到这里感谢LMOS老师同时也祝选择学习这门课程的同学们能在操作系统这方面大展身手。**完成比完美更重要,而且,如果没有完成,那完美更不可能出现**