Менеджер пакетів opkg
Як і більшість дистрибутивів Linux (або мобільних ОС, таких як Android чи iOS), функціональність системи OpenWrt може бути значно розширена шляхом завантаження і встановлення готових пакетів із локальних або віддалених репозиторіїв.
Утиліта opkg
— це легкий менеджер пакетів, який використовується для цієї мети.
opkg — це форк ipkg
, менеджера пакетів із NSLU2 Optware(архів), створеного для додавання ПЗ до прошивок вбудованих пристроїв.
На відміну від ipkg, який додає ПЗ лише в окрему директорію (наприклад, /opt
), Opkg є повноцінним менеджером для файлової системи root, включаючи модулі ядра і драйвери.
opkg іноді називають Entware, оскільки його також використовує репозиторій Entware для вбудованих пристроїв (форк спільноти OpenWrt).
Менеджер opkg
намагається самостійно розв’язувати залежності з репозиторіїв — якщо це не вдається, буде виведена помилка і установка пакета буде скасована.
Відсутні залежності для сторонніх пакетів можуть бути доступні в джерелі самого пакета.
Щоб ігнорувати помилки залежностей, використовуйте прапор --force-depends
.
Якщо ви використовуєте snapshot / trunk / bleeding edge версію, встановлення пакетів може завершитись помилкою, якщо версія ядра новіша за ту, для якої зібрані пакети.
У такому випадку ви побачите повідомлення “Cannot satisfy the following dependencies for…”.
Рекомендується використовувати Image Builder, щоб створити прошивку з усіма потрібними пакетами.
У версіях trunk/snapshot пакети ядра та модулі позначаються як hold, тому команда
opkg upgrade
їх не оновлює.
Виклик
# opkg opkg must have one sub-command argument: usage: opkg [options...] sub-command [arguments...] where sub-command is one of:
Підтримуються шаблони (glob patterns).
Операції з пакетами
update | Оновити список доступних пакетів Це просто завантажує файл типу приклад для вашої архітектури та зберігає його в RAM-директорії /tmp/opkg-lists . У LEDE 17.01 після оновлення цей каталог займає приблизно 450 КіБ.OPKG використовує вміст цієї папки для встановлення/оновлення пакетів або виводу інформації про них. Ви можете безпечно видалити її вміст у будь-який момент для звільнення памʼяті (вміст також видаляється після перезавантаження), але не забудьте повторно виконати opkg update перед встановленням нового пакета. |
upgrade <пакети> | Оновити пакети Щоб оновити кілька пакетів, виконайте: opkg upgrade назва1 назва2 .Список доступних оновлень можна отримати командою opkg list-upgradable .------------ Рекомендується перевірити доступний обсяг флеш-памʼяті перед оновленням системних пакетів. Пакети, які ви самі встановлювали, не мають цієї проблеми — вони вже у розділі з можливістю запису, тому нова версія просто замінить стару. Але перевірка обсягу перед оновленням ніколи не завадить. Як правило, пристрої з 8 МБ і більше флеш-памʼяті без додаткових пакетів не матимуть проблем з оновленням системних пакетів. А пристрої з налаштованим Extroot взагалі не мають проблем із простором. Щоб перевірити вільне місце: у SSH введіть df -h / або зайдіть у LuCI → Система → Програмне забезпечення.Щоб перевірити розмір пакета перед оновленням, використовуйте opkg info назва-пакета або перегляньте таблицю в LuCI, або у Таблиці пакетів на вікі.Зверніть увагу: “size” в opkg — це стиснутий розмір архіву, але у read-write розділі (jffs2/ubifs) буде застосовано аналогічне стиснення, тому розмір при встановленні буде подібний. |
install <пакети|url> | Встановити пакети Приклади: opkg install hiawatha opkg install http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/hiawatha_7.7-2_ar71xx.ipk opkg install /tmp/hiawatha_7.7-2_ar71xx.ipk |
configure <пакети> | Налаштувати розпаковані пакети |
remove <пакети|шаблон> | Видалити пакет(и) |
flag <прапор> <пакети> | Позначити один або кілька пакетів. Дозволено лише один прапор за раз. Доступні прапори: hold • noprune • user • ok • installed • unpacked |
Інформаційні команди
list [пакет|шаблон] | Список доступних пакетівНазва - Версія - Опис (опис може містити переноси рядків — простий grep не підійде) |
list-installed | Показати встановлені пакети |
list-upgradable | Показати встановлені та оновлювані пакети |
list-changed-conffiles | Показати конфігураційні файли, змінені користувачем |
files <пакет> |
opkg files asterisk18 ... /usr/sbin/asterisk /etc/asterisk/sip.conf ...
|
search <файл|шаблон> | Знайти пакет, який встановив файл |
info [пакет|шаблон] |
Package: horst Version: 2.0-rc1-2 Depends: libncurses Size: 19224 Description: [horst] — сканер Wi-Fi мереж у режимах IBSS/Ad-Hoc/Mesh
Примітка: поле Size — це стиснутий розмір пакета. Але розділ JFFS2 також використовує стиснення. |
status [пакет|шаблон] | Показати статус пакету |
download <пакет> | Завантажити пакет у поточну директорію |
compare-versions <v1> <op> <v2> | Порівняння версій за допомогою операторів: <= , < , >= , = , << , >> |
print-architecture | Показати підтримувані архітектури |
whatdepends [-A] [назва|шаблон] | Показати пакети, які залежать від вказаного |
whatdependsrec [-A] [назва|шаблон] | Рекурсивно показати залежні пакети |
whatprovides [-A] [назва|шаблон] | Показати пакети, які надають вказаний функціонал |
whatconflicts [-A] [назва|шаблон] | Показати конфлікти з пакетом |
whatreplaces [-A] [назва|шаблон] | Показати пакети, які замінюють вказаний |
Параметри запуску
Опція | Довгий варіант | Опис |
---|---|---|
-A | Працювати з усіма пакетами, а не лише встановленими | |
-V[<рівень>] | --verbosity[=<рівень>] | Встановити рівень виводу: 0 – лише помилки 1 – стандартні повідомлення (типово) 2 – інформаційні 3 – дебаг 4 – дебаг розширений |
-f <файл> | --conf <файл> | Використовувати файл конфігурації замість /etc/opkg.conf |
--cache <каталог> | Використовувати кеш пакетів | |
-d <dest> | --dest <dest> | Використовувати <dest> як корінь для встановлення/видалення |
-o <каталог> | --offline-root <каталог> | Встановлення пакетів в офлайн-режимі |
--add-arch <арх>:<пріоритет> | Додати архітектуру з пріоритетом | |
--add-dest <назва>:<шлях> | Додати пункт призначення зі шляхом |
Параметри примусу | ||
---|---|---|
--force-depends | Ігнорувати помилки залежностей | |
--force-maintainer | Перезаписувати наявні конфіги | |
--force-reinstall | Перевстановити пакет | |
--force-overwrite | Перезаписати файли інших пакетів | |
--force-downgrade | Дозволити пониження версії | |
--force-space | Ігнорувати перевірку вільного місця | |
--force-checksum | Ігнорувати невідповідність checksum | |
--force-postinstall | Запуск postinstall скриптів навіть офлайн | |
--noaction | Лише перевірка без дій | |
--download-only | Лише завантаження без встановлення | |
--nodeps | Не обробляти залежності | |
--force-removal-of-dependent-packages | Видалити пакет і всі залежні | |
--autoremove | Видалити пакети, встановлені автоматично | |
-t | --tmp-dir | Вказати тимчасовий каталог |
Приклади
Основне
# Встановлення пакету opkg update opkg install <пакет> # Список пакетів opkg list # Інформація про пакет opkg info <пакет>
Додатково
Можна використовувати шаблони (glob) та регулярні вирази з grep/awk/sed:
opkg list | grep -e <шаблон1> -e <шаблон2> opkg list | awk -e '/<шаблон>/{print $0}' opkg info kmod-nf-* | awk -e '/length/{print $0}' opkg list-installed | awk -e '{print $1}' | tr '\n' ' ' for pkg in <пакет1> <пакет2>; do opkg info ${pkg}; done opkg depends dropbear
Оновлення пакетів
Масове оновлення всіх пакетів не рекомендується. Є високий ризик пошкодити систему. Будьте готові до відновлення в failsafe режимі.
# Оновити всі встановлені пакети opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade
Конфігурація
Основний файл конфігурації: /etc/opkg.conf
Приклад вмісту:
dest root / dest ram /tmp lists_dir ext /var/opkg-lists option overlay_root /overlay
Цей файл задає:
- кореневу директорію (
/
) - RAM-диск (
/tmp
) - директорію для списків пакетів (
/var/opkg-lists
) - оверлей для запису (
/overlay
)
Зазвичай змінювати ці налаштування не потрібно. Однак, якщо ваш пристрій має <32 МБ RAM і ви використовуєте Extroot, можете змінити:
lists_dir ext /path/on/disk
Цей файл також доступний через веб-інтерфейс LuCI: Services → Software → Configuration.
Налаштування репозиторіїв
Файл: /etc/opkg/distfeeds.conf
Приклад:
src/gz reboot_core http://downloads.lede-project.org/snapshots/targets/ramips/mt7620/packages src/gz reboot_base http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/base src/gz reboot_telephony http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/telephony src/gz reboot_packages http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/packages src/gz reboot_routing http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/routing src/gz reboot_luci http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/luci
Додаткові (кастомні) репозиторії можна додати у файлі /etc/opkg/customfeeds.conf
:
# додайте свої джерела тут # src/gz myfeed http://example.com/path/to/files
Обидва файли можна редагувати через LuCI: Services → Software → Configuration (прокрутіть вниз).
Локальні репозиторії
Щоб використовувати локальні пакети:
src/gz local file:///path/to/packagesDirectory
OpenWrt використовує кілька репозиторіїв — кожен з унікальним ідентифікатором. Рекомендується зберігати оригінальні назви:
src/gz base file:///path/to/packages/base src/gz luci file:///path/to/packages/luci src/gz packages file:///path/to/packages/packages src/gz oldpackages file:///path/to/packages/oldpackages
Зміна архітектур
OpenWrt використовує архітектури пакетів. Багато пристроїв використовують спільний пул пакетів.
Цей розділ потребує перевірки і, можливо, адаптації до актуального стану OpenWrt.
За замовчуванням, opkg
дозволяє лише пакети архітектури all
(незалежні) та тієї, яка відповідає пристрою на який встановлюються.
Щоб дозволити пакети інших архітектур, додайте до /etc/opkg.conf
рядки з пріоритетами:
arch all 100 arch brcm4716 200 arch brcm47xx 300
Цей приклад дозволить встановлення пакетів brcm47xx
на таргет brcm4716
.
Число — це пріоритет, який визначає, яка архітектура має перевагу при конфліктах.
Підтримка проксі
OpenWrt 21.02:
# Налаштування профілю mkdir -p /etc/profile.d cat << "EOF" > /etc/profile.d/custom.sh export https_proxy=http://proxy.example.org:8080/ EOF . /etc/profile # Обхід sed -i -e "s/https/http/" /etc/opkg/distfeeds.conf
Або додайте в /etc/opkg.conf
:
option http_proxy http://proxy.example.org:8080/ option ftp_proxy ftp://proxy.example.org:2121/
Для автентифікації:
option proxy_user xxxx option proxy_passwd xxxx
Альтернатива з логіном і паролем у URL (за наявності busybox wget):
option http_proxy http://username:password@proxy.example.org:8080/ option ftp_proxy http://username:password@proxy.example.org:2121/
Автентифікація не працює з
uclient-fetch
через відсутність реалізації Proxy-Authorization
.
Для підтримки OpenWrt через apt-cacher-ng і уникнення помилок із `.sig` файлами, додайте до `acng.conf`:
VfilePatternEx: |\.sig$
Усунення несправностей
Verbose opkg update
cat << "EOF" > opkg-update.sh #!/bin/sh rm -f -R /tmp/opkg-lists mkdir -p /tmp/opkg-lists while read TYPE REPO URL do wget -O /tmp/opkg-lists/"${REPO}".gz "${URL}"/Packages.gz wget -O /tmp/opkg-lists/"${REPO}".sig "${URL}"/Packages.sig gunzip -k /tmp/opkg-lists/"${REPO}".gz usign -V -P /etc/opkg/keys -m /tmp/opkg-lists/"${REPO}" 2>&1 \ | grep -e "^OK$" \ && mv -f /tmp/opkg-lists/"${REPO}".gz /tmp/opkg-lists/"${REPO}" done < /etc/opkg/distfeeds.conf EOF chmod +x opkg-update.sh ./opkg-update.sh
Out of space
cat << "EOF" > opkg-rm-pkg-deps.sh #!/bin/sh opkg update URL="$(opkg --force-space --noaction install "${@}" \ | sed -n -e "/^Downloading\s*/s///p")" rm -f /usr/lib/opkg/lock for URL in ${URL} do FILE="$(wget -q -O - "${URL}" \ | tar -O -x -z ./data.tar.gz \ | tar -t -z \ | sort -r \ | sed -e "s|^\.|/overlay/upper|")" for FILE in ${FILE} do if [ -f "${FILE}" ] then rm -f "${FILE}" elif [ -d "${FILE}" ] then rmdir "${FILE}" fi done done EOF chmod +x opkg-rm-pkg-deps.sh # Запуск ./opkg-rm-pkg-deps.sh package_name reboot
Локальний репозиторій
Корисно, якщо:
- Нестабільне інтернет-з'єднання
- Ліміти трафіку
- Власноруч зібрані пакети
- Один пристрій як локальний репозиторій для інших
opkg update opkg install rsync cat << "EOF" > local-repo-sync.sh #!/bin/sh . /etc/os-release REPO_LOCAL="file://${1:-/${ID}}/" REPO_URL="rsync://rsync.${HOME_URL#*//}" case "${VERSION_ID}" in (snapshot) REPO_DIR="downloads/snapshots" ;; (*) REPO_DIR="downloads/releases/${VERSION_ID}" ;; esac REPO_CORE="${REPO_DIR}/targets/${OPENWRT_BOARD}" REPO_PKGS="${REPO_DIR}/packages/${OPENWRT_ARCH}" for REPO_DIR in "${REPO_CORE}" "${REPO_PKGS}" do mkdir -p "${REPO_LOCAL#*//}${REPO_DIR#*/}" rsync --bwlimit="8M" --del -r -t -v \ "${REPO_URL}${REPO_DIR}/" \ "${REPO_LOCAL#*//}${REPO_DIR#*/}/" done EOF chmod +x local-repo-sync.sh ./local-repo-sync.sh /openwrt # Налаштування opkg . /etc/os-release REPO_LOCAL="file:///${ID}/" REPO_URL="https://downloads.${HOME_URL#*//}" sed -i -e "s|${REPO_URL}|${REPO_LOCAL}|" /etc/opkg/distfeeds.conf # Загальний доступ по LAN ln -f -s ${REPO_LOCAL#*//} /www/${ID} # Налаштування клієнтів REPO_LOCAL="http://192.168.1.1/${ID}/" sed -i -e "s|${REPO_URL}|${REPO_LOCAL}|" /etc/opkg/distfeeds.conf
Див. також: Як створити дзеркало
Нестандартні шляхи встановлення
opkg (як і ipkg) дозволяє встановлювати пакети в альтернативні місця, але більшість пакетів OpenWrt цього не підтримує.
Рекомендований метод розширення місця — Extroot
Більшість пакетів очікують встановлення в root (/), тому робота з іншими шляхами потребує ручної адаптації, симлінків тощо.
Файл /etc/opkg.conf
вже містить:
dest root / dest ram /tmp dest mnt /mnt
Використання:
opkg -d ram install somepackage
Аргумент -d має відповідати одному з пунктів у opkg.conf
. Наприклад, -d ram
встановить пакет у /tmp
.
Для модулів ядра — спочатку ознайомтеся з: https://dev.openwrt.org/ticket/10739