@Linux环境启动流程
1)加电自检(Power On Self Test,POST)
首先,计算机会加载BIOS,这是计算机上最接近硬件的软件
各家主板制造商都会开发适合自己主板的BIOS
BIOS中一项很重要的功能就是对自身的硬件做一次健康检查
2)引导系统
这个动作是BIOS设定的,BIOS默认会从硬盘上的第0柱面、第0磁道、第一个扇区中读取MBR,即主引导记录。
一个扇区的大小是512字节,存放的内容是一段引导程序(446字节)和分区信息(64字节是磁盘分区表DPT),最后两字节是MBR的结束位。
这512字节的空间内容是由专门的分区程序产生的,比如Linux下的fdisk命令
常见的方式是在MBR中写入Grub的地址 <= RedHat、CentOS默认会使用Grub作为其引导操作系统的程序,而Grub本身又比较大
3)运行Grub
Grub最重要的功能就是根据其配置文件加载kernel镜像,并运行内核加载后的第一个程序/sbin/init
这个程序会根据/etc/inittab来进行初始化的工作
4)系统初始化
Linux将根据/etc/inittab中定义的系统初始化配置
执行/etc/rc.sysinit脚本,该脚本将会设置系统变量、网络配置,并启动swap、设定/proc、加载用户自定义模块、加载内核设置等
5)根据第三步读到的runlevel值来启动对应的服务
如果值为3,就会运行/etc/rc3.d/下的所有脚本,如果值为5,就会运行/etc/rc5.d/下的所有脚本
6)运行/etc/rc.local
7)生成终端或X Window来等待用户登录
@系统允许级别
Linux默认有7个运行级别0~6
[root@xxx etc]# cat inittab
……
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
[root@xxx etc]#
系统在启动的过程中会根据/etc/inittab中的设定读取runlevel的数值X,并相应地读取和运行/etc/rcX.d(X代表0~6)下所有的脚本。
[root@xxx etc]# ls -ld rc*
lrwxrwxrwx. 1 root root 7 Sep 6 2016 rc -> rc.d/rc
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc0.d -> rc.d/rc0.d
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc1.d -> rc.d/rc1.d
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc2.d -> rc.d/rc2.d
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc3.d -> rc.d/rc3.d
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc4.d -> rc.d/rc4.d
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc5.d -> rc.d/rc5.d
lrwxrwxrwx. 1 root root 10 Sep 6 2016 rc6.d -> rc.d/rc6.d
drwxr-xr-x. 10 root root 4096 Dec 15 12:57 rc.d
lrwxrwxrwx. 1 root root 13 Sep 6 2016 rc.local -> rc.d/rc.local
lrwxrwxrwx. 1 root root 15 Sep 6 2016 rc.sysinit -> rc.d/rc.sysinit
[root@xxx etc]#
系统在启动过程中,会首先运行以K开头的脚本,全部运行完毕后再运行以S开头的脚本,在运行所有K开头的脚本时,又会严格按照K后面的数字大小依次来运行,也就是数字小的先运行,数字大的后运行。
K和S的意思分别是停止(kill)和启动(start)
[root@xxx etc]# cd rc5.d
[root@xxx rc5.d]# ls
K00ipmievd K05pmproxy K20tomcat6 K50snmpd K75ntpdate K87multipathd S08ip6tables S21fcoe S28autofs S85httpd
K00rgmanager K05wdaemon K30phc2sys K50snmptrapd K75quota_nld K87restorecond S10network S22fcoe-target S40edac S90crond
K01cpglockd K10psacct K30spamassassin K50vsftpd K76clvmd K88sssd S11auditd S22messagebus S50bluetooth S95atd
K01luci K10saslauthd K35dovecot K60nfs K76ypbind K89rdisc S11portreserve S24nfslock S50mcelogd S97rhnsd
K01modclusterd K10stinit K35nmb K65kadmin K78dirsrv-snmp K92iptables S12rsyslog S24rpcgssd S55sshd S97rhsmcertd
K01numad K10tcsd K35smb K65kprop K79cman K95firstboot S13cpuspeed S25blk-availability S56xinetd S99certmonger
K01pacemaker K15htcacheclean K35tgtd K65krb5kdc K79dirsrv K95rdma S13irqbalance S25cups S58ntpd S99collectl
K01ricci K15svnserve K35vncserver K69rpcsvcgssd K79ipa K99oscap-scan S13iscsi S25ibacm S60uuidd S99libvirt-guests
K01smartd K19pki-cad K36mysqld K73winbind K80corosync K99rngd S13rpcbind S25netfs S70spice-vdagentd S99local
K02oddjobd K20bacula-fd K40ptp4l K74gfs2 K80sblim-sfcb S01sandbox S15mdmonitor S26acpid S80postfix
K05pmcd K20rstatd K45memcached K74ipmi K84NetworkManager S01sysstat S20cgdcbxd S26haldaemon S82abrt-ccpp
K05pmie K20rusersd K50dnsmasq K74ipsec K84wpa_supplicant S02lvm2-monitor S20kdump S26udev-post S82abrtd
K05pmlogger K20rwhod K50netconsole K75cgconfig K86cgred S07iscsid S20lldpad S27pcscd S85gpm
[root@xxx rc5.d]#
参考书籍:《Linux系统命令及Shell脚本实践指南》王军 著,1.5 系统启动流程