系统启动总结成以下的过程:
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的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 |
systemctl list-dependencies graphical.target所输出的依赖性服务, CentOS 7.x 的 systemd 启动过程:
sysinit.target的阶段主要启动的服务:
basic.target的阶段主要启动的服务:
/etc/systemd/system/multi-user.target.wants/里面默认要被启动的服务
服务的启动脚本配置都是放在下面的目录:
使用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'
会判断/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 # 这个服务确实被记录到启动的环境下!
getty.target的操作界面项目,包括systemd-logind.service,system-user-sessions.service等服务。
如果你的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
有两个地方可以处理模块加载的问题,包括:
将这个模块写入到系统启动过程中
# vim /etc/modules-load.d/cftp.conf
nf_conntrack_ftp
模块外加参数的配置方式
# vim /etc/modprobe.d/cftp.conf
options nf_conntrack_ftp ports=555
/etc/sysconfig/*
参考文档:
《鸟哥的Linux私房菜基础篇第三版》