linux启动流程知多少之迷你系统

为了更清晰的了解,尝试简单做一个grub+kernel启动的迷你linux系统
实验环境:vmware9  rhel5.8

第一步:添加所需磁盘 
    关闭虚拟机rhel5.8,然后setting-->add....(亲,这些实在不想写...)
    添加一个虚拟磁盘(SCSI.vmdk);注意,此磁盘推荐使用scsi
        (创建IDE的磁盘,再最后迷你系统引导时内核恐慌...可能是vmware的小bug吧,具体也不清楚)
第二步:创建分区 
    使用已有的系统rhel5.8为磁盘分俩区(因为系统已有两个磁盘sda,sdb,因此这个为sda,您的您自己看哈)
        sdc1 存放grub、内核等文件--->此分区仅50M大小即可,足够使用了
        sdc2 根分区,大小自定,笔者在此仅给了1G
第三步:给sdb1创建grub且复制或创建启动所需文件(亲,介个很重要哦...) 
        1.  mke2fs -j /dev/sdc1;mke2fs -j /dev/sdc2        格式化俩分区
        2.    mount /dev/sdc1 /media/boot/;mount /dev/sdc2 /media/sysroot/    挂载到本地目录(目录自己创建)
        3.    grub-install --root-directory=/media /dev/sdc
                使用此命令为sdc创建引导扇区及grub所需文件(个人理解)
                注意--root-directory=/media是在挂载点/media/boot的父目录,理解方式可以参照系统/boot目录也是位于/根目录,
                而/boot里面的内容取决于您是否挂载boot分区...(呃,亲,这个的确有点绕,不用死磕,慢慢来就好了),/dev/sdc则是目标磁盘,切记是磁盘不是分区.
        4.    vim /media/boot/grub.conf
default=0    默认启动哪个系统:0为第一个,1为第二个一次
timeout=30    超时时间
splashimage=(hd0,0)/grub/splash.xpm.gz   
                    启动时加载的图片:这个grub-install不会创建的,可以复制系统原来的(笔者就是)
                    也可以自己做(640x480像素,14位色,gimp编辑保存为xpm格式,gzip -9压缩,复制到grub目录,在此指定名字即可)
hiddenmenu            是否隐藏显示下面的可选项...不想隐藏,这行就可以删除了...
title Hello MOS!     标题
    root (hd0,0)    如果系统只有一个磁盘,就是(hd0,0),若不确定,可以使用find (hd0,0)/查找您所需要的磁盘
    kernel /vmlinuz-2.6.18-308.el5    指定启动内核,此文件需要复制,此处的根,指boot分区.(咋又绕到这了..呃,对系统来说,/boot的父目录是根/,对boot分区来说,终极根就是boot分区)
    initrd /initrd.gz    此文件也需要复制,麻烦的是,还需要先解压修改再打包复制过来...原文件名字一般initrd-2.6.18-308.el5.img 版本号要跟内核版本号一致
            此文件(grub.conf)保存并退出
第四步:复制或修改并复制新硬盘引导所需文件 
    1.    cp /boot/grub/splash.xpm.gz /media/boot/grub/;cp /boot/vmlinuz-2.6.18-308.el5 /media/boot/    复制这俩,开机图片+内核
    2.    mkdir -pv /opt/initrd  建个目录,专门折腾initrd-2.6.18-308.el5.img
        2.1     修改并使用:initrd-2.6.18-308.el5.img 先介绍一下:
            此文件存储方式为:cpio归档,gzip压缩。这个是个比kernel更大,驱动更全的内核,以只读的方式运行
            完全可以理解成其本身就是一个迷你系统,负责使系统过度到真正的内核(vmlinuz-2.6.18-308.el5)等工作(个人理解)
        2.2    cp /boot/initrd-2.6.18-308.el5.img /opt/initrd.gz    复制并改名,因为要使用gzip解压,以免出现不必要的麻烦
        2.3    gzip -d /opt/initrd.gz   
        2.4    cd /opt/initrd
        2.5 cpio -id < ../initrd    将文件解包
        2.6    vim /opt/initrd/init
                找到mkrootdev -t ext3 -o defaults,ro /dev/sda2  此行
                修改其内容匹配你的新磁盘的第二个分区,修改使其和你的sdc2一致(本机我的是第三个盘sdc2,但是放到新系统里面,仍然是sda2)
        2.6 find /opt/initrd/|cpio -o --quiet -H newc|gzip -9 > /media/boot/initrd.gz    修改完成后,归档,压缩,扔到新磁盘第一个分区下
