一,systemd是什么?有什么用?
systemd是Linux下的一种init软件,是 Linux 下的一款系统和服务管理器,由Lennart Poettering(英语:Lennart Poettering)带头开发。其开发目标是提供更优秀的框架以表示系统服务(英语:Service (systems architecture))间的依赖关系,并以此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销(英语:Computational overhead)的效果。
systemd 兼容 SysV 和 LSB 的启动脚本。
systemd的特性有:
支持并行化任务
同时采用socket式与D-Bus总线式激活服务;
按需启动守护进程(daemon);
利用 Linux 的 cgroups 监视进程;
支持快照和系统恢复;
维护挂载点和自动挂载点;
各服务间基于依赖关系进行精密控制。
systemd基本工具
检视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务.
systemctl start 单元 #使用单元
systemctl stop 单元 #停止单元
systemctl status 单元 #查看单元的状态
systemctl restart 单元 #重启单元
什么是单元?
一个单元配置文件可以描述如下内容 之一 :系统服务(.service)、挂载点(.mount)、sockets(.sockets 、系统设备、交换分区/文件、启动目标(target)、文件系统路径、由 systemd 管理的计时器
二,系统引导过程概述:
传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)处理,而基于init的启动系统被认为有效率不足的问题,systemd是Linux系统机器的另一种启动方式,宣称弥补了以传统Linux SysV init为基础的系统的缺点。
传统的 init启动过程
- 在我们打开Linux电脑的电源后第一个启动的进程就是init。分配给init进程的PID是1。它是系统其他所有进程的父进程。当一台Linux电脑启动后,处理器会先在系统存储中查找BIOS,之后BIOS会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由MBR控制。
- 主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程序),这个时候GRUB或LILO会加载内核模块。内核会马上查找/sbin下的“init”程序并执行它。从这里开始init成为了Linux系统的父进程。init读取的第一个文件是/etc/inittab,通过它init会确定我们Linux操作系统的运行级别。它会从文件/etc/fstab里查找分区表信息然后做相应的挂载。然后init会启动/etc/init.d里指定的默认启动级别的所有服务/脚本。所有服务在这里通过init一个一个被初始化。在这个过程里,init每次只启动一个服务,所有服务/守护进程都在后台执行并由init来管理。
- 关机过程差不多是相反的过程,首先init停止所有服务,最后阶段卸载文件系统。
systemd启动过程
打开电源后电脑所做的第一件事情就是BIOS初始化。BIOS会读取引导设备设定,定位并传递系统控制权给MBR(假设硬盘是第一引导设备)。
MBR从Grub或LILO引导程序读取相关信息并初始化内核。接下来将由Grub或LILO继续引导系统。如果你在grub配置文件里指定了systemd作为引导管理程序,之后的引导过程将由systemd完成。Systemd使用“target”来处理引导和服务管理过程。这些systemd里的“target”文件被用于分组不同的引导单元以及启动同步进程。
systemd执行的第一个目标是default.target。但实际上default.target是指向graphical.target的软链接。Linux里的软链接用起来和Windows下的快捷方式一样。文件Graphical.target的实际位置是/usr/lib/systemd/system/graphical.target
以流程来看:
通电——>进入初始化阶段——>bios 初始化——>grub2 磁盘引导阶段——>grub2 文件引导阶段——> 指定boot所在分区——>启动内核,只读挂在 / 设备启动——>init 程序进入初始化阶段——> 启动 systemd 初始化进程——>读取 /etc/systemd/中的文件——>启动程序——>启动登陆环境
grub文件引导阶段
由文件/boot/grub2/grub.cfg控制流程:
指定/boot分区位置 —–> 加载内核 —–> 启动系统初始化进程 —–> grub2-mkconfig
内核引导阶段
检测硬件设备 —–> 设备驱动初始化 —–> 将/只读挂载 —–> 载入初始进程systemd —–> 内核文件丢失请重新安装内核
systemd初始化
开启selinux和systemd-tools —–> 加载内核参数 —–> 加载系统时钟,键盘,主机名称 —–> 读写挂载/文件系统 —–> 激活raid, lvm设备 —–> 激活系统配额 —–> 启动multi-user.target.wants中的所有服务脚本 —–> 启用虚拟控台 —–> 启动图形
三,开机启动级别:
1,开机启动级别:
runlever0.target -> poweroff.target //关机’
runlever1.target -> rescue.target //单用户模式
runlever2.target -> multi-user.target //多用户模式,不支持NFS
runlever3.target -> multi-user.target //完整多元化模式
runlever4.target -> multi-user.target //未定义使用
runlever5.target -> grapical.target //带有图形界面的多用户使用
runlever6.target -> reboot.target //重启\
例如开机自启动就是因为添加了链接到脚本上,开机就会自动运行脚本启动,有无图形也是因为链接到有无图形的脚本上。
2.设定开机启动级别:
systemctl set-default 启动级别
/etc/systemd/system/defaults.target
四,关于systemd的实验:
1,主机陷入无尽的重新启动,可是不能真正重启的问题:
[root@server1 system]# ls -l default.target
lrwxrwxrwx. 1 root root 40 Jul 10 2014 default.target -> /usr/lib/systemd/system/graphical.target
可以看见默认目标链接再图形目标上
[root@server1 system]# systemctl set-default reboot.target #重新设置默认目标
rm ‘/etc/systemd/system/default.target’
ln -s ‘/usr/lib/systemd/system/reboot.target’ ‘/etc/systemd/system/default.target’
可以看见执行设置默认目标的操作时,发生的子操作为先删除原有的链接,再建立要设置的链接。
[root@server1 system]# vim /etc/sysconfig/selinux #关闭selinux可以使开机初始化速度加快
执行完以上操作后,主机会陷入无尽的重启状态,
人生还有意义。那一定是还在找存在的理由