标签: systemd

/var/run 目录创建即使服务被禁用

通常,用于存储 pid 或类似内容的目录是由服务的启动脚本创建的。(见这个问题

但是,我只是注意到当我禁用这些服务时,这些目录在重新启动后仍会重新创建。我尝试过的所有服务都发生了这种情况。

root@sonorus:~# systemctl status openvpn
? openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; disabled)
   Active: inactive (dead)
root@sonorus:~# systemctl status ejabberd
? ejabberd.service - A distributed, fault-tolerant Jabber/XMPP server
   Loaded: loaded (/lib/systemd/system/ejabberd.service; disabled)
   Active: inactive (dead)
     Docs: https://www.process-one.net/en/ejabberd/docs/
Run Code Online (Sandbox Code Playgroud)

哪个服务实际上在创建这些目录?

linux systemd debian-jessie

6
推荐指数
1
解决办法
1457
查看次数

initramfs systemd 服务的内省 - 如何?

背景

  • 我正在运行 ArchLinux,使用 systemd 二进制文件启动必要的服务作为 initramfs 的一部分(root fs 解密、挂载等)。
  • 我想检查一下作为这个阶段的一部分启动了哪些 systemd 单元,以及何时启动。
  • systemd-analyze plot 只显示切换根发生后所有单元的时间图。
  • 交换机根单元(定义为 initrd 引导序列中的最后一个单元)状态:

    [Service]
    # ...
    ExecStart=/usr/bin/systemctl --no-block --force switch-root /sysroot
    # ...
    
    Run Code Online (Sandbox Code Playgroud)
  • switch-root 系统命令上的 systemctl 手册页有这样的说法:

    switch-root ROOT [初始化]

    切换到不同的根目录并在其下执行一个新的系统管理器进程。这旨在用于初始 RAM 磁盘(“initrd”),并将从 initrd 的系统管理器进程(又名“init”进程)过渡到从实际主机卷加载的主系统管理器进程。此调用需要两个参数:将成为新根目录的目录,以及在其下作为 PID 1 执行的新系统管理器二进制文件的路径。如果省略后者或空字符串,将自动搜索 systemd 二进制文件用于并用作初始化。如果省略系统管理器路径,等于空字符串或与 systemd 二进制文件的路径相同,则 initrd 的系统管理器进程的状态将传递给主系统管理器,这允许稍后对所涉及服务的状态进行自省在 initrd 启动阶段。

    然后在 initrds 问题上保持沉默......

启动后,我如何内省 initrd 启动阶段所涉及的服务状态,如上面推断的那样,或者发现什至运行了哪些单元(因为有些是动态生成的)?

linux boot arch-linux initramfs systemd

6
推荐指数
1
解决办法
1109
查看次数

为什么升级后 MariaDB 无法启动 (NO_NEW_PRIVILEGES)

在 DigitalOcean 上升级我的 debian(测试,jessie 到拉伸)服务器后,MariaDB 不会以服务 mariadb start 启动

我试图清除所有 mariadb-* 和 mysql-* 包,删除配置和数据,然后重新安装它们,但 mariadb-server-10.1.21-5 拒绝配置:

Setting up mariadb-server-10.1 (10.1.21-5) ...
Job for mariadb.service failed because the control process exited with error code.
See "systemctl status mariadb.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
? mariadb.service - MariaDB database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2017-02-09 21:25:27 CET; 10ms ago
  Process: 1696 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION …
Run Code Online (Sandbox Code Playgroud)

debian configuration selinux mariadb systemd

6
推荐指数
2
解决办法
1万
查看次数

在 CentOS 7 上禁用 polkit.service 的正确方法

为什么?

我的服务是通过适当的单元文件或初始化脚本启动的。我不需要普通用户在我的服务器上做任何超出su. 我特别在寻找一种方法来完全关闭 polkit,而不会在其他服务重新启动时自行启动。

我预见到在我们的 PCI 环境中向审计员解释这一点时也会出现问题。我们必须描述每项服务的目的。我们在 PCI 环境中没有 polkit 的合法用例。

