前言:busybox

      BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士×××。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。

      BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任何小的或嵌入式系统。



一、准备工作


  HOST:准备一台Linux宿主机    系统:CentOS 6.5-x86_64

  Target:目标机:一台没有操作系统,没有硬盘的PC客户端,以目标磁盘为唯一磁盘


   1、首先需要在宿主机上添加一个新目标磁盘

wKiom1NA_evgOZzaAADzKrcZcUM075.jpg

       这里本人在虚拟机上添加了一块20G磁盘。


   2、分区,格式化挂载该目标磁盘

       这里给大家一个autofdisk.sh脚本,帮助完成分区、格式化、创建目录、挂载

       将磁盘分为1 ext4 200M,2 ext4 10G,3 swap 256M 3个分区。

#!/bin/bash
function MOUNT {
           mke2fs -t ext4 "$diskPath"1 &> /dev/null
           mke2fs -t ext4 "$diskPath"2 &> /dev/null
       mkswap "$diskPath"3 &> /dev/null
           mount "$diskPath"1 /mnt/boot &> /dev/null
           mount "$diskPath"2 /mnt/sysroot &> /dev/null
           [ $? -eq 0 ] && echo -e "\033[44;37;5m mount success! \033[0m" || echo -e "\033[31;5mfailure...\033[0m"
}
read -p "Please input a disk path:" diskPath
while ! [[ $diskPath == "quit" ]]; do
        if [ -z $diskPath ] || ! [ -b $diskPath ]; then
             echo -e "\033[31mWrong disk path...\033[0m"
             read -p "Please input a disk path again:" diskPath
        else
             echo -e "\033[5;31mThee following will clear the data in the disk,whether or not to continue!\033[0m"
             read -p "Sure,enter [y|yes]:" option
                 option=`echo $option | tr 'A-Z' 'a-z'`
                 if [[ $option == "y" ]] || [[ $option == "yes" ]]; then
                         dd if=/dev/zero of=$diskPath bs=510 count=1 &> /dev/null
                         echo -e 'n\np\n1\n\n+200M\nn\np\n2\n\n+10G\nn\np\n3\n\n+256M\nt\n3\n82\nw' | fdisk $diskPath &> /dev/null
                                if  [ -d /mnt/boot ] && [ -d /mnt/sysroot ]; then
                                        MOUNT
                                else
                                     mkdir /mnt/{boot,sysroot}
                                        MOUNT
                               fi
                else
                        exit 8
                fi
                    exit
        fi
done
exit 9


   直接运行脚本即可:

wKiom1NBBnSSNeDcAAEf2imMBCg106.jpg

wKioL1NBBrXREPkXAAHmiy7oMpA019.jpg


   3、将两个分区开机自动挂载        

vim /etc/fstab
##添加如下两行
/dev/sdb1               /mnt/boot               ext4    defaults        0 0
/dev/sdb2               /mnt/sysroot            ext4    defaults        0 0



二、编译Linux kernel/提供bzImage

安装环境:

yum groupinstall -y "Development tools"
yum groupinstall -y "Desktop Platform Development"
yum groupinstall -y "Server Platform Development"


    1、编译Linux kernel/提供bzImage

[root@localhost ~]# tar xf linux-3.13.6.tar.xz -C /usr/src/
[root@localhost ~]# cd /usr/src/
[root@localhost src]# ln -sv linux-3.13.6 linux
[root@localhost src]# cd linux
[root@localhost linux]# make allnoconfig    //编译
[root@localhost linux]# make menuconfig    //kernel配置界面


   进入配置页面选择了一些基本功能,下面是配置好的config文件:

congfig-3.13.6-x86_64


