再起動時に回避策の変更を維持する

再起動時に回避策の変更を維持する

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

ただし、2番目のresolvctl呼び出し( "domain = ~ lxd"設定)をnmcliコマンドに変換することはできません。

したがって、この方法では問題は解決されません。

関連情報