第五步:我们还需要点文件(骚等,亲..) 
    1.    cd /media/sysroot/;mkdir -pv mkdir -pv etc/rc.d dev proc sys bin sbin lib root media mnt opt home var usr/{bin,sbin,lib} tmp   
            把根目录下该有的目录,都创建一个吧..
    2.  vim /media/sysroot/etc/inittab   (完整内容参见/etc/inittab)
    id:3:initdefault:
    si::sysinit:/etc/rc.d/rc.sysinit
            这两行足够了,第一个三默认进入第三级运行模式,第二个是其执行rc.sysinit脚本
    3.    vim /media/sysroot/etc/rc.d/rc.sysinit    此脚本内定义了系统各种初始化任务,不再一一细说,(非常好的shell编程范例/etc/rc.d/rc.sysinit)
    echo "Hello MOS"    输出Hello MOS
    /bin/bash            并启动bash
    4.    既然要启动bash,那么bash是个命令,位于/bin目录下,我们需要它,So..
    cp /bin/bash /media/sysroot/bin/
        4.1  单单有/bin/bash还是不行的,为什么呢??库文件,Yes!
                [root@station69 etc]# ldd `which bash`
                linux-gate.so.1 =&gt;  (0x00b0e000)
                libtermcap.so.2 =&gt; /lib/libtermcap.so.2 (0x00c07000)
                libdl.so.2 =&gt; /lib/libdl.so.2 (0x00bd5000)
                libc.so.6 =&gt; /lib/libc.so.6 (0x00110000)
                /lib/ld-linux.so.2 (0x00a5a000)
        4.2  看到上面的库文件了么,亲?动手复制吧...
            cp /lib/libtermcap.so.2 /media/sysroot/lib/
            cp /lib/libdl.so.2    /media/sysroot/lib/
            cp .........
        4.3     仅仅有bash还不行,为什么??对了,还有/sbin/init...所以...你懂的...
                [root@station69 sysroot]# ldd /sbin/init
                linux-gate.so.1 =&gt;  (0x0068c000)
                libsepol.so.1 =&gt; /lib/libsepol.so.1 (0x007e6000)
                libselinux.so.1 =&gt; /lib/libselinux.so.1 (0x007cc000)
                libc.so.6 =&gt; /lib/libc.so.6 (0x00a79000)
                libdl.so.2 =&gt; /lib/libdl.so.2 (0x00bd5000)
                /lib/ld-linux.so.2 (0x00a5a000)
                cp ....;cp ....(亲,没疯吧???没事,笔者当时仅复制了两个,后来的一些命令,写了一个简单的脚本,凑合着用吧,文档末尾列出。)
    到此,系统制作已经简单完成了...看..So easy(声明一下,这话不是我说的...)...
第六步:创建新虚拟机,磁盘指向刚刚做的磁盘即可,切记,关闭或挂起之前的系统! 
    下面来些图片:

2012-10-07_143952

2012-10-07_144343

2012-10-07_144306

添加命令及其库文件脚本,代码如下:
#!/bin/bash
#Author: MOS
#Script name: AddCommLib.sh
#Date & Time: 2012-10-06/17:19:09
#Version: 1.0.1
#Description:
#
Command=${1:-passwd}
Comm=`which $Command|tail -1`
Res=(`ldd $Comm 2&gt;/dev/null|grep -o "/.*"|cut -d" " -f1`)
Path='/media/sysroot'
[ ! -f $Path$Comm ] && cp $Comm $Path$Comm
for i in ${Res[*]}; do
    [  -f $Path${i} ] && continue
    cp $i ${Path}${i}
done
脚本写的仓促,bug挺多,像路径如果太深,会报错内置命令会报错..但是一般的命令是没问题的,凑合着用吧...
笔者还得预习功课,到此为止了.....

呃,笔者菜鸟一枚,理解不到之处,还望各位大神多交流哈..联系QQ:313566432

你可能感兴趣的:(linux,kernel,启动,迷你)