一 創建虛機測試用的磁盤鏡像文件
使用bximage命令創建一個10M的hdd.img(如果沒有bximage,安裝bochs)。
當然,也可以使用dd命令來創建,這里不在贅述,可以參考man dd。
?
centos source命令。接著,創建一個連接到hdd.img 文件的loop device。
losetup /dev/loop1 hdd.img
?
在創建完loop device之后,你可以同過/dev/loop1 設備文件訪問該hdd.img 鏡像文件,如同訪問一個真正的塊設備文件一樣。 所以,我們通過fdisk來對hdd.img 進行分區。
centos7 grub,fdisk /dev/loop1
為方便,在這里僅分一個primary分區包含所有扇區,建立分區后分區表如下:
Command (m for help): p
Disk /dev/loop1: 104 MB, 104767488 bytes
255 heads, 63 sectors/track, 12 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b23eaac
????? Device Boot????? Start???????? End????? Blocks?? Id? System
/dev/loop1p1???????????? ? 1????????? 12?????? 96358+? 83? Linux
可以看到,磁盤文件hdd.img 共有CHS為12/255/63。
這里的start 和 end是以cylinder為單位的。
為了以更細的粒度來查看分區表,通過給fdisk的-ul選項,以扇區問單位查看分區表:
$ sudo fdisk -ul /dev/loop1
Disk /dev/loop1: 104 MB, 104767488 bytes
255 heads, 63 sectors/track, 12 cylinders, total 204624 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b23eaac
????? Device Boot????? Start???????? End????? Blocks?? Id? System
/dev/loop1p1????????????? 63????? 192779?????? 96358+? 83? Linux
?
接下來,在新建的分區上創建文件系統。但是當前/dev/loop1 指向的是整個hdd.img文件,而不是hdd.img的分區loop1p1,所以,需要創建另外一個loop device來指向該分區,進而可以對該分區建立文件系統,就像是多一個真正的硬盤進行的操作一樣。
從上面的輸出結果可以看到,第一個分區是從扇區63開始,硬盤每一個分區的大小512 byte,所以第一個扇區的起始位移為63*512=32256。
到這里我們就可以將一個loop device連接到hdd.img的第一個扇區。
losetup –o 33256 /dev/loop2 /dev/loop1
?
然后,就可以通過訪問/dev/loop2對hdd.img的第一個扇區進行操作。通過mkfs.ext2命令為/dev/loop2建立文件系統。
mkfs.ext2 /dev/loop2
在為/dev/loop2 創建文件系統之后,就可以將其mount到系統的掛載點,從而可以對其進行文件相關的操作。
我們將/dev/loop2 掛載到/mnt/hdd 掛載點下。
mount /dev/loop2 /mnt/hdd
?
在這里我們選用grub 0.97作為bootloader。
創建相應的grub相關的目錄
mkdir –p /mnt/hdd/boot/grub
cp –r? /usr/lib/grub/i386-pc/stage1 /usr/lib/grub/i386-pc/stage2 /mnt/hdd/boot/grub
cp –r the_kernel /mnt/hdd
接下來,到/mnt/hdd/boot/grub 目錄下,創建menu.lst 文件
default 0
timeout 10
title=YuboOS
root (hd0,0)
kernel /bzImage?
接下來,我們將安裝grub bootloader到hdd.img 的MBR中去。
grub –device-map=/dev/null
這會到grub command line界面
在grub shell的提示符下執行命令:
grub>device? (hd0) hdd.img
grub>root (hd0,0)
grub>setup (hd0)
注意,這里device的參數是hdd.img文件,而不是loop device,這是因為grub 0.97的bug原因。
到此,整個虛擬機的磁盤鏡像文件建立完畢。
你可以將hdd.img的第一個分區一直掛載在/mnt/hdd 掛載點下,這樣你就可以隨時更新kernel,然后修改menu.lst 文件,從而可以達到測試kernel的目的。
?
二 使用bochs軟件來學習調試kernel。
我們假設已經有一個創建好的hdd.img可以使用。
為了達到可以調試kernel目的,我們需要自己動手編譯bochs,以為目前一般隨linux 發行版一起的bochs沒有打開其internal debugger或沒有安裝gdb-stub。
?
在這里使用的是bochs的2.4.6版本。編譯和安裝的一般過程是./configure && make && make install。
注意,為了使用bochs的內部調試功能,需要在configure 階段加上 –enable-debugger 和—enable-disasm 選項。
?
接下來,編輯bochs虛機配置文件: bochsrc
1: megs: 32
2: romimage: file=$BXSHARE/BIOS-bochs-latest
3: vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
4: vga: extension=vbe
5: floppya: 1_44=a.img, status=ejected
6: floppyb: 1_44=b.img, status=ejected
7: ata0-master: type=disk, path=hdd.img, cylinders=203, heads=16, spt=63
8: boot: c
9: log: bochsout.txt
10: mouse: enabled=0
11: #ips: 15000000
12: clock: sync=slowdown
13: vga_update_interval: 150000
?
最后,使用bochs –f bochsrc 就可以運行虛機了。