Почему Netplan/Networkd не использует статический интерфейс Ethernet?
У меня есть машина под управлением Ubuntu Server 18.04. Сеть настроена с использованием Netplan, поэтому у меня есть этот конфиг в /etc/netplan/01-netcfg.yaml
:
network:
version: 2
renderer: networkd
ethernets:
enp1s0f0:
optional: false
addresses:
- 10.0.0.1/24
wifis:
wlp2s0:
optional: true
dhcp4: yes
access-points:
[...]
enp1s0f0
подключен к устройству, которое может включаться или не включаться (при загрузке или в любое другое время). Я хочу запустить DHCP-сервер на этом интерфейсе.
Проблема в том, что при загрузке происходит задержка в несколько минут, и я вижу это сообщение:
A start job is running for Wait for Network to be Configured
В конце концов, тайм-аут, загрузка продолжается, но enp1s0f0
никогда не настраивается и не воспитывается. ip link show enp1s0f0
дает:
2: enp1s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 10:dd:b1:ef:65:21 brd ff:ff:ff:ff:ff:ff
Я понятия не имею, каково значение NO-CARRIER
есть, но в случае, если это уместно, вот вывод sudo lspci -v
:
01:00.0 Ethernet controller: Broadcom Limited NetXtreme BCM57766 Gigabit Ethernet PCIe (rev 01)
Subsystem: Broadcom Limited NetXtreme BCM57766 Gigabit Ethernet PCIe
Flags: bus master, fast devsel, latency 0, IRQ 16
Memory at a0400000 (64-bit, prefetchable) [size=64K]
Memory at a0410000 (64-bit, prefetchable) [size=64K]
Capabilities: [48] Power Management version 3
Capabilities: [50] Vital Product Data
Capabilities: [58] MSI: Enable- Count=1/8 Maskable- 64bit+
Capabilities: [a0] MSI-X: Enable+ Count=6 Masked-
Capabilities: [ac] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [13c] Device Serial Number 00-00-10-dd-b1-ef-65-21
Capabilities: [150] Power Budgeting <?>
Capabilities: [160] Virtual Channel
Capabilities: [1b0] Latency Tolerance Reporting
Kernel driver in use: tg3
Kernel modules: tg3
Теперь, если я включу подключенное устройство, достаточно enp1s0f0
подходит:
2: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 10:dd:b1:ef:65:21 brd ff:ff:ff:ff:ff:ff
Но в данный момент это бесполезно - DHCP-сервер не будет работать, потому что он не мог запуститься с enp1s0f0
не во время загрузки. я нуждаюсь enp1s0f0
и настроен во время загрузки, что, как мне показалось, и есть смысл статической конфигурации IP. Еще более странно то, что у него всегда есть адрес IPv6, даже если он не работает:
2: enp1s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 10:dd:b1:ef:65:21 brd ff:ff:ff:ff:ff:ff
inet6 fe80::12dd:b1ff:feef:6521/64 scope link
valid_lft forever preferred_lft forever
Если я проверю выходные данные отладки Netplan, я вижу:
$ sudo netplan --debug apply
** (generate:1555): DEBUG: 20:39:27.253: Processing input file //etc/netplan/01-netcfg.yaml..
** (generate:1555): DEBUG: 20:39:27.254: starting new processing pass
** (generate:1555): DEBUG: 20:39:27.254: wlp2s0: adding wifi AP 'Jeff Winger's Wireless Hairbrush'
** (generate:1555): DEBUG: 20:39:27.254: wlp2s0: setting default backend to 1
** (generate:1555): DEBUG: 20:39:27.254: enp1s0f0: setting default backend to 1
** (generate:1555): DEBUG: 20:39:27.254: Generating output files..
** (generate:1555): DEBUG: 20:39:27.254: wlp2s0: Creating wpa_supplicant configuration file run/netplan/wpa-wlp2s0.conf
** (generate:1555): DEBUG: 20:39:27.254: Creating wpa_supplicant service enablement link /run/systemd/system/multi-user.target.wants/netplan-wpa@wlp2s0.service
** (generate:1555): DEBUG: 20:39:27.254: NetworkManager: definition wlp2s0 is not for us (backend 1)
** (generate:1555): DEBUG: 20:39:27.254: NetworkManager: definition enp1s0f0 is not for us (backend 1)
DEBUG:netplan generated networkd configuration exists, restarting networkd
DEBUG:no netplan generated NM configuration exists
DEBUG:replug enp1s0f0: unbinding 0000:01:00.0 from /sys/bus/pci/drivers/tg3
DEBUG:replug enp1s0f0: rebinding 0000:01:00.0 to /sys/bus/pci/drivers/tg3
DEBUG:device wlp2s0 operstate is up, not replugging
DEBUG:netplan triggering .link rules for wlp2s0
DEBUG:device lo operstate is unknown, not replugging
DEBUG:netplan triggering .link rules for lo
Моя конфигурация для isc-dhcp-server
это иметь /etc/default/isc-dhcp-server
содержать:
INTERFACESv4="enp1s0f0"
...а также /etc/dhcp/dhcpd.conf
содержать (среди прочего):
subnet 10.0.0.0 netmask 255.255.255.0 {
...
}
Теоретически это должно служить DHCP более enp1s0f0
, Тем не менее, так как enp1s0f0
DHCP-сервер не запускается никогда:
No subnet declaration for enp1s0f0 (no IPv4 addresses).
** Ignoring requests on enp1s0f0. If this is not what
you want, please write a subnet declaration
in your dhcpd.conf file for the network segment
to which interface enp1s0f0 is attached. **
Not configured to listen on any interfaces!
Это не было проблемой под ifupdown
(Я не имею понятия почему enp1s0f0
не просто появляется во время загрузки, независимо от того, находится ли что-нибудь на другом конце кабеля; Я думал, что это был весь смысл наличия статического IP). Возможно ли заставить его работать в Netplan? Или возможно, чтобы DHCP-сервер запускался, когда enp1s0f0
вверх?
3 ответа
Похоже, что вы столкнулись с ошибкой, которая будет устранена https://github.com/CanonicalLtd/netplan/pull/34 - в настоящее время устройства будут настроены, только если у них есть носитель, но это требование исчезает.
В то же время, вы можете исправить это, настроив устройство с systemd-networkd
непосредственно. Удалить enp1s0f0
раздел из конфигурации netplan и добавьте что-то вроде этого (непроверенного) конфигурации systemd в /etc/systemd/network/10-enp1s0f0.network
:
[Match]
Name=enp1s0f0
[Link]
RequiredForOnline=no
[Network]
ConfigureWithoutCarrier=true
Address=10.0.0.1/24
Ключевой бит - это ConfigureWithoutCarrier
который я вытащил прямо из запроса на извлечение.
(Вы можете увидеть, что генерирует netplan, и перейти оттуда - файл будет в /run/systemd/network
.)
В качестве альтернативы, вы можете использовать тот факт, что netplan и ifupdown могут сосуществовать, apt install ifupdown
и настроить enp1s0f0
с ifupdown.
Похоже, что у Netplan есть умная система, позволяющая автоматически определять, есть ли у iface ссылка или нет, и назначать адреса только тогда, когда она активна.
Когда этот интерфейс не имеет связи (сигнал несущей), он остается ненастроенным, однако, если я включаю другое устройство на другом конце кабеля, интерфейс автоматически подключается с IP-адресом и всем необходимым.
Для DHCP решением было бы не привязывать его к определенному интерфейсу...
Другая возможность столкнуться с этой проблемой — использование нескольких сетевых адаптеров с одинаковыми приоритетами, как в моем случае: у меня есть два USB-интерфейса, напрямую интегрированных в мою виртуальную машину Ubuntu 20.04. При каждом запуске один из них будет работать нормально, но у другого не отображаются пакеты TX и RX вifconfig
. Командаip a
показывает NO-CARRIER и состояние DOWN, и доступ к подключенной сети через этот сетевой адаптер невозможен. Мне пришлось отключать и снова подключать его в настройках виртуальной машины в течение нескольких месяцев, пока я не нашел решение. На всякий случай, если кто-то сталкивается с той же проблемой:
Решение состоит в том, чтобы открыть графический интерфейс «Расширенная сетевая конфигурация» и убедиться, что для обоих сетевых адаптеров включено «автоматическое подключение с приоритетом», но не с одинаковым значением приоритета, в противном случае это вызовет конфликт, и один сетевой интерфейс всегда будет кричать NO CARRIER. и никаких пакетов TX/RX после каждой загрузки. Установка одного на «0», а другого на «1» позволяет избежать этого конфликта, и после перезагрузки оба сетевых адаптера работают нормально.