用busybox打造一個10M大小的微型linux

利用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   #編譯需要的功能做進內核或做成模塊

這裏使用的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.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了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章