附加说明:我没有安装 polkit。这些服务器的安装非常小,大约 670MB / 这是一个 systemd 更新,似乎已经安装了 polkit 并且该规范显然依赖于所有 systemd 托管服务。安装后,我必须重建机器才能将其删除,就像nss安装后尝试删除一样。我担心的是,如果我强制 unstall,它可能会留下一些文件,这些文件会导致 systemd 假设它在那里。

我尝试过的:

创建/etc/polkit-1/rules.d/99-deny-all.rules

polkit.addRule(function(action, subject) {
    return polkit.Result.YES;
});
Run Code Online (Sandbox Code Playgroud)

然后

systemctl daemon-reload && systemctl daemon-reexec
Run Code Online (Sandbox Code Playgroud)

这什么都不做,/usr/lib/polkit-1/polkitd --no-debug当 systemd 下的其他服务重新启动时继续启动。

[更新] 正如亚历山大所提到的,重新启动 polkit 会将设置应用于 polkit 本身,这很好,但我正在寻找一种方法来告诉 polkit 不启动并且不会破坏其他服务。

[更新 2] 这实际上可能会阻止某些服务正确重新启动。


屏蔽或禁用服务:

这会导致其他服务在启动和关闭时挂起,等待 polkit。


编辑/usr/share/dbus-1/sstem-services/org.freedesktop.PolicyKit1.service

[snip]
Exec=/bin/false
[snip]
Run Code Online (Sandbox Code Playgroud)

然后

systemctl daemon-reload && systemctl daemon-reexec
Run Code Online (Sandbox Code Playgroud)

这什么都不做,/usr/lib/polkit-1/polkitd …

centos systemd

6
推荐指数
1
解决办法
3万
查看次数

无法以非 root 用户身份远程重启 systemctl 服务

我有一个systemd.socket名为gunicorn.socket,我想在远程服务器上更新一些代码后重新启动。

我已按照允许非 root 用户重新启动服务中详述的步骤操作systemctl不断询问我的用户密码。这是我尝试systemctl restart gunicorn.socket与 user一起运行时所做的john

# added an appadmin group to allow the restart command to john
addgroup appadmin
usermod -a -G appadmin john
visudo
Run Code Online (Sandbox Code Playgroud)

sudoers

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start gunicorn.socket, /bin/systemctl stop gunicorn.socket, /bin/systemctl restart gunicorn.socket
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
Run Code Online (Sandbox Code Playgroud)

然后sudo systemctl restart gunicorn.socket在服务器上工作正常,但是当我远程尝试时,我得到:

ssh example.com "sudo systemctl restart gunicorn.socket"
Failed to restart gunicorn.socket: Interactive authentication required.
See …
Run Code Online (Sandbox Code Playgroud)

sudo socket gunicorn systemd systemctl

6
推荐指数
1
解决办法
2万
查看次数

systemd:服务依赖“如果 A 没有运行,B 不应该运行”?

(systemd 版本 229,fwiw)

我有一个主要服务 A 和一个辅助服务 B。主要 A 可以自己运行。但是服务 B 本身无法正确运行:它需要 A 运行(技术上 B 可以运行,但这是我希望 systemd 阻止的)。我的目标:如果 A 没有运行,B 就不应该运行。鉴于 A 和 B 正在运行,当 A 停止或死亡/崩溃时,B 应该停止。

我如何实现这一目标?

我通过将 [Unit] 项目添加到 b.service 来接近,使用

Requisite=A.service
After=A.service
Run Code Online (Sandbox Code Playgroud)

上面的结果是

1) B won't start unless A is running (good).
2) B is stopped when A is stopped (good).
3) However, if I kill A, service B continues to run (bad).
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个最后的行为 #3?我尝试使用 BindsTo 而不是 Requisite,就像在 B 的服务文件中这样:

BindsTo=A.service
After=A.service
Run Code Online (Sandbox Code Playgroud)

我得到:

1) If …
Run Code Online (Sandbox Code Playgroud)

linux systemd

6
推荐指数
1
解决办法
1646
查看次数

“systemd”文件中的变量?

我有这个 systemd 文件:

  [Unit]
  Description=something website
  After=syslog.target
  Requires=postgresql.service

  [Service]
  ExecStart=/home/my_user/my_webapp/bin/ foreground
  ExecStop=/home/my_user/my_webapp/bin/ stop
  Restart=on-abort
  WorkingDirectory=/home/my_user/my_webapp/bin
  SyslogIdentifier=my_webapp_web_app
  User=my_user

  [Install]
  WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

