NOTE:
1)以grub 0.97版本,linux(redhad)下操作为例;
2)创建一个支持fat16文件系统的启动盘。
1. 下载
在这里可以下载到各种grub的源代码:ftp://alpha.gnu.org/pub/gnu/grub/ 2. 解压
在源码压缩包所在目录下执行: tar -xvzf grub-0.97.tar.gz 或在windows下使用winrar等工具将压缩包解开,放到linux指定目录下。
3. 编译
编译时执行命令: $ cd ./grub-0.97 (进入grub源码所在目录) 【可以在下面每个命令执行完成之后,进入相应的子目录看看在这个阶段生成了什么文件】
$ ./configure (将按照缺省配置设定编译配置,生成各个子目录中的Makefile文件;使用./configure --help命令可以得到各种选项配置参数;这个阶段主要查看Makefile文件,或者根据执行完configure命令后的输出查看验证一些文件是不是刚才生成的)
$ make (根据./configure的配置结果,生成grub需要的各种二进制文件;这个阶段重要查看各个目录中的二进制文件,比如.o, 可执行文件等)
【make install (这个命令没有试过,根据一些网文,应该是把make之后生成的一些二进制文件放到linux系统相应的目录下,比如:<根据shell变量的设置> /usr/share/grub/i386-pc 或 /usr/local/share/grub/i386-pc等目录)】
【由于我们不准备给linux使用这些生成的二进制文件,所以就不执行make install这个命令了,二进制文件已经在我手中了,我想怎样用就怎样用。】
4. Julien Lecomte's Blog ? How to make a Bochs disk image.htm 【http://www./blog/2007/07/3/】
根据标题,就知道这篇网文是干什么的了,一步一步跟着做吧。(这篇文章写的太好了,我这篇文章的类型应该算是“整理”,可惜这里没有这样的文章类型,就厚着脸皮“原创”一次吧:) 1)生成10MB大小的disk image
$ dd if=/dev/zero of=disk.img count=20160 2)在镜像文件上简历分区表(下面是每一步的操作步骤,操作时顺便注意一下命令的结果和输出等)
$ fdisk disk.img x -> Extra functionality
c 20 -> 20 cylinders h 16 -> 16 heads s 63 -> 63 sectors per track r -> Return to main menu n -> Create a new partition p -> Primary 1 -> Partition #1 1 -> First cylinder 20 -> Last cylinder a -> Set bootable flag 1 -> Partition number w -> Write partition to disk 10 cylinders * 16 heads * 63 sectors per track = 10080 blocks
20 cylinders * 16 heads * 63 sectors per track = 20160 blocks 【每道扇区数63一般不会变,磁头数一般也不会变,只有柱面数变化时才能扩大磁盘的容量】 $ hexdump -s 0x1BE -x -n 16 disk.img (man hexdump 可获得参数用途)
00001be 0180 0001 0f04 133f 003f 0000 4e81 0000 对比下列两组数据可以得到5MB和10MB disk image的区别(Julien Lecomte创建的是5M的,咱这里是10M的)
0180 0001 0f83 093f 003f 0000 2721 0000 (5M)
0180 0001 0f04 133f 003f 0000 4e81 0000 (10M) 分区标识:(使用 fdisk 的l命令可以列出所有的分区标识码,16进制)
83 for Linux 04 for FAT16 <32M 3)安装lookback设备(得到独立分区第一个扇区在disk image文件中的偏移,63 * 512 = 32256) $ fdisk -l -u disk.img You must set cylinders. You can do this from the extra functions menu. Disk disk.img: 0 MB, 0 bytes
16 heads, 63 sectors/track, 0 cylinders, total 0 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System
disk.img1 * 63 20159 10048+ 83 Linux $ losetup -o 32256 /dev/loop0 disk.img
4)把disk.img格式化fat文件系统
$ mkdosfs /dev/loop0 mkdosfs 2.8 (28 Feb 2001) Loop device does not match a floppy size, using default hd params $ hexdump -s 0x1BE -x -n 16 disk.img
00001be 0180 0001 0f83 133f 003f 0000 4e81 0000 可以看到格式化时,并不能改变分区格式,分区格式任然是0x83。 5)改变分区格式(因为我们想做的是使用fat格式的文件系统,而不是linux的,所以需要改变分区格式)
$fdisk disk.img t ->change a partition's system id 4 ->FAT16 <32M $ hexdump -s 0x1BE -x -n 16 disk.img
00001be 0180 0001 0f04 133f 003f 0000 4e81 0000 可以看到分区类型已经改变,由原来的0x83变成0x04;在使用fdisk不能改变分区格式时,可以使用二进制编辑工具改变它,这样不会出什么问题(我已经做过实验了)。
6)挂载disk.img
$ mount -o loop /dev/loop0 /mnt 7)安装grub
$ mkdir -p /mnt/boot/grub $ pwd /os/grub-0.97 $ cp ./stage1/stage1 ./stage2/fat_stage1_5 ./stage2/stage2 /mnt/boot/grub/
$ vi /mnt/boot/grub/grub.conf default=0 timeout=500
title=My Kernel (2010.03.20)
root (hd0,0) kernel /kernel.bin (需要把我们自己的内核镜像kernel.bin copy到disk.img第一分区文件系统的根目录下) $ cp /mnt/boot/grub/grub.conf /mnt/boot/grub/menu.lst
有了menu.lst才能显示选择菜单,否则(只有grub.conf)只是进入grub的命令状态。 8)解挂disk.img
$ umount /mnt 9)卸载loseup设备
$ losetup -d /dev/loop0 10)完成grub安装
$ pwd /os/grub-0.97/grub $ ./grub --device-map=/dev/null
device (hd0) ../disk.img (disk.img在上一级目录/os/grub-0.97中)
geometry (hd0) 20 16 63 (指明磁盘结构) root (hd0,0) setup (hd0) quit 执行过程中的log:
grub> device (hd0) disk.img Error 15: File not found
grub> device (hd0) ../disk.img
grub> geometry (hd0)
drive 0x80: C/H/S = 620/128/63, The number of sectors = 20160, ../disk.img Partition num: 0, Filesystem type is fat, partition type 0x4 grub> geometry (hd0) 20 16 63
drive 0x80: C/H/S = 20/16/63, The number of sectors = 20160, ../disk.img Partition num: 0, Filesystem type is fat, partition type 0x4 grub> root (hd0,0)
Filesystem type is fat, partition type 0x4 grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/fat_stage1_5" exists... yes Running "embed /boot/grub/fat_stage1_5 (hd0)"... 16 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.l st"... succeeded Done. 11)设置.bxrc 文件,让bocks使用刚刚做好的grub启动盘。
文件内容:
megs: 32 romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000 vgaromimage: $BXSHARE/VGABIOS-elpin-2.40 ata0-master: type=disk, path=f.img, mode=flat, cylinders=20, heads=16, spt=63 boot: disk log: bochsout.txt mouse: enabled=0 keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map 5. 把自己的kernel.bin copy到disk.img上fat系统的根目录中,我们的kernel(支持multi boot)便可以被引导起来了。
|
|
来自: dwlinux_gs > 《制作系统镜像》