手動訂制一個基於BusyBox的微型Linux系統前提:
1、一個作為宿主機的Linux;系統版本為Redhat Enterprise Linux 5.8;
2、busybox源碼;版本為busybox-1.20.2。busbox將大量命令打包在一起
3、在宿主機上添加一塊額外的硬盤作為新系統的存儲盤,這裡添加使用一塊IDE接口的新硬盤;
4.通過https://busybox.net/和https://www.kernel.org/分別下載Linux內核源碼和busybox源碼
5.全部在vmware10.0下新建一個redhat5.8主機用於實驗並添加額外硬盤
一、為系統上的新硬盤建立兩個分區,大小自定義並格式化後,將/dev/hda1掛載至/mnt/boot目錄下;將/dev/hda1掛載至/mnt/sysroot目錄;
fdisk /dev/hda 新建兩個主分區hda1,hda2
partprobe /dev/hda 讓內核重新讀取分區表並生效
mke2fs -j /dev/hda1
mke2fs -j /dev/hda2
mkdir /mnt/boot
mkdir /mnt/sysroot
mount /dev/hda1 /mnt/boot
mount /dev/hda2 /mnt/sysroot
二、獲取內核:直接復制宿主機現有內核或自己按需編譯新內核
1.如果編譯新內核kernel,步驟如下:
cd /usr/src
tar jxvf linux-2.6.38.5.tar.bz2
ln -sv linux-2.6.38.5 linux
cd linux
make menuconfig 按需選擇保存至當前目錄下.config文件
make SUBDIR=arch/ 只編譯平台核心
cp arch/x86/boot/bzImage /mnt/boot
提示:最好將文件系統中的ext3和網卡的驅動程序直接編譯進內核,否則就需要手動裝載對應模塊;
2.本實驗為了方便,不重新編譯內核,直接使用宿主機系統現有內核.簡單明了
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
三、編譯busybox
cd /usr/src
tar -jxvf busybox-1.20.2.tar.bz2
cd busybox-1.20.2
mkdir include/mtd
cp /usr/src/linux/include/mtd/ubi-user.h include/mtd/
make menuconfig
說明:
1、此處需要選擇 Busybox Settings --> Build Options --> Build BusyBox as a static binary (no shared libs),這樣可以把Busybox編譯成一個不使用共享庫的靜態二進制文件,從而避免了對宿主機的共享庫產生依賴;但你也可以不選擇此項,完成編譯後把其依賴的共享庫復制至微型系統上的對應lib目錄中即可;相對比較麻煩一點
2、如想修改安裝位置;方法為:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,這裡可以修改安裝路徑,本實驗保持默認不作修改
make install
安裝後的文件均位於/usr/src/busybox-1.20.2/_install目錄中;
mkdir -pv /tmp/initrd
cp -r /usr/src/busybox-1.20.2/_install/* /tmp/initrd
四、制作initrd
cd /tmp/initrd
1、建立rootfs:
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
添加如下內容:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot
exec switch_root /mnt/sysroot /sbin/init
給此腳本執行權限:
chmod +x init
將ext3.ko和jbd.ko復制到對應目錄下
modinfo ext3 查找系統ext3模塊路徑,便於copy
modinfo jbd 查找系統jbd模塊路徑,便於copy
cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko /lib/modules/ext3.ko
cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko /lib/modules/jbd.ko
4、制作initrd
find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz
5.制作grub引導程序grub-install --root-directory=/mnt /dev/hda說明:此處的/dev/hda為目標系統所在的那塊新磁盤;grub建立配置文件: vim /mnt/boot/grub/grub.conf添加如下內容:default 0timeout 5title BusyBox Linux (2.6.18) root (hd0,0) kernel /vmlinuz ro root=/dev/hda2 initrd /initrd.gz至此/mnt/boot/目錄下的系統啟動所需的內核vmlinuz,initrd,grub等文件全部建立Ok
五、建立真正的根文件系統
cd /mnt/sysroot
cp -r /usr/src/busybox-1.20.2/_install/* /mnt/sysroot/
1、建立rootfs:
mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib
2、創建兩個必要的設備文件:
mknod /mnt/sysroot/dev/console c 5 1
mknod /mnt/sysroot/dev/null c 1 3
3、建立系統初始化腳本文件
vim /mnt/sysroot/etc/rc.d/rc.sysinit
添加如下內容:
#!/bin/sh
echo -e "\tWelcome to \033[31mBusyBox\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
echo -e "Starting the log daemon ..."
syslogd
klogd
讓此腳本具有執行權限:
chmod +x /mnt/sysroot/etc/init.d/rc.sysinit
4、配置init及其所需要inittab文件
cd /mnt/sysroot
rm -rf linuxrc
為init進程提供配置文件:
vim etc/inittab
添加如下內容:
::sysinit:/etc/rc.d/rc.sysinit
#console::respawn:-/bin/sh 讓此行注銷,否則系統直接進行sh
::respawn:/sbin/getty 9600 tty1 用戶登入的第1個終端
::respawn:/sbin/getty 9600 tty2 用戶登入的第2個終端
::respawn:/sbin/getty 9600 tty3 用戶登入的第3個終端
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5.為目標主機建立用戶登入帳號等文件,從宿主機復制root和willow兩個帳號即可
grep -E "^(root|willow)\>" /etc/passwd > /mnt/sysroot/etc/grep -E "^(root|willow)\>" /etc/group > /mnt/sysroot/etc/grep -E "^(root|willow)\>" /etc/shadow > /mnt/sysroot/etc/6.為系統准備一個“文件系統表”配置文件/etc/fstab
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
7.為微型系統訂制banner信息
cp /etc/issue /mnt/sysroot/etc/ 如需要可以更改裡面顯示信息
8.為微型系統提供主機名稱
8.1.vim /mnt/sysroot/etc/hostname
添加如下內容:
HOSTNAME=Tiny.willow.com
8.2.編輯系統初始化腳本rc.sysinit,實現開機過程中設定主機名稱
vim /mnt/sysroot/etc/rc.d/rc.sysinit
echo " Setting the hostname..." [ -f /etc/hostname ] && . /etc/hostname [ -z $HOSTNAME -o $HOSTNAME == '(none)' ] && HOSTNAME=localhost hostname $HOSTNAME9.由於rc.sysinit文件會產生大量日志,所以將日志發送至/var/log/messages文件;
vim etc/syslog.conf
添加如下一行:
*.info /var/log/messages
如需監控日志,tail -f /var/log/messages
好了,至此一個簡易的基於內存運行的微型小linux系統已經構建出來了,
下面將宿主機關機,然後新建一台虛擬機將剛訂制的IDE硬盤掛載上來,開機啟動測試效果
注意:tty1終端測試輸入root用戶密碼後無法登入,不知什麼原因,望大神指教!
但Alt+F2,Alt+F3切換到第二或第三個終端,登入正常,效果如下:
本文出自 “夏維柳” 博客,請務必保留此出處http://willow.blog.51cto.com/6574604/1770078