Linux系统裁剪之四(自定义内核及busybox完成系统定制)

·busybox

    busybox是一个二进制程序,可以模拟实现许许多多的Linux命令,busybox在编译安装完成之后会在我们系统的bin目录下生成一个名为busybox的二进制程序,其它的文件都是该二进制程序的软链接,几乎上百个命令都可以依靠这一个可执行程序来实现,还可以模拟几个shell,可以模拟实现我们Linux操作系统上bin和sbin目录下的很多命令,而且该文件所占的存储空间还非常的小,因此在一些存储设备容量非常小的环境中,比如说我们的安卓手机,安卓手机其实就是一个内核加上一个busybox来进行工作的,相当于是在busybox的基础之上启动了一个java虚拟机,在java虚拟机上运行的安卓系统其实就是一个java程序而已,因此我们只要拥有了kernel再加上一个busybox,就可以模拟出来一个功能比较齐备的Linux操作系统了,busybox其实就是一个根文件系统,它完全可以给我们提供一个根文件系统(kernel+rootfs),这个文件系统还可以给我们提供一个init程序,但是我们知道,如果内核想要装载真正的根文件系统还得依靠一个叫做initrd(ramdisk)的程序,此前我们制作initrd程序是利用解压宿主机的initrd文件来实现的,其实该过程我们完全可以使用busybox来完成,在Debian和Ubuntu的Linux操作系统上就是利用busybox来完成和ramdisk系统的功能的,因此如果我们有了kernel,并且编译好了一个busybox,并且把这个busybox做成一个initrd程序,也可以制作一个功能完好的Linux客户机,制作好initrd文件之后,我们还得有rootfs,我们之前制作的根文件系统中的所有内容是从宿主机一个一个复制过来的,这样做非常的麻烦,因此我们还可以使用busybox来制作一个rootfs,因此我们使用两个busybox,一个用来制作initrd,一个用来制作rootfs,即kernel+initrd(busybox)+rootfs(busybox),就可以制作一个功能完好的Linux客户机,但是busybox不提供bash,因此我们就可以使用宿主机的kernel和一个我们手动编译的busybox,制作一个initrd,再制作一个rootfs,就可以实现一个比之前体积更小,但功能更加完善的Linux操作系统,而且内核我们其实也可以手动来编译。

·查看本机硬件设备信息的命令

    1,查看CPU的信息

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第1张图片


    2,列出本机USB的相关属性信息

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第2张图片


    3,列出PCI总线的所有设备的类型

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第3张图片


    4,显示当前计算机上所有的硬件信息

      hal-device命令

      hal(hardware abstract layer->硬件抽象层)

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第4张图片


      该命令还有一个图形化的命令,相当于Windows的设备管理器

·如何编译内核

    首先执行make menuconfig、make gconfig或者make kconfig命令,make config命令会遍历所有的内核选项,速度比较慢,内核编译完成之后,编译后的信息,会保存在一个.config的文件里面,接下来依次执行make、make modules_install命令(该命令是装载内核模块的命令,内核模块的安装位置在/lib/modules/`uname -r`目录中)以及make install命令。

·如何实现部分编译内核

    1,只编译某个子目录下的相关代码

      格式:make dir/subdir

       make arch/表示只编译和硬件平台相关的内核核心,即除了modules以外的所有内容,但是编译内核核心的时候也会去编译模块的。

       make drivers/表示只编译驱动

       make drivers/net表示只编译和网络相关的驱动

    2,只编译部分模块

      格式:make M=dir/subdir

       make M=dirvers/net表示将net目录下的所有内容全部编译称为ko模块,而且这些ko模块是可以拿来直接使用的。

    3,只编译一个模块

       make drivers/net/pcnet32.ko

    4,将编译完成的结果放在其他目录中

       格式:make O=/usr/src/tmp/kernel

