精华内容
参与话题
问答
  • Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。 systemd的特性有: 支持并行化任务 同时采用socket式与D-Bus总线

    http://blog.csdn.net/wangmj518/article/details/42220767

    CentOS7 使用systemd替换了SysV。Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。

    systemd的特性有:

    支持并行化任务

    同时采用socket式与D-Bus总线式激活服务;

    按需启动守护进程(daemon);

    利用 Linux 的 cgroups 监视进程;

    支持快照和系统恢复;

    维护挂载点和自动挂载点;

    各服务间基于依赖关系进行精密控制。

    systemd基本工具

    检视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务。详见man 1 systemctl。

    小贴士: 在 systemctl 参数中添加 -H <用户名>@<主机名> 可以实现对其他机器的远程控制。该过程使用ssh链接。

    注意: systemadm 是 systemd 的官方图形前端。


    分析系统状态

    输出激活的单元:

    1
    $ systemctl

    以下命令等效:

    1
    $ systemctl list-units

    输出运行失败的单元:

    1
    $ systemctl --failed

    所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)。查看所有已安装服务:

    1
    $ systemctl list-unit-files

    使用单元

    一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets 、系统设备、交换分区/文件、启动目标(target)、文件系统路径、由 systemd 管理的计时器。详情参阅 man 5 systemd.unit.

    使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service)。但是有些单元可以在systemctl中使用简写方式。

    如果无扩展名,systemctl 默认把扩展名当作 .service。例如 netcfg 和 netcfg.service 是等价的。

    挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。

    设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。

    立即激活单元:

    1
    # systemctl start <单元>

    立即停止单元:

    1
    # systemctl stop <单元>

    重启单元:

    1
    # systemctl restart <单元>

    命令单元重新读取配置:

    1
    # systemctl reload <单元>

    输出单元运行状态:

    1
    $ systemctl status <单元>

    检查单元是否配置为自动启动:

    1
    $ systemctl is-enabled <单元>

    开机自动激活单元:

    1
    # systemctl enable <单元>

    注意: 如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们。如果真的需要手动安装,可以直接连接服务,如下(将foo替换为真实的服务名):

    1
    # ln -s /usr/lib/systemd/system/foo.service /etc/systemd/system/graphical.target.wants/

    取消开机自动激活单元:

    1
    # systemctl disable <单元>

    显示单元的手册页(必须由单元文件提供):

    1
    # systemctl help <单元>

    重新载入 systemd,扫描新的或有变动的单元:

    1
    # systemctl daemon-reload

    电源管理

    安装 polkit 后才可使用电源管理。


    如果你正登录在一个本地的systemd-logind用户会话,且当前没有其它活动的会话,那么以下命令无需root权限即可执行。否则(例如,当前有另一个用户登录在某个tty),systemd 将会自动请求输入root密码。

    重启:

    1
    $ systemctl reboot

    退出系统并停止电源:

    1
    $ systemctl poweroff

    待机:

    1
    $ systemctl suspend

    休眠:

    1
    $ systemctl hibernate

    混合休眠模式(同时休眠到硬盘并待机):

    1
    $ systemctl hybrid-sleep

    原生 systemd 配置文件

    注意: 可能需要手动创建某些文件。所有文件的权限都是644,属主 root,属组 root。


    虚拟控制台

    可以用/etc/vconsole.conf 文件或者localectl 配置虚拟控制台,包括键盘布局和控制台字体。详情请访问 控制台字体 和 键盘布局。


    硬件时钟

    systemd 默认硬件时钟为协调世界时(UTC)。

    小贴士: 推荐使用NTP服务来在线同步硬件时钟。

    硬件时钟设定为地方时

    将硬件时钟配置为地方时(不建议):

    1
    # timedatectl set-local-rtc true

    重新调整为 UTC:

    1
    # timedatectl set-local-rtc false

    如果设置成本地时间,处理夏令时有些麻烦。如果夏令时调整发生在关机时,下次启动时时间会出现问题。最新的内核直接从实时时钟芯片(RTC)读取时间,不 使用 hwclock,内核把从 RTC 读取的时间当作 UTC 处理。所以如果硬件时间是地方时,系统启动一开始识别的时间是错误的,之后很快会进行矫正。这可能导致一些问题(尤其是时间倒退时)。


    如果同时安装了 Windows 操作系统(默认使用地方时),那么一般 RTC 会被设置为地方时。Windows 其实也能处理 UTC,需要修改注册表。建议让 Windows 使用 UTC,而非让 Linux 使用地方时。Windows 使用 UTC 后,请记得禁用 Windows 的时间同步功能,以防 Windows 错误设置硬件时间。如上文所说,linux 可以使用NTP服务来在线同步硬件时钟。


    内核模块

    请访问Kernel modules

    文件系统挂载

    默认行为是:在启动一个需要挂载特定分区的服务之前,系统自动检查并挂载分区。/etc/fstab 中设定的网络文件系统(如 NFS、Samba)无需配置即可正常工作,systemd 将确保网络文件系统在网络链接就绪后挂载。


    详情参阅:man 5 systemd.mount。

    LVM

    如果装有不通过 initramfs 激活的LVM卷,则需启动 lvm-monitoring 服务(由 lvm2 软件包提供):

    1
    # systemctl enable lvm-monitoring

    ACPI 电源管理

    参阅 Power Management


    临时文件

    /usr/lib/tmpfiles.d/ 和 /etc/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何创建、清理、删除临时文件和目录,这些文件和目录通常存放在 /run 和 /tmp 中。配置文件名称为 /etc/tmpfiles.d/<program>.conf。此处的配置能覆盖 /usr/lib/tmpfiles.d/ 目录中的同名配置。


    临时文件通常和服务文件同时提供,以生成守护进程需要的文件和目录。例如 Samba 服务需要目录 /run/samba 存在并设置正确的权限位,就象这样:


    /usr/lib/tmpfiles.d/samba.conf

    D /run/samba 0755 root root

    此外,临时文件还可以用来在开机时向特定文件写入某些内容。比如,要禁止系统从USB设备唤醒,利用旧的 /etc/rc.local 可以用 echo USBE > /proc/acpi/wakeup,而现在可以这么做:


    /etc/tmpfiles.d/disable-usb-wake.conf

    w /proc/acpi/wakeup – - – - USBE

    详情参见 man 5 tmpfiles.d。


    注意: 该方法不能向 /sys 中的配置文件添加参数,因为 systemd-tmpfiles-setup 有可能在相关模块加载前运行。这种情况下,需要首先通过 modinfo <模块名> 确认需要的参数,并在 /etc/modprobe.d 下的一个文件中设置改参数。另外,还可以使用 udev 规则,在设备就绪时设置相应属性。


    自己编写 .service 文件

    systemd 的单元文件是受 XDG Desktop Entry .desktop 文件启发而产生,而最初起源是 Windows 下的 .ini 文件。


    处理依赖关系

    使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中 的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。


    依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。


    启动方式

    编写自定义的service文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。具体的参数说明请参阅 man systemd.service 。


    Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。


    Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启 动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。


    Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。


    Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。


    Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。


    修改现存单元文件

    要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:


    /etc/systemd/system/<unit>.d/customdependency.conf[Unit]Requires=<新依赖>After=<新依赖>

    然后运行以下命令使更改生效:


    # systemctl daemon-reload# systemctl restart <单元>

    此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable <unit>,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。


    小贴士: 可以用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被修改。


    单元配置文件的 vim 语法高亮支持

    可从官方仓库安装 vim-systemd 软件包,使 unit 配置文件在 Vim 下支持语法高亮。


    目标(target)

    启动级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和启动级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些 目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 启动级别的目标,仍可以使用旧的 telinit 启动级别 命令切换。

    获取当前目标

    不要使用 runlevel 命令了:

    1
    $ systemctl list-units --type=target

    创建新目标

    在 Fedora 中,启动级别 0、1、3、5、6 都被赋予特定用途,并且都对应一个 systemd 的目标。然而,没有什么很好的移植用户定义的启动级别(2、4)的方法。要实现类似功能,可以以原有的启动级别为基础,创建一个新的目标 /etc/systemd/system/<新目标>(可以参考 /usr/lib/systemd/system/graphical.target),创建 /etc/systemd/system/<新目标>.wants 目录,向其中加入额外服务的链接(指向 /usr/lib/systemd/system/ 中的单元文件)。

    目标表

    SysV 启动级别 Systemd 目标注释

    0 runlevel0.target, poweroff.target中断系统(halt)

    1, s, single runlevel1.target, rescue.target单用户模式

    2, 4 runlevel2.target, runlevel4.target, multi-user.target用户自定义启动级别,通常识别为级别3。

    3 runlevel3.target, multi-user.target多用户,无图形界面。用户可以通过终端或网络登录。

    5 runlevel5.target, graphical.target多用户,图形界面。继承级别3的服务,并启动图形界面服务。

    6 runlevel6.target, reboot.target重启

    emergency emergency.target急救模式(Emergency shell)

    切换启动级别/目标

    systemd 中,启动级别通过“目标单元”访问。通过如下命令切换:

    1
    # systemctl isolate graphical.target

    该命令对下次启动无影响。等价于telinit 3 或 telinit 5。

    修改默认启动级别/目标

    开机启动进的目标是 default.target,默认链接到 graphical.target (大致相当于原来的启动级别5)。可以通过内核参数更改默认启动级别:

    小贴士: 可以省略扩展名 .target。

     systemd.unit=multi-user.target (大致相当于级别3)

     systemd.unit=rescue.target (大致相当于级别1)

    另一个方法是修改 default.target。可以通过 systemctl 修改它:

    1
    # systemctl enable multi-user.target

    命令执行情况由 systemctl 显示:链接 /etc/systemd/system/default.target 被创建,指向新的默认启动级别。该方法当且仅当目标配置文件中有以下内容时有效:

    1
    [Install]Alias=default.target

    目前,multi-user.target、graphical.target 都包含这段内容。


    日志

    systemd提供了自己日志系统(logging system),称为 journal. 使用 systemd 日志,无需额外安装日志服务(syslog)。读取日志的命令:

    1
    # journalctl

    默认情况下(当 Storage= 在文件 /etc/systemd/journald.conf 中被设置为 auto),日志记录将被写入 /var/log/journal/。该目录是 systemd 软件包的一部分。若被删除,systemd 不会自动创建它,直到下次升级软件包时重建该目录。如果该目录缺失,systemd 会将日志记录写入 /run/systemd/journal。这意味着,系统重启后日志将丢失。


    过滤输出

    journalctl可以根据特定字段过滤输出,例如:

    显示本次启动后的所有日志:

    1
    # journalctl -b

    不过,一般大家更关心的不是本次启动后的日志,而是上次启动时的(例如,刚刚系统崩溃了)。目前还没有这项功能,正在 systemd-devel@lists.freedesktop.org 讨论中。


    目前的折中方案是:

    1
    # journalctl --since=today | tac | sed -n '/-- Reboot --/{n;:r;/-- Reboot --/q;p;n;b r}' | tac

    以上命令输出本日内的所有启动信息。但要注意,如果日志很多,该命令执行时间会比较漫长。


    动态跟踪最新信息:

    1
    # journalctl -f

    显示特定程序的所有消息:

    1
     # journalctl /usr/lib/systemd/systemd

    显示特定进程的所有消息:

    1
    # journalctl _PID=1
    1
    2
    显示指定单元的所有消息:
    # journalctl -u netcfg

    详情参阅man journalctl、man systemd.journal-fields


    日志大小限制

    如果按上面的操作保留日志的话,默认日志最大限制为所在文件系统容量的 10%,即:如果 /var/log/journal 储存在 50GiB 的根分区中,那么日志最多存储 5GiB 数据。可以修改 /etc/systemd/journald.conf 中的 SystemMaxUse 来指定该最大限制。如限制日志最大 50MiB:

    1
    SystemMaxUse=50M

    详情参见 man journald.conf.


    配合syslog使用

    systemd提供了 socket /run/systemd/journal/syslog,以兼容传统日志服务。所有系统信息都会被传入。要使传统日志服务工作,需要让服务链接该 socket,而非 /dev/log(官方说明)。Arch 软件仓库中的 syslog-ng 已经包含了需要的配置。

    设置开机启动 syslog-ng:

    1
     # systemctl enable syslog-ng

    疑难解答

    关机/重启十分缓慢

    如果关机特别慢(甚至跟死机了一样),很可能是某个拒不退出的服务在作怪。systemd 会等待一段时间,然后再尝试杀死它。请阅读这篇文章,确认你是否是该问题受害者。


    短时进程无日志记录

    若 journalctl -u foounit.service 没有显示某个短时进程的任何输出,那么改用 PID 试试。例如,若 systemd-modules-load.service 执行失败,那么先用 systemctl status systemd-modules-load 查询其 PID(比如是123),然后检索该 PID 相关的日志 journalctl -b _PID=123。运行时进程的日志元数据(诸如 _SYSTEMD_UNIT 和 _COMM)被乱序收集在 /proc 目录。要修复该问题,必须修改内核,使其通过套接字连接来提供上述数据,该过程类似于 SCM_CREDENTIALS。


    诊断启动问题

    使用如下内核参数引导: systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M

    禁止在程序崩溃时转储内存

    要使用老的内核转储,创建下面文件:

    /etc/sysctl.d/49-coredump.conf

    1
    2
    kernel.core_pattern = core
    kernel.core_uses_pid = 0

    然后运行:

    1
    # /usr/lib/systemd/systemd-sysctl

    同样可能需要执行“unlimit”设置文件大小:

    1
    ulimit -c unlimited

    转自:https://wiki.archlinux.org/index.PHP/systemd_(简体中文)



    展开全文
  • 最简明扼要的 Systemd 教程,只需十分钟

    万次阅读 多人点赞 2018-05-04 11:39:33
    systemctl常用命令介绍~~~Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类...

    systemctl常用命令介绍~~~

    Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。

    Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。


    启动及服务

        大多数主流发行版要么已经采用 Systemd,要么即将在下个发布中采用(如 Debian 和 Ubuntu)。在本教程中,我们使用 Fedora 21(该发行版已经是 Systemd 的优秀实验场地)的一个预览版进行演示,但不论您用哪个发行版,要用到的命令和注意事项都应该是一样的。这是 Systemd 的一个加分点:它消除了不同发行版之间许多细微且琐碎的区别。

        在终端中输入 ps ax | grep systemd,看到第一行,其中的数字 1 表示它的进程号是1,也就是说它是 Linux 内核发起的第一个程序。因此,内核一旦检测完硬件并组织好了内存,就会运行 /usr/lib/systemd/systemd 可执行程序,这个程序会按顺序依次发起其他程序。(在还没有 Systemd 的日子里,内核会去运行 /sbin/init,随后这个程序会在名为 SysVinit 的系统中运行其余的各种启动脚本。)

          Systemd 的核心是一个叫单元unit的概念,它是一些存有关于服务service(在运行在后台的程序)、设备、挂载点、和操作系统其他方面信息的配置文件。Systemd 的其中一个目标就是简化这些事物之间的相互作用,因此如果你有程序需要在某个挂载点被创建或某个设备被接入后开始运行,Systemd 可以让这一切正常运作起来变得相当容易。(在没有 Systemd 的日子里,要使用脚本来把这些事情调配好,那可是相当丑陋的。)要列出您 Linux 系统上的所有单元,输入以下命令:

    1. systemctl list-unit-files

    现在,systemctl 是与 Systemd 交互的主要工具,它有不少选项。在单元列表中,您会注意到这儿有一些格式化:被启用enabled的单元显示为绿色,被禁用disabled的显示为红色。标记为“static”的单元不能直接启用,它们是其他单元所依赖的对象。若要限制输出列表只包含服务,使用以下命令:

    1. systemctl list-unit-files --type=service

    注意,一个单元显示为“enabled”,并不等于对应的服务正在运行,而只能说明它可以被开启。要获得某个特定服务的信息,以 GDM (Gnome Display Manager) 为例,输入以下命令:

    1. systemctl status gdm.service

        这条命令提供了许多有用的信息:一段给人看的服务描述、单元配置文件的位置、启动的时间、进程号,以及它所从属的 CGroups(用以限制各组进程的资源开销)。

        如果您去查看位于 /usr/lib/systemd/system/gdm.service 的单元配置文件,您可以看到各种选项,包括要被运行的二进制文件(“ExecStart”那一行),相冲突的其他单元(即不能同时进入运行的单元),以及需要在本单元执行前进入运行的单元(“After”那一行)。一些单元有附加的依赖选项,例如“Requires”(必要的依赖)和“Wants”(可选的依赖)。

    此处另一个有趣的选项是:

    1. Al Alias=display-manager.service

    当您启动 gdm.service 后,您将可以通过 systemctl status display-manager.service 来查看它的状态。当您知道有显示管理程序display manager在运行并想对它做点什么,但您不关心那究竟是 GDM,KDM,XDM 还是什么别的显示管理程序时,这个选项会非常有用。

    使用 systemctl status 命令后面跟一个单元名,来查看对应的服务有什么情况。

    使用 systemctl status 命令后面跟一个单元名,来查看对应的服务有什么情况。


    “目标target”锁定

        如果您在 /usr/lib/systemd/system 目录中输入 ls 命令,您将看到各种以 .target 结尾的文件。启动目标target是一种将多个单元聚合在一起以致于将它们同时启动的方式。例如,对大多数类 Unix 操作系统而言有一种“多用户multi-user”状态,意思是系统已被成功启动,后台服务正在运行,并且已准备好让一个或多个用户登录并工作——至少在文本模式下。(其他状态包括用于进行管理工作的单用户single-user状态,以及用于机器关机的重启reboot状态。)

        如果您打开 multi-user.target 文件一探究竟,您可能期待看到的是一个要被启动的单元列表。但您会发现这个文件内部几乎空空如也——其实,一个服务会通过 WantedBy 选项让自己成为启动目标的依赖。因此如果您去打开 avahi-daemon.serviceNetworkManager.service 及其他 .service 文件看看,您将在 Install 段看到这一行: 

    1. WantedBy=multi-user.target

    因此,切换到多用户启动目标会启用enable那些包含上述语句的单元。还有其他一些启动目标可用(例如 emergency.target 提供一个紧急情况使用的 shell,以及 halt.target 用于机器关机),您可以用以下方式轻松地在它们之间切换: 

    1. systemctl isolate emergency.target

    在许多方面,这些都很像 SysVinit 中的运行级runlevel,如文本模式的 multi-user.target 类似于第3运行级,graphical.target 类似于第5运行级,reboot.target 类似于第6运行级,诸如此类。

    与传统的脚本相比,单元配置文件也许看起来很陌生,但并不难以理解。

    与传统的脚本相比,单元配置文件也许看起来很陌生,但并不难以理解。


    开启与停止

        现在您也许陷入了沉思:我们已经看了这么多,但仍没看到如何停止和开启服务!这其实是有原因的。从外部看,Systemd 也许很复杂,像野兽一般难以驾驭。因此在您开始摆弄它之前,有必要从宏观的角度看看它是如何工作的。实际用来管理服务的命令非常简单:

    1. systemctl stop cups.service
    2. systemctl start cups.service

    若某个单元被禁用了,您可以先通过 systemctl enable 加上该单元名的方式将其启用。这种做法会为该单元创建一个符号链接,并将其放置在当前启动目标的 .wants 目录下,这些 .wants 目录在/etc/systemd/system 文件夹中。)

        还有两个有用的命令是 systemctl restart 和 systemctl reload,后面接单元名。后者用于让单元重新加载它的配置文件。Systemd 的绝大部分都有良好的文档,因此您可以查看手册 (man systemctl) 了解每条命令的细节。

    定时器单元:取代 Cron

        除了系统初始化和服务管理,Systemd 还染指了其他方面。在很大程度上,它能够完成 cron 的工作,而且可以说是以更灵活的方式(并带有更易读的语法)。cron是一个以规定时间间隔执行任务的程序——例如清除临时文件,刷新缓存等。

        如果您再次进入 /usr/lib/systemd/system 目录,您会看到那儿有多个 .timer 文件。用 less 来查看这些文件,您会发现它们与 .service 和 .target 文件有着相似的结构,而区别在于 [Timer] 段。举个例子:

    1. [Timer]
    2. OnBootSec=1h
    3. OnUnitActiveSec=1w

    OnBootSec 选项告诉 Systemd 在系统启动一小时后启动这个单元。第二个选项的意思是:自那以后每周启动这个单元一次。关于定时器有大量选项您可以设置,输入 man systemd.time 查看完整列表。

    Systemd 的时间精度默认为一分钟。也就是说,它会在设定时刻的一分钟内运行单元,但不一定精确到那一秒。这么做是基于电源管理方面的原因,但如果您需要一个没有任何延时且精确到毫秒的定时器,您可以添加以下一行:

    1. AccuracySec=1us

    另外, WakeSystem 选项(可以被设置为 true 或 false)决定了定时器是否可以唤醒处于休眠状态的机器。

    有一个 Systemd 的图形界面程序,即便它已有多年未被积极维护。

    有一个 Systemd 的图形界面程序,即便它已有多年未被积极维护。

    日志文件:向 journald 问声好

        Systemd 的第二个主要部分是 journal 。这是个日志系统,类似于 syslog 但也有些显著区别。如果您是个 Unix 日志管理模式的粉丝,准备好出离愤怒吧:这是个二进制日志,因此您不能使用常规的命令行文本处理工具来解析它。这个设计决定不出意料地在网上引起了激烈的争论,但它的确有些优点。例如,日志可以被更系统地组织,带有更多的元数据,因此可以更容易地根据可执行文件名和进程号等过滤出信息。

    要查看整个 journal,输入以下命令:

    1. journalctl

    像许多其他的 Systemd 命令一样,该命令将输出通过管道的方式引向 less 程序,因此您可以使用空格键向下滚动,键入/(斜杠)查找,以及其他熟悉的快捷键。您也能在此看到少许颜色,像红色的警告及错误信息。

    以上命令会输出很多信息。为了限制其只输出本次启动的消息,使用如下命令:

    1. journalctl -b

    这就是 Systemd 大放异彩的地方!您想查看自上次启动以来的全部消息吗?试试 journalctl -b -1 吧。再上一次的?用 -2 替换 -1 吧。那自某个具体时间,例如2014年10月24日16:38以来的呢?

    1. journalctl -b --since=”2014-10-24 16:38

    即便您对二进制日志感到遗憾,那依然是个有用的特性,并且对许多系统管理员来说,构建类似的过滤器比起写正则表达式而言容易多了。

    我们已经可以根据特定的时间来准确查找日志了,那可以根据特定程序吗?对单元而言,试试这个:

    1. journalctl -u gdm.service

    (注意:这是个查看 X server 产生的日志的好办法。)那根据特定的进程号?

    1. journalctl _PID=890

    您甚至可以请求只看某个可执行文件产生的消息:

    1. journalctl /usr/bin/pulseaudio

    若您想将输出的消息限制在某个优先级,可以使用 -p 选项。该选项参数为 0 的话只会显示紧急消息(也就是说,是时候向 $DEITY 祈求保佑了)(LCTT 译注: $DEITY 是一个计算机方面的幽默,DEITY 是指广义上的“神”,$前缀表示这是一个变量),为 7 的话会显示所有消息,包括调试消息。请查看手册 (man journalctl) 获取更多关于优先级的信息。

    值得指出的是,您也可以将多个选项结合在一起,若想查看在当前启动中由 GDM 服务输出的优先级数小于等于 3 的消息,请使用下述命令:

    1. journalctl -u gdm.service -p 3 -b

    最后,如果您仅仅想打开一个随 journal 持续更新的终端窗口,就像在没有 Systemd 时使用 tail 命令实现的那样,输入 journalctl -f 就好了。

    二进制日志并不流行,但 journal 的确有它的优点,如非常方便的信息查找及过滤。

    二进制日志并不流行,但 journal 的确有它的优点,如非常方便的信息查找及过滤。



    参考:https://linux.cn/article-6888-1.html

    更详细的教程可以参考:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html



    systemd常见命令汇总:

    使某服务自动启动
    systemctl enable httpd.service
    使某服务不自动启动
    systemctl disable httpd.service
    检查服务状态

    systemctl status httpd.service (服务详细信息) 

    systemctl is-active httpd.service (仅显示是否 Active)

    显示所有已启动的服务
    systemctl list-units --type=service
    启动某服务
    systemctl start httpd.service
    停止某服务
    systemctl stop httpd.service
    重启某服务 systemctl restart httpd.service

    实例

    1.启动nfs服务

    systemctl start nfs-server.service

    2.设置开机自启动

    systemctl enable nfs-server.service

    3.停止开机自启动

    systemctl disable nfs-server.service

    4.查看服务当前状态

    systemctl status nfs-server.service

    5.重新启动某服务

    systemctl restart nfs-server.service

    6.查看所有已启动的服务

    systemctl list -units --type=service

    开启防火墙22端口

    iptables -I INPUT -p tcp --dport 22 -j accept

    如果仍然有问题,就可能是SELinux导致的

    关闭SElinux:

    修改/etc/selinux/config文件中的SELINUX=””为disabled,然后重启。

    彻底关闭防火墙:

    sudo systemctl status firewalld.service
    sudo systemctl stop firewalld.service          
    sudo systemctl disable firewalld.service

    利用systemctl添加自定义系统服务


    systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,还是存在系统服务里吧,即:/usr/lib/systemd/system目录下
     
    每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
     
     
    [root@localhost system]# cat ntpdate.service
    [Unit]
    Description=Set time via NTP
    After=syslog.target network.target nss-lookup.target
    Before=time-sync.target
    Wants=time-sync.target
     
    [Service]
    Type=oneshot
    ExecStart=/usr/libexec/ntpdate-wrapper
    RemainAfterExit=yes
     
    [Install]
    WantedBy=multi-user.target
     
     
    Unit  描述信息
     
    Description=     #描述信息
    After=          #在那个程序之前启动
    Before          #在那个程序之后启动
     
    Service 启动信息
     
    Type=     #启动类型。
              #Type=oneshot :这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
              #Type=notify :与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
              #Type=dbus :若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
              #Type=idle :systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。
              #Type=forking :systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程。
              #Type=simple :(默认值) systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。
     
    RemainAfterExit=yes     #通知systemctl结束
    User=
    Group=
    Restart=               #Restart=always的时候systemctl会不断重启这个脚本,这种适合程序是脚本的。
                           #Restart=no的时候不会重启,适合程序软件。
     
     
    ExecStart=  #后面跟程序的绝对路径,如果有启动参数,后面加上,如果程序没有参数不需要添加ExecStop这条语句
    ExecStop=    #后面跟程序的绝对路径,如果有停止参数,后面加上
    PIDFile=     #加上程序PID文件绝对路径
     
     
    install 安装信息
     
    WantedBy=          #WantedBy=multi-user.target(单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。)

    3.重载服务

    systemctl enable nginx.service

    就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/nginx.service 文件的链接。

    4.操作服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #启动服务
    $ sudo systemctl start nginx.service
      
    #查看日志
    $ sudo journalctl -f -u nginx.service
    — Logs begin at 四 2015-06-25 17:32:20 CST. —
    6月 25 10:28:24 Leco.lan systemd[1]: Starting nginx – high performance web server…
    6月 25 10:28:24 Leco.lan nginx[7976]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    6月 25 10:28:24 Leco.lan nginx[7976]: nginx: configuration file /etc/nginx/nginx.conf test is successful
    6月 25 10:28:24 Leco.lan systemd[1]: Started nginx – high performance web server.
      
    #重启
    $ sudo systemctl restart nginx.service
      
    #重载
    $ sudo systemctl reload nginx.service
      
    #停止
    $ sudo systemctl stop nginx.service



    参考:http://man.linuxde.net/systemctl


    展开全文
  • Systemd基础:1: 概要介绍

    千次阅读 2019-04-08 19:55:24
    Systemd在不知不觉中已经得到了大多数Linux发型版的支持,这系列文章中将来介绍一下在争议中砥砺前行的Systemd

    在这里插入图片描述
    Systemd在不知不觉中已经得到了大多数Linux发型版的支持,这系列文章中将来介绍一下在争议中砥砺前行的Systemd。

    Systemd是什么

    Systemd中的d是daemon(守护进程)的缩写,使用ps即可看到这个进程systemd的存在。看一下ps的systemd的进程号,你就会意识到它的作用,就是那个存在了很长时间的pid为1的init进程,终于改名字了。

    [root@liumiaocn ~]# ps -ef |grep systemd |grep -v grep
    root         1     0  0 Mar31 ?        00:02:20 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root      1402     1  0 Mar31 ?        00:20:03 /usr/lib/systemd/systemd-journald
    root      1431     1  0 Mar31 ?        00:00:02 /usr/lib/systemd/systemd-udevd
    root      2604     1  0 Mar31 ?        00:00:08 /usr/lib/systemd/systemd-logind
    dbus      2607     1  0 Mar31 ?        00:00:36 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
    [root@liumiaocn ~]#
    

    发起的原因

    在Redhat工作的工程师Lennart Poettering 和 Kay Sievers完成了Systemd最初版本的开发,发起的原因也非常简单,就是对init守护进程的改进。

    Systemd的目标

    在2014年, Poettering对于systemd的作用,提到了如下三个通用功能:

    • 系统和服务管理
    • 作为开发其他软件的基础平台
    • 起到应用和内核之间的粘合作用,提供各种由内核提供的功能性接口

    Systemd包含什么

    虽然又一个systemd名称的守护进行,但systemd并不只是这个pid为1的damon进程,从上文的ps结果你还可以看到systemd-journald和systemd-logind等子进程的存在。事实上Systemd是由一系列守护进程所组成,考虑到Poettering关于其通用功能的三个目标,在2013年发布的时候Systemd包含了69个组件也不会让我们感到太意外了。当然Systemd引起了多少非议,有兴趣的可以看一下这篇文章:The Biggest Myths,这篇文章针对30条主要的非议进行了答复,比如:

    • Systemd 不符合Unix哲学
    • Systemd是monolithic的巨石应用因为由69个组件组成

    这篇文章中充满了辩论的智慧,比如:A package involving 69 individual binaries can hardly be called monolithic. 值得每个有志于口水战的技术从业人员学习,毕竟生活和技术可能充满很多无奈。

    关于Systemd为什么会引起那么多口水,看一下Tizen(三星所使用的基于Linux的移动终端操作系统)对于起所使用的systemd的描述就会了解
    在这里插入图片描述

    支持的平台

    在众多的非议之中,systemd已然在大部分Linux发行版中站稳脚跟。截止到目前为之,可以看到基本上主流的Linux发行版已然支持。
    在这里插入图片描述

    不支持Systemd的linux联盟

    截止到目前为止,非主流的Linux发行版中,还有不少without systemd
    在这里插入图片描述

    永远在路上的Systemd

    Poettering描述systemd使用了如下的语句:“never finished, never complete, but tracking progress of technology“,他认为systemd应该追随技术的脚步不停更新,小哥也用他的行动证实了这一点,作为systemd功能的最为核心的提供者一直从未停下脚步。
    在这里插入图片描述

    把争议放在一边不谈,这种想法是一个真正的技术人员应该拥有的。在后面也将会结合实际的简单例子来介绍Systemd的使用方法。

    其他相关文章

    其他不太相关文章

    参考内容

    https://en.wikipedia.org/wiki/Systemd
    https://en.wikipedia.org/wiki/Category:Linux_distributions_without_systemd
    https://www.freedesktop.org/wiki/Software/systemd/
    https://en.wikipedia.org/wiki/Tizen
    http://0pointer.de/blog/projects/systemd.html

    展开全文
  • systemd详解

    万次阅读 2015-08-17 14:43:22
    CentOS 7 使用systemd替换了SysV。Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。 systemd的特性有: 支持并行化任务 ...

    CentOS 7 使用systemd替换了SysV。Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。

    systemd的特性有:

    • 支持并行化任务
    • 同时采用socket式与D-Bus总线式激活服务;
    • 按需启动守护进程(daemon);
    • 利用 Linux 的 cgroups 监视进程;
    • 支持快照和系统恢复;
    • 维护挂载点和自动挂载点;
    • 各服务间基于依赖关系进行精密控制。

    systemd基本工具
    检视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务。详见man 1 systemctl。

    小贴士: 在 systemctl 参数中添加 -H <用户名>@<主机名> 可以实现对其他机器的远程控制。该过程使用ssh链接。

    注意: systemadm 是 systemd 的官方图形前端。

    分析系统状态
    输出激活的单元:

    $ systemctl

    以下命令等效:

    $ systemctl list-units

    输出运行失败的单元:

    $ systemctl --failed

    所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)。查看所有已安装服务:

    $ systemctl list-unit-files

    使用单元
    一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets 、系统设备、交换分区/文件、启动目标(target)、文件系统路径、由 systemd 管理的计时器。详情参阅 man 5 systemd.unit.

    使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service)。但是有些单元可以在systemctl中使用简写方式。

    • 如果无扩展名,systemctl 默认把扩展名当作 .service。例如 netcfg 和 netcfg.service 是等价的。
    • 挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。
    • 设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。

    立即激活单元:

    # systemctl start <单元>

    立即停止单元:

    # systemctl stop <单元>

    重启单元:

    # systemctl restart <单元>

    命令单元重新读取配置:

    # systemctl reload <单元>

    输出单元运行状态:

    $ systemctl status <单元>

    检查单元是否配置为自动启动:

    $ systemctl is-enabled <单元>

    开机自动激活单元:

    # systemctl enable <单元>

    注意: 如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们。如果真的需要手动安装,可以直接连接服务,如下(将foo替换为真实的服务名):

    # ln -s /usr/lib/systemd/system/foo.service /etc/systemd/system/graphical.target.wants/

    取消开机自动激活单元:

    # systemctl disable <单元>

    显示单元的手册页(必须由单元文件提供):

    # systemctl help <单元>

    重新载入 systemd,扫描新的或有变动的单元:

    # systemctl daemon-reload

    电源管理
    安装 polkit 后才可使用电源管理。

    如果你正登录在一个本地的systemd-logind用户会话,且当前没有其它活动的会话,那么以下命令无需root权限即可执行。否则(例如,当前有另一个用户登录在某个tty),systemd 将会自动请求输入root密码。

    重启:

    $ systemctl reboot

    退出系统并停止电源:

    $ systemctl poweroff

    待机:

    $ systemctl suspend

    休眠:

    $ systemctl hibernate

    混合休眠模式(同时休眠到硬盘并待机):

    $ systemctl hybrid-sleep

    原生 systemd 配置文件

    注意: 可能需要手动创建某些文件。所有文件的权限都是644,属主 root,属组 root。

    虚拟控制台
    可以用/etc/vconsole.conf 文件或者localectl 配置虚拟控制台,包括键盘布局和控制台字体。详情请访问 控制台字体 和 键盘布局。

    硬件时钟
    systemd 默认硬件时钟为协调世界时(UTC)。

    小贴士: 推荐使用NTP服务来在线同步硬件时钟。

    硬件时钟设定为地方时
    将硬件时钟配置为地方时(不建议):

    # timedatectl set-local-rtc true

    重新调整为 UTC:

    # timedatectl set-local-rtc false

    如果设置成本地时间,处理夏令时有些麻烦。如果夏令时调整发生在关机时,下次启动时时间会出现问题。最新的内核直接从实时时钟芯片(RTC)读取时间,不使用 hwclock,内核把从 RTC 读取的时间当作 UTC 处理。所以如果硬件时间是地方时,系统启动一开始识别的时间是错误的,之后很快会进行矫正。这可能导致一些问题(尤其是时间倒退时)。

    如果同时安装了 Windows 操作系统(默认使用地方时),那么一般 RTC 会被设置为地方时。Windows 其实也能处理 UTC,需要修改注册表。建议让 Windows 使用 UTC,而非让 Linux 使用地方时。Windows 使用 UTC 后,请记得禁用 Windows 的时间同步功能,以防 Windows 错误设置硬件时间。如上文所说,Linux 可以使用NTP服务来在线同步硬件时钟。

    内核模块
    请访问Kernel modules

    文件系统挂载
    默认行为是:在启动一个需要挂载特定分区的服务之前,系统自动检查并挂载分区。/etc/fstab 中设定的网络文件系统(如 NFS、Samba)无需配置即可正常工作,systemd 将确保网络文件系统在网络链接就绪后挂载。

    详情参阅:man 5 systemd.mount。

    LVM
    如果装有不通过 initramfs 激活的LVM卷,则需启动 lvm-monitoring 服务(由 lvm2 软件包提供):

    # systemctl enable lvm-monitoring

    ACPI 电源管理
    参阅 Power Management

    临时文件
    /usr/lib/tmpfiles.d/ 和 /etc/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何创建、清理、删除临时文件和目录,这些文件和目录通常存放在 /run 和 /tmp 中。配置文件名称为 /etc/tmpfiles.d/<program>.conf。此处的配置能覆盖 /usr/lib/tmpfiles.d/ 目录中的同名配置。

    临时文件通常和服务文件同时提供,以生成守护进程需要的文件和目录。例如 Samba 服务需要目录 /run/samba 存在并设置正确的权限位,就象这样:

    /usr/lib/tmpfiles.d/samba.conf
    D /run/samba 0755 root root

    此外,临时文件还可以用来在开机时向特定文件写入某些内容。比如,要禁止系统从USB设备唤醒,利用旧的 /etc/rc.local 可以用 echo USBE > /proc/acpi/wakeup,而现在可以这么做:

    /etc/tmpfiles.d/disable-usb-wake.conf
    w /proc/acpi/wakeup - - - - USBE

    详情参见 man 5 tmpfiles.d。

    注意: 该方法不能向 /sys 中的配置文件添加参数,因为 systemd-tmpfiles-setup 有可能在相关模块加载前运行。这种情况下,需要首先通过 modinfo <模块名> 确认需要的参数,并在 /etc/modprobe.d 下的一个文件中设置改参数。另外,还可以使用 udev 规则,在设备就绪时设置相应属性。

    自己编写 .service 文件
    systemd 的单元文件是受 XDG Desktop Entry .desktop 文件启发而产生,而最初起源是 Windows 下的 .ini 文件。

    处理依赖关系
    使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。

    依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。

    启动方式
    编写自定义的service文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。具体的参数说明请参阅 man systemd.service 。

    • Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
    • Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
    • Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
    • Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
    • Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

    修改现存单元文件
    要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:

    /etc/systemd/system/<unit>.d/customdependency.conf
    
    [Unit]
    Requires=<新依赖>
    After=<新依赖>

    然后运行以下命令使更改生效:

    # systemctl daemon-reload
    # systemctl restart <单元>

    此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable <unit>,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。

    小贴士: 可以用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被修改。

    单元配置文件的 vim 语法高亮支持
    可从官方仓库安装 vim-systemd 软件包,使 unit 配置文件在 Vim 下支持语法高亮。

    目标(target)
    启动级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和启动级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 启动级别的目标,仍可以使用旧的 telinit 启动级别 命令切换。
    获取当前目标

    不要使用 runlevel 命令了:

    $ systemctl list-units --type=target

    创建新目标
    在 Fedora 中,启动级别 0、1、3、5、6 都被赋予特定用途,并且都对应一个 systemd 的目标。然而,没有什么很好的移植用户定义的启动级别(2、4)的方法。要实现类似功能,可以以原有的启动级别为基础,创建一个新的目标 /etc/systemd/system/<新目标>(可以参考 /usr/lib/systemd/system/graphical.target),创建 /etc/systemd/system/<新目标>.wants 目录,向其中加入额外服务的链接(指向 /usr/lib/systemd/system/ 中的单元文件)。

    目标表

    SysV 启动级别 Systemd 目标 注释
    0 runlevel0.target, poweroff.target 中断系统(halt)
    1, s, single runlevel1.target, rescue.target 单用户模式
    2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户自定义启动级别,通常识别为级别3。
    3 runlevel3.target, multi-user.target 多用户,无图形界面。用户可以通过终端或网络登录。
    5 runlevel5.target, graphical.target 多用户,图形界面。继承级别3的服务,并启动图形界面服务。
    6 runlevel6.target, reboot.target 重启
    emergency emergency.target 急救模式(Emergency shell)

    切换启动级别/目标
    systemd 中,启动级别通过“目标单元”访问。通过如下命令切换:

    # systemctl isolate graphical.target

    该命令对下次启动无影响。等价于telinit 3 或 telinit 5。

    修改默认启动级别/目标
    开机启动进的目标是 default.target,默认链接到 graphical.target (大致相当于原来的启动级别5)。可以通过内核参数更改默认启动级别:

    小贴士: 可以省略扩展名 .target。

    •  systemd.unit=multi-user.target (大致相当于级别3)
    •  systemd.unit=rescue.target (大致相当于级别1)

    另一个方法是修改 default.target。可以通过 systemctl 修改它:

    # systemctl enable multi-user.target

    命令执行情况由 systemctl 显示:链接 /etc/systemd/system/default.target 被创建,指向新的默认启动级别。该方法当且仅当目标配置文件中有以下内容时有效:

    [Install]
    Alias=default.target

    目前,multi-user.target、graphical.target 都包含这段内容。

    日志
    systemd提供了自己日志系统(logging system),称为 journal. 使用 systemd 日志,无需额外安装日志服务(syslog)。读取日志的命令:

    # journalctl

    默认情况下(当 Storage= 在文件 /etc/systemd/journald.conf 中被设置为 auto),日志记录将被写入 /var/log/journal/。该目录是 systemd 软件包的一部分。若被删除,systemd 不会自动创建它,直到下次升级软件包时重建该目录。如果该目录缺失,systemd 会将日志记录写入 /run/systemd/journal。这意味着,系统重启后日志将丢失。

    过滤输出
    journalctl可以根据特定字段过滤输出,例如:

    显示本次启动后的所有日志:

    # journalctl -b

    不过,一般大家更关心的不是本次启动后的日志,而是上次启动时的(例如,刚刚系统崩溃了)。目前还没有这项功能,正在 systemd-devel@lists.freedesktop.org 讨论中。

    目前的折中方案是:

    # journalctl --since=today | tac | sed -n '/-- Reboot --/{n;:r;/-- Reboot --/q;p;n;b r}' | tac

    以上命令输出本日内的所有启动信息。但要注意,如果日志很多,该命令执行时间会比较漫长。

    动态跟踪最新信息:

    # journalctl -f

    显示特定程序的所有消息:

     # journalctl /usr/lib/systemd/systemd

    显示特定进程的所有消息:

    # journalctl _PID=1

    显示指定单元的所有消息:

    # journalctl -u netcfg

    详情参阅man journalctl、man systemd.journal-fields

    日志大小限制
    如果按上面的操作保留日志的话,默认日志最大限制为所在文件系统容量的 10%,即:如果 /var/log/journal 储存在 50GiB 的根分区中,那么日志最多存储 5GiB 数据。可以修改 /etc/systemd/journald.conf 中的 SystemMaxUse 来指定该最大限制。如限制日志最大 50MiB:

    SystemMaxUse=50M

    详情参见 man journald.conf.

    配合syslog使用
    systemd提供了 socket /run/systemd/journal/syslog,以兼容传统日志服务。所有系统信息都会被传入。要使传统日志服务工作,需要让服务链接该 socket,而非 /dev/log(官方说明)。Arch 软件仓库中的 syslog-ng 已经包含了需要的配置。

    设置开机启动 syslog-ng:

     # systemctl enable syslog-ng

    疑难解答
    关机/重启十分缓慢
    如果关机特别慢(甚至跟死机了一样),很可能是某个拒不退出的服务在作怪。systemd 会等待一段时间,然后再尝试杀死它。请阅读这篇文章,确认你是否是该问题受害者。

    短时进程无日志记录
    若 journalctl -u foounit.service 没有显示某个短时进程的任何输出,那么改用 PID 试试。例如,若 systemd-modules-load.service 执行失败,那么先用 systemctl status systemd-modules-load 查询其 PID(比如是123),然后检索该 PID 相关的日志 journalctl -b _PID=123。运行时进程的日志元数据(诸如 _SYSTEMD_UNIT 和 _COMM)被乱序收集在 /proc 目录。要修复该问题,必须修改内核,使其通过套接字连接来提供上述数据,该过程类似于 SCM_CREDENTIALS。

    诊断启动问题
    使用如下内核参数引导: systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M

    禁止在程序崩溃时转储内存
    要使用老的内核转储,创建下面文件:

    /etc/sysctl.d/49-coredump.conf
    
    kernel.core_pattern = core
    kernel.core_uses_pid = 0

    然后运行:

    # /usr/lib/systemd/systemd-sysctl

    同样可能需要执行“unlimit”设置文件大小:

    $ ulimit -c unlimited

    关于版权

    Linux运维笔记》的博文均基于创作共享的知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议发布。转载本站博文时请务必以超链接形式标明源文出处,否则谢绝一切转载!

    转载请保留固定链接: https://blog.linuxeye.com/400.html

    展开全文
  • 浅析 Linux 初始化 init 系统 systemd

    千次阅读 2017-12-07 06:59:19
    Systemd 的简介和特点 Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd 和 ubuntu 的 upstart 是竞争对手,预计会取代 UpStart,...
  • Systemd

    2019-08-19 22:07:51
    转自:...systemd 是 Linux 下一个与 SysV 和 LSB 初始化脚本兼容的系统和服务管理器。systemd 使用 socket 和 D-Bus...
  • systemd

    千次阅读 2018-06-19 10:03:16
    System V init:传统的顺序initsystemd:新出现的initUpstart:ubuntu上的initsystemd是面向目标的。你定义一个你要实现的目标以及它的依赖条件,systemd负责满足所有依赖条件以及执行目标。systemd还可以将该目标...
  • systemd 的组成和使用

    2019-05-07 01:30:02
    systemd 是linux的系统与服务管理器 主要组成 资源限制 当作为系统实例运行时 system.conf 配置文件 system.conf.d 配置目录 当作为用户实例运行时 user.conf 配置文件 user.conf.d 配置目录 环境限制 ...
  • systemd 官方手册地址

    2020-05-08 10:23:56
    https://www.freedesktop.org/software/systemd/man/
  • 在centos7.1上安装systemd

    万次阅读 2015-11-22 20:59:31
    1.检查本地systemd的版本  [admin@localhost ~]$ systemctl --version  systemd 208  +PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ 2.获取安装文件  wget http://www.free
  • systemd详解 (一)

    千次阅读 2016-10-14 11:11:49
    CentOS 6和之前版本采用SysVinit的系统启动进程管理体系,一般用户都可通过在/etc/inittab文件的配置,...CentOS 7开始使用SystemD,所以我们必须要了解SystemD.详细介绍请参阅: RedHat 产品文档 使用systemd管理服务:
  • systemd服务详解

    2020-08-26 11:29:55
    systemd服务详解 简介 在centos5中生成和管理用户空间中的进程以及完成系统的初始化使用的是init,并且是依次启动。在centos6中则是使用的upstart,在一定程度上实现了并行启动,但是仍然存在依赖关系,到了centos7中...
  • systemd服务内容详解

    2019-01-09 09:21:10
    systemd服务内容详解 systemd是Linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化...
  • 制作systemd服务

    2020-01-20 00:02:06
    Centos7开始,系统服务管理方式发生了很大变化。服务由systemd管理。下面具体介绍下服务的制作过程.本网由编制整理加工而成。...第一步分: 制作systemd服务 下面以nginx服务测试为例说明: 1.创建/usr...
  • Systemd 服务管理

    2019-10-06 15:22:09
    Systemd 服务管理 发表于2017-02-13|分类于Linux Systemd 概述 Systemd 简介 Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、...
  • Systemd 服务配置文件

    2019-12-20 23:22:26
    目录 一、开机启动 二、启动服务 三、停止服务 四、读懂配置文件 五、 [Unit] 区块:启动顺序与依赖关系。 六、[Service] 区块:启动行为 ...对于那些支持 Systemd 的软件,安装的时候,会自动在...
  • Systemd 服务管理教程

    2020-06-28 15:55:48
    Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责,并支持通过特定事件(如插入特定 USB 设备)和特定...
  • Systemd服务管理

    2015-01-05 19:34:46
    systemdsystemd官网)是Linux下的一种init软件, 较好地管理多个系统服务之间的并行启动和依赖,同时达到降低系统开销的效果,最终代替现在常用的System V与BSD风格init程序。新发行的RHEL 7也用systemd来取代了...
  • redis自启动服务systemd启动,放在/lib/systemd/system下,然后systemctl daemon-reload,然后systemctl enable redis.service,设置为开机自启动
  • 一般情况下,常规用途的Linux发行版在开机启动时拉起各种相关服务进程,包括许多你可能无需使用的服务,例如蓝牙bluetooth、Avahi、 调制解调管理器ModemManager、ppp-dns(LCTT 译注:此处作者笔误 ppp-dns 应该为 ...

空空如也

1 2 3 4 5 ... 20
收藏数 89,926
精华内容 35,970
关键字:

systemd