LXC 컨테이너를 사용하고 있으며 CONTAINERNAME.lxd를 지정된 컨테이너의 IP로 확인하려면 다음을 사용하세요.
sudo resolvectl dns lxdbr0 $bridge_ip
sudo resolvectl domain lxdbr0 '~lxd'
정말 좋아요! 그러나 변경 사항은 호스트를 재부팅해도 유지되지 않습니다.
(저는 이 질문에 대한 답변으로 다양한 수준의 성공과 함께 "내가 시도한 것"을 설명했습니다.)
저는 Ubuntu 22.04를 기반으로 하는 Pop!_OS 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(Network Manager CLI) 호출로 변환하여 보존하는 것을 제안했습니다. 이는 분명히 정보를 영구적인 어딘가에 저장하고 시작 시 "resolvectl" 구성을 채우는 데 사용됩니다.
이렇게 하면 다음을 사용하여 첫 번째 resolvctl 호출을 변환하는 방법을 알 수 있을 것 같습니다.
sudo nmcli connection modify lxdbr0 ipv4.dns $bridge_ip
하지만 두 번째 resolvctl 호출("domain=~lxd" 설정)을 nmcli 명령으로 변환할 수 없습니다.
따라서 이 방법으로는 문제가 해결되지 않습니다.