不要被题目所吓到,其实裁剪或者说手动做一个小的linux并没有想象中的那么难,那么高大上。{本文都是基于虚拟机实现的}
想要制作或者裁剪一个小的linux,你所需要的是清楚的知道linux的启动过程,以及启动后会去哪些路径执行哪些程序,知道这些就相当的好办了,linux启动需要什么,我们就给他什么,这样就可以启动了。那么下来就先来看看linux的启动流程和需要执行的程序。
linux启动和windows启动方面还有有些类似的。
首先是①开机自检(POST,power on self test),接下来就是②BIOS中读取用户的硬件的相关设定,其中最重要的就是设置启动次序(我们这里肯定是从磁盘启动了),接下来③读取MBR中的分区信息了,当系统读取了到了bootloader,然后硬件工作就交给了操作系统,操作系统④根据GRUB(之前是LILO)引导/boot目录下根据grub.conf的配置信息从而加载内核信息到物理内存中去,当然/boot中不仅有内核文件,还有系统驱动模块,当读取内核后读入系统驱动模块,当一切加载完成后,⑤下来进去用户空间中,进去用户空间中执行的第一个程序就是/sbin/init,这个配置文件里面有系统自动运行的程序,如果你需要让系统开机自动运行什么程序的话,你就可以将命令或者程序写入到这个配置文件中。⑥init进程首先读取/etc/inittab(运行级别的设置文件)当我们打开/etc/inittab文件后,忽略上面的注释,看到的第一行的内容如下所示:
id:表示操作的id。
3:表示运行级别为3.
default:表示设置默认运行级别,无需定义级别。
当然系统运行级别除了3,还有0,1,2,4,5,6总共7个运行级别。
0级别:表示关机。
1级别:单用户模式,直接以root用户登录
2级别:多用户模式。
3级别:完全多用户模式,文本模式
4级别:预留级别
5级别:完全多用户模式,图形模式
6级别:重启
每种模式下都对应了很多当下模式所启动的服务或者程序,他们都位于/etc/rc.d/下。
其中打开当前处于3级别中的文件,如下:有很多在相应运行级别中运行的程序。
这个话题先说到这里,我们去手动制作linux。
如上所说,我们都是基于 VMware虚拟机完成的。
首先手动为linux额外挂载一个SCSI硬盘,如图:
接下来就是给这个硬盘分区。
创建两个分区。一个用来做/boot,一个用来做/sysroot
格式化分区:mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
完成后,建立两个目录用来挂载两个分区
创建目录:mkdir -pv /mnt/{boot,sysroot}
挂载分区:mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
挂载完成之后就要给小linux安装GRUB引导程序了,具体命令如下:
grub-install --root-directory=/mnt /dev/sdb -->意味着把GRUB安装进我们的小linux(sdb中)
安装成功后,就要给我们配置文件对应的/boot分区中放置配置文件要加载的系统内核和设备驱动程序了。我们为了方便,直接基于本机,直接讲本机的系统内核和设备驱动程序放置过去。本机的系统内核和设备驱动程序也在/boot目录中放置,我们可以直接复制进我们的小linux。
如图,上面两个为本linux下的内核和设备驱动程序。
现在就来复制这两个进我们的小linux下的/boot中。我们在复制的过程中,为其改下名字,方便一会我们写grub.conf的配置文件。
上面为复制和改名命令,下来查看下结果:
下来就要为GRUB写配置文件了,好让GRUB去引导和加载他,不是吗?配置文件要写在/grub目录下,名字为grub.conf,下面就让我们去编辑它。
这样,GRUB的配置基本结束了。下来就要对/sysroot目录进行了。
首先,要为其创建应有的目录。
大家已经知道系统第一个执行的是:init,我们自己做小linux,那我们直接让他开机运行shell程序。那既然要这样,那么我们就需要把bash拷进我们的bin中了
我们写一个脚本,用来复制这些命令和其依赖的文件到我们刚建立的目录中去,在次这个脚本也贴出来:
#!/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
这个是脚本内容,我给这个脚本起名为:copy.sh,一会运行这个脚本把自己想要用到的命令一并都加进去。
bash在启动的时候,不是直接启动bash的,也是启动bash的链接文件,所以我们需要为bash创建一个链接文件,所以我们要进入到/bin/bash中为其添加一个链接文件。
当然不能忘记给grub.conf一个执行权限,所以 chmod +x /mnt/boot/grub/grub.conf
这些做完,一个简陋的linux就可以启动了,当然不要忘记同步磁盘,为刚写入的那些东西通通写入到磁盘中,使用命令 sync
启动成功画面。。。。。。。。。。。。。。。
当然这样的不算完,或者他可以更加的优化一点。刚开始不是说init启动用户进程吗,我们刚直接让他运行的bash,那此刻,我们可以给他运行更多的东西,让这个小系统看起来更像那么一回事岂不是更好,我们可以给他也开机加载。查看客户机有那些加载文件。使用mount查看:如下:
那此刻,我们就可以自己写init文件来让系统开机自动加载了。
我们在给/sbin/init中写入开机自己运行的程序的时候,可以自定义添加一些信息,好让我们知道系统启动的过程。我们可以在init中加入一句话:the system is running。
具体看脚本文件:
然后给执行权限:chmod +x /mnt/sysroot/sbin/init
当然,还需要将/grub/grub.conf中的init=/bin/bash改成init=/sbin/init.
将改过的系统再开启来试试效果。
当然这样的情况下,算是已经完成了。不过我们还可以更加完善点,我们可以给他加入网卡驱动的话,那不是我们就可以远程来访问他了。哈哈,不妨来试一试。
首先,我们需要的是网卡驱动,当然还需要装载网卡的命令,还有查看硬件信息的命令。网卡驱动就有本机模拟的网卡。
复制安装网卡和查看网卡类的命令进小linux中:如。ifocnfig modprobe。
使用insmod安装: insmod /lib/modules/e1000.ko
好了,到此结束,以后会完善一些更好的功能的,目前就先这样。
本文出自 “linux运维” 博客,请务必保留此出处http://xz159065974.blog.51cto.com/8618592/1376401