操作系統(tǒng)實戰(zhàn)45講--最全HellOS實驗指南
此篇專欄詳細記錄《極客時間-操作系統(tǒng)實戰(zhàn)45講》的第一個實驗HelloOS的實驗的全部過程。
筆者同時用虛擬機和物理機完成了實驗,基本將所有可能到的坑都踩了一遍,在此詳細記錄下所有的實驗步驟與要點供大家參考。
大家跟著每一步實現(xiàn),保證一定能夠?qū)嶒炌瓿?。先貼一張實驗成功圖。

專欄課程鏈接:https://time.geekbang.org/column/intro/411

一、初始環(huán)境配置
1.一個配置好的Linux系統(tǒng),筆者使用的是?Ubuntu 20.04.2.0 LTS,虛擬機使用的是Oracle VM
VirtualBox。在物理機上安裝了雙系統(tǒng)(Windows、Ubuntu),同時也使用虛擬機在Windows上安裝了Ubuntu。
對比在物理機和在虛擬機上完成實驗的兩種方式,我這里推薦在虛擬機上完成,可以少踩很多的坑。虛擬機上的實驗步驟基本和老師在文章中寫的一樣,而在物理機上就有很多出入,有很多地方因為個體電腦差異,需要進行一些修改,接下來對這兩種方式我都會進行講解。
具體虛擬機安裝與配置的問題,請大家參考網(wǎng)上的資料完成,我就不在這里進行贅述。以下我附上個人在配置時參考的一篇文章。
http://www.1zlab.com/wiki/python-opencv-tutorial/virtualbox-ubuntu-vm-install/
2.安裝nasm
sudo apt-get install nasm
3.安裝gcc,以下這個命令會一次性安裝包括gcc在內(nèi)的一系列編譯軟件
sudo apt install build-essential
以上nasm和gcc的安裝都是為之后make完成編譯和鏈接工作做準備
二、文件準備
1.將老師放在gitee上的代碼拷貝下來,網(wǎng)頁鏈接如下?
https://gitee.com/lmos/cosmos/tree/master/lesson02/HelloOS
2.打開terminal,使用"cd"命令進入拷貝下來的文件夾(或者我一般是進入對應文件夾后右鍵打開terminal),運行以下命令完成編譯鏈接得到HelloOS.bin
make -f Makefile
3.將生成的HelloOS.bin文件拷貝到/boot文件夾下。
其實不是一定強制要HellOS.bin放在/boot文件夾下才能夠完成啟動,這只是遵循慣例而已。將HellOS放在其他文件夾下,然后之后在grub.cfg文件中設置相應的HellOS.bin的地址即可。
拷貝可以使用"mv"命令,我以自己的情況舉例。在HelloOS.bin所在的文件夾打開terminal,使用以下命令進行文件移動
sudo mv HelloOS.bin /boot
4. 修改/etc/default/grub文件,將GRUB_TIMEOUT修改為30,設置進入默認啟動項的等候時間,默認值為10秒,我們將其延長。使用一下命令打開并編輯grub文件
sudo gedit /etc/default/grub

編輯完成后,使用以下命令更新文件設置
sudo update-grub
tips:sudo update-grub會將/boot/grub/grub.cfg文件給初始化,如果之前已經(jīng)添加過menuentry的同學需要重新添加。
menuentry 'HelloOS' {
.................
}
5. 在/boot/grub/grub.cfg中添加menuentry,這一步有非常多的坑,老師在文章中的講解比較簡單,但是在具體實現(xiàn)的時候有很多細節(jié)要注意。首先打開grub.cfg這個文件,使用以下命令
sudo gedit /boot/grub/grub.cfg
然后將下面這段專欄中已經(jīng)給出的配置粘貼到grub.cfg文件中,并保存
menuentry 'HelloOS' {
? ? ?insmod part_msdos #GRUB加載分區(qū)模塊識別分區(qū)
? ? ?insmod ext2 #GRUB加載ext文件系統(tǒng)模塊識別ext文件系統(tǒng)
? ? ?set root='hd0,msdos5' #注意boot目錄掛載的分區(qū),這是我機器上的情況
? ? ?multiboot2 /boot/HelloOS.bin #GRUB以multiboot2協(xié)議加載HelloOS.bin
? ? ?boot #GRUB啟動HelloOS.bin
}
5.1)設置 multiboot2?
multiboo2 '***' 填寫的HelloOS.bin的路徑,下面以HelloOS.bin放在/boot文件夾下進行舉例???
首先確認自己的/boot文件夾是獨立分區(qū)單獨掛載還是算在根分區(qū)的一部分(一般是配置系統(tǒng)時自己進行分區(qū)選擇的)。這一步設置不對,會在最后進入HelloOS系統(tǒng)時產(chǎn)生 "HelloOS.bin not found"這個錯誤
在命令行使用以下命令進行查看分區(qū)情況,我將這兩種情況下命令運行的結果都展示出來,大家對號入座即可。
df -h

