shell,Linux,network

systemd入门

什么是systemd

  systemd是Linux下一个与SysVLSB初始化脚本兼容的系统和服务管理器. systemd使用socketD-Bus来开启服务,提供基于守护进程的按需启动策略,保留了Linux cgroups的进程追踪功能支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有前卫的并行性能. systemd无需经过任何修改便可以替代sysvinit

  systemd开启和监督整个系统是基于unit的概念. unit是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit 有一个具有相同名字的配置文件,是守护进程 Avahi 的一个封装单元). unit主要有以下几种类型较常用,可是使用systemctl -t help命令查看

  • service: 文件扩展名为.service,用于定义系统服务.守护进程的启动,停止,重启和重载是此类unit中最为明显的几个类型
  • socket: .socket,用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动. systemd支持流式,数据报和连续包的AF_INET,AF_INET6,AF_UNIX socket,也支持传统的FIFOs传输模式,每一个socket unit都有一个相应的服务unit
  • target: 文件扩展名为.target,用于模拟实现运行级别
  • snapshot: 与target unit相似,快照本身不做什么,唯一的目的就是引用其他unit
  • device: .device, 用于定义内核识别的设备,每一个使用udev规则标记的设备都将会在systemd中作为一个设备unit出现.udev的属性设置可以作为配置设备unit依赖关系的配置源
  • mount: .mount, 定义文件系统挂载点
  • automount: .automount,文件系统的自动挂载点
  • path: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系 统变化时,延迟激活服务,如:spool 目录

systemd特性

  • 提供守护进程的按需启动策略

  • 使用socket的前卫的并行性能: 为了加速整个系统启动和并行启动更多的进程systemd在实际启动守护进程之前创建监听socket,然后传递socket给守护进程.在系统初始化时,首先为所有守护进程创建socket,然后再启动所有的守护进程.如果一个服务因为需要另一个服务的支持而没有完全启动,而这个连接可能正在提供服务的队列中排队,那么这个客户端进程在这次请求中就处于阻塞状态.不过只会有这一个客户端进程会被阻塞,而且仅是在这一次请求中被阻塞.服务间的依赖关系也不再需要通过配置来实现真正的并行启动(因为一次开启了所有的socket, 如果一个服务需要其他的服务,它显然可以连接到相应的socket)
  • D-Bus激活策略启动服务: 通过使用总线激活策略,服务可以在接入时马上启动.同时,总线激活策略使得系统可以用微小的消耗实现D-Bus服务的提供者与消费者的同步开启请求.(同时开启多个服务,如果一个比总线激活策略中其他服务快就在 D-Bus中排队其请求,直到其他管理确定自己的服务信息为止)
  • 保留了使用Linux cgroups进程的追踪功能: 每一个执行了的进程获得它自己的一个cgroup配置systemd使其可以存放在cgroup中已经经过外部配置的服务非常简单.(如使用 libcgroups utilities)
  • 支持快照和系统状态恢复: 快照可以用来保存/恢复系统初始化时所有的服务和 unit 的状态.它有两种主要的使用情况:允许用户暂时进入一个像 "Emergency Shell" 的特殊状态,终止当前的服务;提供一个回到先前状态的简单方法,重新启动先前暂时终止的服务
  • 维护挂载和自挂载点: systemd监视所有的挂载点的进出情况,也可以用来挂载或卸载挂载点./etc/fstab也可以作为这些挂载点的一个附加配置源.通过使用 comment=fstab选项你甚至可以标记/etc/fstab条目使其成为由systemd控制的自挂载点
  • 实现了各服务间基于依赖关系的一个精细的逻辑控制: systemd支持服务(或 unit)间的多种依赖关系.在unit配置文件中使用After/Before,RequiresWants选项可以固定unit激活的顺序.RequiresWants表示一个正向(强制或可选)的需求和依赖关系,Conflicts表示一个负向的需求和依赖关系.如果一个unit需要启动或关闭,systemd就把它和它的依赖关系添加到临时执行列表,然后确认它们的相互关系是否一致(或所有unit的先后顺序是否含有循环).如果答案是否的话,systemd 将尝试修复它,删除可以消除循环的无用工作

systemd服务管理程序和常用命令

常用命令

systemctl: 用作内省和控制systemd系统和服务管理器的状态

  • 管理服务
systemctl COMMAND name.service
    COMMAND: start, restart, stop, reload, status
  • 条件式重启:已启动才重启,否则不做操作
