制作可用grub引导Linux系统…

本文研究如何制作一个带有grub引导Linux系统的磁盘映像文件,并在磁盘映像文件中放置一个Linux bzImage,使得grub可以引导Linux,文章最后用qemu来验证磁盘映像文件的正确性。

备注:如果大家发现其中有问题欢迎留言或者email(cwsun@mail.ustc.edu.com.cn

实验平台:

系统:Linux-2.6.35.6-45.fc14.i686 GNU/Linux

虚拟机:QEMU emulator version 0.13.0(如果Fedora14系统中没有安装qemu,可用$sudo yum install qemu在线安装)

1 编译linux-2.6.38.tar.bz2

从ftp:ftp://ftp.kernel.org/pub/linux/kernel/v2.6/

下载linux-2.6.38.tar.bz2到新建的imag_dir目录,将linux-2.6.38.tar.bz2解压到img_dir目录中。

$cd image_dir

$tar xvf linux-2.6.38.tar.bz2

备注:本文使用的工作目录是img_dir。

采用i386的默认配置编译linux-2.6.38:

$make i386_defconfig

示意图如下:

 [转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

然后编译linux kernel:

$make

编译结果如下:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

2 制作用软盘引导的磁盘映像文件

需用指出的是,我们需用准备静态编译的一个应用程序init提供给linux kernel执行的后期调用。

例如编译一个输出结果为“Hello World!”的可执行文件:

//init.c

#include<stdio.h>

int main()

{

       printf(“Hello World!n”);

       return 0;

}

该可执行文件命名为init.c

$gcc –static –o init init.c

如果静态编译源码init.c时出现:

/usr/bin/ld: cannot find -lc

collect2: ld returned 1 exit status

解决方法:

$sudo yum install glibc-static

备注:

glibc-static.i686 :C library static libraries for -static linking.

libstdc++-static.i686: Static libraries for the GNU standard C++ library

安装这两个库文件:

$sudo yum install glibc-static libstdc++-static

 

建立引导根目录映像:

使用命令:

$dd if=/dev/zero of=initrd4M.img bs=4096 count=1024

$mkfs.ext3 initrd4M.img

解释:创建一个initrd 4M.img映像,大小为4M,每个扇区4K。创建结果如下:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

$mkdir rootfs

$sudo mount -o loop initrd4M.img rootfs

解释:

在image_dir目录下创建一个rootfs目录,将initrd4M.img挂在到rootfs目录下。

将init拷贝到initrd4M.img的目标根目录下(因为linux启动后期会在根目录中寻找一个应用程序来运行,在根目录下提供init是一种可选方案

$cp init rootfs/

准备dev目录:

$sudo mkdir rootfs/dev

linux启动过程中会启用console设备:

$sudo mknod rootfs/dev/console c 5 1

另外需要提供一个linux根设备,我们使用ram:

$sudo mknod rootfs/dev/ram b 1 0

$sudo umount rootfs

至此,一个包含简单应用程序的根目录initrd4M.img映像就准备好。

结果如下:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

使用命令:

$ qemu -kernel ./linux-2.6.38/arch/x86/boot/bzImage -initrd initrd4M.img -append "root=/dev/ram init=/init"

可以看到系统在qemu中启动起来,并且在启动后看到init的输出结果“Hello World!”。

示意图如下:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

3 用busybox建立根文件系统来运行linux

上面的方案是最简单的运行建立linux映像的方法,在上面的基础上,我们更进一步:下面我们用busybox建立根文件系统来运行linux。

我们在上面建立的initrd4M.img中建立根文件系统:

下载busybox-1.19.4.tar.bz2源码到image_dir 目录中。

$cd image_dir

$tar xvf busybox-1.19.4.tar.bz2

我们在busebox缺省编译的基础上,稍作修改

$make defconfig

$make menuconfig

修改如下配置:

设置busybox settings–>build options–>build busybox

              as a static binary(no share libs)

示意图:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

设置busybox settings> installation options as soft-links

示意图如下:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

接着编译busybox,产生根目录印象

$make

接着将编译的根目录映像安装到myinitrd4M.img映像文件中:

我们使用前面生成的initrd4M.img,将initrd4M.img挂载到rootfs目录下:

$sudo mount -o loop initrd4M.img rootfs

在busybox-1.19.4下,将编译生成的根目录映像安装到rootfs目录中(即安装到initrd4M.img的根目录中):

$cd busybox-1.19.4

$sudo make CONFIG_PREFIX=../rootfs/ install

卸载initrd4M.img映像:

$sudo umount rootfs

运行:

$ qemu -kernel ./linux-2.6.38/arch/x86/boot/bzImage -initrd initrd4M.img -append "root=/dev/ram init=/bin/sh"

此时可以进入busybox提供的shell环境,示意图如下:

[转载]制作可用grub引导Linux系统的磁盘映像文件 <wbr>一

如上图所示,进入shell后,我们可以动态加载运行init!

4 制作带grub启动的磁盘映像

待续。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值