Не удается добавить служебный процесс запуска в openWRT из init.d

Вопрос или проблема

У меня установлена OpenWrt на TP-Link TL-WA901N/ND v3. У меня не установлен пакет luci, потому что не хватает места, поэтому я могу делать все только через командную строку.

То, что я пытаюсь сделать, — это создать интерфейс mon0 при запуске и запустить tcpdump на нем. Я создал файл в /etc/init.d и назвал его monitor. Файл monitor содержит следующее:

#!/bin/sh /etc/rc.common

# чтобы начать после того, как /etc/init.d/network запущен, и остановиться после его остановки
START=99
STOP=1

start(){
    # пробовал с и без следующих двух строк
    include /lib/network
    scan_interfaces

    iw phy phy0 interface add mon0 type monitor
    ifconfig mon0 up
    echo "mon0 is up!"
}
stop(){
    ifconfig mon0 down
    iw mon0 del
    echo "mon0 is down!"
}

затем я выполняю следующую команду

/etc/init.d/monitor enable

и в /etc/rc.d я вижу S99monitor и K1monitor, но когда я перезагружаю, я не вижу интерфейс mon0, созданный при выполнении ifconfig.

Это работает, если я вручную запускаю его с помощью

/etc/init.d/monitor start

Я также пытался добавить приведенную выше команду в /etc/rc.local, но ничего не изменилось.

Что я делаю не так?

Я полагаю, вы забыли добавить секцию

boot(){
start
}

Ответ или решение

Чтобы создать стартап-сервис в OpenWRT на устройстве TP-Link TL-WA901N/ND v3 без использования LuCI, необходимо использовать командную строку (CLI). У вас есть скрипт в /etc/init.d, который запускает интерфейс mon0 и tcpdump во время старта. Однако проблема возникает в том, что интерфейс mon0 не появляется после перезагрузки, хотя он работает при ручном запуске службы.

Анализ проблемы

Ваш скрипт инициализации правильно создаёт службу и добавляет её в автозагрузку. Вы видите символические ссылки S99monitor и K1monitor в каталоге /etc/rc.d, значит система распознает ваш скрипт как часть автозагрузки. Однако, интерфейс не создаётся после перезагрузки.

Потенциальные причины

  1. Инициализация до завершения других служб: Возможно, ваш сервис стартует до завершения всех необходимых служб, таких как сеть. Например, интерфейс может не создаваться, потому что служба сети еще не активирована.
  2. Отсутствие вызова в стадии boot: Необходимо добавить функцию boot, которая будет вызывать start.

Решение

  1. Добавление функции boot: Добавьте функцию boot в ваш скрипт, которая будет вызывать функцию start. Это необходимо, потому что OpenWRT использует стадии init во время загрузки, и boot() позволяет определить поведение на самой стадии загрузки.

    Пример вашего скрипта может выглядеть так:

    #!/bin/sh /etc/rc.common
    
    START=99
    STOP=1
    
    boot() {
       start
    }
    
    start() {
       iw phy phy0 interface add mon0 type monitor
       ifconfig mon0 up
       echo "mon0 is up!"
    }
    
    stop() {
       ifconfig mon0 down
       iw mon0 del
       echo "mon0 is down!"
    }
  2. Переупорядочиванние приоритетов старта:
    Убедитесь, что командующий номер вашей службы START достаточно велик, чтобы гарантировать, что она запускается после сетевых служб. Это показано в вашем скрипте (START=99), но вы можете также проверить /etc/rc.d, чтобы убедиться, что порядок правильный.

  3. Логирование и отладка: Для более детальной диагностики проблем, добавьте логирование в скрипт, чтобы записывать ошибки или вывод команды iw в файл:

    iw phy phy0 interface add mon0 type monitor 2>> /var/log/iw_error.log

Итог

Добавление блока boot() и возможная корректировка порядка выполнения могут решить вашу проблему. Не забудьте протестировать скрипт на предмет синтаксических ошибок и убедиться, что все необходимые зависимости загружены перед запуском вашей службы.

Напишите в надежде, что вы сможете успешно настроить автоматизацию задач на вашем устройстве с OpenWRT!

Оцените материал
Добавить комментарий

Капча загружается...