Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 40

Чтобы введённая команда не сохранилась в history, достаточно перед ней поставить пробел.
НЛО прилетело и опубликовало эту надпись здесь
уточню: для баша зависит от переменной HISTCONTROL в ~/.bashrc (или вашем альтернативным конфигурационном файле баша)
Воможные значения: ignorespace, ignoredups, ignoreboth
Спасибо, довольно интересно.
Надо почитать что он вообще поддерживает.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

В первом же абзаце написано, что systemd-networkd требует всего 2 МБ памяти (против 20 у NetworkManager).

НЛО прилетело и опубликовало эту надпись здесь
это надуманное преимущество. Они сравнивают десткопный NetworkManager с systemd, в то время как NetworkManager не используется на серверах. Нет никакого преимущества. Давайте все запихнем в наш «прекрасный» systemd комбаин, потому что просто так. Вот и все. Дай им волю, они и реестр сделают в linux.
Да такими темпами, systemd скоро научится писать болванки и перегонит Nero по функционалу )))
Есть один нюанс — в RH-based дистрибутивах systemd — by default. Т.е. он из системы не вырезается никак. Прибито гвоздями.
И NM — by default. Однако не прибито.
Автор рисует путь вырезать бОльшее зло (NM) в пользу меньшего зла (systemd).
Если Вы хотите совсем без зла — RTFM «Linux From Scratch».
(как Вы будете поддерживать в одно лицо пару-тройку LFS-серверов — это второй вопрос).
Автор ничего не рисует, автор рекламирует свой хостинг. И он не предлагает вырезать NM, он ссылается на то, что он есть в десктопных версиях, а потом вообще без логики перескакивает на systemd network на серверах. Выглядит это так: смотрите, у верблюдов есть горб, поэтому предлагаю отрезать у лошади хвост и посадить вместо него куст черной смородины.
мне так и не удалось подружить на малине systemd-networkd с WiFi с WPA2. Интересно было бы почитать, как умные люди systemd c wpa_supplicant подружили.
НЛО прилетело и опубликовало эту надпись здесь
Ну это понятно. Проблема в том, что wpa_supplicant пишет в лог, что, якобы, интерфейс уже поднят и поднимать его повторно он не хочет(точную формулировку не вспомню). После этого все работает нормально. Поэтому я и написал «подружить»))
На вопрос о дружбе, думаю, уместнее всего ответить скриптом.
Тестировал на Debian 8.

DHCP wireless configuration script
#!/bin/bash

TARGET_DEVICE=wlan0
WIFI_ESSID='<ESSID>'
WIFI_PASSF='<wpapassphrase>'

systemctl disable networking
systemctl disable wpa_supplicant.service
systemctl disable NetworkManager

cat > /etc/systemd/network/21-dhcp-wireless.network << EOF
[Match]
Name=TARGET_DEVICE

[Network]
DHCP=yes
EOF

# Если вдруг отсутствует
cat > /etc/systemd/system/wpa_supplicant@.service << EOF
[Unit]
Description=Interface-specific version of WPA supplicant daemon
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Before=network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I

[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service
EOF

cat > /etc/wpa_supplicant/wpa_supplicant-TARGET_DEVICE.conf << EOF
update_config=1
eapol_version=1
ap_scan=1
fast_reauth=1
EOF

# passphrase будет записан в файле, в том числе, открытым текстом!
wpa_passphrase WIFI_ESSID WIFI_PASSF >> /etc/wpa_supplicant/wpa_supplicant-TARGET_DEVICE.conf

chmod go-rwx /etc/wpa_supplicant/wpa_supplicant-TARGET_DEVICE.conf

rm /etc/resolv.conf 
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

systemctl enable wpa_supplicant@TARGET_DEVICE.service
systemctl enable systemd-networkd.service
systemctl enable systemd-resolved.service
systemctl start wpa_supplicant@TARGET_DEVICE.service
systemctl start systemd-networkd.service 
systemctl start systemd-resolved.service 

Везде позабывал баксы у имён переменных.
Автору — +100500. Век живи — век учись — так придурком и помрешь :-)
Это я о себе.

От себя добавлю (Fedora/CentOS7 (версия CentOS — важно)):
* NetworkManager в CentOS7 реально бесит. Лечится (пока) установкой пакета initscripts, зачисткой пакетов rpmreaper'ом, после чего включаются олдскульные «chkconfig network on» и «service network restart». NM можно удалять. И без всяких systemd (без которого — никак, поэтому Ваш вариант лучше).
* не развернута тема конфликта /etc/rc.d/network и systemd-networkd. Надо будет потыкать палочкой.
У меня на не особо нагруженном CentOS 7 NetworkManager занимает 3.6 МБ

