本文內容是講述,基於busybox構建嵌入式linux,並且結合Dropbrae打造提供ssh的10.8Mlinux。
國際慣例,廢話不多說,步驟如下:
準備工作:
下載linux-2.6.34.1下載地址
http://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.34/linux-2.6.34.11.tar.bz2
下載busybox-1.16.1下載地址
http://www.busybox.net/downloads/binaries/1.16.1/busybox-i686
下載dropbear-2012.55下載地址
http://down.51cto.com/data/357545
注:由於busybox原生支援IDE硬碟,並不支援SCSI的硬碟,本人實驗SCSI硬碟還未成功,將SCSI的驅動編譯進核心仍然不行,希望博友們知道的不吝賜教,以下以IDE硬碟為基礎。

由於需要編譯核心,以及Busybox,不同的需要具有不同的選項,無法寫進指令碼,所以前面的步驟還是使用命令列完成:

1、新增IDE硬碟:

分割槽hda1作為boot分割槽
分割槽hda2作為根分割槽
分割槽hda3作為swap分割槽
並將其格式化為ext3,這裡不在給出詳細步驟。

2、建立掛載點:

#mkdir -pv /mnt/{boot,sysroot}
#mount /dev/hda1 /mnt/boot/
#mount /dev/hda2 /mnt/sysroot/

3、編譯核心:

#tar xvf linux-2.6.34.1.tar.bz2 -C /usr/src/
#cd /usr/src
#ln  -sv  linux-2.6.34.1  linux
#cd linux
#cp /root/busybox/kernel-2.6.30.5-i686.cfg ./.config
#make menuconfig

注:kernel-2.6.30.5-i686.cfg為編譯核心的選項模版,可以在附件中下載
提示:為了實現後面的功能,請務必將檔案系統中的ext3和網路卡的驅動程式直接編譯進核心;因為作者使用的是vmware Workstation虛擬機器,所以,所需的網上驅動是pcnet32的,其它的均可按需要進行選擇。

網路卡驅動:pcnet32
Device Drivers  —> Network device support  —> Ethernet (10 or 100Mbit)  —> EISA, VLB, PCI and on board controllers   AMD PCnet32 PCI support  
AMD 8111 (new PCI lance) support  

ext3檔案系統:
File systems  —> Ext3 journalling file system support  Default to `data=ordered` in ext3

IDE硬碟驅動:
Device Drivers  —>  Block devices  —>   Very old hard disk (MFM/RLL/IDE) driver

SCSI硬碟驅動:
Device Drivers  —>  SCSI device support  —>  -*- SCSI device support
                    [*] SCSI target support
                    [*] SCSI generic support
                    [*] SCSI low-level drivers  —>
                                    [*]   BusLogic SCSI  support
                    [*] SCSI Device Handlers  —>   [*]   LSI RDAC Device Handler 

 
#make  SUBDIR=arch/
#cp arch/x86/boot/bzImage  /mnt/boot

4、安裝busybox

#tar xvf busybox-1.16.1.tar.bz2 -C /usr/src
#cd /usr/src/busybox-1.16.1
#make menuconfig

Busybox Settings –> Build Options –>Build BusyBox as a static binary (no shared libs)
    Installation Options  —>  (./_install) BusyBox installation prefix,修改其值為
/mnt/sysroot

Busybox Settings –> Busybox Library Tuning  —>     Username completion
                                                      Fancy shell prompts
                                                      Support for /etc/networks
                                                      Query cursor position from terminal

#make  install

安裝後的檔案均位於/mnt/sysroot目錄中;但為了建立initrd,並實現讓其啟動以後將真正的檔案系統切換至目標系統分割槽上的rootfs,您還需要複製一份剛安裝在/mnt/sysroot下的busybox至另一個目錄,以實現與真正的根檔案系統分開製作。我們這裡選擇使用/mnt/temp目錄;

#mkdir -pv /mnt/temp
#cp -r /mnt/sysroot/* /mnt/temp/

執行指令碼buildlinux

#chmod +x buildlinux
#./buildlinux

提示:在指令碼執行過程有兩處和使用者互動
1.要求使用者為目標主機設定root使用者的密碼。
2.要求使用者輸入dropbear的原始碼包的完整路徑。

由於初學,指令碼可能寫的不完善,只能接受.tar.bz2的dropbear原始碼包,還請博友們見諒。

