背景介绍
在Linux结构中,系统是内核加模块构成,在有些场景我们不需要用到所有的模块,可能只需要几个特定模块,而安装模块越多,体积增大的同时也意味着需要承担更多的风险,基于此,我们可以自己定制一个只有内核和所需模块的小系统。Linix的核心是由内核文件vmlinuz加驱动程序initramfs组成,在/boot目录下我们能够找到这2个文件,可以看到体积本身很小,只要有这2个文件,系统就能正常启动,以下就来介绍如何制作一个只有内核和个别命令的小linux系统。
<a href="http://s3.51cto.com/wyfs02/M01/85/1A/wKiom1eZvPuhMbk2AACpJTjkCjc388.png-wh_500x0-wm_3-wmp_4-s_520796933.png" target="_blank"></a>
操作步骤
1.新增一块硬盘sdb
<a href="http://s3.51cto.com/wyfs02/M01/85/1A/wKioL1eZvPvQcGu3AACXDUQQEHM553.png-wh_500x0-wm_3-wmp_4-s_1185536561.png" target="_blank"></a>
2.使用fdis /dev/sdb创建2个分区
<a href="http://s3.51cto.com/wyfs02/M02/85/1A/wKiom1eZvPvyAhaeAAAoDGt_8r0007.png-wh_500x0-wm_3-wmp_4-s_3162795443.png" target="_blank"></a>
3.给这两个分区创建文件系统
mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
4.在/mnt下创建boot和sysroot目录,用来安装裁剪后的系统
<a href="http://s5.51cto.com/wyfs02/M02/85/1A/wKioL1eZvPyy8wJWAAAhSS3NIWg802.png-wh_500x0-wm_3-wmp_4-s_3355370846.png" target="_blank"></a>
5.将sdb1和sbd2挂载到目录下
<a href="http://s5.51cto.com/wyfs02/M00/85/1A/wKiom1eZvPyjTPfaAAATn07-sPk818.png-wh_500x0-wm_3-wmp_4-s_4008518498.png" target="_blank"></a>
6.使用grub-install --root-directory命令安装grub引导程序,此处需要注意的是安装的目录是/mnt而不是/mnt/boot,原因是开机启动时系统会先去加载内核文件,此时文件系统尚未启动,但内核又是以文件的形式存放在磁盘上,似乎有矛盾,其实系统在加载内核前磁盘上有一个临时的根以便MBR访问并加载内核,待内核启动完毕后系统接管控制权再将临时根中的文件映射到/boot中,所以此处的安装目录就是/boot之前的目录,如果挂载点是/media/bootr,此处就是/media。另外安装位置是/dev/sdb而不是/dev/sdb1,原因就是MBR是安装在磁盘的第0扇区,不属于任何分区
<a href="http://s5.51cto.com/wyfs02/M00/85/1A/wKioL1eZvPzBzOiuAAAsaEU68TI513.png-wh_500x0-wm_3-wmp_4-s_891941822.png" target="_blank"></a>
7.复制内核及initramfs文件到/mnt/boot目录中
<a href="http://s5.51cto.com/wyfs02/M02/85/1A/wKioL1eZvPyifgW3AAAttMEtZ6E082.png-wh_500x0-wm_3-wmp_4-s_2513233987.png" target="_blank"></a>
8.在/mnt/boot/grub下创建一个grub.conf配置文件。至此,创建一个小型的系统已经完成。此处需要说明的是:
(1)图中的root不是我们平时所说的“/”所在的位置,而是内核文件所在的分区,且不管是hd磁盘还是sd磁盘,在grub中都是以hd来标识,(hd0,0)表示第1块磁盘的第1个分区
(2)kernel和initrd的位置指向也证实了步骤6的说明,在Centos6之后使用initramfs替代了以前的initrd,但在grub中仍以initrd来指定
(3)root指定为/dev/sda2,因为后面要讲这个硬盘拆到其他主机上,且sda1为/boot
(4)init为/bin/bash,如果想实现一些自动命令可以将init指定为一个脚本。
<a href="http://s2.51cto.com/wyfs02/M00/85/1A/wKiom1eZvP3QFmMWAAArBzSdNl8452.png-wh_500x0-wm_3-wmp_4-s_3545142095.png" target="_blank"></a>
验证系统
1.在/mnt/sysroot内创建一些常见的系统目录
<a href="http://s2.51cto.com/wyfs02/M00/85/1A/wKioL1eZvP3wQrl0AAA4myY011k725.png-wh_500x0-wm_3-wmp_4-s_600720281.png" target="_blank"></a>
2.我们知道程序能够正常运行时靠可执行二进制文件和库的支持,为了模拟程序执行可以移植一些bash、ls等常用命令,此处只介绍移植bash的截图:
(1)拷贝bash的可执行二进制文件
<a href="http://s2.51cto.com/wyfs02/M01/85/1A/wKiom1eZvP3xhVMAAAAVHHUFQ-o675.png-wh_500x0-wm_3-wmp_4-s_1803028921.png" target="_blank"></a>
(2)找到bash所依赖得库文件,依次拷贝到/mnt/sysroot/下相应的目录中
<a href="http://s5.51cto.com/wyfs02/M01/85/1A/wKiom1eZvP6w72N_AABbG1yeRDo729.png-wh_500x0-wm_3-wmp_4-s_1113098205.png" target="_blank"></a>
3.新建一个虚拟机,挂上刚才的硬盘启动,可以看到定制的内核引导程序可以被识别
<a href="http://s5.51cto.com/wyfs02/M01/85/1A/wKioL1eZvP6Qj3ACAACdXuzXctE894.png-wh_500x0-wm_3-wmp_4-s_1104854154.png" target="_blank"></a>
4.内核加载后,测试移植的命令是否能够正常运行
<a href="http://s2.51cto.com/wyfs02/M02/85/1A/wKiom1eZvP-wjBlYAAG9JJYPkGs498.png-wh_500x0-wm_3-wmp_4-s_3791766826.png" target="_blank"></a>
本文转自 qiao645 51CTO博客,原文链接:http://blog.51cto.com/arkling/1831286