В настоящее время значительная (если не бОльшая) часть компьютеров с Linux
имеет подключение к сети, которое обрабатывается системой конфигурации.
Под конфигуратором сети в данном случае понимается программная часть (набор сценариев
и программ), обрабатывающая собственно настройки конкретной Linux-системы. Конфигуратор
должен позволять
оперировать состоянием системы уровнем понятий "включить/выключить поддержку сети",
"сконфигурировать/расконфигурировать сетевой интерфейс вручную", "отреагировать на
сетевой интерфейс с горячим подключением".
Основные широко применяющиеся системы
конфигурации сети Linux — RedHat initscripts и Debian /etc/network (и наследованные
от них). В ALTLinux основная используемая система — net-scripts
(ответвление от RedHat initscripts). Периодически я сталкивался с ситуациями,
когда штатных средств net-scritps было недостаточно для требуемой конфигурации.
Иногда проблему удаётся решить в обход штатных средств путём добавления в rc.local
дополнительных команд, но при
рестарте сети или системы эти настройки зачастую оказываются потерянными. Ещё один
недостаток состоит
в том, что добавление поддержки нового типа сетевых интерфейсов как правило
требует очередной копии одного и того же shell-кода и не всегда полностью
отражает специфику конкретного типа интерфейса.
В результате анализа существующих конфигурационных утилит и возникающих задач
была начата разработка новой системы конфигурации /etc/net (etcnet)
для полноценного использования современных возможностей Linux. Часть решений мигрировала
из числа оригинальных дополнений к net-scripts из ALTLinux. Исходный код
публикуется на домашней странице проекта.
В initscripts долгое время использовался устаревший метод конфигурации через ifconfig и route. В RedHat enterprise Linux сейчас также используется iproute2, но в пределах сравнимой со старой функциональности и общей логики. Логика работы etcnet разрабатывалась с ориентацией на современные средства конфигурации.
Большая часть параметров, необходимых для конфигурации, но не влияющих на
работу программной части, хранится непосредственно в форме аргументов командной
строки. К таким параметрам относятся IP-адреса, маршруты, параметры канального
уровня, беспроводные расширения. Это позволяет без дополнительных
затрат вроде массивов перменных или дополнительных файлов оперировать
множественными параметрами (несколько адресов, несколько
маршрутов), оставляя в то же время возможность использования тех опций
вспомогательных программ, которые на момент разработки отсутствовали.
С другой стороны, реализация синтаксической и семантической проверок аргументов,
хранящихся в таком виде, затруднена, это не следует забывать при практическом
использовании etcnet.
Ещё одно отличие — почти вся относящаяся к одному сетевому интерфейсу
конфигурация собрана в одном каталоге, имя которого и определяет имя
интерфейса. Каталоги с конфигурациями хранятся отдельно от сценариев, что
облегчает резервное копирование, восстановление и миграцию конфигураций.
Единственной общей частью являются несколько файлов глобальных настроек.
Возможно, в последующих версиях размещение файлов будет доведено до полного
разделения на конфигурацию и сценарии.
etcnet изначально проектировалась так, чтобы интерфейсам можно было присваивать любые имена. Я неоднократно сталкивался со следующими ситуациями: при замене одного аппаратного интерфейса из нескольких идентичных их имена могут произвольным образом назначиться в другом порядке, что безусловно неприемлемо для маршрутизаторов. Обязательно должен быть механизм, позволяющий максимально точно сохранить имена интерфейсов при аппаратных изменениях. В etcnet этим механизмом является набор критериев утилиты ifrename, который позволяет привязывать имя интерфейса не только к MAC-адресу, но и к адресу карты на шине PCI, загруженному модулю ядра и другим переметрам. Этот механизм использован и для сменных интерфейсов.
Кроме упомянутых множественных адресов и маршрутов специально был реализован
режим компактной конфигурации подинтерфейсов Ethernet VLAN. Если в системе
требуется быстрая и простая конфигурация множества VLAN-интерфейсов, то для
этого теперь можно использовать 1 строку на интерфейс в единственном файле.
Это должно упростить как ручное редактирование, так и автоматическую генерацию
конфигураций.
Аналогично также можно сконфигурировать несколько адресов на интерфейсе: если
раньше для каждого адреса приходилось заводить отдельный файл, то теперь
каждый дополнительный адрес — одна дополнительная строка в файле.
etcnet поддерживает профили конфигурации, которые могут быть сконфигурированы несколькими способами. Кроме того, возможна активация другого профиля во время работы системы. Различия между профилями в силу наследования настроек могут меняться от незначительных вариаций одной и той же конфигурации до полностью различных конфигураций. Дополнительно к этому существует механизм назначения профиля в результате вызова внешних программ. В комбинации эти решения позволяют строить достаточно динамичные конфигурации в пределах одной и той же системы управления.
Все файлы располагаются в каталоге /etc/net. В нём располагаются
файлы глобальной конфигурации, каталог со сценариями (/etc/net/scripts)
и каталог с настройками /etc/net/ifaces. Необходимо отметить, что
для каждого интерфейса обязательно определён его тип, который либо вычислен из
имени, либо явно определён в конфигурации. На основании типов при общем старте
формируется порядок конфигурации интерфейсов. Например, для запуска
bonding-интерфейса необходимо, чтобы подчинённые интерфейсы уже были созданы и
сконфигурированы. При простейшей обработке по алфавиту будет сначала предпринята
попытка обработать bond0, так как он лексикографически меньше eth0 и eth1. Без
отсутствия строгой типизации этот конфликт можно решить только в частном
порядке, как это сделано в initscripts RHEL:
# master device?
if [ "${TYPE}" = "Bonding" ] || ethtool -i $DEVICE | grep -q "driver: bonding" ; then
/sbin/ip link set dev ${DEVICE} up
for device in `fgrep -l "MASTER=${DEVICE}" /etc/sysconfig/network-scripts/ifcfg-*` ; do
/sbin/ifup ${device##*/}
done
fi
Этот код обрабатывает всего один частный случай и не будет работать для, например, TEQL-интерфейсов. Но что делать, если необходимо создать интерфейс aaa0, который будет являться VLAN-интерфейсом для eth0, но при такой схеме обработается (ошибочно) до создания родительского интерфейса? В etcnet эта неопределённость уменьшена за счёт типов интерфейсов, каждый из которых включает один или более видов, к которым в свою очередь уже принадлежат конкретные интерфейсы (не все из приведённых видов поддерживаются на момент публикации этого доклада):
Видно, что если обрабатывать интерфейсы в указанном порядке, то большинство
проблем, вызванных лексикографическим порядком обработки, исчезнет. Для полного
решения проблемы зависимости также запланирован механизм административного
назначения порядка инициализации и зависимостей внутри логической группы.
Если по имени интерфейса нельзя определить его тип, то тип обязательно должен
быть указан в конфигурационном файле. Это жёсткое требование etcnet.
Следующей важной частью общей логики работы является порядок
конфигурации интерфейса. Он разработан таким образом, чтобы все типы и виды
интерфейсов обрабатывались по одному общему принципу. Основные действия выполняются
в сценарии /etc/net/scripts/ifup-common, который вызывается из
сценариев /etc/net/scripts/ifup для обычных интерфейсов и
/etc/net/scripts/ifup-removable для интерфейсов с горячим подключением
(в последнем случае вызов происходит из агентов сменных устройств).
Упрощённый алгоритм работы ifup-common выглядит следующим образом:
Указанная последовательность предоставляет два важных преимущества: во-первых, опции могут наследоваться на нескольких уровнях; во-вторых, этот порядок позволяет при необходимости выполнять для конкретного вида или типа интерфейса необходимые действия в ключевых моментах процесса конфигурации. За счёт этого etcnet формируется как гибкая система с разумными параметрами по умолчанию.
Рассмотрим два примера.

/etc/net/ifaces/eth0/options
MODULE=3c59x
/etc/net/ifaces/eth0/ipv4address
10.0.0.1/24
/etc/net/ifaces/eth0/ipv4route
default via 10.0.0.254Если в файле
/etc/modules.conf уже определён alias для eth0, то можно
обойтись и без файла options, так как вид интерфейса может быть определён из
его имени.

/etc/net/iftab: в этом файле определена привязка имён
интерфейсов к MAC-адресам, так как используются 3 одинаковых карты. Интерфейсам
присвоены осмысленные названия.
uplink1 mac 00:04:61:52:0b:aa uplink2 mac 00:04:61:52:0b:ab lan mac 00:04:61:52:0b:ac
/etc/net/vlantab: добавочные VLAN-интерфейсы
lan 2 AUTO 10.0.200.254/24 lan 3 AUTO 10.0.201.254/24
/etc/net/ifaces/uplink1/options: минимально достаточные опции для
интерфейса uplink1
TYPE=eth MODULE=3c59x
/etc/net/ifaces/uplink1/ipv4address: адрес для uplink1
100.100.100.101/30
/etc/net/ifaces/uplink1/ipv4route: маршруты для таблицы net100
prohibit 10.0.200.0/24 table net100 prohibit 10.0.201.0/24 table net100 default via 100.100.100.102 table net100
/etc/net/ifaces/uplink1/ipv4rule
add from 10.0.100.0/24 table net100
/etc/net/ifaces/uplink2/options
TYPE=eth MODULE=3c59x
/etc/net/ifaces/uplink2/ipv4address
200.200.200.201/30
/etc/net/ifaces/uplink2/ipv4route
prohibit 10.0.100.0/24 table net200 prohibit 10.0.101.0/24 table net200 default via 200.200.200.202 table net200
/etc/net/ifaces/uplink2/ipv4rule
add from 10.0.200.0/24 table net200 add from 10.0.201.0/24 table net200
/etc/net/ifaces/lan/options
TYPE=eth MODULE=3c59x
/etc/net/ifaces/lan/ipv4address
10.0.100.254/24
/etc/net/ifaces/tunnel101/options
TYPE=iptun PHYSLOCAL=100.100.100.101 PHYSREMOTE=100.100.101.101
/etc/net/ifaces/tunnel101/ipv4address
10.0.0.1 peer 10.0.0.2/32
/etc/net/ifaces/tunnel101/ipv4route
10.0.101.0/24 via 10.0.0.2 table net100 prohibit 10.0.200.0/24 table net101 prohibit 10.0.201.0/24 table net101 prohibit default table net101
/etc/net/ifaces/tunnel101/ipv4rule
add from 10.0.101.0/24 table net101
Замечание: в примере сознательно допущено несколько ошибок. Для полностью корректной конфигурации необходимо расширить конфигурацию интерфейсов для сетей 10.0.200.0/24 и 10.0.201.0/24 в полную нотацию с дополнительными правилами маршрутизации или использовать iptables для разделения сетей.
Конечно, учитывая нестандартный подход и разнообразие опций, в первую очередь etcnet предназначен для опытных сетевых администраторов. Тем более, так как процесс разработки продолжается (возможны ошибки в коде, смена путей и названий файлов, значений переменных), следует уметь оценивать риски от возможных сбоев в работе как при первом ознакомлении с пакетом, так и при смене версий. В то же время в текущей версии пакет может быть успешно использован (и используется) на некоторых системах. В настоящий момент etcnet рекомендуется сетевым администраторам, которым не хватает возможностей стабильных прототипов для настройки сложных маршрутизаторов. Это позволит им ознакомиться с вероятной штатной системой сетевой конфигурации в ALTLinux поколения 3.0.
Так как конфигурация сети является одной из базовых составляющих дистрибутива Linux,
etcnet нельзя просто установить и использовать. Потребуются некоторые изменения в
системе и некоторых программах.
В ходе разработки были изготовлены патчи для пакетов wireless-tools и pcmcia-cs. В
первом случае была модифицирована утилита ifrename, во втором решена проблема с тем,
что cardmgr не отслеживал смену имени интерфейса. Оба патча будут включены в дерево
разработки Sisyphus. Также следует иметь в виду, что сценарии используют некоторые
функции, которые специфичны для ALTLinux, на других дистрибутивах работоспособность
будет проверяться только накануне стабильного релиза. Ещё один момент — выявленная
ошибочная обработка событий вставки и извлечения сетевых карт смешанного типа, когда
hotplug взаимодействует с cardmgr. Эта проблема после исследования скорее всего также
потребует дополнительного патча.
В ближайших планах реализация следующей функциональности: PPP-интерфейсы и обработка внутритиповых зависимостей. Срок выхода стабильного релиза не определён, но подразумевается достаточныйм для тестирования и интеграции с дистрибутивами ALTLinux.