systemd

Linux操作系统启动流程

以debian系的kali为例

加载/boot => 执行/sbin/init程序(进程ID为1,其余所有为其子进程,有的使用了/lib/systemd/systemd=> 读取配置文件中的运行级别(0表示关机,1是单用户(维护模式),6是重启)=> 运行/etc/init.d/中的程序,被按照runlevel分类到/etc/rc2.d/等目录下(S开头表示运行,K开头表示杀掉)=> 用户登录(三种:命令行登录、ssh登录、图形界面登录)

完成上述过程即机器完整启动,其中login shell会读取/etc/profile,然后读取用户家目录下的.bash_profile .bash_login .profile 三者之一。

systemd
基础命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
systemctl suspend|reboot|poweroff #暂停|重启|关闭系统等
systemd-analyze #查看系统启动耗时
hostnamectl #查看主机信息
localectl #查看本地化信息
timedatectl #查看时区设置
loginctl #查看登录用户
systemctl list-units #罗列系统Unit
systemctl status #显示系统状态

# 启动|关闭|重启|杀死|重新加载配置|显示参数 某服务
systemctl start|stop|restart|kill|reload|show apache.service

systemctl list-units-files --type=tagert
systemctl list-dependencies multi-user.target //查看target下的units

systemctl is-enabled mysql.service // 判断是否开机自启
systemctl enable mysql.service // 设置为开机启动

systemctl cat graphical.target // 查看图形启动target的配置文件

journalctl #查看所有日志
# 查看内核日志|本次系统启动日志|指定时间|最新20行|滚动显示最新|指定进程编号|指定unit
journalctl -k|-b|--since yesterday|-n 20|-f|_PID=1|-u ssh.service
journalctl -o json-pretty // 友好的json格式输出
journalctl --disk-usage // 显示日志占据的硬盘空间

用户可以按照其规则编制自定义的unit
使用了systemd之后,相关的配置文件保存在/etc/systemd/ 目录下,另外service mysql status等相关命令也会有所不同,输出如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@kali:~# service mysql status
● mysql.service - LSB: Start and stop the mysql database server daemon
Loaded: loaded (/etc/init.d/mysql)
Active: active (running) since 一 2016-03-14 16:24:06 CST; 2s ago
Process: 4480 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/mysql.service
├─4507 /bin/sh /usr/bin/mysqld_safe
└─4854 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/m...

314 16:24:06 kali mysql[4480]: Starting MySQL database server: mysqld ..
314 16:24:06 kali mysql[4480]: Checking for tables which need an upgrade, are corrupt or were
314 16:24:06 kali mysql[4480]: not closed cleanly..
314 16:24:06 kali /etc/mysql/debian-start[4910]: Upgrading MySQL tables if necessary.
314 16:24:06 kali /etc/mysql/debian-start[4924]: Checking for insecure root accounts.
314 16:24:06 kali /etc/mysql/debian-start[4929]: WARNING: mysql.user contains 4 root account...d!
314 16:24:06 kali /etc/mysql/debian-start[4930]: Triggering myisam-recover for all MyISAM tables
Hint: Some lines were ellipsized, use -l to show in full.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@kali:~# systemctl cat mysql.service
# /run/systemd/generator.late/mysql.service
# Automatically generated by systemd-sysv-generator

[Unit]
SourcePath=/etc/init.d/mysql
Description=LSB: Start and stop the mysql database server daemon
Before=shutdown.target
After=remote-fs.target systemd-journald-dev-log.socket network-online.target time-sync.target
Wants=network-online.target
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/init.d/mysql start
ExecStop=/etc/init.d/mysql stop
ExecReload=/etc/init.d/mysql reload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
上面出现的type字段还有下列取值
simple(默认值):ExecStart字段启动的进程为主进程
forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
dbus:类似于simple,但会等待 D-Bus 信号后启动
notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

killMode字段
control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
process:只杀主进程
mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none:没有进程会被杀掉,只是执行服务的 stop 命令。

Restart字段
no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启
1
2
3
4
5
6
7
8
9
10
11
12
Service unit:系统服务
Target unit:多个 Unit 构成的一个组
Device Unit:硬件设备
Mount Unit:文件系统的挂载点
Automount Unit:自动挂载点
Path Unit:文件或路径
Scope Unit:不是由 Systemd 启动的外部进程
Slice Unit:进程组
Snapshot Unit:Systemd 快照,可以切回某个快照
Socket Unit:进程间通信的 socket
Swap Unit:swap 文件
Timer Unit:定时器