打印

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

[复制链接]
131|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
肉坨坨|  楼主 | 2018-9-20 18:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、内核管理简要理论
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/sdb1


(3)检查分区是否成功

# partprobe /dev/sdb# cat /proc/partitions12


(4)分区格式化

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


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

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


5、安装GRUB

(1)安装命令grub格式:

# grub-install –root-directory=(boot所在目录) /dev/sd[a-z]

(2)例:

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


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/boot1234


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}1


8、移植bash等命令至目标主机根文件系统

(1)移植的时候需要把命令的可执行文件以及所依赖的库文件复制,命令才能被执行。

(2)可执行文件位于/bin目录下,库文件在/lib目录 或者/lib64目录下。

(3)用which COMMAND 命令可查看命令的执行文件在哪个位置

用 ldd `which COMMAND`命令可查看命令所依赖的库文件在哪个位置。

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

#!/bin/bash#target=/mnt/sysrootclearCmd(){if which $cmd &> /dev/null;thencmdPath=`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 $cmdPathdone123456789101112131415161718192021222324252627282930313233343536373839404142434445

(5)复制示例:

# bash /root/scripts/cpcmd.shbashlscatinsmodrmmodmountumountifconfigippingchkconfig1234567891011121314





复制成功。

9、为提供配置文件

(1)示例:

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

(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作为文件后缀名(映像文件)12345678910111213

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/modules1

(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/1


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 /procmount -n -t sysfs sysfs /sysinsmod /lib/modules/e1000.ko[ $? -eq 0 ] && echo -e "Loaded e1000 module \033[60G[ \033[32mOK\033[0m ]"ifconfig lo 127.0.0.0/8ifconfig eth0 172.17.45.243/24mount -n -o remount,rw /dev/sda2 //bin/bash1234567891011121314

# chmod  +x /mnt/sysroot/sbin/init谨记必须给init脚本加上执行权限,否则系统启动的时候并不会执行init,会出现kernel panic错误。# sync使用sync将内存写入的数据同步到磁盘中去。可以使用多次,以确保文件数据已经被同步到磁盘中。1234

(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.2431234


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

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

419

主题

431

帖子

0

粉丝