在重新启动后保留resolvectl更改

在重新启动后保留resolvectl更改

我正在使用 LXC 容器,并将 CONTAINERNAME.lxd 解析为指定容器的 IP,使用:

sudo resolvectl dns lxdbr0 $bridge_ip
sudo resolvectl domain lxdbr0 '~lxd'

这太棒了!但更改不会在主机重新启动后持续存在。

(我已经将“我尝试过的事情”描述为这个问题的答案,这些方法取得了不同程度的成功。)

我使用的是 Pop!_OS 22.04,它基于 Ubuntu 22.04。

我应该如何使这些resolvctl更改在重新启动后保持不变?

答案1

LXD 文档描述了一个解决方案

将其放入 /etc/systemd/system/lxd-dns-lxdbr0.service 中:

[Unit]
Description=LXD per-link DNS configuration for lxdbr0
BindsTo=sys-subsystem-net-devices-lxdbr0.device
After=sys-subsystem-net-devices-lxdbr0.device

[Service]
Type=oneshot
ExecStart=/usr/bin/resolvectl dns lxdbr0 BRIDGEIP
ExecStart=/usr/bin/resolvectl domain lxdbr0 '~lxd'
ExecStopPost=/usr/bin/resolvectl revert lxdbr0
RemainAfterExit=yes

[Install]
WantedBy=sys-subsystem-net-devices-lxdbr0.device

(替换为您自己的 BRIDGEIP,来自lxc network show lxdbr0 | grep ipv4.address

然后应用这些设置而无需重新启动:

sudo systemctl daemon-reload
sudo systemctl enable --now lxd-dns-lxdbr0

答案2

我想出了一个可怕的解决方法:创建一个脚本lxc-ip,从 的输出中抓取容器的 IPv4 lxc list。使用示例:ping $(lxc-ip mycontainer).

该脚本如下所示:

#!/usr/bin/env bash

prog=$(basename $0)

function usage {
    echo "Usage: $prog CONTAINER" >&2
    echo "Outputs IPv4 address of given CONTAINER." >&2
}

container=""

while [[ $# -gt 0 ]]
do
  case "$1" in
  -h|--help)
    usage
    exit 0
    ;;
  *)
    if [ -z "$container" ]; then
        container=$1
    else
        echo "$prog error: Not multiple CONTAINERs" >&2
        usage
        exit 1
    fi
    ;;
  esac
  shift
done

if [ -z "$container" ]; then
    echo "$prog error: Must pass a CONTAINER" >&2
    usage
    exit 1
fi

table=$(lxc list -c ns4 -f csv)
line=$(echo "$table" | grep "$container")
if [ -z "$line" ]; then
    echo "$prog error: Container '$container' not found. Existing containers are:" >&2
    lxc list -c n -f compact >&2
    exit 2
fi

if ! grep -qs RUNNING <<<"$line" ; then
    echo "$prog error: Container is not running: $line" >&2
    exit 3
fi

ipv4=$(echo "$line" | cut -d',' -f3 | cut -d' ' -f1)
if [ -z "$ipv4" ]; then
    echo "$prog error: Container has no IPv4: $line" >&2
    exit 4
fi

echo "$ipv4"

答案3

如果有人可以改进或确认,一位同事报告说他已经使用某种机制解决了这个问题,其中涉及以下文本/etc/systemd/network/lxd.network

[Match]
Name=lxdbr0

[Network]
Address=BRIDGEIP/24
DNS=BRIDGEIP
Domains=lxd

(替换为您自己的 BRIDGEIP,来自lxc network show lxdbr0 | grep ipv4.address

(这可能还需要同时运行 systemd-networkd 和 NetworkManager)

答案4

我看到一个类似的 askubuntu.com 问题,其中唯一的(-1)答案建议通过将其他resolvctl更改转换为nmcli(网络管理器CLI)调用来保留它们。这显然将信息存储在持久的地方,用于在启动时填充“resolvectl”配置。

如果我要这样做,我想我可以看到如何使用以下内容转换第一个resolvctl调用:

sudo nmcli connection modify lxdbr0 ipv4.dns $bridge_ip

但我无法将第二个resolvctl调用(设置“domain=~lxd”)转换为nmcli命令。

所以这个方法并不能解决问题。

相关内容