1

в системе Ubuntu 12.04 мы хотели бы настроить имена (физических) сетевых интерфейсов (таких как eth0, eth1, ...), используя правила udev, например, сгенерированные в /etc/udev/rules.d/70-persistent-net.rules . Хотя загрузочный носитель доступен только для чтения, мы по-прежнему хотим постоянно (повторно) настраивать эти правила для будущих загрузок (например, после замены сетевой карты). Для устойчивости мы хотели бы сохранить правила на (доступном для записи) локальном жестком диске (отличном от загрузочного носителя только для чтения).

Похоже, проблема в том, как сообщить udev достаточно рано о хранимых правилах: очевидно, это не может произойти до того, как будет смонтирован локальный жесткий диск с сохраненными правилами. Монтирование диска зависит от распознавания udev локального жесткого диска. В то же время udev также распознает сетевые интерфейсы и запускает их настройку (возможно, до того, как вступят в силу правила с локального жесткого диска).

Как правильно инициализировать необходимые инициализации при загрузке?

1 ответ1

1

Наше текущее решение, использующее три новых новых задания, похоже, работает (пожалуйста, прокомментируйте):

  1. Мы используем новую задачу upstart /etc/init/hold-interfaces.conf чтобы отложить настройку сетевых интерфейсов (в заданиях upstart /etc/init/network-interface.conf) до тех пор, пока сохраненные сетевые правила не будут установлены (в /etc/udev/rules.d/71-persistent-net.rules , где /etc/ был перекрыт во время initrd/init с помощью tmpfs для возможности записи).

    # /etc/init/hold-interfaces.conf
    
    start on starting network-interface and started mark-configured
    
    instance holding${INTERFACE:+/}${INTERFACE:-}
    
    task
    
    exec :
    
    • start on условию требует starting network-interface . Это обычный метод, запрещающий запуск задания upstart без изменения существующего файла задания (в данном случае /etc/init/network-interface.conf), ср. Выскочка поваренной книги .

    • Поскольку будут отдельные экземпляры задания network-interface (по одному для каждого интерфейса), также должны быть соответствующие экземпляры hold-interfaces . Следовательно, объявление instance (аналогично тому, которое можно найти в /etc/init/network-interface-security.conf).

    • start on условию также требует started mark-configured . Это указывает на то, что сетевые правила были обновлены и инициализация интерфейсов может продолжаться. Невозможно напрямую ожидать отправления события upstart: такое событие позволит продолжить работу только одному экземпляру hold-interfaces . Рекомендуемый обходной путь - имитировать какое-то постоянное событие, используя выделенное задание upstart, в этом случае /etc/init/mark-configured.conf (см. LP: # 447654).

  2. Новое задание upstart /etc/init/mark-configured.conf постоянно указывает на то, что все файлы конфигурации сети были обновлены:

    start on network-rules-ready
    
    task
    
    exec :
    
    • Для запуска этой работы достаточно одного события, network-rules-ready . После этого, как известно, mark-configured started задания, которая освобождает ожидающие экземпляры hold-interfaces и, следовательно, экземпляры network-interface .
  3. Третье новое задание upstart /etc/init/configure_interfaces.conf устанавливает сетевые правила, останавливает отложенные задания network-interface (поскольку они могут быть запущены с данными конфигурации из старых сетевых правил), генерирует событие release и повторно запускает все события udev добавление сетевого устройства.

    # /etc/init/configure_interfaces.conf
    
    start on local-filesystems
    
    task
    
    script
        find_and_mount_local_hard_disk # abbreviated
        install_stored_rules_and_other_network_configurations # abbreviated
    
        udevadm control --reload-rules
    
        # Stop all active network-interface upstart jobs (with data from old rules)
        stop_active_network_interface_jobs # abbreviated, using: initctl stop network-interface <interface>
    
        # Allow next network-interface jobs
        # (with data from stored rules) to complete.
        initctl emit --no-wait network-rules-ready
    
        # Trigger udev recognition.
        udevadm trigger --action='add' --subsystem-match='net'
    end script
    

В тестовой системе (с тремя сетевыми интерфейсами) это работает. С другой стороны, мы не уверены, может ли он иногда не работать / по крайней мере в других системах:

  1. Есть ли гарантия, что все локальные устройства на жестком диске доступны при find_and_mount_local_hard_disk ?

  2. Существует ли состояние гонки, которое может привести к тому, что некоторые сетевые устройства не будут распознаны? (Например: перед чтением новых правил udev ядро может передать udev новое устройство, чтобы оно запускало network-interface задания upstart, используя старые правила. Это может занять некоторое время, пока выскочка не сможет распознать эту работу для ее остановки. Возможно ли, что в то время как новые правила udev могут быть загружены, остановка заданий network-interface пропускает появляющееся задание, и сигнал network-rules-ready к сетевым правилам посылается так, что устройство позже будет запущено, все еще используя старые атрибуты?)

  3. Как можно откладывать / контролировать задачи upstart /etc/init/network-interface-security.conf ? Должны ли другие задания или события быть отложены / переназначены?

    • Задания /etc/init/network-interface-security.conf должны быть соответственно задержаны, если конфигурации сети, на которые они влияют, установлены достаточно рано (вместе с правилами сети).
    • Кроме того , если какие - либо из проведенных интерфейсов сконфигурировано как auto в /etc/network/interfaces и т.д. / сети / интерфейсах, это задерживает сигнал static-network-up , испускаемый /etc/network/if-up.d/upstart после всех auto интерфейсов до ). Таким образом, большинство зависимых от сети заданий должно быть задержано соответствующим образом, включая запуск сценариев инициализации SysV (запускается /etc/init/rc-sysinit.conf ).
  4. Другие проблемы?

(Есть ли более простой способ отложить настройку всех сетевых устройств (и зависимых задач запуска) с помощью ядра, udev, upstart или других функций до тех пор, пока не будет смонтирован локальный жесткий диск и не вступят в силу новые сетевые правила?)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .