Linux系统启动流程及系统裁剪

一、内核管理简要理论

1、内核的功能
(1)进程管理
(2)内存管理(内核管理代码中代码量最大的部分)
(3)I/O管理:中断及中断处理
(4)文件系统:ext3,ext4,reiserfs,xfs等。。
(5)驱动程序
(6)安全相关:SELinux

2、内核设计流派
(1)单内核:单一体系结构(Linux)
<1>特点:
①模块化设计:核心+外围功能性模块组成
②内核支持动态装卸载模块

(2)微内核:内核子系统,更容易用于多线程编程(Windows、Solaris)

二、Linux系统的初始化流程

1、系统启动流程总结
(1)
POST(Power on self Testing)
–>BIOS(boot sequence)
–>GRUB(bootloader),分两阶段{stage1:在MBR中。stage2:在grub目录中}
–>Kernel(找到initrd,被打包的模块)
–>SHELL

2、POST(Power on self testing)的作用
(1)打开电源后,检测硬件设备是否正常工作。

3、BIOS的作用
(1)若电脑有多个存储设备,BIOS就会按照中的Boot Sequence(启动队列)来选择MBR所在的存储设备。

4、GRUB(Grand Unified Bootloader)
(1)1st stage(第一阶段):位于MBR中,为引导2nd stage。
(2)1.5 stage:位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件识别扩展。
(3)位于boot基本磁盘分区中,GRUB的引导程序。

5、启动kernel
(1)启动vmlinuz,vmlinuz是一段压缩存放的代码,分为两端,一个解压代码,一个为内核代码。
(2)vmlinuz一般在boot目录下。
(3)vmlinuz完成对内核的初始化

(4)内核初始化时候需要启动用户进程:/sbin/ini,需要/lib/modules中的内核模块,但内核模块在根分区上,vmlinuz识别/分区又需要内核模块。(鸡和蛋问题)
<1>解决方案:安装操作系统的时候,安装程序能识别内核模块所在磁盘,并将内核模块打包为initrd供vmlinuz识别使用。

6、用户空间进程/sbin/init启动以后的工作
(1)执行/etc/rc.d/rc.ssysinit脚本完成系统初始化工作

三、系统裁剪流程详解

1、系统裁剪要求:有GRUB引导系统,并且使用init脚本实现网卡驱动的装载,以及IP地址的配置,添加tserver服务,并在系统启动时启动此服务并显示。

2、操作环境的目标
(1)在vmware12中操作,系统为Centos6.5
(2)基于宿主机(Host)制作一个简单可启动的Linux

3、流程概括
(1)为虚拟机添加一块新硬盘,并为其分区,安装GRUB
(2)复制内核文件(vmllinuz)和initrd文件至新硬盘中。
(3)移植bash,网络相关命令ifconfig、ip、ping命令,文件列表命令ls,服务管理命令chkconfig,模块装载卸载命令insmod、rmmod,挂载卸载命令mount、umount,文件查看命令cat至目标主机(Target)的/文件系统中。
(4)为grub提供配置文件。
(5)为目标主机配置/sbin/init文件启动网络服务和其他服务。
(6)将目标主机的硬盘装载其他电脑上。

4、添加新硬盘并分区、格式化和挂载
(1)在虚拟机上添加一块20G的硬盘,名为TinyLinux。
这里写图片描述

(2)为硬盘分区{一个为500M(boot分区),一个为1G(/分区)}

 # fidk /dev/sdb

这里写图片描述

(3)检查分区是否成功

# partprobe /dev/sdb
# cat /proc/partitions

这里写图片描述

(4)分区格式化

# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2

这里写图片描述

(5)在/mnt目录下创建boot目录以及sysroot目录,并将上面两个文件系统进行挂载。

# mkdir /mnt/{boot,sysroot}
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
# mount

这里写图片描述

5、安装GRUB
(1)安装命令grub格式:
# grub-install –root-directory=(boot所在目录) /dev/sd[a-z]
(2)例:

# grub-install --root-directory=/mnt /dev/sdb

这里写图片描述

6、复制内核文件和initrd文件至目标主机磁盘
(1)内核文件为宿主机中的/boot/vmlinuz-VERSION
(2)initrd文件为宿主机的/boot/initramfs-VERSION.img
(3)复制示例:

# cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
# cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
# ls /mnt/boot

这里写图片描述

7、创建目标主机的根文件系统
(1)根文件系统一般包含的目录:
etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root
(2)示例:

# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root}

这里写图片描述

8、移植bash等命令至目标主机根文件系统
(1)移植的时候需要把命令的可执行文件以及所依赖的库文件复制,命令才能被执行。
(2)可执行文件位于/bin目录下,库文件在/lib目录 或者/lib64目录下。
(3)用which COMMAND 命令可查看命令的执行文件在哪个位置
ldd `which COMMAND`命令可查看命令所依赖的库文件在哪个位置。

