首頁 > 軟體

使用Bochs和Grub建立可引導硬碟映象

2020-06-16 17:27:49

Bochs,發音同box,是我非常喜歡的虛擬機器,靈活易用方便設定,功能極強,用來偵錯Linux核心是非常合適的。這篇博文主要講解如何建立硬碟映象,並且將Grub安裝上去,最後的結果就是bochs啟動後能進入到grub引導介面。下一篇文章再講解如何在映象上安裝Linux核心

硬碟基礎知識

硬碟的專業術語中有:柱面,磁頭,磁區,每磁軌磁區數這幾個概念。

  1. 每個碟片有兩個磁頭,分別位於兩面上,從0開始依次編號,英語中稱為Heads,漢語中一般翻譯為0面、1面......一般來說硬碟有16個盤面(磁頭)
  2. 每個面都有很多同心圓軌道稱為磁軌,從外向內依此編號為0道、1道......,英語中稱為Tracks
  3. 所有盤面上半徑相同的磁軌正好組成一個圓柱麵,稱為柱面,和磁軌編號相同,英語中稱為Cylinders
  4. 每個磁軌上劃分出很多扇形區域,稱為磁區,每個磁軌上的磁區都從1開始編號,每個磁區512位元組,英語中稱為Sectors。一個磁軌一般有63個磁區。
  5. 磁碟定位使用CHS,即柱面、磁頭、磁區,或稱為磁軌、盤面、磁區。通常所說的0面0道1磁區指的就是第0面(第0號磁頭)、第0磁軌(柱面)、第1磁區。
  6. 一個需要注意的地方:每磁軌磁區編號從1開始,全硬碟絕對磁區編號從0開始。
  7. 整塊硬碟可以分為很多分割區,每個分割區可以格式化為不同的檔案系統。每個分割區的第1磁區(相對該分割區開始來講),叫做引導磁區(Boot Sector)。在全硬碟的第0磁區,也有一塊引導磁區,為了以示區別,將之稱為主引導磁區(Master Boot Sector,MBR)。MBR裡面前446位元組是載入程式,後面緊跟64位元組的分割區表,再加上2位元組的引導標誌正好是512位元組。每個分割區的分割區表表項為16位元組,整個分割區表可以記錄四個分割區的資訊,所以一塊硬碟只能有4個主分割區。引導磁區一共5個(4個分割區的+1個MBR)
  8. 每個柱面的磁區數為:63x16,又因為每個磁區512位元組,所以一個柱面共計63x16x512=516096B

製作空白硬碟映象

我們製作一個50M左右的映象,16個磁頭,每磁軌磁區數63,即一個柱面516096個位元組,大約需要100個柱面。

dd if=/dev/zero of=hd.img bs=516096c count=100

if是輸入,of是輸出,516096c後面的字母c表示單位是1,即516096個位元組,寫入100次,每次516096個位元組。 空白映象製作完畢。

初始化磁碟並分割區

fdisk -u -C100 -S63 -H16 hd.img

指定好柱面數、每磁軌磁區數、磁頭數。 這個命令的操作如下:

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x49b37849.
Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
     switch off the mode (command 'c').

Command (m for help): c #關閉DOS Compatibility flag,不關閉也沒事
DOS Compatibility flag is not set

Command (m for help): n #新建分割區
Command action
e   extended
p   primary partition (1-4)
p   #型別為主分割區
Partition number (1-4): 1   #該分割區是第一個分割區,實際上我們就建立這一個分割區
First sector (1-100799, default 1): 63  #該分割區從硬碟絕對第63磁區開始,留下前面的0-62磁區給grub等載入程式,這是DOS時代留下來的約定。
Last sector, +sectors or +size{K,M,G} (63-100799, default 100799): #直接回車,讓該分割區直至硬碟最後的磁區結束
Using default value 100799

Command (m for help): w #寫入分割區資料並退出
The partition table has been altered!

Syncing disks.

掛載硬碟映象

losetup -o 32256 /dev/loop0 hd.img

