利用busybox做linux可以让我们了解linux的启动过程,以后在linux出错的时候可以明白出错在什么地方。其实Android手机root后用RE文件管理器查看的时候,你会看到busybox,这么说... ...你懂得。
制作环境:VMware Workstation 9
宿主机内核版本:linux-2.6.28.5
微型linux内核版本:linux-2.6.38.5
busybox版本:busybox-1.20.2
一、为小linux建立一个容身之所
在宿主机上添加一块10G大小的IDE硬盘,然后fdisk /dev/hda ,建立三个分区。第一个50M的主分区左右就OK,作为boot分区;第二个512M左右就行,作为新系统的根分区。第三个分区128M,调整分区类别为82,即Swap类别。将第一块分区使用mke2fs -j /dev/hda1 命令格式化后挂载至/mnt/boot目录中,第二块使用mke2fs -j /dev/hda1 命令格式化后挂载至/mnt/sysroot目录中,将两个分区格式化为Ext3文件系统。
二、为新系统提供一个内核
小linux在小也是linux,它同样要有kernel才能跑起来。我使用的是linux-2.6.38.5的内核。
# tar xf linux-2.6.38.5.tar.bz2
# ln -sv linux-2.6.38.5 liunx
# cd linux
# cp /usr/src/linux-2.6.28.10/.config linux-2.6.38.5 #复制系统的内核配置文件至linux-2.6.38.5目录下
# make menuconfig #编译需要的功能做进内核或做成模块
这里使用的VMware虚拟机,我们就要选择网卡的pcnet32驱动程序,将其直接做进内核中
选择小linux支持的文件系统,将Ext3做进内核。
# make SUBDIR=arch/
# cp linux-2.6.38/arch/x86/boot/bzImage /mnt/boot/vmlinuz #将编译后的内核文件拷贝到/mnt/boot下作为小linux的内核。
三、编译busybox
获取busybox的最新版本后,将其解压至当前目录(随便找个地方放下,只要能记着路径就行)
# tar xf busybox-1.20.2.tar.bz2
# cd busybox-1.20.2
# mkdir include/mtd
# mkdir /root/linux-2.6.38.5/include/mtd/ubi-user.h include/mtd/ #宿主机用的linux-2.6.28的内核,busybox编译的时候会报错,要用2.6.38.5内ubi-user.h文件就没问题了。(这个是什么原因笔者也不明白,有懂得说下呗)
# make menuconfig
此处需要选择 Busybox Settings --> Build Options --> Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;也可以不选择此项,在完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可,只是有点麻烦。
# make install #选择功能之后就可以开始安装busybox了
# cp -r busybox-1.20.2/_install/* /root/busybox #安装后会有一个默认的_install目录,我们将其copy至/root/busybox目录下,以便创建initrd
四、制作initrd
# cd /root/busybox
1、建立文件系统必备的文件目录
# mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot
2、创建两个必备的设备文件
# mknod dev/console c 5 1 #这里是在当前目录下创建的
# mknod dev/null c 1 3
3、为initrd编写init程序
# rm linuxrc #这个是里边的链接文件,没有用删了就行
# vim init # 在busybox目录下
内容为:
#!/bin/sh # busybox中没有bash,这里我们只能用sh
mount -t proc proc /proc # 挂载proc
mount -t sysfs sysfs /sys # 挂载sys伪文件系统
insmod /lib/modules/jbd.ko # 如果ext3已经编译进内核了,这里的添加模块就不用了
insmod /lib/modules/ext3.ko
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot # 重新挂载根文件系统
exec switch_root /mnt/sysroot /sbin/init # 更换真正的根文件系统
给此脚本执行权限:
# chmod +x init
4、制作initrd
# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz
五、制作真正的根文件系统
# cp -r busybox-1.20.2/_install/* /mnt/sysroot/
# cd /mnt/sysroot
# rm linuxrc
1、建立根文件系统rootfs所需的文件:
# mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib mnt/sysroot
2、创建两个必要的设备文件:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
3、建立系统初始化脚本文件
# vim etc/rc.d/rc.sysinit
编辑内容:
#!/bin/sh
echo -e "\tWelcome to \033[31mEarl’s\033[0m Linux"
echo -e "Remounting the root filesystem ..." #重新挂载根文件系统为读写
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /
echo -e "Creating the files of device ..." #挂载设备文件
mdev -s
echo -e "Mounting the filesystem ..." #挂载文件系统
mount -a
swapon -a
echo -e "Starting the log daemon ..." #开启日志系统
syslogd
klogd
echo -e "Configuring loopback interface ..." #开启网卡的IP地址
ifconfig lo 127.0.0.1/24
ifconfig eth0 172.16.191.9/16
给予脚本执行权限
# chmod +x etc/rc.d/rc.sysinit
4、配置init及其所需要的inittab文件
# cd /mnt/sysroot
# rm linuxrc
为init进程提供配置文件
# vim etc/inittab
编辑内容:
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、为文件系统添加配置文件
# vim etc/fstab
编辑内容:
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
6、我们在rc.sysinit中启动了日志系统,我们要为日志进程建立配置文件,指定将日志发送至/var/log/messages文件中
# vim etc/syslog.conf
编辑内容:
*.info /var/log/messages
六、创建系统所需的引导程序
# grub-install --root-directory=/mnt /dev/hda #为小linux安装grub到/mnt下
为grub建立配置文件:
# vim /mnt/boot/grub/grub.conf
编辑内容:
default 0
timeout 3
color light-green/black light-magenta/black
title Earl’s Linux (2.6.38.5)
root (hd0,0)
kernel /vmlinuz ro root=/dev/hda2 quiet
initrd /initrd.gz
七、系统同步
# sync #这一步非常重要,要等待一段时间,保证系统同步,不然可能导致小linux文件系统错乱,最好多sync几次。
八、创建一个新的虚拟机,选择系统时选择一个已存在的磁盘,将刚做的小linux在的硬盘加进去。就可以启动新的linux了。