1、基于 Linux 源代码及 Busybox 源代码制作精简可启动内核镜像技术实验方法总结熊海泉一、需要准备的东西.1Linux 内核源代码 .1Busybox 源代码 .2Unetbootin 工具 .2二、制作 Linux 内核镜像及内存虚拟盘根文件系统 .2Linux 内核镜像文件 bzImage 的编译制作 .2基于 Busybox 的根文件系统虚拟盘 initrd.gz 的制作 .5三、利用 unetbootin 工具制作可启动 U 盘 .7unetbootin 工具的获取与安装 .7unetbootin 使用 .7四、制作可启动的光盘镜像与磁盘镜像.9制作一个基于 grub 引导的
2、ttylinux LiveCD.9制作一个基于 grub 引导的 ttylinux 磁盘镜像 .10五、基于 Qemu 模拟器的运行 .111,基于如下命令运行刚才制作的 ttylinux 可启动光盘镜像 .112,以下为启动界面.113,以下为基于 Qemu 模拟器的 ttylinux 运行界面 .12六、基于 Bochs X86 PC 模拟器的运行 .121,基于如下命令运行刚才制作的 ttylinux 可启动光盘镜像 .122,以下为在 Bochs 模拟器中的启动界面.133,以下为基于 Bochs 模拟器的 ttylinux 运行界面 .14一、需要准备的东西Linux 内核源代码下载
3、地址 http:/www.kernel.org/pub/linux/kernel/v2.6/这里下载的是 linux-2.6.36.2.tar.bzBusybox 源代码下载地址 http:/ busybox-1.18.0.tar.bz2Unetbootin 工具下载地址 http:/ Fedora 13 中直接用下面的命令行安装:#yum install unetbootin二、制作 Linux 内核镜像及内存虚拟盘根文件系统Linux 内核镜像文件 bzImage 的编译制作 1、bzImage 的制作将下载下来的内核源代码压缩包拷贝到/study/目录下,然后进入到这个目录将其解压,命令
4、如下:#tar jxvf linux-2.6.36.2.tar.bz2然后创建一个目录,用来保存编译内核产生的目标文件#mkdir linux-2.6.36.2-objlinux-2.6.36.2-obj 现在是一个空目录,在编译内核时会将目标文件输出保存到这个目录下。然后我们开始编译 linux 内核编译配置,输入如下所示的命令:#cd /study/linux-2.6.36.2(进入到内核源码树目录)#make O=/study/linux-2.6.36.2-obj menuconfig (配置内核)这里首先将宿主机的/boot 目录下的 config-2.6.33.3-85.fc13.x
5、86_64 这个配置文件拷贝到/study/linux-2.6.36.2-obj/.config,作为下面内核编译配置的基础。#cp /boot/config-2.6.33.3-85.fc13.x86_64 /study/linux-2.6.36.2-obj/.config配置内核时,里面的选项有很多,如果不确定的话就将所有选项都编译进内核,当然最好能针对性的配置内核,这样产生出的内核镜像不至于太大。还有一点就是配置时一定要将选定的选项编译进内核,而不要编译成模块,也就是说在前面带有 M 选项时,要么直接静态编译进内核,要么去掉。同时,为了支持initrd 内存盘文件系统,有两个选项是必须的。
6、一个是 General Setup Initial RAM filesystem and RAM disk support另一个是 Device Drivers Block Devices RAM block device support这个选项的子选项保持默认就可以了,如下图所示:然后退出配置界面,在退出时会提示你是否保存刚才的配置,选择 yes 就可以了(因为我们在配置时指明了 O=/study/linux-2.6.36.2-obj 目录,所以配置文件会保存到这个目录下,文件名为.config)然后在 linux-2.6.36.2 目录下执行#make mrproper接下来我们开始编译内
7、核:#make O=/study/linux-2.6.36.2-obj j 16 (生成内核镜像,采用多线程编译,4 核八线程故开启-j 16 选项,加快编译速度)通常,我们编译内核是为了更新内核,但这里我们只是为了编译出一个内核镜像,所以就不调用 make install 命令来安装内核了。好!内核编译完成,我们将编译好的内核镜像拷贝到主目录下,以供后面使用。# cp /study/linux-2.6.36.2-obj/arch/x86/boot/bzImage /study/bootdisk (拷贝到此目录下将来由 unetbootin 制作启动盘)基于 Busybox 的根文件系统虚拟盘
8、 initrd.gz 的制作接下来我们开始编译 busybox。 (我的 busybox-1.18.0.tar.bz2 存放到了/study目录下)#tar jxvf busybox-1.18.0.tar.bz2 (解压 busybox 压缩包)#cd busybox-1.18.0 (进入到解压后的 busybox 源码目录)#make menuconfig (配置 busybox)注意配置时,一定要选择静态链接选项,该选项位于:Busybox Settings Build Options Build Busybox as a static binary#yum install libseli
9、nux-static libsepol-static glibc-static(具体根据系统可能还需要其它的包,这是我的系统中需要安装的几个包,是链接 busybox 所需要的)接下来,我们安装 busybox#make install (busybox 默认安装到了其源码树目录的名字为_install 的目录中)#cd _install (进入安装了 busybox 的目录)当我们进入了 busybox 后发现了熟悉的 linux 目录结构,但只有这些是不够的还需要手工添加一些基本的配置文件。这时,我们处在/root/busybox-1.18.0/_install 目录下。好了,开始我们的配
10、置#mkdir proc sys etc dev (创建四个空目录,linux 内核需要)#cd dev#mknod console c 5 1 (创建一个控制台字符设备文件)#mknod null c 1 3 (创建一个 0 设备文件)#cd .#cd etc# vim fstab (输入如下图内容)proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0#mkdir init.d# vim init.d/rcS (输入如下内容)#!/bin/shMount -a#chmod +x init.d/rcS (给 rcS 文件加上可执行权
11、限)#vim inittab (输入如下内容):sysinit:/etc/init.d/rcSconsole:respawn:-/bin/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount a -r#cd .#pwd (打印当前目录)/study/busybox-1.18.0/_install此时表明我们处在 busybox 安装文件的根目录下#rm linuxrc (删除 linuxrc 链接文件)然后新创建一个指向 busybox 文件的链接文件,如下图所示:#ln sv bin/busybox initinit-bin/busybox我们输入如
12、下图所示命令来创建 initrd 镜像.#find .| cpio quiet H newc o |gzip -9 n /study/bootdisk/initrd.gz至此就得到了两个镜像文件:bzImage : linux 内核镜像文件initrd.gz : 内存盘根文件系统镜像文件三、利用 unetbootin 工具制作可启动 U 盘unetbootin 工具的获取与安装unetbootin 使用通过下面的命令打开 unetbootin,一定要加-showcustom=y 选项,否则不会出现自定义那个选项#unetboot -showcustom=y在自定义里面选择内核为刚才我们制作的
13、bzImage,initrd 为刚才制作的initrd.gz。我这里是把它们安装在了 U 盘上,这样方便携带。然后确定,就会把我们刚才的东西装在 U 盘上,最后会出现一个重启的画面,你就可以重新启动,把启动项改为从 U 盘启动,就可以进入自己制作的 linux 了。四、制作可启动的光盘镜像与磁盘镜像制作一个基于 grub 引导的 ttylinux LiveCD1、创建 livecd 目录作为制作 LiveCD 的根的目录,并在其中创建 grub 所需的目录# mkdir -pv /study/livecd/ttylinux,boot/grub2、复制 grub 可引导的光盘所需的引导程序# c
14、p -rv /usr/share/grub/x86_64-redhat/* /study/livecd/boot/grub3、将编译制作好的内核镜像 bzImage 以及内存虚拟盘根文件系统 initrd.gz复制到/study/live/ttylinux 目录下4、为 grub 建立配置文件# vim /study/livecd/boot/grub/grub.conf添加如下内容:default 0timeout 10title ttylinux for Bochs & Qemu (Made by Xiong Haiquan)root (cd)kernel /ttylinux/bzImage
15、 load_ramdisk=1 prompt_ramdisk=0ramdisk_size=8192 ro root=/dev/ram0initrd /ttylinux/initrd.gz5、在/study 目录下执行如下命令,创建 livecd 镜像:# mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4-boot-info-table -o ttylinux.iso livecd好了,到此为止一个 grub 引导的 ttylinux.iso 光盘镜像,可以在 Bochs 和Qemu 中运行启动。制作一
16、个基于 grub 引导的 ttylinux 磁盘镜像五、基于 Qemu 模拟器的运行1,基于如下命令运行刚才制作的 ttylinux 可启动光盘镜像./qemu-0.13.0/x86_64-softmmu/qemu-system-x86_64 cdrom ttylinux.iso boot d2,以下为启动界面3,以下为基于 Qemu 模拟器的 ttylinux 运行界面六、基于 Bochs X86 PC 模拟器的运行1,基于如下命令运行刚才制作的 ttylinux 可启动光盘镜像./bochs-2.4.5/bochs f bochsrc.txt其中配置文件 bochsrc.txt 的主要内容
17、为,关键是光盘启动,颜色为红色部分memory:guest=512,host=256romimage: file=$BXSHARE/BIOS-bochs-latestvgaromimage: file=$BXSHARE/VGABIOS-lgpl-latestata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14ata0-master: type=cdrom, path=“ttylinux.iso“, status=insertedboot: cdromlog: out.txtmouse: enabled=0keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map2,以下为在 Bochs 模拟器中的启动界面3,以下为基于 Bochs 模拟器的 ttylinux 运行界面