#make dep
#make bzImage
下面是最后編譯結果:
Boot sector 512 bytes.
Setup is 4733 bytes.
System is 845 kB
make[1]: Leaving directory `/usr/src/linux-2.4.20-8/arch/i386/boot'
我用上面的配置得到了一個845k的內核.
編譯好的內核放在/usr/src/linux-2.4.20-8/arch/i386/boot下.將他拷貝在一個安全的地方備用.
建立一個專放babylinux材料的目錄
#mkdir /babylinux
建立一個做babylinux根文件系統的目錄
#mkdir /babylinux/rootfs
備份內核
#cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /babylinux/
七,編譯busybox
1,busybox簡介
busybox是一個集成了一百多個最常用linux命令和工具的軟件,他甚至還集成了一個http服務器和一個telnet服務器,而所有這一切功能卻只有區區1M左右的大小.我們平時用的那些linux命令就好比是分力式的電子元件,而busybox就好比是一個集成電路,把常用的工具和命令集成壓縮在一個可執行文件里,功能基本不變,而大小卻小很多倍,在嵌入式linux應用中,busybox有非常廣的應用,另外,大多數linux發行版的安裝程序中都有busybox的身影,安裝linux的時候案ctrl+alt+F2就能得到一個控制臺,而這個控制臺中的所有命令都是指向busybox的鏈接.
Busybox的小身材大作用的特性,給制作一張軟盤的linux帶來了及大方便.
2,busybox的用法
可以這樣用busybox
#busybox ls
他的功能就相當運行ls命令
最常用的用法是建立指向busybox的鏈接,不同的鏈接名完成不同的功能.
#ln -s busybox ls
#ln -s busybox rm
#ln -s busybox mkdir
然后分別運行這三個鏈接:
#./ls
#./rm
#./mkdir
就可以分別完成了ls rm 和mkdir命令的功能.雖然他們都指向同一個可執行程序busybox
但是只要鏈接名不同,完成的功能就不同,busybox就是這么的神奇.
很多linux網站都提供busybox的源代碼下載.目前版本是busybox1.0正式版.
3,配置busybox
busybox的配置程序和linux內核菜單配置方式簡直一模一樣.熟悉用make menuconfig方式配置linux內核的朋友很容易上手.
#cp busybox-1.00.tar.gz /babylinux
#cd /babylinux
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig
下面是需要編譯進busybox的功能選項,其他的可以根據需要自選,但是同樣不要太貪心.
General Configuration應該選的選項
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
這個選項是一定要選擇的,這樣才能把busybox編譯成靜態鏈接的可執行文件,運行時才獨立于其他函數庫.否則必需要其他庫文件才能運行,在單一個linux內核不能使他正常工作.
Installation Options
Don't use /usr
這個選項也一定要選,否則make install 后busybox將安裝在原系統的/usr下,這將覆蓋掉系統原有的命令.選擇這個選項后,make install后會在busybox目錄下生成一個叫_install的目錄,里面有busybox和指向他的鏈接.
其他選項都是一些linux基本命令選項,自己需要哪些命令就編譯進去,一般用默認的就可以了.
配置好后退出并保存.
4,編譯并安裝busybox
#make
#make install
編譯好后在busybox目錄下生成子目錄_install,里面的內容:
drwxr-xr-x 2 root root 4096 11月 24 15:28 bin
lrwxrwxrwx 1 root root 11 11月 24 15:28 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin
其中可執行文件busybox在bin目錄下,其他的都是指向他的符號鏈接.
我編譯出來的busybox可執行文件是935K,加上符號鏈接,整個_install目錄是952K.加上845K的內核不是已經超過1440K了嗎?別擔心,我們將對整個根文件系統做大幅度的壓縮.
八,制作根文件系統
1,基本目錄結構
#cd /babylinux/rootfs
#mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是一定要建的,bin和sbin不用建,因為busybox中已經有了.
其他的可以象征性的建幾個就可以了.
拷貝busybox
#cp -R /babylinux/busybox-1.00/_install/* /babylinux/rootfs/
2,建立設備文件名
#cd /babylinux/rootfs/dev
你可以用mknod手工建立,也可以直接從原系統的/dev目錄下拷貝過來.
手工建立的方法:
#ls -l /dev/console
crw------- 1 root root 5, 1 11月 30 09:02 /dev/console
這樣就查看到了console設備的主設備號是5,輔設備號是1,是一個標記為C的字符設備.
于是,我們可以用mknod建立一個同樣的設備文件:
#mknod console c 5 1
但是手工方法建立太麻煩了,通常直接從/dev下把需要的設備文件拷貝過來.
這些設備文件是特殊文件,在拷貝時一定要加上-R參數才能拷貝.
#cp -R /dev/console ./
#cp -R /dev/null ./
#cp -R /dev/zero ./
...
以下是我認為需要的設備名:
cdrom fd0 hda14 hda4 hdb11 hdb19 hdc hdc16 hdc6 hdd13 hdd3 loop2 ram2
console fd0H1440 hda15 hda5 hdb12 hdb2 hdc1 hdc17 hdc7 hdd14 hdd4 loop3 tty0
fb hda hda16 hda6 hdb13 hdb3 hdc10 hdc18 hdc8 hdd15 hdd5 loop4 tty1
fb0 hda1 hda17 hda7 hdb14 hdb4 hdc11 hdc19 hdd hdd16 hdd6 loop5 tty2
fb1 hda10 hda18 hda8 hdb15 hdb5 hdc12 hdc2 hdd1 hdd17 hdd7 null tty3
fb2 hda11 hda19 hdb hdb16 hdb6 hdc13 hdc3 hdd10 hdd18 hdd8 ram tty4
fb3 hda12 hda2 hdb1 hdb17 hdb7 hdc14 hdc4 hdd11 hdd19 initctl ram0 tty5
fb4 hda13 hda3 hdb10 hdb18 hdb8 hdc15 hdc5 hdd12 hdd2 loop1 ram1 zero
其中,fd0,hda,ram,ram1,tty1,null,zero,loop1,fb0,fb等是必備的.
其它的hda,hda1,hdb等可以根據實際需要決定.但是上表中的選擇是比較合理的,即能滿足大部分的需要,有沒有不用的設備浪費空間.注意,千萬不要把/dev下的設備全拷貝過來,那將產生大約420K的/dev目錄,這對babylinux來說太大了.
3,建立etc目錄下的配置文件
busybox.conf group inittab motd passwd resolv.conf shadow-
fstab init.d issue mtab profile shadow
其中init.d是一個目錄,從busybox-1.00源代碼目錄下拷貝過來.
#cp -R /babylinux/busybox-1.00/examples/bootflopyp/etc/init.d /babylinux/rootfs/etc/
busybox.conf是一個空文件.
其他文件的內容如下:
fstab
/dev/fd0 / ext2 defaults 0 0
none /proc proc defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
group
root:x:0:root
inittab
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
tty2::respawn:/bin/getty 38400 tty2
tty3::respawn:/bin/getty 38400 tty3
tty4::respawn:/bin/getty 38400 tty4
# Stuff to do when restarting the init process
::restart:/bin/init
# Stuff to do before rebooting
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/bin/swapoff -a
issue
Baby Linux release 0.1
motd
mtab
passwd
root::0:0:root:/root:/bin/ash
profile
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo
export PS1="[\u@\h \w]\$"
echo "Done"
alias ll='ls -l'
alias du='du -h'
alias df='df -h'
alias rm='rm -i'
echo
resolv.conf
nameserver 202.96.209.5
nameserver 202.96.209.6
shadow
root:$1$$adltAB9Sr/MSKqylIvSJT/:12705:0:99999:7:::
shadow-
root:$1$DWU.tenP$B7ANiXoGoiZMwJR6Ih8810:12705:0:99999:7:::
其中有很多是從原系統的/etc下拷貝過來修改的,如果你是一個具有中等以上水平的linux愛好者,那么應該一看就明白了,當然,你也可以根據自己的需要修改這些文件.其中最重要的是fstab和inittab,busybox內建的init程序用到的inittab文件的語法和一般的不一樣,不能直接把原系統/etc下inittab文件拷貝過來.可以把busybox-1.00目錄下的示例文件拷貝過來修改用.具體請看busybox的文檔. busybox的init也可以不用inittab.但是在我制作babylinux過程中有一個非常奇怪的bug.所有/sbin下的busybox鏈接在做成壓縮的根文件系統,解壓后都不能正常運行,顯示找不到該命令.只有當我在/bin下做這些鏈接時才能運行.具體原因還不太清除,所以你需要做下面的工作:
#cd /babylinux/rootfs/sbin
#ls
chroot getty ifconfig losetup pivot_root reboot swapoff sysctl
fdisk halt init mkswap poweroff route swapon telnetd
評論
查看更多