재부팅 시 해결 방법 변경 사항 유지

재부팅 시 해결 방법 변경 사항 유지

LXC 컨테이너를 사용하고 있으며 CONTAINERNAME.lxd를 지정된 컨테이너의 IP로 확인하려면 다음을 사용하세요.

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

정말 좋아요! 그러나 변경 사항은 호스트를 재부팅해도 유지되지 않습니다.

(저는 이 질문에 대한 답변으로 다양한 수준의 성공과 함께 "내가 시도한 것"을 설명했습니다.)

저는 Ubuntu 22.04를 기반으로 하는 Pop!_OS 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(Network Manager CLI) 호출로 변환하여 보존하는 것을 제안했습니다. 이는 분명히 정보를 영구적인 어딘가에 저장하고 시작 시 "resolvectl" 구성을 채우는 데 사용됩니다.

이렇게 하면 다음을 사용하여 첫 번째 resolvctl 호출을 변환하는 방법을 알 수 있을 것 같습니다.

sudo nmcli connection modify lxdbr0 ipv4.dns $bridge_ip

하지만 두 번째 resolvctl 호출("domain=~lxd" 설정)을 nmcli 명령으로 변환할 수 없습니다.

따라서 이 방법으로는 문제가 해결되지 않습니다.

관련 정보