Handbook:HPPA/Networking/Advanced
Расширенная настройка
Переменная config_eth0 это основа в конфигурации интерфейса. Это список инструкций высокого уровня для настройки интерфейса (eth0 в данном случае). Каждая команда в списке инструкций выполняется последовательно. Интерфейс считается работоспособным, если хотя бы одна команда работает.
Вот список встроенных инструкций:
Значение | Описание |
---|---|
null
|
Ничего не делать. |
noop
|
Если интерфейс работает и у него есть адрес, тогда успешно завершить настройку. |
Адрес IPv4 или IPv6 | Добавьте адрес к интерфейсу. |
dhcp , adsl , или apipa (или пользовательское значение из сторонних модулей)
|
Запустите модуль, реализующий команду. Например dhcp запустит модуль, реализующий DHCP, который может обслуживаться dhcpcd, dhclient или pump.
|
Если команда не выполняется, укажите значение для fallback. fallback вариант должен строго соответствовать структуре конфигурации.
Можно соединить эти значения вместе. Вот несколько практических примеров:
# Добавление трёх адресов 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"
При использовании модуля
ifconfig
и добавление более одного адреса, создаются псевдонимы интерфейса для каждого дополнительного адреса. Таким образом, с указанными выше двумя примерами пользователи получат интерфейсы eth0, eth0:1 и eth0:2. Нельзя сделать ничего особенного с этими интерфейсами, так как ядро, и другие программы обрабатывают eth0:1 и eth0:2 как eth0Для fallback важен порядок! Если опция null не была указана, то
apipa
будет работать только в случае неудачи noop
.APIPA и DHCP будут рассмотрены позже.
APIPA (руководство) и 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:
rc_net_br0_need="net.eth0 net.eth1"
Этого, однако, не достаточно, как такового. Сетевые init-скрипты в Gentoo используют виртуальную зависимость, которая называется "net", которая информирует систему о том, что сеть доступна. Очевидно, что и в предыдущем случае, сеть должна быть помечена как доступной, только тогда, когда поднят интерфейс net.br0, а не другие. Таким образом, мы должны написать в /etc/conf.d/net так:
rc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"
За подробной информацией о зависимостях обратитесь к разделу о написании init-скриптов в Gentoo Handbook. Больше информации о /etc/rc.conf доступно в виде комментариев в самом файле.
Имена переменных и значения
Имена переменных динамичны. Как правило, они следуют следующей структуре variable_${interface|mac|essid|apmac}
. Например, переменная dhcpcd_eth0 содержит значение для опций dhcpcd на интерфейсе eth0, а dhcpcd_essid содержит опции для dhcpcd при подключении любой из интерфейсов к ESSID "essid".
Тем не менее, нет жестких правил, которые бы говорили, что имена сетевых интерфейсов должны называться ethx. Многие беспроводные интерфейсы называются как wlanx или rax на ряду с ethx. Кроме того, некоторым пользовательским интерфейсам, таким как сетевые мосты, можно назначать любое имя. Для того, чтобы сделать жизнь более прекрасной, беспроводным точкам доступа могут быть назначены имена без цифро-буквенных символов - это важно, так как пользователи могут настраивать сеть для конкретной ESSID.
Недостаток в этом всем то, что Gentoo использует переменные баш для работы с сетью, а баш не может ничего использовать за пределами английского алфавита и цифр. Чтобы обойти это ограничение, мы заменяем любой не английский буквенно-цифровой символ на символ _ (подчеркивание).
Другой недостаток баш проявляется в содержании переменных; некоторые символы должны быть экранированы. Это можно сделать путем добавления \ (обратного слэша) перед символами, которые должны быть экранированы. Ниже приведен список символов, которые должны быть экранированы таким образом: ", ' и \.
В это примере мы использовали беспроводной ESSID, поскольку они могут содержать большое количество символов. Мы будем использовать идентификатор ESSID My "\ 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).