我们在实现内核精简之前首先要知道为什么要做内核的精简,以及我们做内核精简的主要目的是什么,内核精简在实际工作中有什么应用?


下面我们就谈谈这些:

内核精简的主要目的:其实内核的主要目的只有一个就是实现单一或者少数应用。

内核精简在实际工作中的应用:在公司的网络往往需要一些服务器,比如web服务器,ftp服务器,DNS服务器。

那我们为什么要做内核的精简呢?因为我们使用linux的主机实现单一的功能时,并不需要内核中其他的功能。大家都知道,一个操作的系统的内核越大,启用时占用的资源就会越多,从而造成系统的稳定性降低,因此我们在做单一的应用时就必须做内核的精简来减少资源的占用尽量使系统更加稳定,更加高效。


现在,我们就来打造一个精简的内核来实现FTP服务的功能。

当然,想要打造一个可以正常使用的内核,那你必须要了解系统启动的引导过程,下面介绍一下系统启动时的引导过程:

183232472.png

加电开机后,首先运行CMOS对系统软硬件进行检查,查看有没有损坏或者系统的引导方式是光盘引导还是硬盘引导或者其他介质进行引导。检测到我们是硬盘引导后,便启动了系统引导的第一个阶段,即由MBR引导(MBR共有512B,其中前446B是bootloader是系统引导的第一阶段,中间64B的是分区表,分区表分为了四行,每行占用16B分别记录了【记录起始柱面结束柱面大小  id】所以linux下硬盘最多有四个主分区或者三个主分区和一个扩展分区的组合,后2B是magic值,是硬盘的唯一标识)。第一阶段引导后便开始第二阶段引导,便进入grub引导菜单,在这里可以选择要启用的系统,然后加载内核及驱动程序,接着要调用进程。由于在linux系统中一切的进程都依赖于init进程,所以要首先调用init进程,接着会读取/etc/inittab中的内容,无论/etc/inittab中默认的是何种级别(总共6个级别),系统都会执行/etc/rc.d/rc.sysinit脚本进行系统的初始化操作然后会根据/etc/inittab表中的默认级别进入到相应的/etc/rc{0-6}.d/*执行内部指令。然后,会执行/etc/rc.d/rc.local的开机脚本,接着呈现出用于登陆的终端的界面,至此,整个引导过程结束。


我们实现内核精简,打造自己的操作系统的原理是:

我们需要具备完整系统环境的宿主机,将我们的硬盘挂到宿主机上,根据原有系统,打造内核、驱动、init及inittab、常用指令、库文件、及vsftpd应用。最终拆解我们打造好的硬盘挂在我们要打造的主机上。

183245673.jpg

具体实现步骤:

首先,将硬盘挂在宿主机上进行相应的分区和格式化文件系统,且将相应的分区进行挂载:

分区的指令是:fdisk;格式化文件系统是:mkfs;挂载要先用mkdir建立挂载点,再用mount进行挂载。

1.我们先使用fdisk建立三个主分区【分别为:boot分区、/分区、交换分区(swap)】

183529292.png

183535405.png

183539310.png


2.使用mkfs进行文件系统格式化,同时将/dev/sdb1/dev/sdb2格式化成ext3,/dev/sdb3格式化成swap分区:

183543170.png

183557801.png


3.建立挂载点,并且挂载分区:

183606370.png

使用mount指令查看挂载的分区:

183612885.png


其次,一个硬盘要想引导,就必须要有自己的MBR,而MBR内存放了引导的第一阶段,也必须有引导的第二阶段即grub引导阶段,还要有内核等等。

a.因为内核是系统的最核心部分,它不会因为硬件的不同而做很大的改动,这里我们将宿主机的内核直接拷贝我们的硬盘的boot目录下:

183620704.png


然后,我们在宿主机的硬盘空间内新建一目录,将宿主机的驱动使用zcat解压在该目录下,根据需求修改里面init相应的内容后,重新压缩保存在/mnt/boot目录下:

183634758.png

183651961.png

183657844.png


b.这些都做好后我们使用grub-install建立grub的第二阶段:

183706268.png

183724355.png

注意:此时形成为grub目录下缺少grub的引导菜单文件—grub.conf,我们需要手动创建并且填充相应的内容,进入到/mnt/boot/grub下进行创建:

183738597.png

保存并退出即可。


c.第二阶段建立好之后,我们进入grub模式,进行第一阶段的建立:

183747934.png

然后,qiut退出即可。

至此,我们的第一阶段和第二阶段都已经完成了。


第三,我们要进行与init进程相关的操作,但是在进行之前,我们要进入/mnt/sysroot目录下创建所需要的目录结构:

183752683.png


由于,要运行init进程,我们要先使用which命令查看init程序的存放位置,使用ldd查看其运行所依赖的库文件,我们把这些东西全部拷贝到/dev/sdb2的相应的目录下即可:

183804594.png


由于,考虑到以后还要拷贝许多命令,这些命令也都依赖于许多模块,单个的拷贝会浪费很多时间,在这里我做了个脚本程序,方便以后随时的拷贝:

183814731.png

然后,使用chmod a+x指令改变其为可执行。


现在,我们测试一下我们的脚本程序能否将我们输入的命令的二进制文件拷贝到/mnt/sysroot/bin目录下,将库文件拷贝到/mnt/sysroot/lib目录下:

首先查看上面提到的两个目录,发现为空:183826507.png

运行我们编写的脚本程序,输入要拷贝的命令,然后查看/mnt/sysroot/lib、/mnt/sysroot/bin目录:

183832413.png


测试成功之后,我们先把我们常用的几个基础命令拷贝到我们的第二块硬盘上:

183835858.png


现在,内核和init程序已经拷贝过来了,接下来我们要去建立inittab表格,进入/mnt/sysroot/etc/目录下,用vim打开/etc/inittab将第21到29行写到当前目录下的inittab表内,修改成下图所示的内容:

183838160.png


由于系统无论进入何种级别都要进行初始化,运行/etc/rc.d/rc.sysinit初始化脚本,所以我们在/mnt/etc目录下创建rc.d目录,并且在rc.d目录下创建rc.sysinit脚本:

183841706.png


rc.sysinit脚本的内容如下:

183846521.png

保存并且退出,使用chmod a+x修改成可执行权限。


接下来,编写关机脚本syshalt和重启脚本sysreboot内容如下同样都保存退出,使用chmod a+x修改其为可执行:

183849911.png

183852540.png


而,这两个脚本分别调用了halt和reboot的命令,现在我们将这两个指令相关的东西拷贝到我们第二块硬盘的相应的位置,再次运行我们编写的拷贝指令的脚本cp.sh:

183856104.png

我们执行几次sync,把相关的信息同步到我们要写入的第二块硬盘上。


到此,我们重新打造的精简linux系统,已经可以成功引导,并开启了。现在我们先从宿主机上拆解下来,挂载我们的没有硬盘的机器上测试一下吧。

183859953.png

183903248.png

此时,开关机功能也已经实现。


再次拆解掉硬盘挂载在宿主机上,继续丰富我们的精简系统的功能:

此时我们给我们精简的系统增加主机名设置功能:

183909144.png

由于该脚本需要读取/etc/sysconfig/network的内容,所以我们在/mnt/sysroot/etc目录下新建sysconfig目录,并将宿主机的network文件拷贝到该目录下:

183913573.png

然后,我们增加网络功能:由于内核只是存放系统的最核心的部门,其他的文件比如网卡都以模块单独存放。我们的网卡属于硬件,在linux系统中可以使用dmesg查看网卡信息,使用lsmod查看网卡依赖的内核模块,

185609722.png


接下来我们使用modinfo查看上面两个模块的详细信息:

185611651.png

185613723.png


然后我们在/mnt/sysroot/lib目录下建一个modules目录用于存放网卡模块:

185616522.png


我们再来编辑rc.sysinit脚本程序,在初始化时加载网络模块:

可以使用insmod(需要指明具体路径,指明依赖关系)也可以使用modprobe(自动解决依赖关系),这里我们使用insmod进行加载:

185618800.png


由于上面用到了hostname、ifconfig、insmod和我们要测试的ping命令,现在去运行脚本将这些命令拷贝到我们的第二块硬盘上:

185621325.png


这些做完后基本的功能就已经具备,不过我们在启动时看的grub引导菜单不是很美观,我们想加一张背景图片,现在我们就找张自己认为好看的图片,做成符合要求的图片进行应用。

首先,找到一张图片对图片进行处理,在linux下有这样一个图片处理工具gimp我们现在就挂载光驱进行安装:

185623898.png

注意:这个工具只能在图形界面下使用。

gimp打开这个工具,处理图片,对图片的要求是:分辨率640X480,图片质量是十几色,图片格式是.xpm,然后保存在/mnt/boot/grub目录下即可。


接着我们去修改grub.conf文件,加上背景图片:

185626392.png

多执行几次sync,同步我们修改的信息到硬盘。


现在再次拆解掉第二块硬盘,挂载在测试主机上,启动系统进行测试:

此时,我们引导菜单,就有了背景了:

185632900.png

继续,进入到系统内部,进行一些命令的测试:

185634509.png

185637339.png


最后,我们实现FTP服务,能够实现匿名访问:

1.我们先在宿主机上安装vsftpd服务

185639116.png


2.拷贝等会儿可能要使用的命令

185642460.png

185644648.png


3.拷贝安装vsftpd时生成的文件:/etc/vsftpd/vsftpd.conf,由于访问FTP服务器,需要使用ftp账号登陆,而在安装时,会自动生成ftp系统账号,而此账号的信息分别存放在/etc/passwd/etc/shadow/etc/group

185647736.png


4.当然在安装vsftpd时,会自动创建这样一个目录/var/ftp/pub,因此,我们需要手动在第二块硬盘上创建这样一个目录:

185650611.png


5.在linux中系统识别用户是靠id来识别的,当基于名称访问时,linux中的nsswitch机制,来指定名称与id的对应关系,而这个机制依赖于/etc/nsswitch.conf这个文件,而这个文件又依赖于/lib/下几个nss库。因此我们将这些文件全部拷贝到第二块硬盘上:

185652332.png

185655637.png

185658790.png


6.现在,我们需要对/mnt/sysroot/etc/vsftpd/vsftpd.conf文件进行相应的修改:

   a.linux 采用的是pam认证,这里我们需要禁用此项

185700832.png


b.根据需要,我们编辑vsftpd的配置文件如下:

我们把日志文件禁用掉,如下图:

185703988.png

由于,我们这里只是实现匿名登陆,user_list这一项对我们也没有用处,也禁用掉:

185705976.png

别忘了多执行几次sync,进行一下信息同步哦!!!


现在,我们把硬盘抠掉挂载在我们要做ftp服务器的主机上试一下我们吧:

185708960.png


然后用本地的一台主机登陆此ftp服务器:

185712968.png


此时,我们抠掉硬盘继续挂载宿主机上,创建这样一个目录:

185714829.png


再次将硬盘抠掉,挂载我们要做成ftp服务器的主机上,进行测试:

185718510.png


至此,我们的linux内核精简,打造的简单的操作系统就实现了简单的FTP服务器应用了。