指令碼程式碼如下:

  1. #!/bin/bash 
  2. Name: buildlinux 
  3. # Description:  
  4. # Author: CZ 
  5. # Version: 1.1.0 
  6. # Datatime: 2012-03-26 12:25:25 
  7. # Usage: buildlinux 
  8.  
  9. ########################### 1 Make initrd ########################### 
  10. echo -e "[1] Make initrd....." 
  11. cd /mnt/temp 
  12.  
  13. #[1]Build rootfs 
  14. mkdir -p proc sys etc/init.d tmp dev mnt/sysroot 
  15.  
  16. #[2]Build equipment file 
  17. mknod dev/console c 5 1 
  18. mknod dev/null c 1 3 
  19.  
  20. #[3]Make init for initrd 
  21. rm -rf linuxrc 
  22. cat > init << EOF 
  23. #!/bin/sh 
  24. mount -t proc proc /proc 
  25. mount -t sysfs sysfs /sys 
  26. mdev -s 
  27. mount -t ext3 /dev/hda2 /mnt/sysroot 
  28. exec switch_root /mnt/sysroot /init 
  29. EOF 
  30. chmod +x init 
  31.  
  32. #[5]Make initrd 
  33. find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz 
  34. if [ $? -eq 0 ];then 
  35.         echo -e "Make initrd  [ 33[32mOK 33[0m]" 
  36. else 
  37.         echo -e "Make initrd  [ 33[31mFail 33[0m]" 
  38. fi 
  39.  
  40. ########################### 2 Make reality filesystem ########################### 
  41. echo -e "[2] Make reality filesystem....." 
  42. cd /mnt/sysroot 
  43.  
  44. #[1]Build rootfs 
  45. mkdir -p proc sys etc/init.d tmp dev/pts boot var/log boot home root 
  46. chmod -R 700 root/ 
  47.  
  48. #[2]Build equipment file 
  49. mknod dev/console c 5 1 
  50. mknod dev/null c 1 3 
  51.  
  52. #[3]Build initialization system script file 
  53. cd /mnt/sysroot/etc/init.d 
  54. cat > rcS <<EOF 
  55. #!/bin/sh 
  56. echo -e "            Welcome to   33[31mBuilt-in-Linux 33[0m                 " 
  57.  
  58. echo -e "Remounting the root filesystem ..........[   33[32mOK 33[0m  ]" 
  59. mount -t proc proc /proc 
  60. mount -t sysfs sysfs /sys 
  61. mount -o  remount,rw  /  
  62.  
  63. echo -e "Creating the files of device ............[   33[32mOK 33[0m  ]" 
  64. mdev -s  
  65.  
  66. echo -e "Mounting the filesystem .................[   33[32mOK 33[0m  ]" 
  67. mount -a 
  68. swapon -a 
  69.  
  70. echo -e "Starting the log daemon .................[   33[32mOK 33[0m  ]" 
  71. syslogd 
  72. klogd 
  73.  
  74. echo -e "Configuring loopback interface ..........[   33[32mOK 33[0m  ]" 
  75. ifconfig  lo  127.0.0.1/8 
  76. ifconfig eth0 172.16.4.6/16 
  77.  
  78. END 
  79. EOF 
  80. chmod +x rcS 
  81.  
  82. #[4]Build inittab file 
  83. cd /mnt/sysroot 
  84. mv linuxrc init 
  85. cd /mnt/sysroot/etc 
  86. cat > inittab << EOF 
  87. ::sysinit:/etc/init.d/rcS 
  88. ::respawn:/sbin/getty 9600 tty1 
  89. ::respawn:/sbin/getty 9600 tty2 
  90. ::respawn:/sbin/getty 9600 tty3 
  91. ::respawn:/sbin/getty 9600 tty4 
  92. ::respawn:/sbin/getty 9600 tty5 
  93. ::respawn:/sbin/getty 9600 tty6 
  94. ::shutdown:/bin/umount -a -r 
  95. ::ctrlaltdel:/sbin/reboot 
  96. EOF 
  97.  
  98. #[5]Build fstab file 
  99. cat > fstab << EOF 
  100. sysfs                   /sys                    sysfs   defaults        0 0 
  101. proc                    /proc                   proc    defaults        0 0 
  102. devpts                  /dev/pts                devpts  mode=622        0 0 
  103. /dev/hda1               /boot                   ext3    defaults        1 2 
  104. /dev/hda2               /                       ext3    defaults        1 1 
  105. /dev/hda3               swap                    swap    defaults        0 0 
  106. EOF 
  107.  
  108. #[6]Build syslog configure file 
  109. cat > syslog.conf << EOF 
  110. *.info          /var/log/messages 
  111. EOF 
  112. echo -e "Make reality filesystem  [ 33[32mOK 33[0m]" 
  113.  
  114. ########################### 3 Install grub ########################### 
  115. echo -e "[3] Install grub....." 
  116. grub-install --root-directory=/mnt /dev/hda 
  117. NU31=`echo $?` 
  118.  
  119. #[1]Build grub.conf file 
  120. cd /mnt/boot/grub 
  121. cat > grub.conf << EOF 
  122. default        0 
  123. timeout        3 
  124. color    light-green/black light-green/black 
  125. title    Busybox--Linux--Dropbear (2.6.34.1) 
  126.     root (hd0,0) 
  127.     kernel /bzImage ro root=/dev/hda2 quiet 
  128.     initrd /initrd.gz 
  129. EOF 
  130. NU32=`echo $?` 
  131. if [ $NU31 -eq 0 -a $NU32 -eq 0 ];then 
  132.         echo -e "Install grub  [ 33[32mOK 33[0m]" 
  133. else 
  134.         echo -e "Install grub  [ 33[31mFail 33[0m]" 
  135. fi 
  136. unset NU31 NU32 
  137.  
  138. ########################### 4 Build user files ########################### 
  139. echo -e "[4] Build user files....." 
  140. cd /mnt/sysroot 
  141.  
  142. #[1]Build root passwd 
  143. head -1 /etc/passwd > /mnt/sysroot/etc/passwd 
  144. sed -i "s@/bin/bash@/bin/sh@" /mnt/sysroot/etc/passwd 
  145. chmod 400 /mnt/sysroot/etc/passwd 
  146.  
  147. #[2]Build root group 
  148. head -1 /etc/group > /mnt/sysroot/etc/group 
  149.  
  150. #[3]Build root shadow 
  151. read -p "Input a passwd for root: " PASS 
  152. while [ -z $PASS ];do 
  153.         read -p "Input a passwd for root" PASS 
  154. done 
  155. NUMBER=`echo $RANDOM$RANDOM` 
  156. PASSWD=`echo $PASS | openssl passwd -1 -salt $NUMBER -stdin` 
  157. echo "root:$PASSWD:15408:0:99999:7:::" > /mnt/sysroot/etc/shadow 
  158. chmod 400 /mnt/sysroot/etc/shadow 
  159. echo -e "Build user files  [ 33[32mOK 33[0m]" 
  160. unset PASS NUMBER PASSWD 
  161.  
  162. ########################### 5 Build banner ########################### 
  163. echo -e "[5] Build banner....." 
  164. cd /mnt/sysroot/etc 
  165. cat > issue << EOF 
  166.                 Welcome to Busybox-linux(grass51.blog.51cto.com) 
  167.                                 Kernel   
  168. EOF 
  169. echo -e "Build banner  [ 33[32mOK 33[0m]" 
  170.  
  171. ########################### 6 Set Hostname ########################### 
  172. echo -e "[6]Set Hostname config files" 
  173. mkdir /mnt/sysroot/etc/sysconfig 
  174. cd /mnt/sysroot/etc/sysconfig 
  175. echo > network << EOF 
  176. HOSTNAME=grass51.example.com 
  177. EOF 
  178. echo -e "Set Hostname config files  [ 33[32mOK 33[0m]" 
  179.  
  180. ########################### 7 Build profile file ########################### 
  181. echo -e "[7] Build profile file....." 
  182. cd /mnt/sysroot/etc 
  183. cat > profile << EOF 
  184. export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin 
  185. export PS1=`[u@h W]$` 
  186. EOF 
  187. echo -e "Build profile file  [ 33[32mOK 33[0m]" 
  188.  
  189. ########################### 8 OutPut PATH,Hostname ########################### 
  190. echo -e "[8] OutPut PATH,HOSTNAME....." 
  191. cd /mnt/sysroot/etc/init.d 
  192. cat >> rcS << EOF 
  193.  
  194. [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network 
  195. [ -z $HOSTNAME ] && /bin/hostname localhost || /bin/hostname $HOSTNAME 
  196.  
  197. source /etc/profile 
  198. EOF 
  199. echo -e "OutPut PATH,HOSTNAME  [ 33[32mOK 33[0m]" 
  200.  
  201. ########################### 9 Install dropbear ########################### 
  202. echo -e "[9] Install dropbear....." 
  203.  
  204. read -p "Input the dropbear Package path[/tmp/dropbear-2012.55.tar.bz2]:" DROP_FILE 
  205. until [ -e $DROP_FILE ];do 
  206.         echo -e "$DROP_FILE not extis" 
  207.         read -p "Input a right Package path:" DROP_FILE 
  208. done 
  209. tar xf $DROP_FILE 
  210. FILEPATH=`echo ${DROP_FILE##*/}` 
  211. TARPATH=`echo $FILEPATH | sed `s@(.*).tar.bz2@1@`
  212. cd $TARPATH 
  213.  
  214. echo -e " 33[31m Begin configure 33[0m" 
  215. sleep 5 
  216. ./configure 
  217. NU91=`echo $?` 
  218. if [ ! $NU91 -eq 0 ];then 
  219.         read -p "Sorry,configure error,Do you continue[N/y]" NU911 
  220.         case $NU911 in 
  221.                 y|Y) 
  222.                         echo "" 
  223.                         ;; 
  224.                 *) 
  225.                         exit 
  226.                         ;; 
  227.         esac 
  228. fi 
  229. make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" 
  230. NU92=`echo $?` 
  231. if [ ! $NU92 -eq 0 ];then 
  232.         read -p "Sorry,make error,Do you continue[N/y]"  NU922 
  233.         case $NU922 in 
  234.                 y|Y) 
  235.                         echo "" 
  236.                         ;; 
  237.                 *) 
  238.                         exit 
  239.                         ;; 
  240.         esac 
  241. fi 
  242. make install 
  243. NU93=`echo $?` 
  244. if [ ! $NU93 -eq 0 ];then 
  245.         read -p "Sorry,make install error,Do you continue[N/y]"  NU933 
  246.         case $NU933 in 
  247.                 y|Y) 
  248.                         echo "" 
  249.                         ;; 
  250.                 *) 
  251.                         exit 
  252.                         ;; 
  253.         esac 
  254. fi 
  255. cp -a scp /usr/local/bin 
  256. cd ../ 
  257. rm -rf $TARPATH 
  258.  
  259.  
  260. #[1]Build a explant lib file script 
  261. mkdir -p /mnt/sysroot/{usr/lib,lib} 
  262. for COMM in dropbear dropbearkey dropbearconvert dbclient scp;do 
  263.   TARGET=/mnt/sysroot 
  264.  
  265.   COMMAND=`which $COMM | grep -o "/.*"
  266.   CMDPATH=${COMMAND%/*} 
  267.  
  268.   [ -d $TARGET$CMDPATH ] || mkdir -p $TARGET$CMDPATH 
  269.   [ -e $TARGET$COMMAND ] || cp $COMMAND $TARGET$CMDPATH 
  270.  
  271.   for LIBFILE in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"`; do 
  272.         LIBPATH=${LIBFILE%/*} 
  273.         [ -d $TARGET$LIBPATH ] || mkdir -p $TARGET$LIBPATH 
  274.         [ -e $TARGET$LIBFILE ] || cp $LIBFILE $TARGET$LIBPATH 
  275.   done 
  276. done 
  277.  
  278. unset COMM TARGET COMMAND CMDPATH LIBPATH 
  279. #[2]Build shells for Dropbear 
  280. cd /mnt/sysroot/etc 
  281. cat > shells << EOF 
  282. /bin/sh 
  283. /bin/ash 
  284. /bin/hush 
  285. EOF 
  286.  
  287. #[3]Explant nsswitch 
  288. cat > nsswitch.conf << EOF 
  289. passwd:         files 
  290. shadow:         files 
  291. group:          files 
  292. hosts:          files dns 
  293. EOF 
  294.  
  295. #[4]Explant nsswith libfiles 
  296. cd /usr/lib 
  297. cp -a libnss_compat.so libnss_db.so libnss_files.so libnss_dns.so libnssutil3.so  
  298.  
  299. libnss3.so libnssckbi.so /mnt/sysroot/usr/lib/ 
  300. cd /lib 
  301. cp -a libnss_compat* libnss_db* libnss_dns* libnss_files* /mnt/sysroot/lib/ 
  302.  
  303. #[5]Build private key 
  304. mkdir /mnt/sysroot/etc/dropbear 
  305. export PATH=$PATH:/usr/local/bin:/usr/local/sbin 
  306. dropbearkey -t rsa  -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key 
  307. dropbearkey -t dss  -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key 
  308.  
  309. if [ $NU91 -eq 0 -a $NU92 -eq 0 -a $NU93 -eq 0 ];then 
  310.         echo -e "Install dropbear  [ 33[32mOK 33[0m]" 
  311. else 
  312.         echo -e "Install dropbear  [ 33[31mFaile 33[0m]" 
  313. fi 
  314. unset NU91 NU911 NU92 NU922 NU93 NU933 
  315.  

 

到此一個10.8M的linux就製作好了,並且其中包含了大多數常用命令,而且還可以ssh遠端連線!