Centos系统启动流程

一.内核空间启动流程

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值