Centos系统启动流程

    xiaoxiao2022-07-12  150

    一.内核空间启动流程

    1.Linux系统的组成部分

    1.Linux系统组成 1)内核

    1.内核功能:进程管理,内存管理,网络协议栈,文件系统,驱动程序,安全功能 2.进程间通信IPC(Inter process communication)分类 1)消息队列,semerphor,shm共享内存等 2)socket,不同主机间通信

    2)根文件件系统

    2.运行中的系统环境分类: 1)内核空间:内核代码(系统调用) 2)用户空间:应用程序(进程或线程) ps:根文件系统中最重要的文件:init

    3.内核设计流派: 1)单内核设计:把所有功能集成于一个程序,例如linux 2)微内核设计:每种功能使用一个单独的子系统实现,例如Windows,Solaris

    4.Linux内核的特点: 1)支持模块化:内核中的功能 .ko文件(kernel object) 2)支持模块运行时动态装载或卸载

    3.Linux内核组成部分: 1)核心文件:/boot/vmlinuz-version-release (release为local version发行号)

    [root@grub6 init]# ls /boot config-2.6.32-696.el6.x86_64 initramfs-2.6.32-696.el6.x86_64.img System.map-2.6.32-696.el6.x86_64 efi lost+found vmlinuz-2.6.32-696.el6.x86_64 grub symvers-2.6.32-696.el6.x86_64.gz

    2)ramdisk(临时根文件系统):其将内存中的一部分当做磁盘使用,使内核可以加载/boot下根文件系统设备的相关驱动程序,达到挂载根文件系统的目的

    1.Centos5:/boot/initrd-verson-release.img 2.Centos6,7:/boot/initramfs-version-release.img ps:由于ramdisk其本身即在内存空间中。当在centos5中将ramdisk当做磁盘中的文件进行读取,可能会被再次缓存,形成双缓存。在Centos6,7中,ramdisk被当做文件系统即不会发生这种状况。

    3)模块文件:/lib/modules/version-release

    2.内核视角系统启动流程

    1.加电自检

    1.POST加电自检:由ROM芯片上的CMOS进行,常见的CMOS为BIOS

    2.BIOS(芯片中的代码):Basic input Output System

    ps:ROM(加载自检程序)及RAM都为可被CPU访问的内存空间

    2.Boot Sequence(MBR为例)

    1.Boot Sequence(启动过程):按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备

    2.bootloader:引导加载器,程序 1)Windows:ntloader 2)Linux:

    1.LILO:Linux Loader 2.GRUB:Grand Uniform Bootloader 1)GRUB 0.X:grub legacy,基础grub 2)GRUB 1.X:grub2,第二版grub ps:boot loader无法驱动lvm,软raid类高级设备,因为bootloader太小,所有一般内核应该放在基本磁盘分区上

    3.MBR(Master Boot Record)引导加载器共512bytes: 1)446bytes:bootloader 2)64bytes:fat(文件系统分配表) 3)2bytes:55AA(确认有效信息)

    4.GRUB引导加载器: 1)bootloader:1st stage; 2)Partition:filesystem driver,1.5stage 3)Partition:/boot/grub,2nd stage ps:grub将引导加载分成四个阶段

    1.第一阶段,装载bootloader,实现装载第二阶段 2.由第二阶段提供相关的接口, 3.将内核加载至内存中

    5.bootloader功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中特定空间,解压,展开,而后把系统控制权移交给内核

    3.kernel自身初始化

    1.自身初始化:

    1.探测可识别到的所有硬件设备 2.加载硬件驱动程序(可能借助于ramdisk加载驱动) 3.以只读方式挂载根文件系统 4.运行用户空间的第一个应用程序:/sbin/init

    2.init程序的类型:

    1.Centos 5:SysV init 1)配置文件:/etc/inittab 2.Centos 6:Upstart 1)配置文件:/etc/init/*.conf(为了兼容5,/etc/inittab也存在) 3.Centos 7:Systemd 1)配置文件:/usr/lib/systemd/system;/etc/systemd/system

    3.ramdisk(安装完操作系统后,自行创建): 1)linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问 2)Centos 5:initrd,工具程序为mkinitrd 3)Centos 6,7:initramfs,工具程序为dracut(也兼容mkinitrd,实际也为调用dracut程序) 4)由Centos5到6,7:ramdisk --> ramfs(提速机制)

    4.系统初始化流程

    1.系统初始化流程(内核级别)

    1.POST:加电自检,检测硬件设备是否存在并且能够正常运行。 2.BootSequence:通过BIOS决定哪个设备为引导加载设备。 3.Bootloader(MBR):引导加载器,将用户选择好的系统或内核装载至RAM的特定空间中。 4.kernel初始化:借助ramdisk,完成对真正根文件系统相关设备驱动程序的加载。 5.rootfs:避免操作系统bug,以只读方式挂载根文件系统。 6.运行/sbin/init

    二.用户空间启动流程

    1.Centos 5:SysV init

    1.由于init程序是用户空间第一个启动的程序,其余进程都为其子进程,所以其为用户空间最重要的程序。

    2.运行级别:为了系统的运行或维护等目的而设定的机制

    0-6:共7个级别 0级别,关机,shutdown;0级别 1级别,单用户模式(single user),root用户,无需认证,维护模式; 2级别,多用户模式(multi user),会启动网络功能,但不会启动NFS(网络文件系统,维护模式) 3级别,多用户模式(multi user),完全功能模式,文本界面 4级别,预留级别,目前无特别使用目的,单习惯以同3级别功能使用 5级别,多用户模式(multi user),完全功能模式,图形界面 6级别,重启,reboot

    3.运行级别切换及查看 1)运行模式一般默认级别:3,5 2)级别切换:init #,例如init 5 3)级别查看:who -r命令或runlevel

    2.init配置文件

    1.init配置文件:/etc/inittab

    2.配置文件格式:

    每行定义一种action以及与之对应的process id:runlevels:action:process 1.id:一个任务的标识符 2.runlevels:在哪些级别启动此任务,也可以为空,表示所有级别 3.action:在什么条件下启动此任务 1)wait:等待切换至此任务所在的级别时执行一次 2)respawn:一旦此任务终止,就自动重新启动之 3)initdefault:设定默认运行级别,此时process省略 4)sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit 4.process:任务

    3.举例: 1)id:3:initdefault:(设定默认启动级别为3) 2)si::sysinit:/etc/rc.d/rc.sysinit(启动任一级别时,设定系统初始化)

    3.rc脚本

    1.rc脚本:实现在指定级别下,自动启动或关闭设置好的服务(rc各级别脚本为/etc/init.d/*服务脚本的符号链接)

    I0:0:wait:/etc/rc.d/rc 0 I1:1:wait:/etc/rc.d/rc 1 . . I6:6:wait:/etc/rc.d/rc 6

    2./etc/rc.d目录下有个对应级别的rc脚本,并且每个对应脚本下有K开头及S开头的文件 1)K*:要停止的服务;K##*,其中##代表优先级,数字越小,越优先被关闭,依赖的服务先关闭,之后关闭被依赖的服务 2)S*:要启动的服务,S##*,其中##代表优先级,数字越小,越先被启动,被依赖的服务先被启动,之后启动依赖的服务

    [root@kasumi ~]# ls /etc/rc.d/ init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit [root@kasumi ~]# ls /etc/rc.d/rc3.d/ K01smartd K61nfs-rdma K92pppoe-server S13cpuspeed S26haldaemon K02oddjobd K69rpcsvcgssd K95firstboot S13irqbalance S26udev-post K05wdaemon K73winbind K99rngd S13rpcbind S28autofs K10psacct K74ntpd S01sysstat S15mdmonitor S55sshd K10saslauthd K75ntpdate S02lvm2-monitor S22messagebus S80postfix K15svnserve K75quota_nld S05rdma S23NetworkManager S82abrtd K30spice-vdagentd K76ypbind S08ip6tables S24nfslock S83abrt-ccpp K50dnsmasq K84wpa_supplicant S08iptables S24rpcgssd S90crond K50kdump K87restorecond S10network S25blk-availability S95atd K50snmpd K88sssd S11auditd S25cups S99certmonger K50snmptrapd K89netconsole S11portreserve S25netfs S99libvirt-guests K60nfs K89rdisc S12rsyslog S26acpid S99local

    3.rc脚本框架

    for srv in /etc/rc.d/rc#.d/K*; do $srv stop done for srv in /etc/rc.d/rc#.d/S*; do $srv start done

    4./etc/rc.d/rc.local文件 1).正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d/下某脚本,而是链接至/etc/rc.d/rc.local(/etc/rc.local),因此,不便或不需要写为服务脚本的程序期望开机能自动运行,直接放置于此脚本文件中即可。

    [root@kasumi ~]# ls /etc/rc.d/ init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit [root@kasumi ~]# ll /etc/rc.d/rc3.d/ | grep "rc.local" lrwxrwxrwx. 1 root root 11 4月 27 00:46 S99local -> ../rc.local

    3.1测试服务脚本

    1./etc/init.d/testsrv编写测试服务文件

    [root@kasumi init.d]# vim /etc/init.d/testsrv #!/bin/bash #testing service script #chkconfig:2345 50 60 "此行为设定:2345(runlevel,chkconfig添加后自动为no) 50(启动优先级) 60(关闭优先级)" #description:testing service srv=$(basename $0) if [ $# -lt 1 ];then echo "Usage: $srv {start|stop|status|restart}" exit 1 fi if [ "$1" == "start" ];then echo "start $srv finished" elif [ "$1" == "stop" ];then echo "stop $srv finished" elif [ "$1" == "restart" ];then echo "restart $srv finished" elif [ "$1" == "status" ];then if pidof $srv &> /dev/null;then echo "$srv is running" else echo "$srv is stopped" fi else echo "Usage: $srv {start|stop|status|restart}" exit 2 fi

    2./etc/init.d/*脚本执行方式 1)/etc/init.d/srv_script {start|stop|restart|status}

    [root@kasumi ~]# /etc/init.d/testsrv start start testsrv finished [root@kasumi ~]# /etc/init.d/testsrv stop stop testsrv finished [root@kasumi ~]# /etc/init.d/testsrv status testsrv is stopped [root@kasumi ~]# /etc/init.d/testsrv eeee Usage: testsrv {start|stop|status|restart} [root@kasumi ~]# echo $? 2

    2)service srv_script {start|stop|restart|status}

    "service命令即为调取/etc/init.d/*脚本" [root@kasumi ~]# service testsrv start start testsrv finished [root@kasumi ~]# service testsrv stop stop testsrv finished [root@kasumi ~]# service testsrv status testsrv is stopped [root@kasumi ~]# service testsrv Usage: testsrv {start|stop|status|restart} [root@kasumi ~]# echo $? 1

    ps:/etc/rc.d/init.d/*也可执行服务脚本,其为/etc/init.d/*符号链接文件

    4.chkconfig命令

    1.chkconfig命令:管控/etc/init.d/每个服务脚本在各个级别下的启动或关闭状态,向/etc/rc.d/下各个级别对应文件添加,S或K开头的的对应服务文件 2.查看:chkconfig --list [name]

    3.添加:chkconfig --add name:

    [root@kasumi ~]# chkconfig --add testsrv [root@kasumi ~]# ls /etc/rc.d/rc0.d/ | grep "testrv" [root@kasumi ~]# ls /etc/rc.d/rc0.d/ | grep "testsrv" K60testsrv [root@kasumi ~]# ls /etc/rc.d/rc2.d/ | grep "testsrv" S50testsrv [root@kasumi ~]# ls /etc/rc.d/rc5.d/ | grep "testsrv" S50testsrv [root@kasumi ~]# ls /etc/rc.d/rc6.d/ | grep "testsrv" K60testsrv 能被添加的服务的脚本定义格式之一: #!/bin/bash # # chkconfig: LLL(runlevel,添加后自动为on)NN(启动优先级) NN(关闭优先级) # description:

    ps:由于其服务脚本设定2345级别,chkconfig命令添加后自动启动 ,其为S开头文件,016级别则为K开头文件

    4.删除:chkconfig --del name:

    [root@kasumi ~]# chkconfig --del testsrv

    5.修改制定的链接类型:chkconfig [--level LEVEL] name {on|off|reset} 1)- -level LEVELS:指定要控制的级别;默认为2345

    [root@kasumi ~]# chkconfig --list testsrv testsrv 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 [root@kasumi ~]# chkconfig --level 23 testsrv off [root@kasumi ~]# chkconfig --list testsrv testsrv 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭

    5.启动终端

    1.当前运行级别的对应服务开启或关闭之后,会启动相应终端

    tty1:2345:respawn:/usr/sbin/mingetty tty1 ... ... tty6:2345:respawn:/usr/sbin/mingetty tty6

    1)mingetty会调用login程序 2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等

    6.系统初始化脚本

    1.系统初始化脚本:/etc/rc.d/rc.sysinit

    1.设置主机名 2.设置欢迎信息 3.激活udev和selinux 4.挂载/etc/fstab文件中定义的所有文件系统 5.检测根文件系统,并以读写方式重新挂载根文件系统 6.设置系统时钟 7.根据/etc/sysctl.conf文件来设置内核参数 8.激活lvm及软raid设备 9.激活swap设备 10加载额外设备的驱动程序 11.清理操作

    7.用户空间启动流程

    1.用户空间的启动流程:/sbin/init(配置文件:/etc/inittab)

    1.设置默认运行级别(id:3:initdefault) 2.运行系统初始化脚本,完成系统初始化(si::sysinit:/etc/rc.d/rc.sysinit) 3.关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 (l3:3:wait:/etc/rc.d/rc 3) 4.设置登陆终端 5.若为5级别,启动图形终端

    8.centos6,7init程序

    8.1 Centos6

    1.init程序:upstart,但依然为/sbin/init,其配置文件:/etc/init/*.conf;/etc/inittab(仅用于定义默认运行级别) ps:*.conf为upstart分割的配置文件

    [root@kasumi ~]# ls /etc/init/*.conf /etc/init/ck-log-system-restart.conf /etc/init/rcS.conf /etc/init/ck-log-system-start.conf /etc/init/rcS-emergency.conf /etc/init/ck-log-system-stop.conf /etc/init/rcS-sulogin.conf /etc/init/control-alt-delete.conf /etc/init/readahead-collector.conf /etc/init/init-system-dbus.conf /etc/init/readahead.conf /etc/init/kexec-disable.conf /etc/init/readahead-disable-services.conf /etc/init/plymouth-shutdown.conf /etc/init/serial.conf /etc/init/prefdm.conf /etc/init/splash-manager.conf /etc/init/quit-plymouth.conf /etc/init/start-ttys.conf /etc/init/rc.conf /etc/init/tty.conf

    1)rcS.conf:系统初始化脚本 2)rc.conf:启动关闭服务 3)start-ttys.conf:启动终端

    8.2 Centos7

    1.init程序:systemd,配置文件:/usr/lib/systemd/system/*;/etc/systemd/system/*

    2.其完全兼容SysV脚本机制,因此,service命令依然可以使用,但是建议使用systemctl命令来控制服务

    systemctl {start|stop|restart|status} name[.service]
    最新回复(0)