我这里使用的是系统是Redhat 6.4,虽然CentOS是在此基础上优化开发的,但是我一直没有裁剪成功,不知道到底是哪里出了问题。也希望使用Centos6.X执行裁剪成功的朋友,可以指点我一下,非常非常感谢,我的QQ315688082。
1.这里使用交叉编译的思想,我在Redhat6.4上添加一个硬盘,将该硬盘分区以及安装好MBR之后,再将其挂载到另一个新建的虚拟机上,注意该虚拟机在创建时我只使用了这一个处理好的硬盘。
2.怎么添加新硬盘就不赘述了,现在默认以及添加好了,下面要执行的步骤是分区、格式化、挂载、安装grub、创建“根分区”、挂载至新系统。
3.给sdd(我的虚拟机有四块硬盘,这个是第四块)硬盘分区,然后格式化,我划分了两个分区,一个100M用于boot分区,一个1G用来模拟根分区,如下:
分区以后,查看一下,应该如下所示:
4.格式化硬盘
5.在宿主机上创建两个目录,用于挂载这两个分区。分别是/mnt/boot和/mnt/sysroot
6.为精剪的小系统创建根目录下的相关文件,这里我使用一个简单的for命令去创建。
7.复制内核文件意见所需的基本设备驱动文件
8.安装移植shell程序,这里我使用马哥(马永亮)提供的一个移植脚本bincp.sh,非常好用。其实移植一个命令只需要将该命令以及该命令的的库文件移植过去就可以了,命令ldd。
#!/bin/bash
#
target=/mnt/sysroot
clearCmd() {
if which $cmd &> /dev/null; then
cmdPath=`which --skip-alias $cmd`
else
echo "No such command"
return 5
fi
}
cmdCopy() {
cmdDir=`dirname $1`
[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
libCopy() {
for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
while true; do
read -p "Enter a command: " cmd
if [ "$cmd" == 'quit' ] ;then
echo "quit"
exit 0
fi
clearCmd $cmd
[ $? -eq 5 ] && continue
cmdCopy $cmdPath
libCopy $cmdPath
done
这里至少要移植一个bash命令,其余的用到的话可以来移植,为了后面还要添加网卡模块,因此我在这里移植了一下几个命令:bash,ls,cat,ifconfig,insmod,rmmod,route,ping等命令。
9.安装grub(安装方法前面目录有详细步骤和说明)
10.创建grub.conf文件,具体步骤和说明复习之前的章节,vi /mnt/boot/grub/grub.conf,内容如下:
我们给引导文件创建了一个名字:New Minimal Linux OS Powered by Redhat6.4,这样方便我们查看,另外需要注意的一点,当内核装载进内存,并且展开驱动设备的“文件系统”,会以只读方式(ro)挂载根分区,然后进行系统初始化流程,默认会去找./sbin/init,但是我们这里使用一个shell脚本来替代,即可进入系统。只不过这里需要指定init参数,并且一定要在该行的最后,如果系统都没有挂载好,有怎么能找到/bin/bash这个可执行文件呢。将宿主机挂起,然后创建一个新的虚拟机,使用这块硬盘,然后启动如下:
现在可以成功进入系统了,而且启动速度特别快,也就3秒左右。后面来说下加入网卡模块,然后让这个小型的linux系统可以上网。