А если сеть не заведется, то что делать, не имея доступа к серверу? Делать бекапы?
иметь консольный доступ наверное
Если «железный» — подключиться через IPMI или BMC
Если виртуальный — ещё проще.
А что насчет примеров настроек 802.1q, qiniq, LAG, route?
LACP+802.1q

Сетевые интерфейсы называются eno{1,2,3,4}


==> eno.network <==
[Match]
Name=eno*

[Link]
MTUBytes=9000

[Network]
Bond=bond1

==> bond1.netdev <==
[NetDev]
Name=bond1
Kind=bond

[Bond]
Mode=802.3ad
LACPTransmitRate=slow
TransmitHashPolicy=layer3+4
MinLinks=1
MIIMonitorSec=1s
UpDelaySec=2s
DownDelaySec=8s

==> bond1.network <==
[Match]
Name=bond1

[Link]
MTUBytes=9000

[Network]
VLAN=l2domru
VLAN=megafon

==> l2domru.netdev <==
[NetDev]
Name=l2domru
Kind=vlan

[VLAN]
Id=900

==> l2domru.network <==
[Match]
Name=l2domru

[Link]
MTUBytes=9000

[Network]
IPForward=yes

[Address]
Address=192.168.170.4/29

[Route]
Destination=172.16.253.0/30
Gateway=192.168.170.2

[Route]
Destination=172.16.254.0/30
Gateway=192.168.170.3

==> megafon.netdev <==
[NetDev]
Name=megafon
Kind=vlan

[VLAN]
Id=910

==> megafon.network <==
[Match]
Name=megafon

[Link]
MTUBytes=1500

[Network]
DNS=4.2.2.4
DNS=77.88.8.8
DNS=8.8.4.4
IPForward=yes

[Address]
Address=x.x.x.x/27

Существовала проблема с bond интерфейсами — bond0 никак не заводился в режиме 802.3ad(не знаю исправили это сейчас или нет), так что лучше начинать с bond1

Он заводится, нужно делать:
modprobe bonding max_bonds=0
Т.к. он не умеет реконфигурять уже созданный bond.

Спасибо

Хотелось бы информацию о том как отлаживать это хозяйство, наверно это сложнее чем классические bash-скрипты.
1. Куда заносится информация о DNS-серверах, автоматически перезаписывается /etc/resolv.conf?
2. DHCP-клиент тянет за собой isc-dhcp-client или используется свой велосипед?
3. Как добавить несколько IP-адресов на один интерфейс, типа как раньше eth0:0 и т.п.?
4. Как добавлять разные VLANы на физический интерфейс?
5. Можно ли в случае проблем просто выключить systemd-networkd и поднять интерфейс руками? (ip addr add и т.д...)
1. Куда заносится информация о DNS-серверах, автоматически перезаписывается /etc/resolv.conf?

Если вы получаете DNS от DHCP или указываете DNS в файлах .network, то конфигурированием занимается демон systemd-resolved; он пишет конфиг в /run/systemd/resolve/resolv.conf, так что необходимо создать симлинк
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

И resolvconf нужно будет удалить.
Спасибо за замечание, это важный момент.

2. DHCP-клиент тянет за собой isc-dhcp-client или используется свой велосипед?

Реализация DHCP своя. Здесь разработчик пишет о производительности реализации.

3. Как добавить несколько IP-адресов на один интерфейс, типа как раньше eth0:0 и т.п.?

Нужно просто добавить несколько строк вида Address= в секцию [Network]
[Network]
Address=192.168.1.2/24
Address=10.23.8.7/16
Gateway=...

Или можно сделать несколько секций [Address] и в каждой из них указать адрес.
Несколько адресов в одной секции [Address] указывать нельзя.
[Network]
Gateway=...

[Address]
Address=10.2.3.4/16

[Address]
Address=10.6.7.8/16


4. Как добавлять разные VLANы на физический интерфейс?

Нужно создать файлы .netdev для ваших vlan'ов:
first-vlan.netdev
[NetDev]
Name=vlan1
Kind=vlan

[VLAN]
Id=1

second-vlan.netdev
[NetDev]
Name=vlan2
Kind=vlan

[VLAN]
Id=2

А в конфиг .network в секцию [Network] вписать строки
VLAN=vlan1
VLAN=vlan2

P.S. Даже, вроде, можно список VLAN'ов указать через пробел
VLAN=vlan1 vlan2