[root@localhost ~]# mv congfig-3.13.6-x86_64 .config
[root@localhost ~]# cp .config /usr/src/linux
cp: overwrite `/usr/src/linux/.config'? y
[root@localhost ~]# cd /usr/src/linux
[root@localhost linux]# make bzImage

注:编译内核是个漫长的过程,根据电脑性能不同编译的时间也不尽相同,但至少也要30分钟左右。

[root@localhost mylinux]# cd /usr/src/linux
[root@localhost linux]# cp arch/x86_64/boot/bzImage /mnt/boot/



三、编译busybox应用程序提供busybox应用程序

       解决依赖关系:

yum -y install  libmcrypt-devel
//将Centos第二张光盘挂上
mount /dev/dvd /media/
cd /media/Packages/
rpm -ivh glibc-static

   在编译busybox时选择了静态编译模式;而在静态编译程序时就会用到glibc-static这个程序包,所以安装上


1、配置busybox

[root@localhost ~]# tar xf busybox-1.22.1.tar.bz2
[root@localhost ~]# cd busybox-1.22.1
[root@localhost busybox-1.22.1]# make menuconfig


图1:选择进入图2

wKiom1NBIR2wl8v-AAHWo_FMtN4996.jpg


图2:选中进入图3

wKiom1NBIUWDNFcbAAG551s6O2w995.jpg


图3:按图选择*,将此功能编译进内核后,选择Exit,退出,知道出现图4

wKioL1NBISuhThGsAAJMLAk6GYw016.jpg


图4:选择yes,保存退出

wKioL1NBIb_zfz4TAACs60jYFmY943.jpg

   注:选择此项,是将该应用程序编译成静态二进制格式程序,这就意味着它所依赖的库文件不再以动态方式去链接,它也就没有库文件,因为在编译时直接就编译到自身了,这样就使得它的空间和性能得到很好的提升,故此这里选择该项.


make
make install


   2、移植busybox应用程序

安装后的文件均位于_install目录中;把这些文件复制进/mnt/sysroot

wKioL1NBK8eSdsOPAABOsenA28c457.jpg

[root@localhost busybox-1.22.1]# cp -a _install/* /mnt/sysroot/


三、建立根文件系统


   1、创建系统文件目录  

[root@localhost busybox-1.22.1]# cd /mnt/sysroot/
[root@localhost sysroot]# mkdir -pv  proc  sys  etc/rc.d/init.d  tmp  dev/pts  boot  var/log bin  dev


2、建立系统初始化脚本

[root@localhost sysroot]# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/sh
#
#欢迎短语
echo -e "\tWelcome to \033[34mTest\033[0m Linux"
#判断、设置主机名
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME
#设置命令提示符
str=$"(Repair filesystem)"
PS1="$str \# # "; export PS1
#挂载伪文件系统
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
#虚拟终端所需目录
mkdir /dev/pts
#在grub中根是只读的,将其重新挂载为读写
mount -o remount,rw /
#设置IP,实现初始化系统时配置上IP地址
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.12.110
mount -a
[root@localhost sysroot]# chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit


   3、配置init及其所需要inittab文件

       创建两个必要的设备文件:

[root@localhost dev]# cd /mnt/sysroot/dev/
[root@localhost dev]# mknod  console  c  5  1
[root@localhost dev]# mknod  null  c  1  3


创建/etc/inittab文件,提供虚拟终端

[root@localhost dev]# vim /mnt/sysroot/etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1
::respawn:/sbin/getty 19200 tty2
::respawn:/sbin/getty 19200 tty3
::respawn:/sbin/getty 19200 tty4
::respawn:/sbin/getty 19200 tty5
::respawn:/sbin/getty 19200 tty6
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r


4、为系统准备一个“文件系统表”配置文件/etc/fstab

vim /mnt/sysroot/etc/fstab
//添加以下内容
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sda1               /boot                   ext4    defaults        0 0
/dev/sda2               /                       ext4    defaults        0 0
/dev/sda3               swap                    swap    defaults        0 0


5、为定制Linux系统提供passwd, group, shadow文件

[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# head -1 /etc/passwd > /mnt/sysroot/etc/passwd
[root@localhost ~]# vim /mnt/sysroot/etc/passwd
root:x:0:0:root:/root:/bin/sh    //将此处改成/bin/sh
[root@localhost ~]# mkdir /mnt/sysroot/root    //为root创建家目录
#++++++++++++++++++++++++用户组文件++++++++++++++++++++++++
[root@localhost ~]# head -1 /etc/group
root:x:0:
[root@localhost ~]#  head -1 /etc/group > /mnt/sysroot/etc/group
[root@localhost ~]# tail /mnt/sysroot/etc/group
root:x:0:
#++++++++++++++++++++++++用户密码文件++++++++++++++++++++++++
[root@localhost ~]# head -1 /etc/shadow
root:$6$CGsqab6d$Cd.PnnWtlL5XZAyr9J2zoMqyJH1QodcDp1pQp0uZ1f0Cq4eq9.TMkSQU6IfpvYZEYc32.lmF0lKuQwavnC49a0:16165:0:99999:7:::
[root@localhost ~]# head -1 /etc/shadow > /mnt/sysroot/etc/shadow
[root@localhost ~]# tail /mnt/sysroot/etc/shadow
root:$6$CGsqab6d$Cd.PnnWtlL5XZAyr9J2zoMqyJH1QodcDp1pQp0uZ1f0Cq4eq9.TMkSQU6IfpvYZEYc32.lmF0lKuQwavnC49a0:16165:0:99999:7:::
#由于busybox对于sha512的加密没有很好的兼容性,所以这里才用md5的加密密码去替换即可
[root@localhost ~]# openssl passwd -1
Password:
Verifying - Password:
$1$.mbEqYHZ$gkHTrFcUn0wHyBdGgx0lp/
[root@localhost ~]# vim /mnt/sysroot/etc/shadow
root:$1$.mbEqYHZ$gkHTrFcUn0wHyBdGgx0lp/:16165:0:99999:7:::
[root@localhost ~]# chmod 400 /mnt/sysroot/etc/shadow


四、安装系统引导程序

1、安装grub

grub-install  --root-directory=/mnt  /dev/sdb


2、创建grub配置文件

[root@localhost ~]# vim /mnt/boot/grub/grub.conf
idefault=0
timeout=5
title Mini Linux Test
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init



3、为定制版Linux定义主机名文件

[root@localhost ~]# mkdir /mnt/sysroot/etc/sysconfig
[root@localhost ~]# vim /mnt/sysroot/etc/s
shadow     sysconfig/
[root@localhost ~]# vim /mnt/sysroot/etc/sysconfig/network
HOSTNAME=stu12.magedu.com


4.为定制版Linux定义banner

[root@localhost ~]# vim /mnt/sysroot/etc/issue
Minilinux Test
kernel \r


五、新建目标机启动并测试

   将宿主机关机,以防磁盘崩溃

   1、新建一个虚拟机做目标机,选择目标磁盘作为主磁盘

wKiom1NBOTzD6jCZAAFIbubIZCc884.jpg

   选择已存在的磁盘,选择目标磁盘

wKiom1NBPiXBNRfOAAFAjP2g-_0104.jpg


进入到输入用户的界面时,alt+F2,进入终端2,输入账号密码进入


wKioL1NBPkOSY6XeAAHjcsCmj5Q885.jpg


以上是基于busybox成功制作一个微型linux。下篇会继续完善该linux的功能。