systemctl try-restart name.service
  • 重载或重启服务:先加载,再启动
systemctl reload-or-restart name.service
  • 重载或条件式重启服务
systemctl reload-or-try-restart name.service
  • 禁止自动和手动启动
systemctl mask name.service
  • 取消禁止
systemctl unmask name.service
  • 服务查看
  • 查看某服务当前激活与否的状态
systemctl is-active name.service
  • 查看所有已经激活的服务
systemctl list-units --type|-t service
  • 查看所有服务
systemctl list-units --type service --all|-a
  • 设定某服务开机自启
systemctl enable name.service
  • 设定某服务开机禁止启动
systemctl disable name.service
  • 查看所有服务的开机自启状态
systemctl list-unit-files --type service
  • 用来列出该服务在哪些运行级别下启用和禁用
ls /etc/systemd/system/*.wants/sshd.service
  • 查看服务是否开机自启
systemctl is-enabled name.service
  • 查看服务的依赖关系
systemctl list-dependencies name.service
  • 杀掉进程
systemctl kill unitname  
  • 服务状态
  • 显示状态
systemctl list-unit-files --type service --all
- loaded: Unit配置文件加载至内存中的
- active(running): 一次或多次持续处理的运行
- active(exited): 成功完成一次性的配置 
- active(waiting): 运行中,等待一个事件
- inactive: 不运行
- enabled: 开机启动
- disabled: 开机不启动
- static: 开机不启动,但可被另一个启用的服务激活
  • 显示所有单元状态
systemctl list-units
  • 只显示服务单元的状态
systemctl --type=service
  • 列出活动状态的所有服务单元
systemctl list-units --type=service
  • 列出所有服务单元
systemctl list-units --type=service --all
  • 查看服务单元的启用和禁用状态
systemctl list-unit-files --type=service
  • 列出失败的服务
systemctl --failed --type=service
  • systemd-cgls: 以树形递归显示选中的Linux控制组结构层次
  • systemadm: 一个systemd系统和服务管理器的图形化前端.是 systemd-gtk软件包的一部分

内核启动命令

在系统启动时systemd默认激活default.target,它的工作就是按照依赖关系来激活服务和调用其他unit

为了重载需要激活的unit,systemd通过systemd.unit=命令行选项解析其自己的kernel命令行参数.这可以用来临时启动系统到一个不同的启动unit.传统的run-levels被下面的取代

  • systemd.unit=rescue.target: 设置基本系统和救援shell的特殊target unit,与运行级1相似
  • systemd.unit=emergency.target: 与传递保留参数的init=/bin/sh给系统使系统从该状态启动相似
  • systemd.unit=multi-user.target: 非图形化的多用户系统
  • systemd.unit=graphical.target: 图形化的登录界面

system V init 与systemd的兼容性

  • systemd同SysVinitLSB init scripts兼容

Systemd 是一个"新来的",Linux 上的很多应用程序并没有来得及为它做相应的改变.和UpStart一样,systemd引入了新的配置方式,对应用程序的开发也有一些新的要求.如果 systemd 想替代目前正在运行的初始化系统,就必须和现有程序兼容.任何一个Linux发行版都很难为了采用systemd而在短时间内将所有的服务代码都修改一遍

Systemd 提供了和Sysvinit以及LSB initscripts兼容的特性.系统中已经存在的服务和进程无需修改.这降低了系统向systemd迁移的成本,使得 systemd 替换现有初始化系统成为可能

systemd如何查看与更改运行级别

  • systemd使用比sysvinit的运行级更为自由的target概念作为替代
  • 第3运行级用multi-user.target替代.第5运行级用graphical.target 替代.runlevel3.targetrunlevel5.target分别是指向multi-user.targetgraphical.target的符号链接
  • systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其它服务,来创建自己的目标.下表列举了systemd下的目标和常见runlevel的对应关系
  • Sysvinit 运行级别和 systemd 目标的对应表
Sysvinit 运行级别Systemd 目标备注
0runlevel0.target, poweroff.target关闭系统
1, s, singlerunlevel1.target, rescue.target单用户模式
2, 4runlevel2.target, runlevel4.target, multi-user.target用户定义/域特定运行级别.默认等同于3
3runlevel3.target, multi-user.target多用户,非图形化.用户可以通过多个控制台或网络登录
5runlevel5.target, graphical.target多用户,图形化.通常为所有运行级别 3 的服务外加图形化登录
6runlevel6.target, reboot.target重启
emergencyemergency.target紧急 Shell
  • 切换运行级别为3
systemctl isolate multi-user.target
systemctl isolate runlevel3.target
  • 切换运行级别为5
systemctl isolate graphical.target
systemctl isolate runlevel5.target

切换默认运行级别

  • systemd使用链接来指向默认的运行级别,在创建新的链接前,可以先删除存在的链接
rm /etc/systemd/system/default.target
  • 设置默认运行级别为3
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
  • 设置默认运行级别为5
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
  • 查看当前运行级别

runlevel命令在systemd下仍然可以工作

systemctl list-units --type=target

systemd如何改变默认getty数目

添加一个新的 getty

  • 只需要在getty.target.wants/目录下新建一个链接到getty的示例即可
ln -sf /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service
systemctl daemon-reload
systemctl start getty@tty9.service

删除一个 getty

  • 直接删掉getty.target.wants/目录下不想要的那个getty链接即可
rm /etc/systemd/system/getty.target.wants/getty@tty5.service /etc/systemd/system/getty.target.wants/getty@tty6.service
systemctl daemon-reload
systemctl stop getty@tty5.service getty@tty6.service

systemd虚拟终端设置自动登录

  • 首先创建一个新的类似于 getty@.service 的服务
cp /lib/systemd/system/getty@.service   /etc/systemd/system/autologin@.service
ln -s /etc/systemd/system/autologin@.service       /etc/systemd/system/getty.target.wants/getty@tty8.service
  • 然后编辑ExecStartRestartAlias的值,如:
...
ExecStart=-/sbin/mingetty --autologin USERNAME %I
Restart=no
...
Alias=getty.target.wants/getty@tty8.service
  • 最后重新加载守护进程,运行服务
systemctl daemon-reload
systemctl start getty@tty8.service

如果退出了tty8的会话,需要等到下次重新启动才能使用,除非Restart的值是always,这样可以使用systemctl`手动开启,但是出于安全考虑,强烈建议不要这么做

systemd定制或增加一个自定义unit文件

unit文件在/etc/systemd/system下的优先级要高于/lib/systemd/system下的.按照个人的需求从后者移动到前者并进行自定义修改

/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/

/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行

/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行

service unit文件格式

  • /etc/systemd/system:系统管理员和用户使用
  • /usr/lib/systemd/system:发 行版打包者使用
  • 以 “#” 开头的行后面的内容会被认为是注释
  • 相关布尔,1, yes, on,true都是开启,0, no, off, false都是关闭
  • 时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明
  • service unit file文件通常由三部分组成:

  • Unit段的常用选项:

    • Description:描述信息
    • After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与 Before相反
    • Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit 也无法激活
    • Wants:依赖到的其它units,弱依赖
    • Conflicts:定义units间的冲突关系
  • Service段的常用选项:

    • Type:定义影响ExecStart及相关参数的功能的unit进程启动类型

      • simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常 驻于内存中
      • forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此 daemon的主要服务。原生父程序在启动结束后就会终止
      • oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在 内存中
      • dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才 会继续运作.因此通常也要同时设定BusNname= 才行
      • notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
      • idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后 才会执行。这类的daemon通常是开机到最后才执行即可的服务
    • EnvironmentFile:环境配置文件
    • ExecStart:指明启动unit要运行命令或脚本的绝对路径
    • ExecStartPre: ExecStart前运行
    • ExecStartPost: ExecStart后运行
    • ExecStop:指明停止unit要运行的命令或脚本
    • Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动 启动此服务
  • Install段的常用选项:

    • Alias:别名,可使用systemctl command Alias.service
    • RequiredBy:被哪些units所依赖,强依赖
    • WantedBy:被哪些units所依赖,弱依赖
    • Also:安装本服务的时候还要安装别的相关服务

对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启

systemctl daemon-reload
  • 如下,创建一个简单的service unit
cat << EOF | tee /usr/lib/systemd/system/ss-local.service
[Unit]
Description=Shadowsocks to Love GFW
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=root
PIDFile=/run/ss-local.pid
ExecStart=/usr/bin/sslocal -c /etc/shadowsocks.json

[Install]
WantedBy=multi-user.target
EOF

参考

systemd 系统入门手册

Understanding and administering systemd

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

支付宝扫一扫,向我赞赏

回复

This is just a placeholder img.