如果是單獨掛載的情況,multiboot2設置如下
multiboot2 /HelloOS.bin #GRUB以multiboot2協(xié)議加載HelloOS.bin

如果是/boot是根分區(qū)一部分,multiboot2設置如下
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2協(xié)議加載HelloOS.bin
總結一下,如果/boot是單獨分區(qū)的,就可以去掉/boot。
5.2)設置insmod和set root=' '
set root=‘***’里面填寫的是存放HelloOS.bin的文件夾,在?三、文件準備 2.?中其實說過,HelloOS.bin文件放在哪里都是可以的,不一定要放在/boot文件夾下。而set root=''中填寫的就是存放HelloOS.bin的文件夾所在的磁盤分區(qū)。
在專欄的文章中,老師沒有詳細解釋set root=''的具體設置方法,而是給了一個例子,這里我給大家展示最完備的方法。因為我的HelloOS.bin存放在/boot下,所以我們接下來尋找/boot文件夾所在的磁盤分區(qū)。同時又分成/boot單獨分區(qū)與/boot在根目錄下兩種情況進行講解
接下來我們要進入grub的命令行模式找尋HelloOS.bin所在文件夾的磁盤分區(qū)。重啟虛擬機,在重啟時長按esc鍵調(diào)出grub引導界面(如果是物理機的請自行搞定調(diào)出grub引導界面,能用在物理機上裝linux的伙伴肯定能搞定這點小事)
然后按c鍵進入grub命令行交互模式,并輸入ls+回車,列出所有磁盤分區(qū)。下面附上一篇文章鏈接介紹msdos與gpt這兩種分區(qū)的區(qū)別
https://blog.csdn.net/free050463/article/details/81876521
接下來我們分情況討論,大家自己對號入座 ,靈活修改
5.2.1)虛擬機 + /boot文件夾屬于根目錄一部分,沒有單獨分區(qū)

在列出磁盤分區(qū)后,我們遍歷所有磁盤分區(qū)里,將分區(qū)內(nèi)文件全部列出來,直到找到看到HelloOS.bin文件為止。同時因為/boot文件夾沒有單獨分區(qū),那么具體的命令如下
ls (hdx,msdosx)/boot/

那么我們就找到了HelloOS.bin所在的文件夾/boot的磁盤分區(qū),也就確定了set root=''里面的參數(shù)為如下
set root="hd0,msdos5"
這是最簡單的情況,我猜也是老師實驗環(huán)境的情況。
然后我們發(fā)現(xiàn)磁盤采用msdos分區(qū)方式,所以insmod part_msdos?這個配置也就不需要修改了。下面給出完整設置
menuentry 'HelloOS' {
? ? ?insmod part_msdos #GRUB加載分區(qū)模塊識別分區(qū)
? ? ?insmod ext2 #GRUB加載ext文件系統(tǒng)模塊識別ext文件系統(tǒng)
? ? ?set root='hd0,msdos5' #注意boot目錄掛載的分區(qū),這是我機器上的情況
? ? ?multiboot2 /boot/HelloOS.bin #GRUB以multiboot2協(xié)議加載HelloOS.bin
? ? ?boot #GRUB啟動HelloOS.bin
}
5.2.2)物理機 + /boot文件夾單獨分區(qū)
現(xiàn)在我們就來到了一個比較坑的情況。我先附上grub命令行截圖

? ? ?
通過觀察可以發(fā)現(xiàn),我的物理機磁盤使用gpt分區(qū)方式,所以首先需要做如下修改?
insmod part_gpt
然后,因為我的物理機上/boot是單獨分區(qū)的,所以在進行查找時命令不需要加上/boot,具體命令如下
ls (hdx,gptx)/
我們發(fā)現(xiàn)HelloOS.bin在(hd0,gpt5)下面,所以現(xiàn)在可以設置set root了
下面我附上完整設置
menuentry 'HelloOS' {
? ? ?insmod part_gpt?#GRUB加載分區(qū)模塊識別分區(qū)
? ? ?insmod ext2 #GRUB加載ext文件系統(tǒng)模塊識別ext文件系統(tǒng)
? ? ?set root='hd0,gpt5' #注意boot目錄掛載的分區(qū),這是我機器上的情況
? ? ?multiboot2 /HelloOS.bin #GRUB以multiboot2協(xié)議加載HelloOS.bin
? ? ?boot #GRUB啟動HelloOS.bin
}
6. 保存grub.cfg,然后重啟,在grub引導界面選擇HelloOS!大工告成,Oh làààààààà
大家覺得這篇文章有幫助的話可以關注一波up,同時我也在更新LeetCode題解視頻,可以來逛逛喲??!
