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

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的信息

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

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

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

hal-device命令

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

该命令还有一个图形化的命令,相当于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这两个工具:

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

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

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

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

2,接下来执行make install命令

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

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

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

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

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

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

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

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

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

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

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

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

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

mknod /dev/null c 1 3

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

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

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

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

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

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

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

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

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

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

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

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

时间: 2024-08-02 06:59:25

Linux系统裁剪之四(自定义内核及busybox完成系统定制)的相关文章

linux命令:系统裁剪之二 insmod装载模块

Linux系统裁剪笔记之二 1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好的地方请指教. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是

Linux学习笔记<二十>——系统裁剪之二

在系统裁剪之一的基础上,给系统添加挂载文件系统.关机重启.设置主机名.运行对应级别的服务脚本.启动终端.装载网卡驱动并启用网络等功能. 挂载文件系统 ①重新挂载根文件系统为可读写 vim 编辑/mnt/sysroot/etc/rc.d/rc.sysinit添加以下行 echo "Remount rootfs..." mount -n -o remount,rw / ②vim 编辑/mnt/etc/fstab /dev/sdb2       /       ext3    default

iOS8新特性扩展(Extension)应用之四——自定义键盘控件

iOS8新特性扩展(Extension)应用之四--自定义键盘控件 iOS8系统的开放第三方键盘,使得用户在输入法的选择上更加自主灵活,也更加贴近不同语言的输入风格.这篇博客,将介绍如何开发一个第三方的键盘控件. 一.了解UIInputViewController类 UIInputViewController是系统扩展支持键盘扩展的一个类,通过这个类,我们可以自定义一款我们自己的键盘提供给系统使用. 首先,我们先来看一下这个类中的一些属性和方法: @property (nonatomic, re

Linux系统裁剪笔记之四busybox

Linux系统裁剪笔记之四busybox 1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好的地方请指教. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系

Linux内核编译及系统裁剪之一

Linux内核编译方法详解及系统裁剪之一详解 我们的内核是由两部分组成的: 1,内核核心 核心文件的路径是/boot/vmlinuz-内核版本号 如下图-> 2,内核模块(ko:kernel object,内核对象) ko文件的路径是/lib/modules/内核版本号/下的所有文件 如下图-> 我们的内核有两种设计风格: 1,单内核设计风格 Linux的内核就属于是单内核设计风格的,不过Linux的单内核设计风格采用了微内核设计风格的模块化设计思想,所以使得我们的Linux内核的核心可以被设

Linux系统裁剪之二(Bash脚本编程之十二)

Linux系统裁剪之二(Bash脚本编程之十二) 系统函数库 ·Linux系统的启动流程     1,POST(加电自检) 计算机本身并不会执行程序,它只是一堆破铜烂铁,但是它可以在开机的时候先去载入一段程序,系统在刚刚启动的时候能够实现将某个ROM芯片中的程序映射到CPU能够寻址的地址空间中去,并且让CPU能够执行其中的指令,这些指令大部分都是用来做系统检测的,当检测完成后,如果系统中所有的基本硬件和核心硬件都没有问题的话,接下来就会根据BIOS中设定的系统启动次序(Boot Sequence

linux命令:系统裁剪之一grub引导

Linux系统裁剪笔记 1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统,从而达到系统缩减,订制特殊系统. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR(grub)-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是用的g

Linux系统裁剪笔记

1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好的地方请指教. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是用的grub这个软件,gru

Linux系统裁剪笔记之二insmod

Linux系统裁剪笔记之二 1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好的地方请指教. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是