制作可用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
示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
然后编译linux kernel:
$make
编译结果如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
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。创建结果如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
$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映像就准备好。
结果如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
使用命令:
$ qemu -kernel
./linux-2.6.38/arch/x86/boot/bzImage -initrd initrd4M.img -append
"root=/dev/ram init=/init"
可以看到系统在qemu中启动起来,并且在启动后看到init的输出结果“Hello World!”。
示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
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)
示意图:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
设置busybox
settings –>
installation options as soft-links
示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
接着编译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环境,示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
如上图所示,进入shell后,我们可以动态加载运行init!
4 制作带grub启动的磁盘映像
待续。。。。。。。
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
示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
然后编译linux kernel:
$make
编译结果如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
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。创建结果如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
$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映像就准备好。
结果如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
使用命令:
$ qemu -kernel
./linux-2.6.38/arch/x86/boot/bzImage -initrd initrd4M.img -append
"root=/dev/ram init=/init"
可以看到系统在qemu中启动起来,并且在启动后看到init的输出结果“Hello World!”。
示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
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)
示意图:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
设置busybox
settings –>
installation options as soft-links
示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
接着编译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环境,示意图如下:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
如上图所示,进入shell后,我们可以动态加载运行init!
4 制作带grub启动的磁盘映像
待续。。。。。。。
相关文章推荐
- 制作可用grub引导Linux系统的磁盘映像文件 二
- windows/Linux双系统重装grub修复Linux系统引导
- ubuntu10.04+win7双系统,重装win7后,恢复grub引导菜单以及命令行引导linux
- Linux下制作grub启动U盘,引导ubuntu LiveCD(或其他镜像)
- u盘安装linux,将grub安装到了u盘,导致没U盘系统无法引导启动的解决方法
- Linux系统启动过程及grub引导故障排错(一)
- Linux系统安装的引导镜像制作
- ubuntu10.04+win7双系统,重装win7后,恢复grub引导菜单以及命令行引导linux
- Linux系统中修复GRUB引导故障手动引导进入操作系统
- 用U盘制作启动盘来引导linux,修复grub
- 使用GRUB引导linux和winxp双系统
- 在Linux下配置GRUB实现多系统引导
- 在red hat Linux下配置GRUB实现多系统引导
- 用GRUB引导多LINUX系统的方法,建议新手看看
- 系统引导管理 之 用GRUB(包括WINGRUB)命令行模式引导安装Linux
- 双系统卸载linux的并去除Grub引导的办法
- 恢复LINUX多系统GRUB引导的方法
- 【Linux学习笔记十六】用户密码修复和GRUB引导错误无法进入系统解决办法
- 通过grub进入Linux系统,并修复引导
- Linux系统启动故障总结:单用户模式/GRUB引导故障/Linux救援模式