歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 使用Bochs和Grub建立可引導硬盤鏡像

使用Bochs和Grub建立可引導硬盤鏡像

日期:2017/2/28 13:46:55   编辑:Linux教程

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

Copyright © Linux教程網 All Rights Reserved