-o 32256是跳過63x512=32256個位元組再掛載,還記得第一分割區是從硬碟映象絕對第63磁區開始的吧,這一步就是跳過0-62分割區,即跳過32256個位元組,直接把第一分割區掛載到loop0上。 這一步之所以不用mount是因為mount是用來掛載檔案系統的,現在硬碟映象第一分割區裡還沒有檔案系統。losetup命令用來將硬碟分割區掛載到loop0裝置上。

格式化檔案系統

mkfs.ext3 /dev/loop0

將掛到loop0上的分割區格式化為ext3檔案系統

掛載檔案系統

現在檔案系統已經建立,是時候將之掛載了

mount -t ext3 /dev/loop0 /mnt

這命令我就不解釋了,很簡單。

建立boot和grub目錄

mkdir -p /mnt/boot/grub

將當前系統上的grub程式檔案複製進去,

cp /boot/grub/stage1 /boot/grub/stage2 /boot/grub/e2fs_stage1_5 /mnt/boot/grub/

這一步你也可以自己下載grub原始碼編譯,編譯完後也會出現stage1、stage2、e2fsstage15這幾個檔案,這是grub的核心程式,stage1待會兒會被放到MBR裡,開機時BIOS會把MBR裡的stage1取到記憶體裡執行,之後stage1會取出stage2檔案執行,然後是e2fsstage15。

我們這裡不自己編譯了,直接使用宿主系統CentOS 6.4的檔案。

建立grub.conf檔案

cp /boot/grub/grub.conf /mnt/boot/grub/

組態檔依然借用宿主系統CentOS 6.4的。

ln -s /mnt/boot/grub/grub.conf /mnt/boot/grub/menu.lst

這個軟連結如果不建立,待會兒開機進入grub時不會出現啟動項選擇介面

解除安裝檔案系統

umount /mnt/

解除安裝硬碟分割區

losetup -d /dev/loop0

最終安裝grub

grub --device-map=/dev/null

執行後依次輸入下面的內容敲回車。

grub> device (hd0) hd.img
grub> geometry (hd0) 100 16 63  #柱面數、磁頭數、每磁軌磁區數
grub> root (hd0,0)
grub> setup (hd0)
grub> quit

啟動bochs

在bochs裡設定好,然後啟動就行了 應該會看到如下提示:

ata0 master: Generic 1234 ATA-6 Hard-Disk (  49 MBytes)

Press F12 for boot menu.

Booting from Hard Disk...
failed to read image
Press any key to enter the menu


Booting CentOS (2.6.32-358.el6.i686) in 0 seconds...
Error 15: File not found

Press any key to continue...

這介面很正常,畢竟我們只裝了grub,作業系統根本不存在,它能找到檔案就怪了。按下任意鍵,就能看到grub啟動項選擇介面了。因為我們的grub程式檔案和組態檔全部來自於宿主系統,所以這裡看到的啟動項也和宿主系統一樣是CentOS 6.4,只不過這個啟動項所指定的核心檔案不存在而已。

這篇博文就寫到這裡,下一篇http://www.linuxidc.com/Linux/2016-11/137354.htm我們將核心映象寫入硬碟映象,這樣就能啟動核心了,不過要想真正執行Linux系統還是很麻煩的,因為後面還要向硬碟映象內寫入檔案系統裡面的主要檔案,比如/bin/sh之類的。

CentOS 6.0 原始碼 編譯 安裝 Bochs  http://www.linuxidc.com/Linux/2012-12/76952.htm

openSUSE 安裝Bochs 2.6  http://www.linuxidc.com/Linux/2012-11/75156.htm

Linux0.11 執行環境搭建以及調式--Bochs  http://www.linuxidc.com/Linux/2012-11/73902.htm

Ubuntu 12.04安裝帶偵錯功能的Bochs http://www.linuxidc.com/Linux/2012-10/73251.htm

Ubuntu安裝Bochs過程中遇到的問題及解決方法 http://www.linuxidc.com/Linux/2012-05/61422.htm

Ubuntu 14.04 LTS 安裝和設定Bochs  http://www.linuxidc.com/Linux/2016-10/135905.htm

Ubuntu上使用Bochs http://www.linuxidc.com/Linux/2016-10/135903.htm

使用bochs和gdb聯合偵錯Linux核心  http://www.linuxidc.com/Linux/2016-11/137342.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137353.htm


IT145.com E-mail:sddin#qq.com