Вопрос или проблема
У меня установлена 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
, значит система распознает ваш скрипт как часть автозагрузки. Однако, интерфейс не создаётся после перезагрузки.
Потенциальные причины
- Инициализация до завершения других служб: Возможно, ваш сервис стартует до завершения всех необходимых служб, таких как сеть. Например, интерфейс может не создаваться, потому что служба сети еще не активирована.
- Отсутствие вызова в стадии boot: Необходимо добавить функцию
boot
, которая будет вызыватьstart
.
Решение
-
Добавление функции 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!" }
-
Переупорядочиванние приоритетов старта:
Убедитесь, что командующий номер вашей службыSTART
достаточно велик, чтобы гарантировать, что она запускается после сетевых служб. Это показано в вашем скрипте (START=99), но вы можете также проверить/etc/rc.d
, чтобы убедиться, что порядок правильный. -
Логирование и отладка: Для более детальной диагностики проблем, добавьте логирование в скрипт, чтобы записывать ошибки или вывод команды
iw
в файл:iw phy phy0 interface add mon0 type monitor 2>> /var/log/iw_error.log
Итог
Добавление блока boot()
и возможная корректировка порядка выполнения могут решить вашу проблему. Не забудьте протестировать скрипт на предмет синтаксических ошибок и убедиться, что все необходимые зависимости загружены перед запуском вашей службы.
Напишите в надежде, что вы сможете успешно настроить автоматизацию задач на вашем устройстве с OpenWRT!