·如何编译busybox

    我们在编译一个程序之后,这个程序要想正常使用得依赖一系列的库文件,我们之前将宿主机中的命令移植到我们的客户机当中的时候,还将这些命令所依赖的库文件也全部移植了,这些因为我们所移植的这些命令全都是使用动态链接的方式去编译的,我们也可以将一个程序所依赖的库文件全部编译进程序当中,这样做虽然会导致程序的体积变大,但是程序的移植性会变得非常的好,因此我们在编译busybox的时候,为了使busybox得移植过程尽可能的简化,我们可以用静态链接的方式来编译busybox,即将busybox所依赖的库文件全部编译进busyox程序当中,接下来我们开始正式编译安装busybox:

    要想编译安装一个软件,首先得安装Development tools和Development librares这两个工具:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第5张图片


    1,首先下载busybox的稳定版本,下载地址www.busybox.net

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第6张图片


      接下来开始手动编译busybox,编译busybox的方式和编译内核的方式是一样的,即在busybox的解压目录下执行make menuconfig命令即可:

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第7张图片


      然后我们得在Busy Settings里面的Build Options(编译选项)里面选择以静态链接的方式来编译busybox:

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第8张图片


      还得在Busybox Settings里面的Installation Options(安装选项)来设定我们的busybox的安装路径:

      

wKioL1g1SZbSCMy-AAANG5WGCqE254.png


    2,接下来执行make install命令

      直接执行该命令可能会报错,因为新版本的busybox可能会依赖更新版本的内核头文件,所以我们得需要更新版本的内核了,比如2.6.38.5版本的Linux内核,将内核的源码目录解压至/usr/src目录下:

      

wKioL1g1T6nw5tI0AAAJSwYlrr0761.png


      在内核源码的目录中有一个叫做include的头文件目录,在该目录中的mtd目录中,有一个叫做ubi-user.h的文件,我们只需要这么一个文件,编译的过程就不会再出错了,我们在busybox的源码目录下的include目录中新建一个mtd目录,并将该文件复制进来即可:

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第9张图片


      最后在busybox的源码目录下执行make install命令进行编译安装即可:

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第10张图片

 

      安装路径在当前目录的_install这个目录中:

      

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第11张图片


       此时,busybox就已经编译安装完成。

·使用编译安装好的busybox来制作initrd

    将busybox的安装目录复制到/root目录下:

    

wKiom1g1VOHgx64LAAAUwJbIzPA999.png


    删除linuxrc这个链接文件,并且手动创建一些目录:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第12张图片


    我们先使用红帽提供的内核,不再手动编译内核了,但是红帽提供给我们的内核不支持ext3文件系统,内核不支持ext3文件系统,意味着内核无法访问rootfs,所以我们的initrd文件才给我们的内核提供了访问ext3文件系统的相关模块,因此我们得给busybox装载和ext3文件系统相关的模块,所以我们才在busybox中创建了lib/modules目录,专门用该目录来存放相关模块,要想给busybox装载和ext3文件系统相关的模块,首先我们得使用modinfo命令来查看和ext3文件系统相关的模块都是什么:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第13张图片


    由上图知,ext3依赖于jbd,故我们得将ext3和jbd相关的模块都装载进busybox中,将二者的模块文件全部复制进busybox的lib/modules目录中:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第14张图片


    接下来我们还得给busybox提供一个init脚本:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第15张图片


    然后还得在busybox中创建两个非常重要的设备文件:

    mknod /dev/console c(字符设备) 5(主设备号) 1(次设备号)

    mknod /dev/null c 1 3

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第16张图片


    最后再创建一个tmp目录,再给init脚本一个执行权限,至此initrd文件就制作完成了:

    

wKioL1g1WzmQaBVoAAANOL3hPto401.png


    之后将制作好的initrd文件归档压缩至/mnt/boot目录下即可:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第17张图片


    有了initrd文件,接下来就是复制宿主机的内核到客户机当中:

    

wKioL1g1XPeCctnhAAAU_iB6EH8177.png


    最后就是安装我们的grub了:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第18张图片


    并手动提供grub的配置文件:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第19张图片


·使用编译安装好后的busybox来制作客户机的rootfs

    进入到busybox的源码目录中去,将busybox安装目录中的所有内容全部复制到/mnt/sysroot目录中去,并且删除掉linuxrc文件:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第20张图片


    然后创建根文件系统所需的目录:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第21张图片


    然后创建init程序的配置文件inittab:

    

wKiom1g1YpOD01LKAAALPd860WE368.png


    接下来还得手动添加一个fstab文件:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第22张图片


    对于我们的rootfs也需要两个设备文件:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第23张图片

    最后提供一个sysinit系统启动脚本,并添加执行权限即可:

    

Linux系统裁剪之四(自定义内核及busybox完成系统定制)_第24张图片