我们有一个带有多个 IP 地址的服务器。最近我们迁移到 systemd,我们仍然需要该服务器上的多个 IP。使用 systemd-networkd 我们很难找到配置示例。所以我们在启动过程结束时使用 bash 脚本将 ip 添加到接口。
有人可以提供一个 systemd-networkd 配置示例,用于将多个 IP 添加到一个接口。
我想在 Fedora 22 上将 systemd-networkd(版本 219)管理的网络接口从系统分配的名称重命名enp2s0为wan. 为此,我创建了以下文件/etc/systemd/network/80-wan.link:
[Match]
MACAddress=mac-address
[Link]
Name=wan
Run Code Online (Sandbox Code Playgroud)
但是,这对系统没有影响。重启后名字还是enp2s0。我看到udevadmudev 拿起文件进行配置,但忽略了提供的名称:
~> udevadm info /sys/class/net/enp2s0
P: /devices/pci0000:00/0000:00:1c.1/0000:02:00.0/net/enp2s0
E: DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:02:00.0/net/enp2s0
E: ID_BUS=pci
E: ID_MM_CANDIDATE=1
E: ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
E: ID_MODEL_ID=0x8168
E: ID_NET_DRIVER=r8169
E: ID_NET_LINK_FILE=/etc/systemd/network/80-wan.link
E: ID_NET_NAME_MAC=enxMacAddress
E: ID_NET_NAME_PATH=enp2s0
E: ID_OUI_FROM_DATABASE=Shuttle Inc.
E: ID_PATH=pci-0000:02:00.0
E: ID_PATH_TAG=pci-0000_02_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd.
E: ID_VENDOR_ID=0x10ec
E: IFINDEX=2
E: INTERFACE=enp2s0
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp2s0 …Run Code Online (Sandbox Code Playgroud) 我有一个新的 systemd 服务,它无法以“权限被拒绝”错误启动。我买了一台 Thinkpad L480。不幸的是,内核似乎存在未检测到触摸板的问题。这是解决here可以解决
sudo sh -c 'echo -n "elantech" > /sys/bus/serio/devices/serio1/protocol'
Run Code Online (Sandbox Code Playgroud)
因为我不想在每次启动时都这样做,所以我做了一个 systemd 服务,但它没有按预期工作。
我的 touchpad_enabler.service 是
[Unit]
Description=FooBar
[Service]
Type=oneshot
ExecStart=/usr/local/bin/enable_touchpad.sh
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
脚本文件很简单
#!/bin/bash
echo -n "elantech" > /sys/bus/serio/devices/serio1/protocol
Run Code Online (Sandbox Code Playgroud)
但我也用sh -c版本试过了。我通过调整权限
sudo chmod 744 /usr/local/bin/enable_touchpad.sh
sudo chmod 644 /etc/systemd/system/touchpad_enabler.service
Run Code Online (Sandbox Code Playgroud)
所以这两个文件都归root所有。然后我通过
systemctl enable enable_touchpad.sh
Run Code Online (Sandbox Code Playgroud)
当我通过 手动启动服务时systemctl start touchpad_enabler.service,它完全正常工作,触摸板也能正常工作。但是,在启动时,服务失败并在 中被列为“失败” systemctl list-units。
的输出journalctl -b -u touchpad_enabler.service是:
systemd[1]: Starting Solves bug that Thinkpad L480 Touchpad is not correctly detected...
enable_touchpad.sh[516]: …Run Code Online (Sandbox Code Playgroud) 目前,我使用以下配置来确保我的显示管理器等待 DRM 驱动程序加载后启动(否则 X.org 无法启动):
udev规则:
ACTION=="add", SUBSYSTEM=="drm", KERNEL=="card0", TAG+="systemd"
Run Code Online (Sandbox Code Playgroud)
系统服务覆盖:
[Unit]
Requires=sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-drm-card0.device
After=sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-drm-card0.device
Run Code Online (Sandbox Code Playgroud)
这样就完成了工作,但看起来很脆弱。
是否可以缩短Requires=和After=行以一般性地引用 DRM 设备,而不使用完整的 PCI 路径?
我使用的是 Ubuntu 19.04。
编辑以满足重复的警察:
建议的重复询问如何在设备插入时自动启动 systemd 服务。这个问题是关于等待启动已经自动启动的服务,直到给定设备初始化。两个不同的问题。阅读它们。
本节指定 Docker 容器获取主机的/etc/resolv.conf. 然而,当我在 Fedora 34 上运行一个简单的容器时,我得到了不同的结果:
$ cat /etc/resolv.conf
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
...
nameserver 127.0.0.53
options edns0 trust-ad
search .
Run Code Online (Sandbox Code Playgroud)
$ docker run --rm -it alpine /bin/sh
/ # cat /etc/resolv.conf
# This is /run/systemd/resolve/resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
...
nameserver 192.168.0.1
nameserver 192.168.0.2
search .
Run Code Online (Sandbox Code Playgroud)
docker 容器获得了我的主接口的名称服务器,由以下人员维护systemd-resolved:
$ resolvectl dns enp1s0
Link 2 (enp1s0): 192.168.0.1 192.168.0.2
Run Code Online (Sandbox Code Playgroud)
当我想访问互联网时这有效。但这是否意味着 Docker 以某种方式与 集成systemd-resolved …
似乎每当我尝试禁用 systemd 服务时,该服务都会找到某种方法来重新启用自身。最近的例子是 PackageKit,我发现它是我在这个问题中提出的问题的根源。如果我运行这个:
\nsystemctl disable packagekit\nRun Code Online (Sandbox Code Playgroud)\n然后几天后,我的磁盘保持稳定,但几天后,PackageKit 会重新启用自身并运行,并/var/cache/yum再次填充,将我的磁盘固定在 100%。
我\xe2\x80\x99m 没有专门询问PackageKit;我真的\xe2\x80\x99m 试图了解systemd 服务停用应该如何工作。
\n是否有任何通用的方法可以说 \xe2\x80\x9c 禁用此服务,并禁用任何自动重新启用它的方法?\xe2\x80\x9d 或者是我彻底删除我不\xe2 的包的唯一选择\x80\x99 不想运行吗?
\n更新:我的问题的一部分被误导了:systemctl disable确保服务无论如何都不会运行不是我们的工作;所做的只是systemctl disable说该服务不应在启动时自动运行。
根据 user1686 的回答中的建议,我尝试过
\nbusctl --activatable | grep -i packagekit\nRun Code Online (Sandbox Code Playgroud)\n并得到了
\norg.freedesktop.PackageKit - - - (activatable) - -\nRun Code Online (Sandbox Code Playgroud)\n所以这很可能表明是什么类型的事情正在启动它(如果不是在启动时)。busctl tree但在继续下一步之前我并没有想到要尝试。
再次根据 user1686 的建议,我尝试了
\nsystemctl mask packagekit\nRun Code Online (Sandbox Code Playgroud)\n这似乎已经成功了 \xe2\x80\x94 无论之前启动了那个东西,都不再启动它了。\n我不知道这是否会被认为是丑陋的或暴力的或危险的解决方案;我不知道它是否会永远有效,但现在似乎有效。
\n我想以 -20 作为非 root 启动 xcape。然而,设置一个好的值 -20 需要 root 权限。所以我想知道这是否可能。我还尝试创建系统服务和设置User=myuser,但 xcape 需要 xorg,DISPLAY因此XAUTHORITY
到目前为止我得到了什么:
[Unit]
Description=xcape: esc on caps lock
PartOf=graphical-session.target
[Service]
Type=simple
Nice=-20
ExecStart=/usr/bin/xcape -t 180 -e 'Caps_Lock=Escape'
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud) 我有两个 systemd 计时器及其相关服务:
a.timer触发a.serviceb.timer触发b.service两个服务都使用系统包管理器执行内务管理任务,因此它们不能并行运行(事实上,如果在另一个服务正在运行时启动,则两个服务都会失败,因为两个服务都会尝试创建锁定文件)。
我的目标是确保这两项服务确实运行,因此b.service如果正在运行,则应延迟a.service,反之亦然。
如果我正确理解systemd.unit(5)我无法使用Conflicts=,因为这会在启动一项服务时主动停止一项服务。我不能使用After=或Before=之一(与Type=simple),因为这只会延迟第二个服务,直到第一个服务初始化(即仍在运行)。
Type=oneshot据我了解,一种解决方案是和的组合,因为 oneshot 使 systemd在主进程终止后After=认为单元处于活动状态(并立即死亡)。另一方面,Type=oneshot对于可能长时间运行的任务,明确不鼓励使用。
人们还可以.service使用以下方法将这两项任务放在一个单元中
ExecStart=/usr/bin/sh -c 'first-command; second-command'
Run Code Online (Sandbox Code Playgroud)
但我认为这非常丑陋,因为它将两个服务的执行间隔绑定在一起。
那么,拥有依赖于同一专有资源的多个服务的最系统化的方式是什么?
我正在尝试实现三个简单的目标(在我们的 CentOS8 服务器上)......
起初我直接选择了dnsmasq,因为这似乎是大多数人在我的研究中使用的。这是一个简单的安装,我很快就能启动并运行它。 #1 - 检查
然后我继续DNSSEC并最终发现我只需要将以下内容添加到我的dnsmasq.conf...
conf-file=/usr/share/dnsmasq/trust-anchors.conf
dnssec
dnssec-check-unsigned
Run Code Online (Sandbox Code Playgroud)
一切看起来都很好,#2 - 检查
dnsforwarder最后我开始了解DNSoverTLS ,并开始了解bind. 似乎如果不在链中安装另一个链接(例如 )stubby,它就不是本机支持的东西。 #3 - 软失败
我想要尽可能简单/易于维护的解决方案,即更少的移动部件,所以我开始考虑它,BIND9因为它是事实上的标准,但在这样做的过程中,我还发现systemd-resolved它已经安装并且似乎支持我的所有三个要求。#1,2,3 - 检查
我的问题是,根据我的三个要求,为什么我不使用systemd-resolved,使用其他两种方法之一的现实世界差异或好处是什么?我看到了一些人对 的憎恨systemd-resolved,但这只是因为它由于可能存在 MITM 向量而并不真正安全,但从我所看到的情况来看,这个问题已经得到了处理。
我试图找到比较这三者的细节,但一切都是关于bind和 的dnsmasq,令人惊讶的是,除了 的参考手册之外很难找到任何东西systemd-resolved。
谢谢。
编辑:所以你对情况有了更好的了解,服务器的使用率很低,邮件服务,一些文件同步,轻量的网络任务,通常< 5个用户,也许偶尔会有机器人/白痴试图随机渗透它,唯一需要注意的是,将会有很多这样的实例,所有这些实例都作为集中编排的独立单租户系统独立运行......所以我正在寻找一个简单但功能强大的 DNS 系统,它提供现代隐私和安全功能,如 DNSSEC 和点。
我并不反对一种包含更多部件的解决方案,但我只是在寻找一种理由(如果有这样做的理由)。
也就是说,我刚刚意识到 CentOS8 被困在 systemd v239 上,并且根据文档,完全工作的 DoT 直到 …
我在 WSL2(适用于 Linux 的 Windows 子系统,v2)上并从以下位置获得 CentOS 8 WSL:https :
//github.com/yuk7/CentWSL
从 Windows Store 下载的 Ubuntu 20 WSL 也没有systemd启用。
让它像往常一样运行,但是systemd没有运行,尽管它确实存在于文件系统中:
$ cat /etc/*-release | grep NAME
NAME="CentOS Linux"
PRETTY_NAME="CentOS Linux 8 (Core)"
CPE_NAME="cpe:/o:centos:centos:8"
$ stat /lib/systemd/systemd
File: /lib/systemd/systemd
Size: 2523648 Blocks: 4936 IO Block: 4096 regular file
Device: 2h/2d Inode: 1407374884100769 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-05-31 13:17:53.497597100 +0700
Modify: 2020-04-10 04:52:32.000000000 +0700
Change: 2020-05-30 12:06:52.791586300 +0700 …Run Code Online (Sandbox Code Playgroud)