利用busyboxlinux可以让我们了解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   #编译需要的功能做进内核或做成模块

用busybox打造一个10M大小的微型linux_  little linux

这里使用的VMware虚拟机,我们就要选择网卡的pcnet32驱动程序,将其直接做进内核中

用busybox打造一个10M大小的微型linux_busybox_02

选择小linux支持的文件系统,将Ext3做进内核。

用busybox打造一个10M大小的微型linux_  little linux_03

#  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.5ubi-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[31mEarls\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    Earls Linux (2.6.38.5)

   root (hd0,0)

   kernel /vmlinuz ro root=/dev/hda2 quiet

initrd /initrd.gz

七、系统同步

# sync    #这一步非常重要,要等待一段时间,保证系统同步,不然可能导致小linux文件系统错乱,最好多sync几次。

八、创建一个新的虚拟机,选择系统时选择一个已存在的磁盘,将刚做的小linux在的硬盘加进去。就可以启动新的linux了。