Почему 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» позволяет избежать этого конфликта, и после перезагрузки оба сетевых адаптера работают нормально.

Другие вопросы по тегам