利用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了。