Описание компонента OPKG
Менеджер пакетов opkg
предназначен для расширения возможностей устройств Keenetic путем установки дополнительных пакетов программного обеспечения. С помощью opkg
опытные пользователи могут устанавливать и обновлять модули, не входящие в стандартную прошивку устройства, что позволяет гибко настраивать функциональность роутера для конкретных задач.
В этой статье описаны принципы использования opkg
в KeeneticOS, включая процедуру установки, способы подключения внешних накопителей и рекомендации по использованию пакетов из репозитория.
Для использования открытых пакетов на устройстве должен быть установлен компонент Поддержка открытых пакетов.
Компонент позволит:
добавить команды конфигурации
opkg
,смонтировать файловую систему USB в
/opt
,распаковать файлы
*.ipk
и*.tar.gz
из каталога/opt/install
,выполнить хук-скрипты.
Конфигурация
Команда opkg disk
используется для указания файловой системы /opt
. Файловая система может быть идентифицирована по UUID или метке тома. Например,
(config)>opkg disk OPT_LABEL:
Opkg::Manager: Disk is set to: OPT_LABEL. (config)>system configuration save
Поддерживаются файловые системы NTFS и EXT2/3. После настройки opkg disk
и подключения хранилища компонент opkg
выполнит следующие действия:
Смонтирует файловую систему
OPT_LABEL
в/opt
.Если каталог
/opt/install
существует, распакует все файлы/opt/install/*.ipk
в/opt
. Распаковка должна быть завершена в течение 120 секунд, иначе она будет прервана по истечении времени ожидания.Выполнит
/opt/etc/initrc
.
Хук-скрипты
Скрипты расположены в:
/opt/etc/initrc
— скрипт запуска по умолчанию (может быть определен с помощью командыopkg initrc
),/opt/etc/ndm/*.d/
— обработчики событий.
Каталоги скриптов и переменные среды описаны в соответствующих разделах ниже.
Переменные PATH
и LD_LIBRARY_PATH
предопределены для выбора исполняемых файлов и динамических библиотек из /opt
:
PATH=/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib:/lib:/usr/lib
Префикс /opt
всегда подразумевается в шебанге хука. То есть, как #!/bin/sh
, так и #!/opt/bin/sh
будут запускать интерпретатор /opt/bin/sh
.
Для каждого выполняемого скрипта установлен 24-секундный тайм-аут.
Все хук-скрипты запускаются в одной очереди, т. е. пока /opt/etc/ndm/wan.d/01-one.sh
все еще выполняется, никакие другие скрипты не будут запускаться ни из /opt/etc/ndm/wan.d/
, ни из /opt/etc/ndm/netfilter.d/
.
initrc
Скрипт инициализации /opt/etc/initrc
выполняется после монтирования /opt
. Он может выполнять другие скрипты инициализации, такие как /opt/etc/init.d/*
для запуска фоновых процессов. Если /opt/etc/initrc
отсутствует, компонент OPKG будет выполнять /opt/etc/init.d/*
в алфавитном порядке.
Например, скрипт запуска dropbear может выглядеть следующим образом:
#!/bin/sh if [ ! -d /opt/etc/dropbear ]; then mkdir /opt/etc/dropbear fi if [ ! -f /opt/etc/dropbear/dropbear_dss_host_key ]; then dropbearkey -t dss -f /opt/etc/dropbear/dropbear_dss_host_key fi if [ ! -f /opt/etc/dropbear/dropbear_rsa_host_key ]; then dropbearkey -t rsa -f /opt/etc/dropbear/dropbear_rsa_host_key fi dropbear
Чтобы обеспечить совместимость с системами инициализации типа Sys-V, скрипты /opt/etc/initrc
и /opt/etc/init.d
вызываются с аргументом командной строки start
. Когда пользователь хочет извлечь хранилище /opt
, вызывается скрипт /opt/etc/initrc
с аргументом stop
.
ndm/wan.d
Скрипты событий /opt/etc/ndm/wan.d/
выполняются после установления нового подключения к интернету.
1-й параметр | Описание |
---|---|
| Установлено подключение к интернету |
| Подключение к интернету прервано |
Переменная | Описание |
---|---|
| WAN-интерфейс, например |
| IP-адрес интерфейса |
| Маска подсети интерфейса |
| IP-адрес шлюза WAN |
Когда интернет-соединение отсутствует, скрипты wan.d
выполняются с недоопределенными вышеуказанными переменными.
Если подключение к интернету было установлено до монтирования /opt
, скрипты wan.d
выполняются сразу после initrc
.
ndm/user.d
Скрипты /opt/etc/ndm/user.d
выполняются при обновлении файлов /etc/passwd
и /etc/group
основной системой. Добавьте скрипты в user.d
, если вам нужно изменить файлы /etc/passwd
или /etc/group
. В противном случае любые изменения в этих файлах будут перезаписаны.
Переменная | Описание |
---|---|
| Имя пользователя с доступом к |
Когда пользователь удаляется, скрипты user.d
выполняются с неопределенным $user
.
Например, вы можете создать домашние каталоги с помощью хука user.d
следующим образом:
#!/bin/sh home=/opt/home [ -z "$user" ] && exit 0 # $user is undefined [ -d $home/$user ] && exit 0 # home already exists if mkdir -p $home/$user; then chmod 0755 $home chmod 0700 $home/$user chown $user $home/$user fi
ndm/netfilter.d
Скрипты /opt/etc/ndm/netfilter.d
выполняются, когда система перезаписывает таблицу netfilter. Хуки netfilter.d
способны изменять таблицу с помощью iptables
. Переменные $table
и $type
следует проверять, чтобы избежать дублирования правил.
Переменная | Описание |
---|---|
| Протокол netfilter, например |
| Таблица netfilter, например |
Например, вы можете добавить несколько правил mangle следующим образом:
#!/bin/sh [ "$type" == "ip6tables" ] && exit 0 # check the protocol type in backward-compatible way [ "$table" != "mangle" ] && exit 0 # check the table name iptables -A PREROUTING -i br0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1 iptables -A PREROUTING -i br0 -t mangle -p tcp --dport 23 -j MARK --set-mark 1
ndm/usb.d
Скрипты /opt/etc/ndm/usb.d
выполняются при подключении или отключении устройства USB.
1-й параметр | Описание |
---|---|
| USB-устройство подключено |
| USB-устройство отключено |
Следующие переменные окружения определены для идентификации донгла.
Переменная | Описание | Пример |
---|---|---|
| Путь к устройству |
|
| Имя устройства в |
|
| Путь в sysfs |
|
| Идентификатор модели USB |
|
| Номер порта USB |
|
| Идентификатор производителя USB |
|
Любое устройство, подключенное до запуска скрипта OPKG init, запустит эти скрипты обратного вызова, запланированные для запуска при выполнении скрипта OPKG init.
ndm/fs.d
Скрипты /opt/etc/ndm/fs.d
вызываются при монтировании файловой системы, при подготовке к ее размонтированию или при неожиданном извлечении.
1-й параметр | Описание |
---|---|
| Файловая система смонтирована |
| Файловая система готовится к размонтированию или незапланированно извлечена |
Тип файловой системы может быть любым из следующих: VFAT
, EXFAT
, NTFS
, EXT2
, EXT3
, EXT4
или HFSP
.
Переменная | Описание | Пример |
---|---|---|
| Тип файловой системы |
|
| Идентификатор файловой системы |
|
| Метка файловой системы / раздела |
|
| Каталог монтирования файловой системы (абсолютный путь) |
|
Любая файловая система, смонтированная до выполнения скрипта OPKG init, запустит эти скрипты обратного вызова, запланированные для запуска при выполнении скрипта OPKG init.
ndm/time.d
Скрипты /opt/etc/ndm/time.d
вызываются при изменении системного времени (синхронизация через NTP).
ndm/button.d
Скрипты /opt/etc/ndm/button.d
вызываются при нажатии кнопки FN и/или кнопки (кнопок) WPS.
Переменная | Описание | Пример |
---|---|---|
| Какая кнопка была нажата |
|
| Тип нажатия |
|
Сначала необходимо настроить некоторые параметры в веб-конфигураторе.
ndm/schedule.d
Скрипты /opt/etc/ndm/schedule.d вызываются с запланированными событиями (если расписания определены через CLI).
1-й параметр | Описание |
---|---|
| Начало запланированной задачи |
| Окончание запланированной задачи |
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Название расписания |
| Время (в секундах), затраченное на выполнение действия |
ndm/neighbour.d
Скрипты /opt/etc/ndm/neighbour.d
вызываются при определенных событиях, связанных с соседствующими сетевыми устройствами. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Уникальный идентификатор соседствующего устройства с момента загрузки |
| Действие соседствующего устройства ( |
| Тип обновления (если есть): |
| Семейство адресов — ipv4 или ipv6 |
ndm/ifcreated.d
Скрипты /opt/etc/ndm/ifcreated.d
вызываются при создании интерфейса NDM. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Обозначение интерфейса Linux |
ndm/ifdestroyed.d
Скрипты /opt/etc/ndm/ifdestroyed.d
вызываются при удалении интерфейса NDM. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Обозначение интерфейса Linux |
ndm/ifipchanged.d
Скрипты /opt/etc/ndm/ifipchanged.d
вызываются при изменении IPv4-адреса или подсети интерфейса NDM. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Обозначение интерфейса Linux |
| Новый IPv4-адрес |
| Новая маска сети IPv4 |
| Текущее состояние соединения интерфейса, может быть |
| Текущее состояние подключения интерфейса, может быть |
| Текущее состояние интерфейса, может быть |
| Текущий глобальный приоритет интерфейса, может быть равен нулю для неглобальных интерфейсов и > 0, если интерфейс является глобальным (global) |
ndm/ifip6changed.d (since 4.0)
Скрипты /opt/etc/ndm/ifip6changed.d
вызываются при изменении IPv6-адреса или подсети интерфейса NDM. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Обозначение интерфейса Linux |
| Адрес IPv6 |
| Маска сети IPv6 |
| Текущее состояние соединения интерфейса, может быть |
| Текущее состояние подключения интерфейса, может быть |
| Текущее состояние интерфейса, может быть |
| Текущее действия по изменению, может быть |
| Текущий глобальный приоритет интерфейса, может быть равен нулю для неглобальных интерфейсов и > 0, если интерфейс является глобальным (global) |
ndm/ifstatechanged.d (устарело с версии 4.0, сохраняется только для обратной совместимости)
Скрипты /opt/etc/ndm/ifstatechanged.d
вызываются при изменении состояния интерфейса NDM. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Обозначение интерфейса Linux |
| Текущее состояние соединения интерфейса, может быть |
| Текущее состояние подключения интерфейса, может быть |
| Текущее состояние интерфейса, может быть |
| Источник изменений, может быть |
ndm/iflayerchanged.d (новый и основной с версии 4.0)
Скрипты /opt/etc/ndm/iflayerchanged.d
вызываются при изменении состояния интерфейсного уровня NDM. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Обозначение интерфейса Linux |
| Уровень интерфейса, может быть |
| Текущий статус уровня интерфейса, может быть |
ndm/sms.d
Скрипты /opt/etc/ndm/sms.d
вызываются при получении SMS на интерфейсе UsbQmi. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDM |
| Идентификатор SMS |
Фактическое содержание SMS можно получить с помощью ci/rci (команды ndmq / jq), используя предоставленный интерфейс и идентификаторы сообщений.
ndm/pptp_vpn_up.d
Скрипты /opt/etc/ndm/pptp_vpn_up.d
вызываются, когда пользователь подключается к серверу PPTP VPN. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Имя пользователя |
| Системный интерфейс (обычно vpn*) |
| Внешний IPv4-адрес удаленного узла |
| IPv4-адрес удаленного узла внутри туннеля |
ndm/pptp_vpn_down.d
Скрипты /opt/etc/ndm/pptp_vpn_down.d
вызываются, когда пользователь отключается от сервера PPTP VPN. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Имя пользователя |
| Системный интерфейс (обычно sstp*) |
| Внешний IPv4-адрес удаленного узла |
| IPv4-адрес удаленного узла внутри туннеля |
ndm/l2tp_ipsec_vpn_up.d
Скрипты /opt/etc/ndm/l2tp_ipsec_vpn_up.d
вызываются, когда пользователь подключается к серверу L2TP/IPsec VPN. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
$ndm_opkg_id | Имя пользователя |
$iface | Системный интерфейс (обычно l2tp*) |
$remote | Внешний IPv4-адрес удаленного узла |
$local | IPv4-адрес удаленного узла внутри туннеля |
ndm/l2tp_ipsec_vpn_down.d
Скрипты /opt/etc/ndm/l2tp_ipsec_vpn_down.d
вызываются, когда пользователь отключается от сервера L2TP/IPsec VPN. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Имя пользователя |
| Системный интерфейс (обычно lt2p*) |
| Внешний IPv4-адрес удаленного узла |
| IPv4-адрес удаленного узла внутри туннеля |
ndm/vip_vpn_up.d
Скрипты /opt/etc/ndm/vip_vpn_up.d
вызываются, когда пользователь подключается к серверу Virtual IP VPN. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Имя пользователя |
| Внешний IPv4-адрес удаленного узла |
| IPv4-адрес удаленного узла внутри туннеля |
ndm/vip_vpn_down.d
Скрипты /opt/etc/ndm/vip_vpn_down.d
вызываются, когда пользователь отключается от сервера Virtual IP VPN. Скрипты вызываются с первым параметром ($1
) == hook
.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
Переменная | Описание |
---|---|
| Имя пользователя |
| Внешний IPv4-адрес удаленного узла |
| IPv4-адрес удаленного узла внутри туннеля |
ndm/openvpn-*.d
Скрипты /opt/etc/ndm/openvpn-*.d/
вызываются, когда OpenVPN
в NDMS выполняет скрипт-хук (2.10+, только если установлен и настроен ndm-mod-openvpn
).
Список сценариев:
/opt/etc/ndm/openvpn-up.d/
/opt/etc/ndm/openvpn-tls-verify.d/
/opt/etc/ndm/openvpn-ipchange.d/
/opt/etc/ndm/openvpn-client-connect.d/
/opt/etc/ndm/openvpn-route-up.d/
/opt/etc/ndm/openvpn-client-disconnect.d/
/opt/etc/ndm/openvpn-down.d/
/opt/etc/ndm/openvpn-learn-address.d/
Значение скриптов можно уточнить на официальной странице справочника OpenVPN (раздел SCRIPTING AND ENVIRONMENTAL VARIABLES).
Все переменные окружения, установленные самим OpenVPN (описанные здесь), сохраняются без изменений и передаются хук-скриптам OPKG. Скрипты вызываются с первым параметром ($1
) == hook
. Все аргументы из исходного выполнения хука передаются в качестве дополнительных переменных окружения.
Переменная | Описание |
---|---|
| Идентификатор интерфейса NDMS, например, |
| Количество аргументов в исходном вызове хука |
| Значение аргумента |