1.什么裁剪?
本片博文的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好的地方请指教.
2.原理
大家都知道,操作系统的启动流程是(主要是Linux):POST—>BIOS—>MBR—kernel-->initrd-->sbin/init,
POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是用的grub这个软件,grub引导系统了,然后启动内核,内核调用initrd来实现最基本的操作系统,
3.接下来,实际操作(所有操作均在虚拟机上实现)
3-1.首先我们得创建一个新的磁盘,来保存我们的grub和内核等关键程序(直接在虚拟机上添加新的磁盘)
笔者这里已经添加好了,就不演示添加的过程了,笔者的地盘分了两个区,分别是100M的主盘,和1G的主盘,名字为
/dev/sdg1和/dev/sdg2,首先在/mnt目录下创建两个文件夹:如图
3-2.挂载/dev/sdg1到/mnt/boot,挂载/dev/sdg2到/mnt/sysroot
3-3.大家知道,启动系统的时候除了硬件方面,首先就是要有引导程序,所以我们把引导程序安装到/mnt/boot
使用命令:grub-install –-root-directory=/mnt /dev/sdg1
3-4.有了引导程序就需要有我们的内核了,没有内核怎么启动啊,但是内核的启动又要依赖initrd(Centos6),所以我们要把这两个文件都复制过去,使用命令:
cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlunuz
cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img
3-5.这样一个简单的操作系统的雏形就做好了,但是OS的操作依赖于shell,所以我们得把bash shell复制到/dev/sgd2目录下,所以我们得把/bin/bash以及bash依赖的库复制过去,可以使用ldd `which bash`查看bash依赖的库文件有哪些,笔者这里自己有一个简单的script脚本,就不手动复制了
3-6.接下来要配置grub文件,不然系统怎么找到你的硬件,所以接下来在/mnt/boot/grub下创建一个grub.conf的配置文件,内容如下
3-7.接下来还要在根目录下,也就是挂载在/mnt/sysroot下创建一个proc的文件夹.就可以把这块新的硬盘当成其他系统的启动盘了,我们来试试,新创建一个空的虚拟机不用教了吧.然后添加我们的这块磁盘,就可以开机启动了
3-8.接下来我们来给他添加命令,其实很简单的,只要把命令的所在目录和命令所有依赖的库复制到/mnt/sysroot目录下就行了.这里我用脚本完成,就不演示了,笔者复制了一些常用的命令如:ls
3-9.笔者给这个小系统创建了几个目录了当然是在原主机上添加的,是不是越来越像一个系统了
3-10.好了!系统到这里就差不多了,不过我们还得修修,大家在3-6可以看到,我们的init=/bin/bash,这时候就会有同学问了,有没搞错,Linux系统化初始化不都是调用/sbin/init的么,你怎么调用了/bin/bash,没错,其实这里指向什么就调什么,那我们现在重新让他指向/sbin/init吧,首先在/mnt/sysroot下建立一个init文件,在里面添加如下字符:完成后记得给/sbin/init一个快 执行权限,然后把/mnt/boot/grub/grub.conf中的指向改成init=/sbin/init
3-11.如下图,执行成功了
3-12.最后,我们该给他添加一个网络模块了,哦哦,在3-9步我们发现磁盘还是只读的,所以得重新把他挂载成读写的,如下图:
3-13.终于可以给他加网络模块了,Linux的系统是单内核,但是支持模块化,所以咯,我们来给他加个网络模块吧,我们值需要先把原系统的网络模块复制到我们的微系统中,Linux的模块都在/lib/module/[内核版本号下],我们首先用lspci或者lsmod查看网络模块信息,然后复制到微系统中,如下:
最后安装网络模块,使用命令insmod [path]
好了,整个系统安装完成了!
4.接下来是系统开机自动启动的服务了,有兴趣的朋友可以看看
4-1.在/etc/rc.d/rc3.d(1-7都有,这里用3举例).见下图,一下都是开机可启动的服务,K代表开机时不自动启动的,S代表开机时自动启动的,K和S后面都有数字,那代表他们启动或关闭的优先级,数字越小,优先级越高,他们都是连接文件,指向/etc/init.d.而启动系统开机启动服务的命令是chkconfig命令
4-2.chkconfig命令
我们创建一个tsservice.sh脚本,让他开机自动启动,该怎么做呢?把这个脚本放在/etc/init.d下.脚本的全段代码如下图,附代码:
#!/bin/bash # myService=`basename $0` lockFile="/var/lock/subsys/$myService" [ $# -lt 1 ] && echo "Usage: $myService {start|stop|restart|status}" && exit 4 case $1 in 'start') touch $lockFile echo "Starting $myService OK" ;; 'stop') rm -f $lockFile echo "Stopping $myService OK" ;; 'restart') rm -f $lockFile touch $lockFile echo "Restarting $myService OK" ;; 'status') if [ -f $lockFile ]; then echo "$myService is running" else echo "$myService is stopped" fi ;; *) echo "Usage: $myService {start|stop|restart|status}" exit 3 ;; esac
4-3我们已经创建了该脚本,并且把该脚本放在了/etc/init.d目录下,是否就可以运行了呢?错....还需要使用chkconfig --add添加才行
可以看到,我们完成了
转载于:https://blog.51cto.com/lidefu/1370072