CentOS的启动流程
1)加载BIOS 的硬件信息,获取第一个启动设备
2)读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息
3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4)核心执行init 程序,并获取默认的运行信息
5)init 程序执行/etc/rc.d/rc.sysinit 文件
6)启动核心的外挂模块
7)init 执行运行的各个批处理文件(scripts)
8)init 执行/etc/rc.d/rc.local
9)执行/bin/login 程序,等待用户登录
10)登录之后开始以Shell控制主机
接下来我们根据CentOS的启动流程进行一步步的详解,介绍的内容不深但是能让你对大概流程有个大概的映像。
1)步骤是加载BIOS的硬件信息,获取第一个启动设备
这个步骤的主要是: POST(power on system test):加电自检,主要步骤检测CPU、内存、硬盘等内部设备是否能够正常运行,以及外部设备是否正常存在,自检是由BIOS这个基本输入输出系统实现,它是装载在硬件芯片CMOS之上,CMOS上面有一些配置信息会去读取其他的硬件设备信息检测是否能够正常运行,接下来进行硬件设备的初始化,当初始化步骤完成以后BIOS会列出可以启动的装置,由于不同操作系统文件系统之间的不同,为了避免一个格式信息不兼容会将启动一个管理程序Boot loader,这时我们进入第二个阶段。
2)读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息
3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
Boot loader存在于硬盘第一个扇区内就是在MBR(主引导记录)前446字节当中。boot loader的主要功能是为了识别,加载操作系统中的核心文件,并提交到内存中运行,进而来启动对应的操作系统,在boot loader中会提供菜单信息向使用这提供不同的启动项目,来加载不同的操作系统,并将启动管理功能转交给其他的加载程序。
这个时候又到了grub的阶段,在这里有三个阶段 #这个软件有好几个部分,MBR部分就是第一个阶段
primary boot loader :
1st stage #第一阶段里面存放在硬盘的第一个扇区里的446字节也就是MBR部分,这里存放这第二阶段内容的指向
[root@magedu6 ~]# hexdump -C -n 512 /dev/sda -v #MBR的前446字节 00000000 eb 48 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.H..............| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 03 02 |........q...q...| ...省略 000001e0 ff ff 82 fe ff ff 00 08 e2 04 00 80 3e 00 00 fe |............>...| 000001f0 ff ff 05 fe ff ff 00 88 20 05 00 78 5f 07 55 aa |........ ..x_.U.|
1.5 stage #1.5阶段让我们识别/boot驱动446字节记录找到2阶段的内容。意思是通过1阶段里记录的2阶段的内容去模拟一个ext4的文件系统去加载第二阶段的内容。
[root@station159 boot]# ls /boot/grub device.map grub.conf minix_stage1_5 stage2 e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5 fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5 ffs_stage1_5 menu.lst stage1 xfs_stage1_5
secondary boot loader :2nd stage ,分区文件
这里就是boot loader的最后一个阶段了,这个时候内核可以在虚拟的根文件系统上加载合适的驱动程序来加载硬盘等设备,之后释放虚拟的根文件系统,并以只读的方式挂载磁盘上的根文件系统,之后开始正常的启动过程了 #这个时候以只读的方式挂载原因是防止一些破坏性的操作,等操作系统启动到一定步骤的时候还会重新以读写的方式重新挂载。
ramdisk :辅助的伪根系统,这个系统能够通过boot loader程序将其加载到内存当中,然后这个文件会被解压缩并且在内存中模拟一个根文件系统,这个根文件系统能够提供一个可以运行的程序,这个程序用来加载启动过程中需要的核心模块(RAID,LVM/SCSI等文件系统与磁盘的驱动程序等),加载完成后会协助内核重新呼叫/sbin/init来执行后续的正常启动,而这个程序存在/boot下,属于安装系统的时候临时生成的。这个文件是一个压缩文件
[root@station159 ~]# ll /boot 总计 6203 -rw-r--r-- 1 root root 68663 2009-08-19 config-2.6.18-164.el5 drwxr-xr-x 2 root root 1024 05-09 22:49 grub -rw------- 1 root root 3312527 05-09 22:45 initrd-2.6.18-164.el5.img #CentOS 5里的伪根文件系统文件 drwx------ 2 root root 12288 05-09 22:42 lost+found -rw-r--r-- 1 root root 107405 2009-08-19 symvers-2.6.18-164.el5.gz -rw-r--r-- 1 root root 954947 2009-08-19 System.map-2.6.18-164.el5 -rw-r--r-- 1 root root 1855956 2009-08-19 vmlinuz-2.6.18-164.el5 [root@magedu6 ~]# ll /boot 总用量 32040 -rw-r--r--. 1 root root 108103 5月 11 2016 config-2.6.32-642.el6.x86_64 drwxr-xr-x. 3 root root 4096 5月 6 06:28 efi drwxr-xr-x. 2 root root 4096 5月 6 06:31 grub -rw-------. 1 root root 25585943 5月 6 06:31 initramfs-2.6.32-642.el6.x86_64.img #CentOS 6模拟出来的根文件系统的文件 -rw-r--r--. 1 root root 215559 5月 11 2016 symvers-2.6.32-642.el6.x86_64.gz -rw-r--r--. 1 root root 2615003 5月 11 2016 System.map-2.6.32-642.el6.x86_64 -rwxr-xr-x. 1 root root 4264528 5月 11 2016 vmlinuz-2.6.32-642.el6.x86_64 [root@station159 grub]# cat grub.conf ...省略 #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (2.6.18-164.el5) root (hd0,0) kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet #当内核加载完毕后启动下面的文件,进行第一次加载 initrd /initrd-2.6.18-164.el5.img #伪根文件系统
当这个步骤完成的时候就会去执行第四个步骤了。
4)核心执行init 程序,并获取默认的运行信息
在这里会对第四个步骤进行稍微详细的介绍
[root@station159 ~]# cat /etc/inittab ...省略一些介绍 id:3:initdefault: # 默认的runlevel配置,这里默认的启动级别是3 # System initialization. si::sysinit:/etc/rc.d/rc.sysinit #系统软件运行环境的脚本 #7个不同级别的运行级别,需要启动服务的scripts放置路径。为初始化用户空间环境,会执行许多系统初始化任务。 l0:0:wait:/etc/rc.d/rc 0 #/etc/rc.d/rc0.d/ ...省略了几个级别 # /etc/rc.d/rc#.d l6:6:wait:/etc/rc.d/rc 6 #/etc/rc.d/rc6.d/ # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now #使用ctrl+alt+del #重新启动的配置项目 # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" #当断电后会发一个广播2分钟后关机停电 # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" 这行会告诉你如果电力恢复了可以停止关机,当然需要在断电后的两分钟以内。 # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 #各个终端tty1~tty6由这几行决定 2:2345:respawn:/sbin/mingetty tty2 #你也可以手动添加或者注释掉 ...省略 6:2345:respawn:/sbin/mingetty tty6 #从这里你也能知道了为什么1模式的时候启动不需要密码了把,因为这里没写上。 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon #图形化界面的模式,也就是Xwindow由这里决定,当然你也能修改成其他级别启动图形化,但是因为一些依赖文件的原因会导致一些问题
[root@magedu6 ~]# cat /etc/inittab # inittab is only used by upstart for the default runlevel. # ...省略 id:5:initdefault: 在6里这个文件重要的一行代码只有这行,设置的默认启动级别,而它其他的配置写在了/etc/init/*.conf里了 [root@magedu6 ~]# ls /etc/init/ ck-log-system-restart.conf rcS.conf ck-log-system-start.conf rcS-emergency.conf ck-log-system-stop.conf rcS-sulogin.conf control-alt-delete.conf readahead-collector.conf init-system-dbus.conf readahead.conf kexec-disable.conf readahead-disable-services.conf plymouth-shutdown.conf serial.conf prefdm.conf splash-manager.conf quit-plymouth.conf start-ttys.conf rc.conf tty.conf
5)init 程序执行/etc/rc.d/rc.sysinit 文件
在init执行的第二步执行系统初始化过程。
6)启动核心的外挂模块
7)init 执行运行的各个批处理文件(scripts)
在系统/etc/rc.d/rc.sysinit初始化完成系统之后,此时系统就已经可以正常工作了,只是还缺少启动时所需要的各项服务,这样主机才能提供一些我们需要的功能,如网络服务、dhcp服务等功能这里通过inittab里面提到的l3:3:wait:/etc/rc.d/rc 3配置了,而这里其实是通过/etc/rc.d/rc3.d/下所有链接文件来决定如何启动或关闭服务;素有以S开头的都被传递start参数启动,所有以K开头的,都被传递stop参数以停止。
而/etc/rc.d/rc3.d/下的所有链接文件都是在/etc/init下面的所有脚本,而这些脚本都必须至少接受四个最基本的参数,{start|stop|status|restart}
脚本在指定级别启动还是停止的控制方法:
这些脚本开头:
#chkconfig : S N N K N #这里的S N N两个N都是表示优先启动级别 而K那里的N则是停止服务时候的级别。
#description: #这一行在centos5里必须准确写,而6里能帮你识别。
而这些符号链接的创建可通过chkconfig命令来实现
-add:为某存放在/etc/init.d的服务在对应的/etc/rc.d/rc0-6.d目录添加符号链接:
-del:把指定SVC_SCRIPTS的在7个级别符号链接统统删除
[root@station159 ~]# chkconfig --list #打印列表 NetworkManager 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 acpid 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 anacron 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 ....省略 ypbind 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 yum-updatesd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 [root@station159 ~]# chkconfig nfs on #开启服务 nfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 [root@station159 ~]# chkconfig nfs off #关闭服务 nfs 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 [root@station159 ~]# chkconfig --level 135 nfs on #开启指定级别的服务 [root@station159 ~]# chkconfig --list nfs 0:关闭 1:启用 2:关闭 3:启用 4:关闭 5:启用 6:关闭 #基于 xinetd 的服务: #这里分为独立服务和非独立服务 #xinetd #被称为超级守护进程,他也是服务,被他服务的,叫非独立服务,在centos 7里全部是非独立服务了。 chargen-dgram: 关闭 ...省略 time-dgram: 关闭 time-stream: 关闭
[root@station159 ~]# ls /etc/init.d/ #这里的服务都能通过chkconfig 命令修改状态,当然也能通过上面说的修改文件上面的两行。
acpid dund killall nscd single
anacron firstboot krb524 ntpd smartd
apmd functions kudzu pand squid
atd gpm libvirtd pcscd sshd
auditd haldaemon lvm2-monitor portmap syslog
autofs halt mcstrans psacct tux
avahi-daemon hidd mdmonitor rawdevices vncserver
avahi-dnsconfd hplip mdmpd rdisc wdaemon
bluetooth httpd messagebus readahead_early winbind
capi ip6tables microcode_ctl readahead_later wpa_supplicant
conman ipmi multipathd restorecond xfs
cpuspeed iptables netconsole rhnsd xinetd
crond irda netfs rpcgssd ypbind
cups irqbalance netplugd rpcidmapd yum-updatesd
cups-config-daemon iscsi network rpcsvcgssd
dc_client iscsid NetworkManager saslauthd
dc_server isdn nfs sendmail
dnsmasq kdump nfslock setroubleshoot
8)init 执行/etc/rc.d/rc.local
9)执行/bin/login 程序,等待用户登录
10)登录之后开始以Shell控制主机
启动流程的简单版本:post-mbrstage1 --stage1.5--stage2 grub.conf--vmlinuz root=/dev/sda2 , initramf---init--/etc/inittab--/etc/rc.c/rc.sysinit---/etc/rcn.d/s* k*---/etc/rc.d/rc.local--login --X
CentOS 6 启动流程:POST --> Boot Sequence(BIOS) --> Boot Loader -->Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 别 设定默认运行级别 --> 系统初始化脚本 rc.sysinit --> 务 关闭或启动对应级别的服务 --> 启动终端