前言
Linux系统的初始化过程,笼统的讲:POST加电自检–>BIOS(Boot Sequence)–>加载对应引导上的MBR(bootloader)–>主引导设置加载其BootLoader–>Kernel初始化。Kernel初始化后,就是启动init系统,初始化随系统启动的各种服务。这个init系统有以下几种:
- systemvinit
- upstart,就是常见的
/etc/init.d
下的脚本 - systemd,一代更比一代强,这就是我们接下来要介绍的。在CoreOS,ubuntu15.04及以上版本中有使用。
Systemd
systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动;尽可能减少对shell脚本的依赖。
将以前的init主程序 + 一些约定 + 各种脚本
变成init主程序 + 一些约定 + 各个配置文件
,既然是配置文件,就有了各种约定。
###基本概念
-
单元
系统初始化需要做的事情非常多。
- 需要启动后台服务,比如启动 SSHD 服务;
- 需要做配置工作,比如挂载文件系统。
Systemd将配置单元归纳为一些不同的类型,
.service,.socket, .device, .mount, .automount, .swap, .target, .path, .timer, .snapshot
,使用 .desktop 文件的语法(即 windows 下 ini 文件的语法),所有的这些文件都有共同的两个section,即 [Unit] 和 [Install]。随着新功能不断增加。配置单元类型可能在不久的将来继续增加。 -
target
A target is a grouping mechanism that allows systemd to start up groups of processes at the same time. This happens at every boot as processes are started at different run levels.
systemd is the first process started on CoreOS and it reads different targets and starts the processes specified which allows the operating system to start. The target that you’ll interact with is the
multi-user.target
which holds all of the general use unit files for our containers.Each target is actually a collection of symlinks to our unit files. This is specified in the unit file by
WantedBy=multi-user.target
. Runningsystemctl enable foo.service
creates symlinks to the unit insidemulti-user.target.wants
. 下面是ubuntu15.04下的/etc/systemd/system/multi-user.target.wants
目录root@docker1:/etc/systemd/system/multi-user.target.wants# ls -al total 8 drwxr-xr-x 2 root root 4096 Feb 23 05:48 . drwxr-xr-x 13 root root 4096 Jul 23 2015 .. lrwxrwxrwx 1 root root 32 Jul 23 2015 cron.service -> /lib/systemd/system/cron.service lrwxrwxrwx 1 root root 34 Feb 23 05:48 docker.service -> /lib/systemd/system/docker.service lrwxrwxrwx 1 root root 37 Jul 23 2015 nfs-client.target -> /lib/systemd/system/nfs-client.target lrwxrwxrwx 1 root root 41 Jul 23 2015 plymouth-quit.service -> /lib/systemd/system/plymouth-quit.service lrwxrwxrwx 1 root root 46 Jul 23 2015 plymouth-quit-wait.service -> /lib/systemd/system/plymouth-quit-wait.service lrwxrwxrwx 1 root root 36 Jul 23 2015 pppd-dns.service -> /lib/systemd/system/pppd-dns.service lrwxrwxrwx 1 root root 36 Jul 23 2015 remote-fs.target -> /lib/systemd/system/remote-fs.target lrwxrwxrwx 1 root root 35 Jul 23 2015 rsyslog.service -> /lib/systemd/system/rsyslog.service lrwxrwxrwx 1 root root 31 Jul 23 2015 ssh.service -> /lib/systemd/system/ssh.service lrwxrwxrwx 1 root root 31 Jul 23 2015 ufw.service -> /lib/systemd/system/ufw.service
文件放哪?
一个操作系统有多个位置包含Systemd配置文件(跟不用用途的应用程序放在不同的目录是一个意思),其加载遵循一定的顺序,先载入的会覆盖后载入的。一般来讲,如果自己定义的.service
,要放在/etc/systemd/system
里。以CoreOS系统为例,以系统模式启动时的加载顺序如下。
/run/systemd/generator.early Generated units (early)
/etc/systemd/system 本地配置
/run/systemd/systemd Volatile units
/run/systemd/generator Generated units (middle)
/usr/local/lib/systemd/system local 包中的文件
/usr/lib/systemd/system 安装包中的文件
/run/systemd/generator.late Generated units (late)
以管理sshd服务为例
# cat /etc/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
[Service]
EnvironmentFile=/etc/sysconfig/sshd ## 自定义一些环境变量
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usr/sbin/sshd –D $OPTIONS
ExecReload=/bin/kill –HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
文件分为三个小节。第一个是[Unit]部分,这里仅仅有一个描述信息。第二部分是 Service 定义,其中,ExecStartPre 定义启动服务之前应该运行的命令;ExecStart 定义启动服务的具体命令行语法。第三部分是[Install],WangtedBy 表明这个服务是在多用户模式下所需要的。
想知道一个app的systemd配置文件放在哪,可以通过systemctl status xx
来查看。
以增量的方式修改文件 or 所有鸡蛋不要放在一个篮子里
和一个sshd.service
文件在一起存在的可能有一个sshd.service.wants/
目录,所有这个目录里的链接的这些文件都隐含的增加在Wants=
键的后面,这样可以在不修改原文件的情况下,为其增加依赖关系。
和一个 sshd.service
文件一起存在的还可能有一个sshd.service.d/
目录,所有在这个目录中带有.conf
后缀的文件会在sshd.service
本身解析后进行解析,这对不编辑 sshd.service
文件而给它增加一些配置是很有用的。
systemd通常使用一个键值EnvironmentFile来提供一个配置文件,让用户可以按自己的需要定制服务,在systemd的配置文件中,变量无需使用双引号。
查看系统日志
使用Systemd后,系统日志将被集中管理,可用journalctl查看
journalctl -xe 查看日志的最后部分
journalctl -xe -u app 查看某个组件的最后输出
默认情况下,结果会通过 less 工具进行分页输出, 并且超长行会在屏幕边缘被截断。 不过,被截掉的部分可以通过左右箭头按键查看。journalctl 中文手册
小结
本文主要提供一个大致的框架,Systemd的使用细节有很多,读者可以自行参考相关文档。