硬盤的專業術語中有:柱面,磁頭,扇區,每磁道扇區數這幾個概念。
我們制作一個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
這命令我就不解釋了,很簡單。
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的文件。
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 --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裡設置好,然後啟動就行了 應該會看到如下提示:
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