Handbook:X86/Networking/Advanced
Расширенная настройка
Переменная config_{interface} (где {interface}
— это имя интерфейса, например, eth0
) — это основа в конфигурации интерфейса. Значение переменной является высокоуровневой инструкцией для конфигурации указанного интерфейса.
Вот список встроенных инструкций:
Значение | Описание |
---|---|
null
|
Ничего не делать. |
noop
|
Если интерфейс работает и у него есть адрес, тогда успешно завершить настройку. |
Адрес IPv4 или IPv6 | Добавить адрес к интерфейсу. |
dhcp , adsl , или apipa (или пользовательское значение из сторонних модулей)
|
Запустить модуль, реализующий команду. Например dhcp запустит модуль, реализующий DHCP (через dhcpcd, dhclient и так далее).
|
Чтобы обработать ошибку команды, можно установить соответствующее значение fallback через переменную fallback_{interface}. Значение должно в точности соответствовать структуре переменной config_{interface}.
Можно соединить эти значения вместе. Вот несколько практических примеров:
/etc/conf.d/net
Примеры конфигурации# Добавление трёх адресов IPv4
config_eth0="192.168.0.2/24
192.168.0.3/24
192.168.0.4/24"
# Добавление адреса IPv4 и двух адресов IPv6
config_eth0="192.168.0.2/24
4321:0:1:2:3:4:567:89ab
4321:0:1:2:3:4:567:89ac"
# Хранит адрес, присвоенный ядром, если интерфейс
# не запустился, иначе назначается другой адрес через DHCP.
# Если DHCP не работает, тогда добавляет статический адрес,
# определяемый APIPA
config_eth0="noop
dhcp"
fallback_eth0="null
apipa"
Для fallback важен порядок! Если опция null не была указана, то
apipa
будет работать только в случае неудачи noop
.При использовании модуля
ifconfig
и добавление более одного адреса, создаются псевдонимы интерфейса для каждого дополнительного адреса. Таким образом, с указанными выше двумя примерами пользователи получат интерфейсы eth0, eth0:1 и eth0:2. Нельзя сделать ничего особенного с этими интерфейсами, так как ядро, и другие программы обрабатывают eth0:1 и eth0:2 как eth0APIPA (руководство) и DHCP (руководство) рассматриваются в разделе Модульное построение сети.
Сетевые зависимости
Init-скрипты в /etc/init.d/ могут зависеть от конкретного сетевого интерфейса или просто от "net". Все сетевые интерфейсы в системе инициализации Gentoo обеспечивают то, что называется "net".
Если в /etc/rc.conf переменная rc_depend_strict установлена в YES
, тогда все сетевые интерфейсы "net" "должны" быть удачно запущены перед тем как зависимости от "net" смогут запуститься. Другими словами, если в системе есть net.eth0 и net.eth1, то они должны быть оба запущены перед тем, как сможет запустится init-скрипт, зависящий от "net".
С другой стороны, если установлено rc_depend_strict="NO"
, тогда "net" зависимость считается разрешенной, в том случае, если хотя бы один сетевой интерфейс удачно поднялся.
Но что по поводу зависимости net.br0 от net.eth0 и net.eth1? от net.eth1, возможно, нужно настроить беспроводное или PPP устройство перед добавлением их в сетевой мост. Это нельзя сделать в /etc/init.d/net.br0, так как это символьная ссылка на net.lo.
Ответ в определении настройки rc_net_{interface}_need в /etc/conf.d/net:
/etc/conf.d/net
Добавление зависимости для net.br0rc_net_br0_need="net.eth0 net.eth1"
Этого, однако, не достаточно, как такового. Сетевые init-скрипты в Gentoo используют виртуальную зависимость, которая называется "net", которая информирует систему о том, что сеть доступна. Очевидно, что и в предыдущем случае, сеть должна быть помечена как доступной, только тогда, когда поднят интерфейс net.br0, а не другие. Таким образом, мы должны написать в /etc/conf.d/net так:
/etc/conf.d/net
Обновление виртуальных зависимостей и положений для сетиrc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"
За подробной информацией о зависимостях обратитесь к разделу о написании init-сценариев Руководства Gentoo.
Имена переменных и значения
Имена переменных динамичны. Как правило, они следуют следующей структуре:{variable}_{interface|mac|essid|apmac}
. Например, переменная dhcpcd_eth0 содержит значение для параметров dhcpcd на интерфейсе eth0, а dhcpcd_essid — значения параметров для dhcpcd при подключении любого из интерфейсов к ESSID «essid».
Тем не менее, нет правил, которые бы говорили, что имена сетевых интерфейсов должны иметь шаблон ethx
. Например, по умолчанию ядро именует беспроводные интерфейсы как wlanx
. Кроме того, некоторым пользовательским интерфейсам, таким как сетевые мосты, можно назначать любое имя. Для того, чтобы сделать жизнь более прекрасной, беспроводным точкам доступа могут быть назначены имена без цифро-буквенных символов - это важно, так как пользователи могут настраивать сеть для конкретной ESSID.
Однако для работы с сетью в Gentoo используются переменные в стиле Bash, а они не могут содержать ничего кроме цифр и символов английского алфавита. Чтобы обойти это ограничение, мы заменяем любой не английский буквенно-цифровой символ на символ _
(подчеркивание).
Также, для некоторых значений переменных Bash необходимо экранирование определённых символов: "
(двойные кавычки), '
(одинарная кавычка) и \
(обратная косая черта). Это можно сделать путем добавления символа «\» (обратная косая черта) перед символами, которые должны быть экранированы.
Например, чтобы определить ESSID My "\ NET
:
/etc/conf.d/net
Имена переменных# это будет работать, но домен не действительный
dns_domain_My____NET="My \"\\ NET"
Настройка выше устанавливает DNS домен в My "\ NET, когда беспроводная карта подключена к точке доступа у которой ESSID My "\ NET.
Именование сетевых интерфейсов
Как это работает
Имена сетевых интерфейсов не выбираются произвольно: ядро Linux и менеджер устройств (в большинстве систем используется Udev в качестве менеджера устройства, хотя могут быть другие варианты) выбирают имя сетевого интерфейса через фиксированный набор правил.
В случае обнаружения сетевой карты в системе, ядро Linux собирает необходимые данные об этой карте. В которые входят:
- Для встроенных (работающие на основной шине (не PCI, актуально для SoC)) регистрируется имя сетевой карты; позже будет видно в ID_NET_NAME_ONBOARD.
- Слот в который подключена сетевая карта; позже будет виден в ID_NET_NAME_SLOT.
- Путь по которому можно получить доступ к сетевой карте; позже будет виден в ID_NET_NAME_PATH.
- MAC-адрес (предоставляемый поставщиком) сетевой карты; позже будет виден в ID_NET_NAME_MAC.
Основываясь на этой информации менеджер устройств определяет как назвать устройство. По умолчанию, он назначает первое значение из первых трех переменных выше (ID_NET_NAME_ONBOARD, _SLOT или _PATH). Например, если ID_NET_NAME_ONBOARD найден и задан как eno1
, тогда интерфейс будет называться как eno1.
Значения переменных для интерфейса можно получить следующей командой udevadm:
root #
udevadm test-builtin net_id /sys/class/net/enp3s0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc. ID_NET_NAME_PATH=enp3s0
Поскольку (а это так и есть), первое значение из трех главных переменных это переменная ID_NET_NAME_PATH, ее значение используется в качестве имени интерфейса. Если ни одна из переменных не содержит значение, то система возвращается к предоставляемой ядром схеме именования (eth0, eth1 и так далее)
Использование именования в старом стиле (ядром)
До введения нового стиля именования сетевым интерфейсам присваивались имена самим ядром Linux на основе того, как были загружены драйвера (именование также зависело от других непонятных причин). Такое поведение все еще может быть включено при помощи настройки net.ifnames=0
как загрузочного параметра в загрузчике.
Использование пользовательских имен
Основная идея пользовательских имен предназначена не для запутывания людей, а сделать изменения имен сетевых интерфейсов проще. Предположим, что в системе имеется два интерфейса, которые обычно называются eth0 и eth1. Один подразумевает доступ к сети через провода, другой подразумевает под собой беспроводной доступ. Если использовать поддержку именования интерфейса, пользователи могли бы называть интерфейсы lan0 (проводной) и wifi0 (беспроводной); что поможет избежать от использования хорошо известных имен eth* и wlan*, так как их именование остается не точным.
Уточните параметры карты и используйте эту информацию для создания правил, чтобы назвать карту как нужно:
root #
udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc.
root #
vim /etc/udev/rules.d/70-net-name-use-custom.rules
# Используется информация о MAC и число 70- , чтобы быть перед другими правилами SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="c8:0a:a9:42:9d:76", NAME="lan0"
root #
vim /etc/udev/rules.d/76-net-name-use-custom.rules
# Затем используется информация из ID_NET_NAME_PATH и число 76- , # чтобы быть между правилами 75-net-*.rules и 80-net-*.rules SUBSYSTEM=="net", ACTION=="add", ENV{ID_NET_NAME_PATH}=="enp3s0", NAME="wifi0"
Поскольку эти правила запускаются до любого правила, которые обычно идут по умолчанию (правила запускаются в алфавитном порядке, поэтому 70 сработает до 80), имена, приведенные в файле правил выше, будут использоваться вместо обычно используемых по умолчанию. Номер в имени файла должен быть между 76 и 79 (переменное окружение определяется правилами, которые начинаются с 75, а запасной вариант присвоения имен делается в правиле 80).