Вопрос или проблема
У меня есть плата Petalinux, которая загружается с неправильной конфигурацией сетевого подключения (без DHCP). В /etc
нет конфигураций:
$ ls /etc/NetworkManager/system-connections/
$
После настройки подключения с помощью sudo nmcli con mod eth0 ...
всё работает нормально. (Я изменяю конфигурацию ipv4 и ipv6, как здесь на stackoverflow.) И это создаёт постоянный конфигурационный файл в /etc
:
/etc/NetworkManager/system-connections/eth0.nmconnection
Но после перезагрузки NetworkManager создаёт новую конфигурацию в /run
, которая каким-то образом имеет приоритет над моим подключением в /etc
:
$ nmcli -f TYPE,FILENAME,UUID,NAME,DEVICE connection
TYPE FILENAME UUID NAME DEVICE
ethernet /run/NetworkManager/system-connections/eth0.nmconnection 99e39a32-c0ab-4b3f-be16-75a9bdff1277 eth0 eth0
loopback /run/NetworkManager/system-connections/lo.nmconnection 5d84c484-4214-47e4-8f00-01f7730200b3 lo lo
ethernet /etc/NetworkManager/system-connections/eth0.nmconnection fb365147-6ad9-47a0-a5c8-fbea10080ece eth0 --
Здесь отъявленный 99e39a32
из /run
подключён к устройству eth0
, а моя конфигурация подключения fb365147
в /etc
остаётся бездействующей.
Как правильно и постоянно сохранить конфигурацию подключения в NetworkManager или заставить его использовать конфигурацию из /etc
как единственный шаблон для подключения eth0
? Откуда он вообще берёт конфигурации для /run
? Почему он не использует /etc
для создания конфигураций в /run
?
Есть сообщения о том, что NetworkManager создаёт подключения для каждого пользователя. Т.е. предположение было таким, что /etc
принадлежит root, и как-то другие подключения используются для моего пользователя. Но я не думаю, что это так. nmcli
не позволяет мне изменять подключение без прав root.
В интернете есть множество аналогичных вопросов: 1 (У меня нет файла /etc/netplan
, который упоминается в комментарии), 2, 3. Но они не помогают в моём случае.
Обновление:
Есть информация о том, как создаётся конфигурация /run
, благодаря логам journalctl -u NetworkManager
после загрузки компьютера с [loggin] level=TRACE
в /etc/NetworkManager/NetworkManager.conf
:
NetworkManager[347]: <info> [1734374462.9312] device (eth0): carrier: link connected
NetworkManager[347]: <trace> [1734374462.9313] ethtool[3]: ETHTOOL_GSET, eth0: success
NetworkManager[347]: <debug> [1734374462.9317] device[e5c0e28febbc1b13] (eth0): unmanaged: flags set to [platform-init,!user-settings=0x4/0x14/unmanaged/unrealized], set-managed [user-settings=0x10])
NetworkManager[347]: <debug> [1734374462.9318] device[e5c0e28febbc1b13] (eth0): unmanaged: flags set to [!platform-init,!user-settings=0x0/0x14/managed/unrealized], set-managed [platform-init=0x4])
NetworkManager[347]: <debug> [1734374462.9318] device[e5c0e28febbc1b13] (eth0): unmanaged: flags set to [!sleeping,!platform-init,!user-settings=0x0/0x15/managed/unrealized], set-managed [sleeping=0x1])
NetworkManager[347]: <trace> [1734374462.9319] dbus-object[e5c0e28febbc1b13]: export: "/org/freedesktop/NetworkManager/Devices/2"
NetworkManager[347]: <info> [1734374462.9329] manager: (eth0): new Ethernet device (/org/freedesktop/NetworkManager/Devices/2)
NetworkManager[347]: <trace> [1734374462.9349] settings: auto-default: cannot create auto-default connection for device eth0: already has a profile
<----- этот уже существующий "профиль" должен быть конфигурацией в /etc
когда я добавил no-auto-default=* или eth0 в NetworkManager.conf
эта строка произнесла: невозможно создать авто-умолчание.. потому что no-auto
...
NetworkManager[347]: <debug> [1734374462.9356] Connection 'eth0' differs from candidate 'eth0' in ipv4.addresses, ipv4.gateway, ipv4.method
NetworkManager[347]: <debug> [1734374462.9357] manager: (eth0): assume: generated connection 'eth0' (b807ebb2-d7a5-4b26-82c1-c321a6e7d5ba)
NetworkManager[347]: <debug> [1734374462.9357] device[e5c0e28febbc1b13] (eth0): assume-state: set guess-assume=0, connection=(null)
NetworkManager[347]: <trace> [1734374462.9370] keyfile: commit: b807ebb2-d7a5-4b26-82c1-c321a6e7d5ba (eth0) added as "/run/NetworkManager/system-connections/eth0.nmconnection" (nm-generated,volatile,external)
Я предполагаю, что вопрос теперь в том, что означает Connection 'eth0' differs from candidate 'eth0' ...
– что такое этот кандидат? Т.е. возможно, есть какая-то другая конфигурация для самого устройства eth0
, и когда конфигурация из /etc
конфликтует с ней, NetworkManager создаёт новую?
Я пытался добавить этот файл, но без изменений в поведении (возможно, он устарел):
$ cat /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
Подобно systemd, конфигурации в /run/
автоматически генерируются. Если вы хотите отключить автоматическое создание профилей для данного сетевого интерфейса (чтобы заставить себя создать профиль для подключения Ethernet даже в сети DHCP, например), вам нужно настроить NetworkManager для отключения профилей по умолчанию или создать собственный профиль.
Для этого добавьте конфигурационный файл в /etc/NetworkManager/conf.d/
, который устанавливает no-auto-default
для интерфейсов, которые вы не хотите, чтобы получали автоматические профили.
[main]
no-auto-default=eth0
Оставшиеся файлы в /run/NetworkManager/
являются состоянием системы в режиме выполнения для NetworkManager и не должны быть удалены.
Ответ или решение
Для того чтобы NetworkManager использовал конфигурации из директории /etc
и не создавал новые соединения в /run
, необходимо учесть несколько важных аспектов работы NetworkManager.
1. Понимание структуры конфигурации
NetworkManager создает файлы конфигурации соединений в двух основных местах:
/etc/NetworkManager/system-connections/
— هنا находятся постоянные конфигурации, которые сохраняются после завершения работы системы. Эти файлы можно редактировать вручную или создавать с помощью командnmcli
./run/NetworkManager/system-connections/
— здесь хранятся временные конфигурации на время работы системы. Эти файлы создаются автоматически, когда NetworkManager запускается и обнаруживает активные устройства.
2. Автоматическая генерация соединений
Когда NetworkManager обнаруживает сетевое устройство, он пытается создать автоматически соединение для него. Это происходит, если для устройства уже не существует профиля в /etc
. В вашем случае, даже если вы создали файл /etc/NetworkManager/system-connections/eth0.nmconnection
, NetworkManager по какой-то причине создает новое соединение с UUID 99e39a32
, так как на этапе инициализации устройства он видит, что параметры в конфигурации отличаются от ожидаемых значений (сообщение "Connection ‘eth0’ differs from candidate ‘eth0’").
3. Отключение автоматического создания соединений
Чтобы предотвратить автоматическую генерацию соединений для вашего интерфейса eth0
, вы можете использовать опцию no-auto-default
. Для этого создайте файл конфигурации (например, no-auto-default.conf
) в директории /etc/NetworkManager/conf.d/
, в котором добавьте следующее содержимое:
[main]
no-auto-default=eth0
Это укажет NetworkManager не создавать автоматическое соединение для eth0
, и он будет полагаться на конфигурацию, хранящуюся в /etc
.
4. Перезагрузка NetworkManager
После внесения изменений вам необходимо перезагрузить NetworkManager, чтобы новые параметры вступили в силу. Это можно сделать с помощью команды:
sudo systemctl restart NetworkManager
5. Проверка конфигурации
После перезагрузки проверьте активные соединения снова:
nmcli -f TYPE,FILENAME,UUID,NAME,DEVICE connection
Вы должны увидеть, что ваше соединение из /etc
используется и не было создано новое в /run
.
6. Почему не используются конфигурации из /etc
?
Если по-прежнему возникают конфликты между файлами в /etc
и /run
, это может быть связано с тем, что NetworkManager не считывает ваш файл из-за ошибок в конфигурации или неверных параметров. Убедитесь, что ваш файл /etc/NetworkManager/system-connections/eth0.nmconnection
не содержит синтаксических ошибок и соответствует необходимым параметрам.
Заключение
Правильная настройка NetworkManager требует понимания его внутреннего устройства и механизмов создания соединений. Настроив файл конфигурации для отключения автоматического создания соединений, вы сможете обеспечить стабильность и предсказуемость сетевых настроек на вашей Petalinux плате.