我有一台有很多磁盘的机器,还有一个 HBA 模式下的额外 SAS 控制器。这似乎导致 Linux 在磁盘实际出现之前在 initramfs 中思考至少 8-10 秒。磁盘检测超时时间为 10 秒。这会导致 BTRFS/MDADM/etc 无法挂载我系统中的 RAID1,将我置于紧急 shell 中,从那里我可以实际挂载磁盘并继续正常工作。
我的问题是,如何从 10 秒增加启动时的超时时间?它在systemd中吗?是在udev吗?别的地方?我不确定从哪里开始寻找,谷歌搜索这个问题似乎主要是让人们希望提高 I/O 超时或其他一些(scsi/lun/etc)超时,但我不是在寻找那个。
我有一个相当简单的单元文件,用于我在 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) 我有一个 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) 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,networkd我需要在一个 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 请求方服务而不全局禁用它?
我开始使用 Amazon Linux AMI。它似乎有/etc/systemd/system/文件夹,但我无法使用systemctl来启动停止我添加到/etc/systemd/system/文件夹中的服务。
$ systemctl
bash: systemctl: command not found
Run Code Online (Sandbox Code Playgroud) 我想以机器可读的形式获取服务状态详细信息(已加载、已启用、活动、正在运行、因为、主 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 中获取服务状态?
是否可以创建一个依赖于其他几个服务的服务?什么是正确的语法?
如:
[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吗?
我正在处理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线左右开始相关的东西,希望有人遇到这个问题并成功解决!
我将在下面附上最小化的测试用例。但是,它是一个简单的 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=host到docker 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)