我正在使用 LXC 容器,并将 CONTAINERNAME.lxd 解析为指定容器的 IP,使用:
sudo resolvectl dns lxdbr0 $bridge_ip
sudo resolvectl domain lxdbr0 '~lxd'
这太棒了!但更改不会在主机重新启动后持续存在。
(我已经将“我尝试过的事情”描述为这个问题的答案,这些方法取得了不同程度的成功。)
我使用的是 Pop!_OS 22.04,它基于 Ubuntu 22.04。
我应该如何使这些resolvctl更改在重新启动后保持不变?
答案1
将其放入 /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命令。
所以这个方法并不能解决问题。