Linux系统--Linux启动过程
CentOS 启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 运行统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端
1.POST:加电自检,检查外围设备是否能正常启动。
2.Boot Sequence(Bios):按一定次序查找引导设备,第一次有引导程序的设备即为本次启动用到的设备,不管系统能不能正常启动。
3.BootLoader(MBR):
MBR:主引导记录,有512个字节组成,前446字节是bootloader,64字节的分区表信息,还有2字节的Magical Number。
BootLoader:引导加载器,是一个程序。在Windows上使用的是ntloader。Linux上有两种:LILO(LInux Loader)和Grub (GRand Unified Bootloader)
功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压,展开,并把控制权交给内核:
4.kernel(ramdisk):内核初始化:
探测可识别到的所有硬件设备,加载硬件驱动程序(此时可能会借助于ramdisk加载驱动)已读的方式挂在文件系统;运行进程的第一个应用程序:/sbin/init
ramdisk:本地回环设备文件,把本地文件模拟磁盘或文件系统使用
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6:/boot/initramfs-VERSION-release.img
initrd 是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。当系统启动时,bootloader会把initrd文件读取到内存中,然后把initrd文件在内存中起始地址和大小传递给内核。内核在启动初始化过程中会解压缩initrd文件,然后将解压后的initrd挂载为根目录,然后执行根目录下的/linuxrc脚本,就可以在这个脚本中加载真实文件系统存放的设备驱动程序以及在/dev目录下建立必要的设备结点。这样就可以mount真正的根目录,并且换到根目录中。
5.启动init程序:
加载完内核之后会启动Linux第一个应用程序/sbin/init。在CentOS5,6,7上init的程序类型是不相同的。
CentOS5上:是SysV init,配置文件为:/etc/inittab
CentOS6上:是Upstart init,配置文件为:/etc/inittab, /etc/init/*.conf
CentOS7上:Systemd,配置文件为:/usr/lib/systemd/system,/etc/systemd/system
CentOS 5上的/sbin/init :
启动第一个init程序会读取init的配置文件/etc/inittab,并依据此文件来进行初始化工作。/etc/inittab文件主要作用是指定运行级别,执行系统初始化脚本(/etc/rc.d/rc.sysinit),启动相应运行级别下的服务和启动终端。
(1)Linux的运行级别有7级别:0-6
0:关机
1:单用户模式root,不需要登录在此级别下可以修改管理员用户密码,维护模式
2:多用户模式,会启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别:可同3级别;
5:多用户模式,正常模式,图形界面
6:重启
级别的切换:init #
查看运行级别:runlevel 和 who -r
(2)配置文件:/etc/inittab文件内容的格式和各字段的含义:
/etc/inittab文件中每一行定义一种action和与之对应的process,用冒号隔开如:
id:runlevel:action:process
其中action常用的种类有:
wait:切换至某级别运行一次process
respawn:此process终止的话,就重新启动之
initdefault:设置默认运行级别的,process省略
sysinit:设定系统初始化方式,此处一般指定为:/etc/rc.d/rc.sysinit
id:3:initdefault
si::sysinit:/etc/rc.d/rc.sysinit
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
...
16:6:wait:/etc/rc.d/rc 6
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
其中rc 2表示要读取/etc/rc.d/rc2.d目录下的所有文件,并启动相应的服务。
在/etc/rc.d/目录下定义着不同运行级别服务启动脚本所在目录如:rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d 。这些目录下的文件都是以K或S开头的文件,格式如:K{Number}{ServerName}
其中以S开头的文件向脚本传递start参数,服务脚本会在开机时运行此脚本(必须设定开机自启动的情况下),K开始的文件向脚本传递stop参数,切换此级别时会关闭服务。
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
chkconfig命令:用来查看,添加和删除服务
查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
添加服务:在添加时,Server的服务脚本放置在/etc/rc.d/init.d或/etc/init.d/目录下的。其实在/etc/rc.d/rcX.d/目录的以S和K开头的文件都是连接至此的链接文件。添加服务命令:
chkconfig --add name
其中服务脚本文件中必须有以下一行:
# chkconfig: LLLL SS KK
LLLL表示运行的级别,就是服务在哪些级别下是启动的。省略表示2345级别
SS:表示服务运行的次序
KK:表示服务关闭的次序
删除服务:
# chkconfig --del name
正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
mingetty会login程序,启动终端程序
(3)文件/etc/rc.d/rc.sysinit的作用有:
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 激活swap设备;
(8) 根据/etc/sysctl.conf文件设置内核参数;
(9) 激活lvm及software raid设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
CentOS6上的/init/会读取配置文件/etc/inittab 和 /etc/init/*.conf,文件/etc/inittab设定系统启动的默认级别,而/etc/init目录下所有以.conf结尾的文件是进行执行系统初始化脚本,启动相应运行级别下的服务和启动终端。如以下文件:
6.到启动终端之后,提供用户登录界面,Linux的启动过程结束。