User Tools

Site Tools


ru:doc:uci

Система 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

Портирование UCI на различные Linux дистрибутивы

ru/doc/uci.txt · Last modified: 2013/10/15 16:38 (external edit)