如您所见,“my_webapp”和“my_user”重复了很多次。有没有办法将它们存储到变量中并使用变量代替?

linux systemd

6
推荐指数
1
解决办法
1923
查看次数

为什么MongoDB不会自动重启?

如果 MongoDB 3.6 崩溃,它似乎不会自动配置为重新启动。查看与 Ubuntu 16.04LTS 的最新 .deb 包捆绑在一起的 systemd 服务,它似乎没有配置重启:

$ sudo systemctl cat mongod
# /lib/systemd/system/mongod.service
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
PIDFile=/var/run/mongodb/mongod.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

发送 SIGKILL 和 SIGSEGV 都会终止进程并且不会重新启动。我不确定这些是否被 …

ubuntu mongodb systemd

6
推荐指数
1
解决办法
3459
查看次数

systemd 的网络绑定功能

我正在部署Goldfish,它是Vault 的一个接口,在专用于机密管理的服务器上进行生产。因此,安全是这里的首要问题。

我正在尝试在 Unbuntu 16.04 系统上使用 systemd 部署服务,为其提供尽可能少的权限。我希望它以非 root 用户身份运行goldfish并侦听端口 443。我尝试了多种选择。


解决方法1:使用systemd插座,在多个帖子建议我发现如这一个(金鱼后端写在去,因为在后)。这似乎是最精确和最安全的,因为它完全由 systemd 管理并为单个服务打开一个端口。我的单元文件如下所示:

  • /etc/systemd/system/goldfish.socket

    [Unit]
    Description=a Vault interface
    
    [Socket]
    ListenStream=443
    NoDelay=true  # Tried with false as well
    
    Run Code Online (Sandbox Code Playgroud)
  • /etc/systemd/system/goldfish.service

    [Unit]
    Description=a Vault interface
    After=vault.service
    Requires=goldfish.socket
    ConditionFileNotEmpty=/etc/goldfish.hcl
    
    [Service]
    User=goldfish
    Group=goldfish
    ExecStart=/usr/local/bin/goldfish -config=/etc/goldfish.hcl
    NonBlocking=true  # Tried with false as well
    
    [Install]
    WantedBy=multi-user.target
    
    Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到一个“listen tcp 0.0.0.0:443: bind: permission denied”。所以看起来它仍然没有得到想要的权限,这似乎违背了为服务创建套接字的目的。我在这里缺少什么?


解决方案 2:为服务提供 CAP_NET_BIND_SERVICE 能力。这次我没有使用 systemd 套接字,而是使用AmbientCapabilities服务中的设置(也尝试使用CpabilityBoudingSetCapabilities,后者令人惊讶地未在 …

networking security systemd vault

6
推荐指数
1
解决办法
8808
查看次数

iptables-restore 有时会在重启时失败

今天和昨天,我的服务器自动重启,在启动过程中无法启动网络设备。如果我再次重新启动机器,它就会正常启动,在过去的 2 个月里我也没有遇到任何问题。

我能找到的与此相关的唯一错误日志是:

Aug 23 06:37:14 server systemd[1]: Started ifup for ens16.
Aug 23 06:37:14 server systemd[1]: ifup@ens16.service: Main process exited, code=exited, status=1/FAILURE
Run Code Online (Sandbox Code Playgroud)

Aug 23 06:37:14 server sh[281]: iptables-restore: line 10 failed
Aug 23 06:37:14 server systemd[1]: ifup@ens16.service: Main process exited, code=exited, status=1/FAILURE
Aug 23 06:37:14 server sh[281]: run-parts: /etc/network/if-pre-up.d/iptables exited with return code 1
Aug 23 06:37:14 server sh[281]: ifup: failed to bring up ens16
Run Code Online (Sandbox Code Playgroud)

/etc/network/if-pre-up.d/iptables 包含:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
Run Code Online (Sandbox Code Playgroud)

/etc/iptables.up.rules 包含:

*filter
:INPUT ACCEPT [0:0] …
Run Code Online (Sandbox Code Playgroud)

linux iptables systemd

6
推荐指数
1
解决办法
2735
查看次数