本文内容是讲述,基于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  [\033[32mOK\033[0m]" 
  36. else 
  37.         echo -e "Make initrd  [\033[31mFail\033[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 <
  55. #!/bin/sh 
  56. echo -e "            Welcome to  \033[31mBuilt-in-Linux\033[0m                 " 
  57.  
  58. echo -e "Remounting the root filesystem ..........[  \033[32mOK\033[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 ............[  \033[32mOK\033[0m  ]" 
  64. mdev -s  
  65.  
  66. echo -e "Mounting the filesystem .................[  \033[32mOK\033[0m  ]" 
  67. mount -a 
  68. swapon -a 
  69.  
  70. echo -e "Starting the log daemon .................[  \033[32mOK\033[0m  ]" 
  71. syslogd 
  72. klogd 
  73.  
  74. echo -e "Configuring loopback interface ..........[  \033[32mOK\033[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  [\033[32mOK\033[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  [\033[32mOK\033[0m]" 
  133. else 
  134.         echo -e "Install grub  [\033[31mFail\033[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  [\033[32mOK\033[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 \r 
  168. EOF 
  169. echo -e "Build banner  [\033[32mOK\033[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  [\033[32mOK\033[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  [\033[32mOK\033[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  [\033[32mOK\033[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 "\033[31m Begin configure\033[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  [\033[32mOK\033[0m]" 
  311. else 
  312.         echo -e "Install dropbear  [\033[31mFaile\033[0m]" 
  313. fi 
  314. unset NU91 NU911 NU92 NU922 NU93 NU933 
  315.  

 

到此一个10.8M的linux就制作好了,并且其中包含了大多数常用命令,而且还可以ssh远程连接!