5. Можно ли в случае проблем просто выключить systemd-networkd и поднять интерфейс руками? (ip addr add и т.д...)

Конечно можно.

P.S. «это хозяйство» пишет вполне вразумительные логи, обычно их хватает.
НЛО прилетело и опубликовало эту надпись здесь
Эм. А зачем вообще подобный софт на сервере? Статической конфигурации для сервера более чем достаточно. Зачем держать некий демон в памяти если настройка сети с 99% вероятностью больше не будет менять после перезагрузки?

Наверное затем, что в наши дни и на сервере конфигурация бывает не такой уж статической. Например, срочно понадобился дополнительный сетевой интерфейс — подоткнули Ethernet-USB-свисток, networkd его настроит (если у него есть подходящие правила, конечно).

fuck systemd! это не linux way. одна утилита должна делать делать что-то одно и хорошо.

Спасибо, полезно.


Когда у тебя в хозяйстве исторический зоопарк дистрибутивов, networkd выглядит лучом света в тёмном царстве :-)


P.S.: у вас пара опечаток в листинге, "Adress=" (одна "d").

Ещё к сожаленью не упомянуто о такой интересной фиче как приём и передача LLDP. Очень помогает разобраться, что куда в реальности подключено.

Уважаемый ru_vds, спасибо за статью, и дополнение про resolv.conf. Вы могли бы ответить на следующий вопрос? Появился механизм именования сет. интерфейсов, основанный на физическом месторасположении устройства в слоте, напр: p1p1, em1, em0 и т.д. И вроде как, в этом, участие принимают компоненты systemd. Вроде это как благо, и теперь, при смене железки, не нужно ничего делать руками. Однако, Ваша статья, противоречит этому, снова прибивая всё гвоздями к MAC адресу карточки. Вы можете как-то прокомментировать это? Я как системный администратор уже не понимаю что происходит… Вот поставил я CentOS7, у меня там: em1, em2. Вроде, как-бы теперь должно всё быть динамически. Однако, nmtui, в общем то, так же молотком прибивает mac+имя. В общем, я не понимаю, к чему все эти измнения от eth к em1/p1p1, если всё равно, всё гвоздями колотится?

Спасибо!
И вроде как, в этом, участие принимают компоненты systemd.


В этом принимает участие udev и только он.
Смотрите его рулесы, там есть скрипт /lib/udev/rules.d/80-net-name-slot.rules, назначающий имена интерфейсов по их расположению. Регулируется это созданием/удалением в /etc/udev/rules.d одноимённого со скриптом симлинка на /dev/null
Спасибо Вам за замечание. Сопоставлять конфигурацию сетевому интерфейсу можно массой способов. Привязка к hwaddr для иллюстрации .link конфигов. Можно не создавать .link файлов, а в .network в секции [Match] использовать, например, имена сетвых интерфейсов Name=enp2s0 или Name=wl* (для нескольких сетевых интерфейсов типа wlp1s0). Также в этой секции можно использовать ключ Path=pci-0000:02:00.0-*, или, например привязаться к драйверу (Driver=brcmsmac). Подробнее можете посмотреть здесь.
Огромное спасибо! Будет здорово, если на основе всей ветки коментариев дополнить основную статью.
Хоть тема старая, но все же отпишусь
На CentOS 7 столкнулся с тем что когда я пытаюсь прибить службу к интерфейсу, то после ребута она не работает.
Вот пример логов для redis и nginx
Это два ребута сервера
524:M 27 Feb 14:58:14.421 # Creating Server TCP listening socket 192.168.135.9:16371: bind: Cannot assign requested address
539:M 27 Feb 15:01:20.318 # Creating Server TCP listening socket 192.168.135.9:16371: bind: Cannot assign requested address

Это один ребут
2017/02/27 17:26:12 [emerg] 516#0: bind() to 192.168.135.2:8899 failed (99: Cannot assign requested address)


В итоге имеем не работающую службу после ребута сервера (сервер — виртуальная машина).

Начал смотреть что и как и в итоге набрел вот на такое
cat nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target


Вроде бы стоит After, но оно не отрабатывает как хочется
почитал вот это
https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

и сразу стало понятно что в зависимости надо писать
After=network-online.target
Но писать это для каждого сервиса не очень хочется, кстати тот же zabbix тоже не запускался сразу, но там стоит перезапуск через 10 секунд после неудачи.

В итоге попробовал systemd-network и все заработало из коробки, не пришлось создавать кучу костылей и велосипедов.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий