Virtual-Machine

Systemd-networkd 似乎沒有在容器中找到介面

  • January 23, 2022

我正在嘗試在 Ubuntu 20.04.3 上設置一個 nspawn-container。主機網路配置包含一個橋接介面:

br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet *  netmask 255.255.255.255  broadcast 0.0.0.0
       inet6 * prefixlen 64  scopeid 0x0<global>
       ether 41:8a:5b:d8:83:00  txqueuelen 1000  (Ethernet)
       RX packets 5914822  bytes 888728796 (888.7 MB)
       RX errors 0  dropped 449  overruns 0  frame 0
       TX packets 30323548  bytes 37836188291 (37.8 GB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

容器開始於:

systemd-nspawn -UbM helloworld --network-bridge=br0

容器啟動時,vb-helloworld創建介面:

vb-helloworld: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet6 fe80::c8fc:b8ff:fed1:176  prefixlen 64  scopeid 0x20<link>
       ether ca:fc:b8:d1:01:76  txqueuelen 1000  (Ethernet)

在容器中,有一個 interface host0,應該由systemd-networkdconfig處理/etc/systemd/network/host0.network

[Match]
Name=host0
[Network]
DHCP=false
Address=*:*:*:*::100/64
Gateway=fe80::1
DNS=2a01:4ff:*::*:1
Address=192.168.50.10/24
Gateway=192.168.50.1
DNS=192.168.50.2
ConfigureWithoutCarrier=yes
[Link]
MACAddress=f6:d9:2b:ba:7a:1d
ARP=true
RequiredForOnline=yes
[Address]
Address=*:*:*:*::100/64
Scope=global
[Route]
Gateway=fe80::1
Scope=global

容器有介面:

host0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 169.254.214.0  netmask 255.255.0.0  broadcast 169.254.255.255
       inet6 fe80::f4d9:2bff:feba:7a1d  prefixlen 64  scopeid 0x20<link>
       ether f6:d9:2b:ba:7a:1d  txqueuelen 1000  (Ethernet)
...

不幸的是,networkd 似乎沒有找到 interface host0。沒有分配地址,既不是 ip4 也不是 ip6。當我將Name部分中的參數更改[Match]為 時*,地址將分配給lo介面。

我究竟做錯了什麼?

Systemd 已經帶有與host0介面匹配的網路配置:

/usr/lib/systemd/network/80-container-host0.network

Networkd 以 asciibetical 順序讀取所有 .network 文件,第一個匹配的文件獲勝。(在 ASCII 中,順序大致為0-9 A-Z a-z。)為了使您的自定義配置優先,其文件名必須在之前 80-container-host0排序,例如50-custom-host0.

(該目錄僅在兩個文件具有相同名稱時才重要——在這種情況下,/etc 中的文件優先於 /usr/lib 中的同名文件。)

引用自:https://unix.stackexchange.com/questions/687488