最近学习grub2相关知识,调试过程中使用虚拟机来避免不停的重启机器,这里使用bochs作为虚拟机。
1、制作一个硬盘镜像,用于安装我们将要调试的grub2;并作为我们的bochs中运行系统的引导盘;
dd if=/de v/zero of=hard-grub.img bs=512 count=524160
在当前目录先生成一个大约256M的hard-grub.img文件,524160(cylinkers=520,header=16,spt=63;520*16*63)
2、在hard-grub.img 上创建一个分区,并格式化为ext3,作为虚拟系统的boot分区;
fdisk hard-grub.img
输入m,可以查看fdisk所有命令
这里我们输入n->p->1->默认起始扇区->默认结束扇区->w结束命令
sudo losetup /dev/loop0 hard-grub.img (删除是losetup -d)
sudo kpartx -a /dev/loop0 (在/dev/mapper下生成分区设备文件loop0p1,删除用kpartx -d)
sudo mkfs.ext3 /dev/mapper/loop0p1 (格式化loop0p1分区)
sudo mount /dev/mapper/loop0p1 ~/hard-grub (挂在loop0p1)
3、安装grub2
sudo grub-install --boot-directory ~/hard-grub --force --allow-floppy /dev/loop0
安装成功,最后会显示No error reported,在我们挂载的hard-grub中会生成grub文件夹和一些文件。
4、以如下bochs.rc启动脚本,启动我们的虚拟机 bochs -f bochs.rc
megs:256
romimage:file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage:file=/usr/share/bochs/VGABIOS-lgpl-latest
#floppya:1_44=bochs.img,status=inserted
#boot:floppy
ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
ata0-master:type=disk,path="hard-grub.img",cylinders=520,heads=16,spt=63
boot:disk
log:bochsout.txt
mouse:enabled=0
display_library:sdl
至此说明我们的grub已经在虚拟磁盘上安装成功,并且识别到了我们的boot分区,msdos1
5、测试我们的grub引导功能
因为我们已经把我们的分区loop0p1作为我们的boot分区挂载到了hard-grub中,因此我们直接可以在ubuntu的hard-grub中,对虚拟机的boot分区进行操作。
把 ubuntu下的/boot/grub/grub.cfg 文件考到hard-grub/grub中。
把ubuntu下的/boot下的某一版本的相关文件考到hard-grub/boot中(boot目录需要自己创建,相关文件如config-xxx、System.map-xxx、vmlinz-xxxx、initrd.img-xxx)
启动虚拟机,看见引导界面和我们宿主机ubuntu引导界面一样了,着了由于grub.cfg内容与实际的虚拟机的配置不一致(我们只是单纯的拷过来的),系统不会引导成功,在grub下安"c",我们主动引导,界面如下:
这了vmlinuz可以自动补全,说明我们的grub已经找到了内核镜像,此处还未设置root文件系统。
boot,即可引导我们的内核。