LINUX.ORG.RU
решено ФорумAdmin

помогите распарсить persistent-net.rules


0

1

Вот допилил debian live(в конфигурации minimal) для роутера.
Стартует это дело с флешки. Работать должно на любом(не старом) компе с двумя сетевухами.

Проблема в том, что иногда(когда сетевухи с разными чипами) имена у них скачут как попало.
И это при том, что МАС у них не меняется между ребутами(читал, что и такое бывает). Просто драйверы грузятся как попало(кстати кто ответит почему?). В логе это видно очень хорошо: то ядро зацепит одну сетевуху, то вторую... ну а что это за роутер у которого WAN интерфейс сегодня в одной дырке, а завтра в другой? )) кароче жЭсть.

Ну была мысль при первом запуске этот самый 70-persistent-net.rules сохранить, а потом подгружать.. но в общем хреть это. ибо задумывалось всё рид онли by design.

Поэкспериментировал немного. работает следующая схема:
1.Загружается система, стартует udev...генерит persistent-net.rules
2.Парсим persistent-net.rules, сортируем имена сетевух по МАС/драйверу/etc..
3.Выгружаем модули сетевух(их имена берутся из persistent-net.rules)
4.Загружаем модули сетевух, ядро генерит события, udev их подхватывает и уже пропускает через подготовленный .rules
5.На выходе имеем воспроизводимый порядок имён сетевух + никакой привязки к конкретному железу(live же всё-таки)

пока эти операции я проводил головой и руками.
мой опыт регулярных выражений ограничивается простенькими grep'ами и шпаргалкой с википедии )

чем бы распарсить это дело и заменить после сортировки NAME?

Формат известый, но напомню:
# PCI device 0x10de:0x0373 (forcedeth)
SUBSYSTEM==«net», ACTION==«add», DRIVERS=="?*", ATTR{address}==«04:4b:80:80:80:03», ATTR{type}==«1», ATTR{ifindex}==«3», KERNEL==«eth*», NAME=«eth1»

# PCI device 0x10de:0x0373 (forcedeth)
SUBSYSTEM==«net», ACTION==«add», DRIVERS=="?*", ATTR{address}==«04:4b:80:80:80:03», ATTR{type}==«1», ATTR{ifindex}==«2», KERNEL==«eth*», NAME=«eth0»
каждая сетевуха - одна строка. над ней камент(оттуда название модуля брать надо).

тут уже grep не очень эффективен, кажется..
на чём-то же должны делаться подобные парсеры. весь линух на текстовых конфигах.

подскажите, чтоб долго не мучался.


1. Пишете какой-нибудь /etc/mac-to-names.conf вида

00:08:00:20:00:30 eth0
00:08:00:20:00:31 eth1
00:08:00:20:00:32 eth2
00:08:00:20:00:33 eth3

2. Пишете дополнительный скрипт - например config-builder, который создает на основании конфигурационного файла с предыдущего шага файл /tmp/70-persistent-net.rules

3. Делаете /etc/udev.d/rules.d/70-persistent-net.rules симлинком на /tmp/70-persistent-net.rules

4. Пишете свой init примерно такого вида

#!/bin/sh
mount /tmp
/path/to/your/config-builder
exec /sbin/init $@

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

>1. Пишете какой-нибудь /etc/mac-to-names.conf вида
пардон, немного не ясно откуда их взять эти маки то?
В принципе идея понятна: проделать всё это ДО udev. И мне эта идея нравится! Это значительно красивее получается. Что-то я вчера уже под утро не сообразил.
Вопрос только в том как получить от ядра список обнаруженных интерфейсов и их аттрибуты для генерации 70-persistent-net.rules?

вопрос к знатокам sysfs? )

dx
() автор топика
Ответ на: комментарий от dx

> Вопрос только в том как получить от ядра список обнаруженных интерфейсов и их аттрибуты для генерации 70-persistent-net.rules?

/sys/class/net/eth*/address

Nao ★★★★★
()
Ответ на: комментарий от Nao

> /sys/class/net/eth*/address

Они появляются уже после загрузки драйверов, а загрузка драйвера приводит к вызову udev (если он уже запущен), а заполнить mac+name нужно до загрузки udev. Впрочем, могу ошибаться.

Nastishka ★★★★★
()
Ответ на: комментарий от dx

> как получить от ядра список обнаруженных интерфейсов

Если вы строите «раутер на флэшке», то вам все равное каждую флэшку гвоздями прибивать к конкретному раутеру.

То есть настройка раутера будет такая:
загрузка
переписывание mac-to-names
перезагрузка

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

да да, всё правильно. я так сразу и сказал:

В принципе идея понятна: проделать всё это ДО udev.


/sys/class/net/eth*/address уже нашел. спасибо.

эксперимент поставил:
снёс нафиг 70-persistent-net.rules, а в скрипт запуска udev вставил cp /sys/devices в папку.
потом идёт вызов udev..
потом сравниваю содержимое этого «бэкапа» и /sys - имена совпадают в /sys и в копии.
потом меняю местами имена в 70-persistent-net.rules,
ребут
сравниваю опять: имена в /sys и в копии созданной до udev различаются.

т.е. концепция 100% правильная и из /sys/ ДО запуска udev можно получить всё необходимое для генерации 70-persistent-net.rules

ну и ещё для себя выяснил, что udev таки меняет /sys раньше я этого не знал.

ща буду скрипт ваять... ))

dx
() автор топика
Ответ на: комментарий от dx

> что udev таки меняет /sys

Он не «меняет /sys», он меняет имя устройства, а sysfs всего лишь показывает текущее состояние :-)

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

ну вообще да. правильно.

dx
() автор топика

да, забыл отписаться.
скрипт сваял, всё работает прекрасно.
пропатчил /etc/init.d/mountkernfs.sh, который теперь после выполнения своей работы вызыывает мой скриптик, который подсовывает удэву 70-persistent-net.rules
сортировку сделал не по мак адресу, а по положению на шине.
иначе на двух одинаковых роутерах положение WAN порта может быть различным(как МАК адрес ляжет), а это дополнтельная заморочка.

dx
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.