Менеджер пакетів 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.
------------
:!: Оскільки базова система OpenWrt зберігається у стиснутому розділі лише для читання, будь-яке оновлення системного пакета буде записане у розділ з можливістю запису, що потребує більше місця, ніж просто оновлення в базовому розділі.
Рекомендується перевірити доступний обсяг флеш-памʼяті перед оновленням системних пакетів.
Пакети, які ви самі встановлювали, не мають цієї проблеми — вони вже у розділі з можливістю запису, тому нова версія просто замінить стару. Але перевірка обсягу перед оновленням ніколи не завадить.
Як правило, пристрої з 8 МБ і більше флеш-памʼяті без додаткових пакетів не матимуть проблем з оновленням системних пакетів. А пристрої з налаштованим Extroot взагалі не мають проблем із простором.
Щоб перевірити вільне місце: у SSH введіть df -h / або зайдіть у LuCI → Система → Програмне забезпечення.
Щоб перевірити розмір пакета перед оновленням, використовуйте opkg info назва-пакета або перегляньте таблицю в LuCI, або у Таблиці пакетів на вікі.
Зверніть увагу: “size” в opkg — це стиснутий розмір архіву, але у read-write розділі (jffs2/ubifs) буде застосовано аналогічне стиснення, тому розмір при встановленні буде подібний.
:!: У snapshot-збірках репозиторії оновлюються автоматично. Через це часто виникають конфлікти при оновленні деяких пакетів, особливо повʼязаних з ядром. У такому випадку рекомендується скористатися Image Builder і створити нову прошивку з усіма потрібними пакетами.
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$
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
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

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2025/05/31 09:51
  • by vazaz