标签: systemd

使用 Linux/Systemd 增加启动时的磁盘检测超时

我有一台有很多磁盘的机器,还有一个 HBA 模式下的额外 SAS 控制器。这似乎导致 Linux 在磁盘实际出现之前在 initramfs 中思考至少 8-10 秒。磁盘检测超时时间为 10 秒。这会导致 BTRFS/MDADM/etc 无法挂载我系统中的 RAID1,将我置于紧急 shell 中,从那里我可以实际挂载磁盘并继续正常工作。

我的问题是,如何从 10 秒增加启动时的超时时间?它在systemd中吗?是在udev吗?别的地方?我不确定从哪里开始寻找,谷歌搜索这个问题似乎主要是让人们希望提高 I/O 超时或其他一些(scsi/lun/etc)超时,但我不是在寻找那个。

linux timeout boot btrfs systemd

11
推荐指数
1
解决办法
2038
查看次数

这个变量转义如何在 systemd 单元文件中工作?

我有一个相当简单的单元文件,用于我在 CoreOS 上运行的服务器实例的发现助手服务。单元文件如下所示:

[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service

[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
    while true; do \
        export PORT=$(docker port frontend%i 80 | sed s/.*://); \
        etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
        sleep 45; \
    done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i

[X-Fleet]
MachineOf=frontend@%i.service
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我花了很长时间才到达这个阶段,因为如果我将etcdctl行更改为:

etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Run Code Online (Sandbox Code Playgroud)

然后它不起作用 - 它最终设置了一个100.45.218.3:没有端口的值。一路上,我花了很多时间玩弄$PORT变量的不同用途,但我不知道为什么我选择的配置有效。有一次我在脚本中有这个:

echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \ …
Run Code Online (Sandbox Code Playgroud)

bash systemd coreos

10
推荐指数
1
解决办法
5010
查看次数

在 ubuntu 15.04 上使用 systemd 启动 docker-compose

我有一个 docker-compose 项目,我想通过 systemd 进行控制。在暴发户中,我会使用如下所示的脚本:

description "Start/Stop server"
author "Jim Cortez"

start on filesystem and started docker
stop on runlevel [!2345]

respawn limit 3 240

pre-start script
    # wait (if necessary) for our docker context to be accessible
    while [ ! -f /projects/my_server/docker-compose.yml ]
    do
      sleep 1
    done
    /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
end script

script
    sleepWhileAppIsUp(){
        while docker ps | grep "$1" >/dev/null; do
            sleep 2
        done
    }

    sleepWhileAppIsUp "my_server"
end script

# stop docker container after the stop …
Run Code Online (Sandbox Code Playgroud)

systemd docker ubuntu-15.04

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

systemd:如何获取运行目标

  • 命令systemctl get-default返回user-defined.target
  • 然后我systemctl isolate multi-user.target用来切换到multi-user.target.
  • 我可以看到一堆不应该运行user-defined.taret而应该运行的服务multi-user正在运行,这意味着我在multi-user.target.
  • 但是,systemctl get-default总是返回user-defined.target

问题是,如果不查看和整理服务,我怎么知道我multi-user.target在使用后正在运行isolate

linux systemd centos7

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

systemd:如何有选择地禁用特定 WLAN 接口的 wpa_supplicant?

在 Linux 系统上systemdnetworkd我需要在一个 WLAN 接口上运行 WLAN 接入点,同时在正常站(“客户端”)模式下运行更多(热插拔)WLAN 接口。

事实证明,wpa_supplicant.service在我所有的 WLAN 接口上都可以使用,如果所有这些 WLAN 接口都可以在工作站/客户端模式下运行,那就没问题了。但是,虽然wpa_supplicant.service提供 WLAN 接口,但不可能(不再?)hostapd.service在 AP 接入点模式下运行该 WLAN 接口。

所以我只想禁用wpa_supplicant.service特定接口,比如wls35u2. 我的想法是有一个wpa_supplicant@wls35u2.service我可以有选择地禁用但保持wpa_supplicant.service启用状态的单元。但是,这似乎不起作用,或者我在wpa_supplicant@wls35u2.service.

那么,如何仅在特定接口上禁用 WPA 请求方服务而不全局禁用它?

debian linux-networking systemd

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

如何在 Amazon Linux AMI 上启用 systemd

我开始使用 Amazon Linux AMI。它似乎有/etc/systemd/system/文件夹,但我无法使用systemctl来启动停止我添加到/etc/systemd/system/文件夹中的服务。

$ systemctl
bash: systemctl: command not found
Run Code Online (Sandbox Code Playgroud)

amazon-web-services systemd amazon-linux systemctl

10
推荐指数
3
解决办法
5万
查看次数

如何以json格式获取systemd状态?

我想以机器可读的形式获取服务状态详细信息(已加载、已启用、活动、正在运行、因为、主 PID),并且我知道 systemd 工具有--output=json选项,但如果我这样做:

 systemctl status servicename --output=json --plain
Run Code Online (Sandbox Code Playgroud)

我看到类似的东西:

? snapd.service - Snappy daemon
   Loaded: loaded (/lib/systemd/system/snapd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-04-16 11:20:07 MSK; 4h 45min ago
 Main PID: 738 (snapd)
    Tasks: 10 (limit: 4915)
   CGroup: /system.slice/snapd.service
           ??738 /usr/lib/snapd/snapd

{ "__CURSOR" : "s=461ecb6a4b814913acd57572cd1e1c82;...
Run Code Online (Sandbox Code Playgroud)

日志记录采用 JSON 格式。但是如果可能的话,如何在 JSON 中获取服务状态?

json systemd

10
推荐指数
2
解决办法
9044
查看次数

具有多个 After 的 systemd 服务

是否可以创建一个依赖于其他几个服务的服务?什么是正确的语法?

如:

[Unit]
Description=service description
Wants=network.target
After=network.target
After=syslog.target

[Service]
User=bootapp
ExecStart=/var/app/app.jar
SuccessExitStatus=143

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

目标是在操作系统重新启动后自动启动服务,并确保在服务之前启动日志记录和网络服务。

附加问题:我需要指定Restart吗?

linux service systemd

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

服务器无法在启动时绑定到地址

我正在处理RHEL 7 中的一个已知 问题,即指定要绑定到的地址的服务将无法正确启动。我发现了许多类似的报告,许多人说它们已通过更新 systemd 得到解决,但我仍然面临这个问题。这会影响我的机器上的所有服务(sshd、sshd、vsftpd、nginx),而不仅仅是绑定到 0.0.0.0。

我找到了各种假设的解决方法,但没有一个对我始终有效。以sshd为例,配置如下:

Port 22
ListenAddress 192.168.242.225
...
Run Code Online (Sandbox Code Playgroud)

这是我单独和组合尝试过的:

来自https://bugzilla.redhat.com/show_bug.cgi?id=1352214#c4(我也尝试sys-subsystem-net-devices-eth1.device过代替,network-online.target但我怀疑这不会等待寻址发生。)

mkdir /etc/systemd/system/sshd.service.d
tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
After=network-online.target
EOF
Run Code Online (Sandbox Code Playgroud)

来自https://bugzilla.redhat.com/show_bug.cgi?id=1352214#c11

mkdir /etc/systemd/system/sshd.service.d
tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
Wants=network-online.target
After=network-online.target
EOF
Run Code Online (Sandbox Code Playgroud)

来自https://bugzilla.redhat.com/show_bug.cgi?id=1438749#c0

systemctl add-wants multi-user.target network.target
Run Code Online (Sandbox Code Playgroud)

从某处

mkdir /etc/systemd/system/sshd.service.requires
ln -s /usr/lib/systemd/system/network-online.target /etc/systemd/system/sshd.service.requires/
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,我通常都会得到“错误:绑定到 192.168.242.125 上的端口 22 失败:无法分配请求的地址”。有时,一切都完美启动,我猜这归结为时间问题。

运行 Scientific Linux (RHEL) 7.5 并启用网络管理器,所有 IP 地址都是静态的。如果有任何其他细节可能有帮助,请告诉我。journalctl启动失败后的输出,在After=network-online.targetsshd 单元文件中。1700线左右开始相关的东西,希望有人遇到这个问题并成功解决!

systemd rhel7

10
推荐指数
2
解决办法
1553
查看次数

使用 cgroupv2 (--cgroupns=private) 时,Systemd 无法在 docker 容器中运行

我将在下面附上最小化的测试用例。但是,它是一个简单的 Dockerfile,具有以下几行:

VOLUME ["/sys/fs/cgroup"]
CMD ["/lib/systemd/systemd"]
Run Code Online (Sandbox Code Playgroud)

它是基于 Debian:buster-slim 的映像,并在容器内运行 systemd。实际上,我曾经像这样运行容器:

$ docker run  --name any --tmpfs /run \
    --tmpfs /run/lock --tmpfs /tmp \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro -it image_name
Run Code Online (Sandbox Code Playgroud)

在我升级一堆主机 Linux 软件包之前,它曾经运行良好。主机内核/systemd 现在似乎默认 cgroup v2。之前是cgroup。它停止工作。但是,如果我提供内核选项以便主机使用 cgroup,则它会再次运行。

在不提供内核选项的情况下,修复是添加--cgroupns=hostdocker run除了/sys/fs/cgroup以读写方式安装(:rw代替:ro)之外。

我想避免强迫用户提供内核选项。尽管我远非专家,但强制为 docker 容器使用主机命名空间对我来说并不合适。

我试图理解为什么会发生这种情况,并弄清楚应该做什么。我的目标是在 docker 中运行 systemd,其中主机遵循 cgroup v2。

这是我看到的错误:

$ docker run --name any --tmpfs /run --tmpfs /run/lock --tmpfs /tmp \
    -v /sys/fs/cgroup:/sys/fs/cgroup:rw -it image_name
systemd 241 running in system mode. (+PAM +AUDIT …
Run Code Online (Sandbox Code Playgroud)

cgroup systemd docker

10
推荐指数
2
解决办法
2331
查看次数