1 分钟阅读

前言

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主程序 + 一些约定 + 各个配置文件,既然是配置文件,就有了各种约定。

###基本概念

  1. 单元

    系统初始化需要做的事情非常多。

    1. 需要启动后台服务,比如启动 SSHD 服务;
    2. 需要做配置工作,比如挂载文件系统。

    Systemd将配置单元归纳为一些不同的类型,.service,.socket, .device, .mount, .automount, .swap, .target, .path, .timer, .snapshot,使用 .desktop 文件的语法(即 windows 下 ini 文件的语法),所有的这些文件都有共同的两个section,即 [Unit] 和 [Install]。随着新功能不断增加。配置单元类型可能在不久的将来继续增加。

  2. 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. Running systemctl enable foo.service creates symlinks to the unit inside multi-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的使用细节有很多,读者可以自行参考相关文档。

标签:

分类:

更新时间:

留下评论