系统启动总结成以下的过程:
- 加载 BIOS 的硬件信息与进行自我测试,并依据配置取得第一个可启动的设备;
- 读取并运行第一个启动设备内 MBR的boot Loader(亦即是 grub2, lilo等程序);
- 依据 boot loader的配置加载Kernel,Kernel会开始检测硬件与加载驱动程序;
- 在硬件驱动成功后,Kernel 会主动调用systemd程序,并以default.target流程启动;
- systemd执行sysinit.target 初始化系统及 basic.target准备运行环境;
- systemd启动multi-user.target下的服务;
- systemd执行multi-user.target下的 /etc/rc.d/rc.local脚本;
- systemd执行multi-user.target 下的 getty.target 及登陆服务;
- systemd执行graphical 需要的服务
BIOS, 启动自我测试与 MBR/GPT
通过BIOS程序加载 CMOS 的信息,并且通过 CMOS 内的配置值取得主机的各项硬件配置,启动自我测试 (Power-on Self Test, POST) ,然后开始运行硬件检测的初始化
BIOS会指定启动的设备,通过硬件的INT 13中断功能读取在启动设备的第一个扇区(sector)内的MBR(Master Boot Record, 主要启动记录区)中的boot loader
Boot Loader 的功能
认识操作系统的文件格式并据以加载核心到主内存中去运行
每种操作系统都有自己的boot loader
加载核心检测硬件与initramfs的功能
将核心解压缩到内存当中,并且利用核心的功能,开始测试与驱动各个周边设备
# ls --format=single-column -F /boot
config-3.10.0-229.el7.x86_64 <==此版本核心被编译时选择的功能与模块配置文件
grub/ <==旧版grub1,不需要理会
grub2/ <==就是启动加载器grub2 相关资料目录
initramfs-0-rescue-309eb890d3d95ec7a.img <==下面几个就是虚拟文件系统文件,这一个是用来救援的!
initramfs-3.10.0-229.el7.x86_64.img <==正常开机会用到的虚拟文件系统
initramfs-3.10.0-229.el7.x86_64kdump.img <==核心出问题时会用到的虚拟文件系统
System.map-3.10.0-229.el7.x86_64 <==核心功能放置到内存地址对应表
vmlinuz-0-rescue-309eb890d09543d95ec7a* <==救援用的核心文件
vmlinuz-3.10.0-229.el7.x86_64* <==就是核心文件啦!最重要者!
虚拟文件系统 (Initial RAM Disk或Initial RAM Filesystem)的文件名为/boot/initrd或/boot/initramfs
通过boot loader来加载到内存中模拟成一个根目录,提供一个可运行的程序,通过该程序来加载启动过程中所最需要的核心模块USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动程序,帮助核心重新调用systemd来开始后续的正常启动流程。
第一个程序 systemd 及使用 default.target 进入启动
systemd的PID号码是1
systemd的功能就是准备软件运行的环境,包括系统的主机名称、网络配置、语言环境、文件系统格式及其他服务的启动等。
systemd不再使用system V的runlevel
所有的动作都会通过 systemd的/etc/system/system/default.target来完成
default.target的主要项目有:
multi-user.target 以及 graphical.target这两个。还有rescue.target,emergency.target,shutdown.target等等,以及initrd.target。
SystemV |
systemd |
init 0 |
systemctl poweroff |
init 1 |
systemctl rescue |
init [234] |
systemctl isolate multi-user.target |
init 5 |
systemctl isolate graphical.target |
init 6 |
systemctl reboot |
systemd 的处理过程
systemctl list-dependencies graphical.target所输出的依赖性服务, CentOS 7.x 的 systemd 启动过程:
- local-fs.target + swap.target:这两个target主要在挂载本机 /etc/fstab 里面所定义的文件系统与相关的内存交换空间。
- sysinit.target:这个target 主要在检测硬件,加载所需要的核心模块等动作。
- basic.target:加载主要的周边硬件驱动程序与防火墙相关任务
- multi-user.target下的其它一般系统或网络服务的加载
- 图形界面相关服务如 gdm.service 等其他服务的加载
systemd 执行sysinit.target 初始化系统、basic.target 准备系统
sysinit.target的阶段主要启动的服务:
- 特殊文件系统设备的挂载:包括dev-hugepages.mount,dev-mqueue.mount等挂载服务,主要在挂载跟大容量内存分页使用与信息队列的功能。挂载成功后,会在/dev下面建立/dev/hugepages/,/dev/mqueue等目录;
- 特殊文件系统的启用:包括磁盘陈列、网络磁盘(iscsi)、LVM文件系统、文件系统多路径服务(multipath)等等。
- 启动过程的信息传送与动画执行:使用plymouthd服务搭配plymouth命令来传送动画与信息
- 日志管理服务的使用:就是systemd-journald这个服务的启用
- 加载额外的核心模块:通过/etc/modules-load.d/*.conf文件的配置,让核心额外加载管理员所需要的核心模块
- 加载额外的核心参数配置:包括/etc/sysctl.conf以及/etc/sysctl.d/*.conf内的配置
- 启动系统的随机数生成器:随机数生成器可以帮助系统进行一些密码加密的功能
- 配置终端机(console)字符
- 启动动态设备管理:就是udevd这个家伙,用在动态对应实际设备存取与设备文件名的一个服务。
basic.target的阶段主要启动的服务:
- 加载alsa音效驱动程序:这个alsa是个音效相关的驱动程序,会让你的系统有音效产生;
- 加载firewalld防火墙:CentOS 7.x以后使用firewalld取代iptables的防火墙配置,虽然最终都是使用iptables的架构,不过在配置上差很多;
- 加载CPU的微指令功能;
- 启动与配置SELinux 的安全上下文:如果由disable的状态改成enable的状态,或者是管理员配置强制重新配置一次SELinux的安全上下文,也在这个阶段处理;
- 将目前的启动过程所产生的启动信息写入到/var/log/dmesg文件中;
- 由/etc/sysconfig/modules/*.modules及/etc/rc.modules加载管理员指定的模块;
- 加载systemd支持的timer功能;
systemd 启动multi-user.target 下的服务
/etc/systemd/system/multi-user.target.wants/里面默认要被启动的服务
服务的启动脚本配置都是放在下面的目录:
- /usr/lib/systemd/system (系統默认的服务启动的脚本配置 )
- /etc/systemd/system (管理员自己开发与配置的脚本配置)
使用systemctl enable/disable一个服务时,是到/etc/system/system/multi-user.target.wants/这个目录下建立和删除链接
# systemctl disable vsftpd.service
rm '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
# systemctl enable vsftpd.service
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
兼容 system V 的 rc-local.service:
会判断/etc/rc.d/rc.local是否具有可执行的权限来判断要不要启动这个服务
# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 473 Mar 6 13:48 /etc/rc.d/rc.local
# systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static)
Active: inactive (dead)
# systemctl list-dependencies multi-user.target | grep rc-local
# 明明就有这个服务,但是 rc.local 不具有可执行 (x) 的权限,因此这个服务不会被执行
# chmod a+x /etc/rc.d/rc.local; ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 Mar 6 13:48 /etc/rc.d/rc.local
# systemctl daemon-reload
# systemctl list-dependencies multi-user.target | grep rc-local
├─rc-local.service # 这个服务确实被记录到启动的环境下!
提供 tty 界面与登陆的服务
getty.target的操作界面项目,包括systemd-logind.service,system-user-sessions.service等服务。
systemd 启动graphical.target下的服务
如果你的default.target 是 multi-user.target 的话,那么这个步骤就不会运行。反之,如果是graphical.target 的话,那么systemd就会开始加载用户管理服务与图形界面管理(windows display manager,DM)等
# systemctl list-dependencies graphical.target
graphical.target
├─accounts-daemon.service
├─gdm.service
├─network.service
├─rtkit-daemon.service
├─systemd-update-utmp-runlevel.service
└─multi-user.target
├─abrt-ccpp.service
.....(下面省略).....
到此为止,systemd 就已经完整的处理完毕
使用『 systemctl isolate multi-user.target 』切换runlevel
启动过程会用到的主要配置文件
关于模块: /etc/modprobe.d/*.conf 及 /etc/modules-load.d/*.conf
有两个地方可以处理模块加载的问题,包括:
- /etc/modules-load.d/*.conf:单纯要核心加载模块的位置;
- /etc/modprobe.d/*.conf:可以加上模块参数的位置
将这个模块写入到系统启动过程中
# vim /etc/modules-load.d/cftp.conf
nf_conntrack_ftp
模块外加参数的配置方式
# vim /etc/modprobe.d/cftp.conf
options nf_conntrack_ftp ports=555
/etc/sysconfig/*
- authconfig:身份认证的机制,包括是否使用本机的 /etc/passwd, /etc/shadow 等,以及 /etc/shadow密码使用的加密算法,还有是否使用外部密码服务器提供的账号验证 (NIS, LDAP) 等。系统默认使用 SHA512 加密算法,并且不使用外部的身份验证机制;使用authconfig-tui修改
- cpupower:启动 cpupower.service 服务时,会读取这个配置文件。主要是 Linux 核心如何操作 CPU 的原则。启动 cpupower.service 之后,系统会让CPU 以最大效能的方式来运行,否则默认就是用多少算多少的模式来处理的。
- firewalld, iptables-config, ip6tables-config, ebtables-config:
与防火墙服务的启动外带的参数有关。 - network-scripts/:主要用在配置网卡。
参考文档:
《鸟哥的Linux私房菜基础篇第三版》