(4)用一个脚本实现将命令的可执行文件以及其所依赖的库文件复制到目标主机根文件系统中

#!/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} ] && echo -e "\033[31mThe ${1} exist!\033[0m" && return 5
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
        echo -e "\033[32mCopy ${1} success.\033[0m"
}

libCopy(){
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] && echo -e "\033[31mThe ${lib} exist!\033[0m" && continue
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
                echo -e "\033[32mCopy ${lib} success.\033[0m"
        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

(5)复制示例:

# bash /root/scripts/cpcmd.sh

bash
ls
cat
insmod
rmmod
mount
umount
ifconfig
ip
ping
chkconfig

这里写图片描述
这里写图片描述
复制成功。

9、为提供配置文件
(1)示例:

# vim /mnt/boot/grub/grub.conf
内容为:
default=0
timeout=5
title Tiny Linux
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda2  quiet selinux=0 init=/bin/bash
        initrd /initramfs.img

(2)字段解释:
<1>default =# :指定默认启动的内核或者OS(Operating System)
<2>timeout=# :等待用户选择要启动的内核或OS的时长,单位为秒。
<3>splashimage=/path/to/splashimage_file :指定使用的背景图片
<4>hiddenmenu:隐藏菜单
<5>tittle

    root (Device(磁盘设备),Part(磁盘分区) )
        ①Device表示方式:在grub中,统统以hd开头,并紧跟一个数字做各磁盘设备的标志,从0开始编号。
        ②Part表示方式:代表分区,从0开始编号

    kernel 
        ①指定内核文件及传递给内核的参数,常用参数:ro root=/path/to/device,
        表示把该设备文件所表示的设备当作内核去挂载时的根使用的真正根分区所在的设备。(只读挂载) 
        参数格式:ro root=/path/to/device quiet
        quiet为静默模式

    initrd
        ①文件通常为cpio归档,并使用gzip压缩;通常以.img作为文件后缀名(映像文件)

10、将目标主机的硬盘装载其他电脑上。

切记在装载前先把宿主机挂起,再装载在其他电脑上,以免数据被损坏。
(1)在vmware12中创建一个新的虚拟机,内核为64位即可,一下是我自己的配置:
这里写图片描述

(2)为该虚拟机提供硬盘,在Centos6.5目录下找到TinyLinux.vmdk文件即可
这里写图片描述
这里写图片描述

(3)启动该虚拟机,若有grub引导并出现如下界面,并且命令正确,证明TinyLinux小系统能成功运行。

这里写图片描述

这里写图片描述

11、复制网卡模块至目标主机的
(1)网卡模块所在路径:
/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
(2)创建/mnt/sysroot/lib/modules目录

# mkdir /mnt/sysroot/lib/modules

(3)复制网卡模块至/mnt/sysroot/lib/modules目录下

# cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/

这里写图片描述

12、为目标主机配置/sbin/init文件启动网络服务和其他服务
(1)将上面步骤中开启的新的虚拟机关机,重新打开挂起的Centos6.5
(2)编辑/mnt/sysroot/sbin/init文件

# vim /mnt/sysroot/sbin/init

编辑内容:
#!/bin/bash
#
echo -e "\tWelcome to \033[34mKingOlie Tiny \033[0mLinux"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
[ $? -eq 0 ] && echo -e "Loaded e1000 module \033[60G[ \033[32mOK\033[0m ]"
ifconfig lo 127.0.0.0/8
ifconfig eth0 172.17.45.243/24
mount -n -o remount,rw /dev/sda2 /
/bin/bash
# chmod  +x /mnt/sysroot/sbin/init
谨记必须给init脚本加上执行权限,否则系统启动的时候并不会执行init,会出现kernel panic错误。
# sync
使用sync将内存写入的数据同步到磁盘中去。可以使用多次,以确保文件数据已经被同步到磁盘中。

(3)编辑/mnt/boot/grub/grub.conf文件,将init指定为sbin目录下的init

(4)如果目标主机启动时候显示绿色OK字样,证明网卡模块已经被装载。
这里写图片描述

(5)用ping命令检验网络模块能否正常工作

# ping 172.17.45.243
此时,ctrl+c按键并不能中断ping命令,因为该小系统并没有配置ctrl+c热键。
建议使用以下命令限定ping次数和时间检测:
# ping -w 5 -c 5 172.17.45.243

这里写图片描述

===================================================

以上是我的个人总结,如有错误,欢迎大家指出,谢谢大家。

发布了42 篇原创文章 · 获赞 55 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览