您的位置:首页 > 运维架构 > Linux

制作可用grub引导Linux系统…

2014-06-10 16:28 295 查看
原文地址:制作可用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

示意图如下:

 



然后编译linux kernel:

$make

编译结果如下:





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。创建结果如下:





$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映像就准备好。

结果如下:





使用命令:

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

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

示意图如下:





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)

示意图:





设置busybox
settings –>
installation options as soft-links

示意图如下:





接着编译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环境,示意图如下:





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

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

待续。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: