Система UCI
Сокращение UCI значит Unified Configuration Interface и направлен на централизованную настройку OpenWrt. Настройка должна быть простой, понятной и документированной.
Многие программы имеют собственный конфигурационный файл, например /etc/network/interfaces
или /etc/exports
или /etc/dnsmasq.conf
/etc/samba/samba.conf
и иногда они используют несколько отличающуюся структуру синтаксиса. В OpenWRT вам не нужно мучиться с ними, мы только заменяем файлы настроек UCI!
Вам не нужно перезагружать свою систему для изменения настроек! Перейдите по ссылке command.line.utility:,чтобы знать как это делается. И, пожалуйста, не забывайте, что некоторые демоны уже имеются в системе, но по умолчанию они отключены! К примеру, демон cron отключён по умолчанию, следовательно, редактирование crontab не даст результата. Вам необходимо либо запустить демона при помощи /etc/init.d/cron start
или включить его /etc/init.d/cron enable
. Вы можете disable
(отключить), stop
(остановить) и restart
(перезапустить) большинство демонов. Возможно документация по notuci.config поможет вам.
Общие принципы
Централизованная конфигурация OpenWrt находится в нескольких файлах, расположенных в каталоге /etc/config/
. Каждый файл относится к части системы, который он настраивает. Вы можете редактировать файлы конфигурации в текстовом редакторе или с помощью утилиты командной строки uci
, или через различные интерфейсы программирования (например, Shell, Lua и C).
Конфигурационные Файлы
Файл | Описание |
---|---|
Основные | |
/etc/config/dhcp | Конфигурация Dnsmasq и установки DHCP |
/etc/config/dropbear | Опции SSH сервера |
/etc/config/firewall | NAT, пакетная фильтрация, перенаправление портов, и т.д. |
/etc/config/network | Конфигурация коммутатора, интерфейсов и маршрутизатора |
/etc/config/system | Доп. системные настройки |
/etc/config/timeserver | Список серверов времени для rdate |
/etc/config/wireless | Настройки беспроводного подключения и сети wifi |
IPv6 | |
/etc/config/ahcpd | Ad-Hoc Configuration Protocol (AHCP) server and forwarder configuration |
/etc/config/aiccu | AICCU client configuration |
/etc/config/dhcp6c | WIDE-DHCPv6 client |
/etc/config/dhcp6s | WIDE-DHCPv6 server |
/etc/config/gw6c | GW6c client configuration |
/etc/config/radvd | Router Advertisement (radvd) configuration |
Другое | |
/etc/config/bbstored | Конфигурация сервера резервного копирования BoxBackup |
/etc/config/etherwake | Wake-on-Lan: etherwake |
/etc/config/fstab | Точки монтирования и раздел подкачки |
/etc/config/hd-idle | Another idle-daemon for attached hard drives |
/etc/config/httpd | Установки веб-серввера (Busybox httpd, устарело) |
/etc/config/luci | Основные настройки LuCI |
/etc/config/luci_statistics | Настройка пакета статистики |
/etc/config/mini_snmpd | Настройки SNMP демона mini_snmpd |
/etc/config/minidlna | Настройки MiniDLNA |
/etc/config/mjpg-streamer | Настройки потокового вещания для Linux-UVC совместимых веб-камер |
/etc/config/mountd | Настройки демона автомонтирования OpenWrt |
/etc/config/mroute | Конфигурационные файлы для маршрутов мульти-WAN |
/etc/config/multiwan | Конфигурация простого мульти-WAN |
/etc/config/ntpclient | Настройки NTP клиента синхронизации времени |
/etc/config/p910nd | Настройки для без-буферного демона печати p910nd.server |
/etc/config/pure-ftpd | Конфигурация сервера Pure-FTPd |
/etc/config/qos | Реализация QoS для upload |
/etc/config/racoon | Настройки сервиса IPsec racoon |
/etc/config/samba | Настройки сервера SAMBA для шаринга файлов и принтеров сетей Microsoft |
/etc/config/snmpd | Настройки SNMP демона SNMPd |
/etc/config/sshtunnel | Установки пакета sshtunnel |
/etc/config/stund | Настройки сервера STUN |
/etc/config/transmission | Настройки BitTorrent |
/etc/config/uhttpd | Настройки веб-сервера (uHTTPd) |
/etc/config/upnpd | Настройки UPnP сервера miniupnpd |
/etc/config/users | База данных пользователей для различных сервисов |
/etc/config/ushare | Настройки сервера UPnP uShare |
/etc/config/vblade | vblade userspace AOE target |
/etc/config/vnstat | vnstat downloader settings |
/etc/config/wifitoggle | Скрипт для вкл. WiFi кнопкой |
/etc/config/wol | Wake-on-Lan: wol |
/etc/config/wshaper | wondershaper qos script settings |
/etc/config/znc | ZNC bouncer configuration |
Синтакс Файлов
Конфигурационные файлы uci обычно содержат одно или более конфигурационных определений
, которые также называются секциями, в которых содержатся одна или более опций
определений, определяющих фактические значения.
Ниже приведен пример простого конфигурационного файла:
package 'example' config 'example' 'test' option 'string' 'some value' option 'boolean' '1' list 'collection' 'first item' list 'collection' 'second item'
- Утверждение
config 'example' 'test'
определяет начало секции с типомexample
и именемtest
. Секция также может быть анонимной с указанием только типа, без имени секции. Тип необходим для программ обработки для принятия решения о том, как интерпретировать входящие в секциюопции
.
- Строки
option 'string' 'some value'
иoption 'boolean' '1'
определяют простые значения внутри секции. Заметьте, что синтаксически нет разницы между текстовыми и булевскими опциями. По соглашению, булевские опции могут иметь одно из значений '0', 'no', 'off' или 'false' для определения значения 'ложь' или '1' , 'yes', 'on' или 'true' для определения значения 'истина'.
- В строках начинающихся с дескриптора
list
определены опции с множественными значениями. Все определенияlist
, которые используют одинаковое имя (collection
в нашем примере), будут объединены в один список значений в том порядке, в котором они были в конфигурационном файле.
- Наличие отступов в строчках с определениями
option
иlist
является соглашением для улучшения читаемости конфигурационного файла, но синтаксически не обязательно.
Обычно Вам не требуется заключать идентификаторы или значения в кавычки. Кавычки требуются только если заключаемое в них значение содержит символы пробела или табуляции. Также вполне допустимо использовать двойные кавычки (“) вместо одинарных (') при вводе конфигурационных опций.
Все приведенные ниже примеры являются синтаксически корректными в uci:
option example value
option 'example' value
option example “value”
option “example” 'value'
option 'example' “value”
В противовес, следующий пример синтаксически неверен:
option 'example” “value'
(несбалансированность кавычек)option example some value with space
(кавычки отсутствуют вокруг значения)
Важно знать, что идентификаторы UCI и имена конфигурационных файлов могут содержать только символы a-z
, 0-9
и _
. Значения опций могут содержать любые символы (пока они в кавычках).
Утилита Командной Строки (UCI)
Использование awk и grep для парсинга конфигурационных файлов OpenWrt является избыточным, неумным и неэффективным. Вместо этого используйте утилиту uci для получения того что Вам нужно.
Ниже приведено описание, а также некоторые полезные примеры использования этой мощной утилиты. Запомните, друзья не позволяют друзьям парсить собственные конфигурационные файлы!
Когда есть несколько правил, следующих одно за другим, uci использует для них ссылки похожие на адресацию в массивах. Если есть 8-мь серверов NTP, uci позволит Вам ссылаться на их секции как timeserver.@timeserver[0] для первого сервера или timeserver.@timeserver[7] для последнего. Вы также можете использовать отрицательные индексы, как например timeserver.@timeserver[-1]. ”-1“ означает “последний”, ”-2“ предпоследний, и т.д. Это оказывается очень удобно, когда добавляются новые правила к концу списка. См. пример ниже.
Использование
root@OpenWrt:/lib/config# uci
Usage: uci [<options>] <command> [<arguments>] Commands: batch export [<config>] import [<config>] changes [<config>] commit [<config>] add <config> <section-type> add_list <config>.<section>.<option>=<string> show [<config>[.<section>[.<option>]]] get <config>.<section>[.<option>] set <config>.<section>[.<option>]=<value> delete <config>[.<section[.<option>]] rename <config>.<section>[.<option>]=<name> revert <config>[.<section>[.<option>]] Options: -c <path> установка пути поиска конфигурационных файлов (по умолчанию: /etc/config) -d <str> установка разделителя для значений списка в uci show -f <file> использовать для ввода информации содержимое файла <file> вместо стандартного потока stdin -m при импорте, объединение данных в уже существующий пакет -n имя не именованной секции при экспорте (по умолчанию) -N не присваивать имени не именованным секциям -p <path> добавить путь поиска файлов измененной конфигурации -P <path> добавить путь поиска файлов измененной конфигурации и использовать его по умолчанию -q тихий режим (не печатаются сообщения об ошибках) -s строгий режим (останавливаться на ошибках парсинга, используется по умолчанию) -S отключить строгий режим -X не использовать расширенный синтаксис для 'show'
Команда | Цель | Описание |
---|---|---|
commit | [<config>] | Сохраняет изменения данного конфигурационного файла, либо, если он не указан, всех конфигурационных файлов в файловую систему. Все команды “uci set”, “uci add”, “uci rename” и “uci delete” сохраняют результаты во временное хранилище и сохраняются сразу скопом во флэш-память с помощью “uci commit”. Это не нужно делать после редактирования конфигурационного файла в текстовом редакторе, но необходимо для скриптов, GUI и других программ работающих непосредственно с UCI файлами. |
batch | - | Запускает многострочный UCI скрипт, который обычно выполнен в форме here-документа). |
export | [<config>] | Экспорт конфигурации в машино-читаемый формат. Используется внутренне для преобразования конфигурационных файлов в shell-скрипты. |
import | [<config>] | Импорт конфигурационных файлов в синтаксисе UCI. |
changes | [<config>] | Список зарезервированных (пер. но еще не сохраненных) изменений данного конфигурационного файла или, если файл не указан, всех конфигурационных файлов. |
add | <config> <section-type> | Добавить анонимную секцию типа section-type в данную конфигурацию. |
add_list | <config>.<section>.<option>=<string> | Добавить данную строку в существующий список опций. |
show | [<config>[.<section>[.<option>]]] | Отобразить данную опцию, секцию или конфигурацию в компактном виде. |
get | <config>.<section>[.<option>] | Получить значение данной опции или тип данной секции. |
set | <config>.<section>[.<option>]=<value> | Установить значение данной опции, или добавить новую секцию с типом равным указанному значению. |
delete | <config>[.<section[.<option>]] | Удалить данную секцию или опцию. |
rename | <config>.<section>[.<option>]=<name> | Переименовать данную секцию или опцию. |
revert | <config>[.<section>[.<option>]] | Отменить изменения данной опции, секции или конфигурационного файла. |
Примеры:
Нет необходимости рестарта всей системы
После изменения порта, который слушает сервер uhttpd, с 80 на 8080 в файле /etc/config/uhttpd, сохраним изменения. Затем выполним
uci commit uhttpd |
И затем
/etc/init.d/uhttpd restart |
Все сделано. Перезагрузка не требуется.
Экспорт всей конфигурации
root@OpenWrt:~# uci export httpd
package 'httpd'
config 'httpd'
option 'port' '80'
option 'home' '/www'
root@OpenWrt:~# |
Отобразить в древовидном виде данную конфигурацию
root@OpenWrt:~# uci show httpd
httpd.@httpd[0]=httpd
httpd.@httpd[0].port=80
httpd.@httpd[0].home=/www
root@OpenWrt:~# |
Отобразить только значение опции
root@OpenWrt:~# uci get httpd.@httpd[0].port
80
root@OpenWrt:~# |
Адресация в UCI
Рассмотрим следующий пример конфигурационного файла:
# /etc/config/foo
config bar 'first'
option name 'Mr. First'
config bar
option name 'Mr. Second'
config bar 'third'
option name 'Mr. Third'
|
В соответствующих группах адресация эквивалентна:
# Mr. First
uci get foo.@bar[0].name
uci get foo.@bar[-0].name
uci get foo.@bar[-3].name
uci get foo.first.name
# Mr. Second
uci get foo.@bar[1].name
uci get foo.@bar[-2].name
# uci get foo.second.name не работает; метка 'second' не определена.
# Mr. Third
uci get foo.@bar[2].name
uci get foo.@bar[-1].name
uci get foo.third.name
|
Запрос состояния интерфейса
root@OpenWrt:~# uci -P/var/state show network.wan
network.wan=interface
network.wan.ifname=eth0.1
network.wan.proto=dhcp
network.wan.defaultroute=0
network.wan.peerdns=0
network.wan.device=eth0.1
network.wan.ipaddr=10.11.12.13
network.wan.broadcast=255.255.255.255
network.wan.netmask=255.255.255.0
network.wan.gateway=10.11.12.1
network.wan.dnsdomain=
network.wan.dns=10.11.12.100 10.11.12.200
network.wan.up=1
network.wan.lease_gateway=10.11.12.1
network.wan.lease_server=10.11.12.25
network.wan.lease_acquired=1262482940
network.wan.lease_lifetime=5400
network.wan.lease_hostname=x-10-11-12-13
root@OpenWrt:~# |
Добавление правила межсетевого экрана
Это хороший пример, демонстрирующий добавление правила для перенаправления TCP SSH порта и синтаксис отрицательной адресации (-1), используемый в uci (пер. - в данном случае, используется ссылка на последнее добавленное правило).
root@OpenWrt:~# uci add firewall rule
root@OpenWrt:~# uci set firewall.@rule[-1].src=wan
root@OpenWrt:~# uci set firewall.@rule[-1].target=ACCEPT
root@OpenWrt:~# uci set firewall.@rule[-1].proto=tcp
root@OpenWrt:~# uci set firewall.@rule[-1].dest_port=22
root@OpenWrt:~# uci commit firewall
root@OpenWrt:~# /etc/init.d/firewall restart |
Получение IP адреса WAN интерфейса
- Backfire
uci -P/var/state get network.wan.ipaddr
- Trunk (not really uci)
. /lib/functions/network.sh; network_get_ipaddr ip wan; echo $ip
Получение SSID
uci get wireless.@wifi-iface[-1].ssid