Debian systemd network-online.target не працює?


24

Я намагаюся створити системний сервіс на Debian Jessie. Мені потрібно це почати після того, як network-online.targetбуде досягнуто.

Проблема - це network-online.targetпожежі одночасно, network.targetі в цей час мої інтерфейси ще не налаштовані, щойно розпочався DHCP-запит.

Схоже, ця проблема характерна для Debian, оскільки вона використовує застарілу мережеву конфігурацію.

Як обійти цю проблему чи як змусити network-online.targetпрацювати?


Який результат systemctl list-dependencies network-online.target? Також зауважте, що, network-online.targetможливо, це не означає, що є доступ до Інтернету. Дивіться цю сторінку для отримання додаткової інформації.
saiarcot895

Вихід команди: network-online.target ● └─systemd-networkd-wait-online.service Я вже прочитав цю сторінку, я розумію там основну концепцію, але все ще дуже дивно не мати визначеної точки, з якої можуть запускатися критичні послуги мережі. Принаймні, це може чекати належного призначення DHCP.
10robinho

Це означає, що network-online.targetзалежить лише від того, systemd-networkd-wait-online.serviceщо він готовий. Це не залежить від того, що NetworkManager заявив, що він готовий, і не перевірити, чи ifupуспішно працювали всі посилання (якщо ви використовуєте цей метод для налаштування своєї мережі). Ubuntu, з іншого боку, залежить від ifupNetworkManager, але не для цього systemd-networkd-wait-online..
saiarcot895

Як налаштовуєте свою мережу:, /etc/network/interfacesсистемні .networkфайли або NetworkManager?
saiarcot895

Ви праві, network-online.targetі network.targetспрацьовують відразу після ifup. Я використовую debian за замовчуванням, тому /etc/network/interfacesз dhcp адресою. Схоже, мережеве рішення може бути кращим рішенням, але це не просто реалізувати.
10robinho

Відповіді:


18

Оскільки ви користуєтеся /etc/network/interfaces, вам знадобиться системна служба для контролю стану кожного інтерфейсу. Перевірте, чи є у вас /lib/systemd/system/ifup-wait-all-auto.service(встановлений ifupdownпакетом в Ubuntu 15.04). Якщо ні, то створіть /etc/systemd/system/ifup-wait-all-auto.serviceі вставте наступне:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

Це сервісний файл, який присутній в системі Ubuntu 15.04, але з [Install]доданим розділом, щоб зробити це трохи простіше. Я сподіваюся, що поведінка ifupв Ubuntu 15.04 така сама, як ifupу Debian Jessie. Якщо ні, то деякі зміни будуть потрібні (особливо з останнім рядком).

Потім бігайте sudo systemctl enable ifup-wait-all-auto.service. Перезавантаживши комп'ютер, ви повинні побачити, що network-online.targetдосягнуто після підйому інтерфейсів (принаймні).


Дякую за зусилля, дозвольте спробувати зараз, і я дам вам відгук
10robinho

У мене закінчилася дещо змінена версія ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. Це залежить від того, hostnameщоб перевірити, чи призначено IP-адресу.
luka5z

Не намагайтесь це зробити доктор. це не тому, що він використовує / etc / network / інтерфейси. Це тому, що systemd настільки неохайний, і робота завантажується на кожного користувача, а не вирішує проблему, де він був створений.
Флоріан Хейгл

1
fwiw, ifup-wait-all-auto.serviceу ifupdownверсії було скинуто 0.8.5ubuntu1: "Відкиньте ifup-wait-all-auto.service. Це було реалізовано більш елегантно, зробивши
network-online.target

0

Увага! Щойно зрозумів це на Raspbian Jessie: видаліть ВСІ коментовані рядки в / etc / мережевих інтерфейсах, і це спрацює! Це здається помилкою для розбору =) У моєму конкретному випадку я залишив коментар iface eth0 inet dhcpі просто забув про це ще багато років тому, але після оновлення до Raspbian Jessie та відновлення ядра у мене дуже дивна поведінка: він використовував DHCP і відмовився зробити настройку з / etc / network / інтерфейсів. Тому я позбавив його від будь-яких коментарів - просто робочих ліній, перезавантажте - і це працює! НЕ ПОТРІБНО ПІДГОТОВКА СКРИПТУ / РЕДАКЦІЇ!


Цікаво, мені потрібно спробувати це. Хоча це не має особливого сенсу :)
10robinho

2
Чи є у вас якісь посилання на це? Я хотів би прочитати звіти про помилки та переглянути код помилок.
ʇsәɹoɈ

Ні, я не відкрив путівку. Щоб відтворити його, просто додайте коментарі до вашого /etc/network/interfacesфайлу - він запуститься, якщо він все ще є.
Олексій Веснін

0

За https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ рекомендований спосіб запуску служби ПІСЛЯ мережі є рівень використання « network-online.target » в .Service файлі:

 "After=network-online.target"
 "Wants=network-online.target"

Однак після використання " network-online.target " і моєї служби не вдалося, оскільки мережа була не на повному рівні, я виявив помилку ( https://github.com/coreos/bugs/isissue/1966 ) з нею: не гарантовано бути 100% непогрішним.

Дійсно, там, де використовуються засоби динамічної конфігурації мереж, такі як " NetworkManager ", як і в цьому випадку, стан мереж ніколи не може бути 100% точним або передбачуваним. Мабуть, за посиланням, що описує помилку, " network-online.target " може вести себе непослідовно, залежно від різних додатків, з якими вона використовується.

Вирішення :
Вам потрібно проаналізувати порядок запуску сервісів і використовувати той, який починається пізніше, ніж " network-online.target ":

 systemd-analyze plot > /home/pi/graph.svg

Це ітеративний процес поступово змінюючи цілі на пізніші та більш пізні сервіси, поки ви не знайдете той, що забезпечує встановлення мережі на рівні, і ваша послуга починається без помилок. В моєму випадку мені навіть довелося sleep 10вписати в свій сценарій сервіс SystemD, який називався.


0

Я одного разу знайшов відповідь на Github, який вирішив її, постійно намагаючись пінг-сервер. Лише коли пінг проходить, служба продовжує:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

Я замінив google.comвласний сервер, оскільки для підключення до мого сервера потрібен мій основний сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.