背景
最近在學習操作系統,需要從零開始搭建系統,由于教程中給的虛擬機搭建的方式感覺還是過于重量級,因此研究了一下通過 qemu 模擬器,配合 grub 完成啟動系統的搭建。
qemu 介紹
qemu 是一款十分優秀的系統模擬器,可以用于模擬各種CPU架構硬件。你可以在 x86平臺上模擬出 arm 架構的 CPU并在其上運行程序,也可以反過來。總而言之,通過 qemu 可以忽略平臺間的架構差異,完成硬件模擬。
grub 介紹
grub 是一個開源的系統啟動器,用于對計算機進行初始化并引導至操作系統。
操作步驟
整個操作是在 wsl2 中執行的,需要提前安裝一些軟件:
sudo apt install -y qemu-system-x86 qemu-utils grub2
以下命令需要在 root 權限下執行,如果由于權限問題無法執行可以通過在前面加 sudo執行
1. 使用 dd 創建一塊虛擬硬盤
dd
命令在 linux 系統中主要用于創建文件如:
# 創建一個 file.bin 的空文件,寫入塊大小為 512字節,共2M
dd bs=512 count=20000 if=/dev/zero of=file.bin
# 創建一個隨機文件
dd bs=512 count=20000 if=/dev/random of=file.bin
這里使用該命令創建了一個 raw 類型的虛擬磁盤,qemu 可以直接使用這種類型的虛擬磁盤。
# 創建了一個虛擬磁盤文件,其實就是一個全是0 的空文件
dd bs=512 count=102400 if=/dev/zero of=hd.img
# bs=512 單次寫入 512字節
# count=102400 共寫入 102400次,合計 50MB
# if=/dev/zero 寫入源為 zero
# of=hd.img 指定輸出文件名稱
然后通過 losetup -f
將這個虛擬硬盤文件關聯為回環設備:
losetup -f hd.img
# -f 隨機找一個空閑的回環設備,并將 hd.img 附加到上面
losetup -a
/dev/loop0: [2080]:409 (/root/hd.img)
# 這里可以看到我們剛剛創建的虛擬硬盤文件被附加到了 /dev/loop0 這個回環設備上了
# 可以通過 losetup -D 移除關聯
通過 mkfs.ext4
將我們剛剛創建的的虛擬硬盤文件格式化為 ext4 磁盤文件系統類型
mkfs.ext4 hd.img
掛載我們剛剛初始化好的文件系統到當前系統上:
mkdir hdisk && mount hd.img hdisk
# 創建 hdisk 文件夾,并將 hd.img 虛擬硬盤掛載到這個文件夾上
到這里準備工作就完成了,現在我們為虛擬硬盤安裝 grub:
grub-install --boot-directory=./hdisk/boot --no-floppy --force /dev/loop0
# --boot-directory 指定啟動目錄
# --no-floppy 設置沒有軟盤
# --force 只要沒有發生錯誤,就繼續寫入,如果不指定 --force 可能會安裝報錯
# /dev/loop0 指定寫入的磁盤文件,這里填剛剛通過 losetup -a 查詢到的關聯的回環設備文件
現在我們已經可以通過 qemu 啟動這塊硬盤了,雖然啟動后直接是進入到 grub 界面:
qemu-system-x86_64 -hda hd.img
# qemu-system-x86_64 -drive file=hd.img,index=0,media=disk,format=raw 與上面命令效果一樣
當然這只是一個空界面,你可以用 grub 的一些命令做一些初步的操作
insmod part_msdos #GRUB加載分區模塊識別分區
insmod ext2 #GRUB加載ext文件系統模塊識別ext文件系統
set root='hd0' #注意boot目錄掛載的分區,這是我機器上的情況
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2協議加載HelloOS.bin
boot #GRUB啟動HelloOS.bin
如果想要重復練習上面的過程,可以在關閉 qemu 窗口后,接觸對虛擬硬盤的關聯:
umount hdisk
# 接觸 hdisk 目錄與 hd.img 的關聯
然后接觸 hd.img 與本地回環設備的關聯:
losetup -D
# 移除所有關聯的本地回環設備
losetup -a
# 查看是否已經解除關聯
最后刪除掉當前目錄中的 hd.img 和 hdisk 目錄.重新操作即可.
內核加載部分不做介紹.
參考資料
- 02 | 幾行匯編幾行C:實現一個最簡單的內核
- grub命令 – 交互式的管理GRUB引導程序
原文鏈接:https://www.linuxcool.com/grub