BusyBox(瑞士军刀)
BusyBox最初是由Bruce Perens在1996年为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.4-1.7MB的内容,因此这里没有多少空间留给Linux内核以及相关的用户应用程序使用
BusyBox是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell
制作最小Linux系统需要用到此瑞士军刀(下载地址),接下来便是制作步骤
最小Linux系统制作
ARM交叉编译工具链安装
首先在Ubuntu系统目录/home下新建文件夹minilinux,使用WinCP软件将busybox-1.21.1.tar.bz2拷贝到Ubuntu系统上的目录/home/minilinux下,并在当前目录执行解压命令:
madmanazo@ubuntu:~/minilinux$ tar -xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
接下来进行环境变量的配置,编辑/etc/bash.bashrc的环境变量配置文件,在最末尾行后行加入export PATH=$PATH:/home/madmanazo/minilinux/arm-2009q3/bin/:
madmanazo@ubuntu:~/minilinux/arm-2009q3$ sudo vi /etc/bash.bashrc
最后执行:
madmanazo@ubuntu:~/minilinux/busybox-1.22.1$ source /etc/bash.bashrc
关闭当前终端并重新打开终端进行测试是否成功,找不到文件是因为64位Ubuntu与32位软件不相容,执行以下命令之后再执行第二条命令配置好环境重新再执行一次arm-none-linux-gnueabi-gcc -v命令即可测试:
madmanazo@ubuntu:~$ arm-none-linux-gnueabi-gcc -v
bash: /home/madmanazo/minilinux/arm-2009q3/bin/arm-none-linux-gnueabi-gcc: No such file or directory
madmanazo@ubuntu:~$ sudo apt-get install lib32z1 lib32ncurses5 libbz2-1.0:i386 lib32stdc++6
madmanazo@ubuntu:~$ arm-none-linux-gnueabi-gcc -v
输出一大段很乱的话,会说明你使用的版本等,证明成功了
注意如果没有ARM交叉编译工具链的安装配置的话,直接执行后面BusyBox配置会报错
BusyBox配置
首先在Ubuntu系统目录/home下新建文件夹minilinux,使用WinCP软件将busybox-1.21.1.tar.bz2拷贝到Ubuntu系统上的目录/home/minilinux下,并在当前目录执行解压命令:
madmanazo@ubuntu:~/minilinux$ tar -xvf busybox-1.21.1.tar.bz2
切换到解压后的busybox-1.22.1目录下,可以看到解压后的众多文件:
madmanazo@ubuntu:~/minilinux$ cd busybox-1.22.1/
madmanazo@ubuntu:~/minilinux/busybox-1.22.1$ ls
applets console-tools findutils loginutils modutils selinux
applets_sh coreutils include mailutils networking shell
arch debianutils init Makefile printutils sysklogd
archival docs INSTALL Makefile.custom procps testsuite
AUTHORS e2fsprogs libbb Makefile.flags README TODO
Config.in editors libpwdgrp Makefile.help runit TODO_unicode
configs examples LICENSE miscutils scripts util-linux
接下来使用make menuconfig命令配置BusyBox,这里总结到一个小经验就是,直接执行make menuconfig命令的话肯定是会报找不到某些文件的错误的,不信可以直接执行make menuconfig命令测试一下,解决方法如下:
- 红帽或者FC的安装ncurses-devel
- sudo yum install ncurses-devel
- Ubuntu的需要安装libncurses5-dev
- sudo apt-get install libncurses5-dev
所以我们按如下步骤执行命令即可成功进入make menuconfig配置界面:
madmanazo@ubuntu:~/minilinux/busybox-1.22.1$ sudo apt-get install libncurses5-dev
[sudo] password for madmanazo:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
thunderbird-globalmenu
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
libtinfo-dev
Suggested packages:
ncurses-doc
The following NEW packages will be installed:
libncurses5-dev libtinfo-dev
0 upgraded, 2 newly installed, 0 to remove and 543 not upgraded.
Need to get 325 kB of archives.
After this operation, 1,623 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://us.archive.ubuntu.com/ubuntu/ precise/main libtinfo-dev amd64 5.9-4 [103 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ precise/main libncurses5-dev amd64 5.9-4 [222 kB]
Fetched 325 kB in 2s (148 kB/s)
Selecting previously unselected package libtinfo-dev.
(Reading database ... 141606 files and directories currently installed.)
Unpacking libtinfo-dev (from .../libtinfo-dev_5.9-4_amd64.deb) ...
Selecting previously unselected package libncurses5-dev.
Unpacking libncurses5-dev (from .../libncurses5-dev_5.9-4_amd64.deb) ...
Setting up libtinfo-dev (5.9-4) ...
Setting up libncurses5-dev (5.9-4) ...
madmanazo@ubuntu:~/minilinux/busybox-1.22.1$ make menuconfig
选中Busybox Settings按回车进入Busybox Settings界面:
在Busybox Settings配置选项里面需要修改两个地方,第一个是Build Optiions-> Cross
Compiler prefix,它是指定用什么编译器来编译Busybox,选中Build Options如上图,然后
按回车,进入到Build Options 配置界面,如下图:
选中Build Options 配置界面的Cross Compiler prefix 如上图,然后按回车,进入Cross
Compiler prefix 配置界面,如下图:
输入使用的交叉编译工具arm-none-linux-gnueabi-,如下图:
按回车返回到Build Options 配置界面,这时可以看到刚才设置的交叉编译工具,如
下图:
然后使用键盘的左右按键选中Exit,回到Busybox Settings 设置界面;选中Installation Options,然后按回车,如下图:
进入Installation Options 配置界面,如下图:
选中BusyBox installation prefix 如上图所示,然后按回车进入BusyBox installation
prefix配置界面(这个界面是设置编译完Busybox,把最终生成的二进制文件安装到哪个目录
下面),如下图:
删除上图里面的./_install,然后输入“../system”(最终生成的二进制文件会安装到当前
目录的上一级目录下的system目录里面),如下图:
然后按回车,回到Installation Options,如下图:
最后保存退出即可
编译和安装BusyBox
前面配置已经完成,接下来开始编译BusyBox,并得到最后成功的截图如下:
madmanazo@ubuntu:~/minilinux/busybox-1.22.1$ make
madmanazo@ubuntu:~/minilinux/busybox-1.22.1$ make install
制作的系统还需要dev,etc,lib,mnt,proc,sys,tmp,var文件夹,为其创建各个文件夹:
madmanazo@ubuntu:~/minilinux$ cd system/
madmanazo@ubuntu:~/minilinux/system$ ls
bin linuxrc sbin usr
madmanazo@ubuntu:~/minilinux/system$ mkdir dev etc lib mnt proc sys tmp var
madmanazo@ubuntu:~/minilinux/system$ ls
bin dev etc lib linuxrc mnt proc sbin sys tmp usr var
切换到etc文件夹下,为其创建网络连接配置文件:
madmanazo@ubuntu:~/minilinux/system$ cd etc/
madmanazo@ubuntu:~/minilinux/system/etc$ vi eth0-setting
IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
~
~
~
"eth0-setting" [New File] 5 lines, 94 characters written
保存并退出eth0-setting的编辑后,修改eth0-setting的权限:
madmanazo@ubuntu:~/minilinux/system/etc$ chmod 755 eth0-setting
在etc目录下建立init.d文件夹,并在init.d文件夹下建立ifconfig-eth0文件为其编辑以下内容:
madmanazo@ubuntu:~/minilinux/system/etc$ mkdir init.d
madmanazo@ubuntu:~/minilinux/system/etc$ >cd init.d/
madmanazo@ubuntu:~/minilinux/system/etc/init.d$ vi ifconfig-eth0
#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
if [ -f /etc/eth0-setting ] ; then
source /etc/eth0-setting
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ... > /dev/ttySAC2
else
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
fi
echo nameserver $DNS > /etc/resolv.conf
else
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ... > /dev/ttySAC2
else
/sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
fi
fi
echo Done > /dev/ttySAC2
~
~
"ifconfig-eth0" [New File] 27 lines, 0 characters written
保存并退出ifconfig-eth0的编辑后,修改ifconfig-eth0的权限:
madmanazo@ubuntu:~/minilinux/system/etc/init.d$ chmod 755 ifconfig-eth0
再在init.d文件夹下面新建rcS文件,为其编辑如下内容:
madmanazo@ubuntu:~/minilinux/system/etc/init.d$ vi rcS
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
ln -sf /dev/ttyS2 /dev/tty2
ln -sf /dev/ttyS2 /dev/tty3
ln -sf /dev/ttyS2 /dev/tty4
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
#echo "*************************************" > /dev/ttySAC2
#echo " http://www.topeet.com.cn " > /dev/ttySAC2
#echo "*************************************" > /dev/ttySAC2
#echo "*************************************"
#echo " http://www.topeet.com.cn "
#echo "*************************************"
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
~
~
"rcS" [New File] 70 lines, 0 characters written
保存并退出rcS的编辑后,修改rcS的权限:
madmanazo@ubuntu:~/minilinux/system/etc/init.d$ chmod 755 rcS
回到etc目录,在etc目录下创建passwd文件,为其编辑如下内容:
madmanazo@ubuntu:~/minilinux/system/etc$ vi passwd
root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
~
~
"passwd" [New File] 4 lines, 0 characters written
保存并退出passwd的编辑后,修改passwd的权限:
madmanazo@ubuntu:~/minilinux/system/etc$ chmod 755 passwd
继续在etc目录下创建profile文件,为其编辑如下内容:
madmanazo@ubuntu:~/minilinux/system/etc$ vi profile
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
~
~
"profile" [New File] 14 lines, 0 characters written
保存并退出profile的编辑后,修改profile的权限:
madmanazo@ubuntu:~/minilinux/system/etc$ chmod 755 profile
接下来在etc目录下新建文件夹rc.d,并在rc.d文件夹下新建init.d文件夹,然后在init.d文件夹下新建netd文件:
madmanazo@ubuntu:~/minilinux/system/etc$ mkdir rc.d
madmanazo@ubuntu:~/minilinux/system/etc$ cd rc.d
madmanazo@ubuntu:~/minilinux/system/etc/rc.d$ mkdir init.d
madmanazo@ubuntu:~/minilinux/system/etc/rc.d$ cd init.d
madmanazo@ubuntu:~/minilinux/system/etc/rc.d/init.d$ vi netd
#!/bin/sh
base=inetd
# See how we were called.
case "$1" in
start)
/usr/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
~
~
"netd" [New File] 18 lines, 0 characters written
保存并退出netd的编辑后,修改netd的权限:
madmanazo@ubuntu:~/minilinux/system/etc/rc.d/init.d$ chmod 755 netd
回到sysytem目录下,进入到lib目录中,因为使用的交叉编译环境和编译内核的相同,所以编译器是/home/madmanazo/minilinux/arm-2009q3,Busybox 编译生成的二进制文件是以动态链接库的形式运行,所以我们需要拷贝编译器里面的
库文件到lib目录:
madmanazo@ubuntu:~/minilinux/system/etc/rc.d/init.d$ cd ../../../
madmanazo@ubuntu:~/minilinux/system$ cd lib/
madmanazo@ubuntu:~/minilinux/system/lib$ cp /home/madmanazo/minilinux/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./
madmanazo@ubuntu:~/minilinux/system/lib$ ls
ld-2.10.1.so libgcc_s.so.1 libnss_nisplus-2.10.1.so
ld-linux.so.3 libm-2.10.1.so libnss_nisplus.so.2
libanl-2.10.1.so libmemusage.so libnss_nis.so.2
libanl.so.1 libm.so.6 libpcprofile.so
libBrokenLocale-2.10.1.so libnsl-2.10.1.so libpthread-2.10.1.so
libBrokenLocale.so.1 libnsl.so.1 libpthread.so.0
libc-2.10.1.so libnss_compat-2.10.1.so libresolv-2.10.1.so
libcidn-2.10.1.so libnss_compat.so.2 libresolv.so.2
libcidn.so.1 libnss_dns-2.10.1.so librt-2.10.1.so
libcrypt-2.10.1.so libnss_dns.so.2 librt.so.1
libcrypt.so.1 libnss_files-2.10.1.so libSegFault.so
libc.so.6 libnss_files.so.2 libthread_db-1.0.so
libdl-2.10.1.so libnss_hesiod-2.10.1.so libthread_db.so.1
libdl.so.2 libnss_hesiod.so.2 libutil-2.10.1.so
libgcc_s.so libnss_nis-2.10.1.so libutil.so.1
上面库拷贝完成后,回到system目录,进入到var目录下,新建lib、lock、log、run、tmp五个目录:
madmanazo@ubuntu:~/minilinux/system$ cd var/
madmanazo@ubuntu:~/minilinux/system/var$ mkdir lib lock log run tmp
madmanazo@ubuntu:~/minilinux/system/var$ ls
lib lock log run tmp
回到system目录的上一级目录,至此system已做好
madmanazo@ubuntu:~/minilinux/system/var$ cd ../../
安装打包软件
打包工具make_ext4fs可以文件系统制作成二进制文件,先来安装一下make_ext4fs工具,拷贝压缩包“linux_tools.tgz”到Ubuntu 系统的“/”目录下并进行解压:
madmanazo@ubuntu:/$ ls
bin dev initrd.img lib64 media proc sbin sys var
boot etc lib linux_tools.tgz mnt root selinux tmp vmlinuz
cdrom home lib32 lost+found opt run srv usr
madmanazo@ubuntu:/$ sudo tar -vxf linux_tools.tgz
usr/
usr/local/
usr/local/bin/
usr/local/bin/mkimage
usr/local/bin/make_ext4fs
返回minilinux目录下,生成system.img文件系统镜像,完成最小系统制作:
madmanazo@ubuntu:~$ cd minilinux/
madmanazo@ubuntu:~/minilinux$ ls
arm-2009q3
arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
busybox-1.22.1
busybox-1.22.1.tar.bz2
linux_tools.tgz
system
madmanazo@ubuntu:~/minilinux$ make_ext4fs -s -l 314572800 -a root -L linux system.img system
Creating filesystem with parameters:
Size: 314572800
Block size: 4096
Blocks per group: 32768
Inodes per group: 6400
Inode size: 256
Journal blocks: 1200
Label: linux
Blocks: 76800
Block groups: 3
Reserved block group size: 23
Created filesystem with 437/19200 inodes and 4623/76800 blocks
madmanazo@ubuntu:~/minilinux$ ls
arm-2009q3 linux_tools.tgz
arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 system
busybox-1.22.1 system.img
busybox-1.22.1.tar.bz2
make_ext4fs -s -l 314572800 -a root -L linux system.img system
-j :journal size 日志大小
-b:block_size 块大小
-g: blocks per group 一个组有多少个块
-i: inodes 索引节点
-I:inode size 索引大小
-L: Label标签
-l 分区大小,需要查看分区的大小
314572800 --300M(ITOP4412大小300M)
-s 就是生成ext4的S模式制作
-a:android mountpoint, 是指这个image用于Linux系统的哪个挂载点
(若为-a system即表示为android系统,挂载点即是/system)
(若为-a root 即表示为kernel, 挂载点即是/kernel)
使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限)。
system.img FileName,文件名
system: directory 目录