воскресенье, 24 сентября 2017 г.

Решение проблемы с Open vSwitch после обновления Debian до Stretch

В одной из своих прошлых заметок Установка и настройка Open vSwitch в Debian я писал о настройке Open vSwitch. Тогда я воспользовался информацией из статьи Boot integration of the Openvswitch in Ubuntu.

Через некоторое время после выхода Deban Stretch, я решил обновить систему до него. После обновления столкнулся с проблемой: при загрузке системы происходит задержка при настройке сети и запуске демона Open vSwitch, после чего загрузка продолжается, но в загрузившейся системе оказываются настроенными только интерфейсы, не связанные с Open vSwitch.

Исправить проблему помогла всё та же статья Boot integration of the Openvswitch in Ubuntu, где была приведён юнит-файл systemd со следующим содержимым:
[Unit]
Description=Open vSwitch Internal Unit
PartOf=openvswitch-switch.service

DefaultDependencies=no

After=apparmor.service local-fs.target systemd-tmpfiles-setup.service

Wants=network-pre.target openvswitch-switch.service
Before=network-pre.target openvswitch-switch.service

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/default/openvswitch-switch
ExecStart=/usr/share/openvswitch/scripts/ovs-ctl start \
          --system-id=random $OVS_CTL_OPTS
ExecStop=/usr/share/openvswitch/scripts/ovs-ctl stop

[Install]
WantedBy=openvswitch-switch.service
Этот текст нужно поместить в файл /lib/systemd/system/openvswitch-nonetwork.service

Затем нужно добавить в файл /etc/default/openvswitch-switch вот такую опцию:
OVS_CTL_OPTS='--delete-bridges'
Однако этого оказалось не достаточно.

Затем нужно создать ещё один юнит-файл вот с таким содержимым:
[Unit]
Description=Open vSwitch
After=network.target openvswitch-nonetwork.service
Requires=openvswitch-nonetwork.service

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/true
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Этот текст нужно поместить в файл /lib/systemd/system/openvswitch-switch.service

Теперь нужно чтобы systemd перечитал обновления в своей конфигурации. Сделаем это при помощи следующей команды:
# systemctl daemon-reload
Теперь можно включить созданные нами сервис-файлы:
# systemctl enable openvswitch-nonetwork.service
# systemctl enable openvswitch-switch.service
Теперь можно перезагрузить систему и проверить, правильно ли настроилась сеть после перезагрузки.

Меня всё меньше радуют тенденции в новых релизах Debian и в Linux в целом. Я бы не возмущался, если бы лоббисты systemd, протащившие его в систему, заменили бы всё так, чтобы ничего не сломалось. А то получается, что старое сломали, а новое не работает как положено. В самих юнит-файлах по-прежнему используются shell-скрипты для запуска и остановки сервиса - достаточно посмотреть на значения опций ExecStart и ExecStop. Раньше было достаточно уметь писать shell-скрипты для того, чтобы запустить сервис, правильно подготовив для него окружение, и остановить сервис, убрав за ним мусор. Сейчас же получается, что shell-скрипты по-прежнему нужно знать, но ещё нужно знать и опции юнит-файлов systemd. Подумываю о FreeBSD, где знания об ipfw, rc.conf и системе портов в той или иной мере актуальны до сих пор, хотя система и развивается. Настораживает только то, что в последнее время даже самые ярые сторонники FreeBSD стали всё чаще использовать Ubuntu.

Использованные материалы:
P.S. Дополнение от 11 апреля 2018 года: в файл openvswitch-nonetwork.service добавлена секция Install, без которой systemctl отказывался принимать файл.

Комментариев нет: