OPKG, czyli menadżer pakietów w OpenWRT

Spis treści

W OpenWRT do zarządzania pakietami wykorzystywany jest menadżer pakietów opkg. To przy jego pomocy instalujemy i usuwamy pakiety. Niemniej jednak, to narzędzie nie ogranicza się jedynie do tych dwóch powyższych czynności. Przy pomocy opkg jesteśmy w stanie przeprowadzić szereg innych operacji dotyczących zarządzania pakietami w systemie operacyjnym naszego domowego routera. W tym wpisie prześledzimy sobie poszczególne opcje jakie ten menadżer pakietów nam oferuje.

Dlaczego "opkg update" jest taki ważny

Wszystkie pakiety, które chcemy zainstalować w OpenWRT, są przechowywane w repozytoriach. Listy z pakietami dostępnymi w repozytoriach można pobrać za pomocą polecenia opkg update . Cały proces wygląda mniej więcej tak jak pokazano na obrazku poniżej:

opkg-update-lista-repozytoria-openwrt

Użytkownikom windowsa ten mechanizm może wydawać się początkowo obcy i niezrozumiały. Generalnie rzecz ujmując, na linux'ach nie zwykło się pobierać programów z pierwszego linku, który zwróci nam google. Dlatego są te repozytoria. Z jednej strony poprawiają one bezpieczeństwo, a z drugiej zaś wiemy, że dana aplikacja będzie nam działać bez problemu, bo została sprawdzona. Wszystkie pakiety, które nie spełniają wymogów stawianych przez developerów OpenWRT, są zwyczajnie usuwane z repozytoriów. W dalszym ciągu, takie usunięte pakiety możemy sobie zainstalować ale wtedy jeśli router nie będzie chciał się nam uruchomić lub jakaś usługa nie będzie działać jak należy, to pretensje możemy mieć tylko do siebie.

Różnica w stosunku do dystrybucji linux'a w kwestii menadżera pakietów jest taka, że z reguły desktop'y mają o wiele większe dyski twarde w porównaniu do flash'a przeciętnego routera domowego. Dlatego też z tego powodu, wszystkie listy pakietów w OpenWRT są pobierane do pamięci operacyjnej, której routery mają zwykle więcej niż dostępnej przestrzeni na flash'u. Dane w pamięci RAM nie przetrwają restartu routera, dlatego za każdym razem musimy wydawać polecenie opkg update , by te listy były obecne w stosownym miejscu w pamięci. Ponadto, biorąc pod uwagę fakt, że aplikacje są rozwijane oraz, że OpenWRT posiada ich całą masę, wersje pakietów ulegają zmianie. Wraz z nimi zmieniają się także zależności, które muszą być zainstalowane, by dana usługa mogła działać bez przeszkód. Pobranie nowych list aktualizuje te wszystkie wpisy. Trzeba się z tym liczyć w przypadku, gdy chcemy zainstalować jakiś pakiet na starszej wersji firmware. Może to nie być możliwe za sprawą konfliktu zależności w pakietach, które są obecne w repozytoriach. Dlatego też zawsze starajmy się posiadać w miarę nową wersję OpenWRT, by ograniczyć tego typu problemy do minimum.

Konfiguracja opkg

Plik konfiguracyjny dla menadżera pakietów opkg jest zlokalizowany w /etc/opkg.conf . We wcześniejszych wersjach OpenWRT znajdowały się tam także linki do repozytoriów. Obecnie w wydaniu Chaos Calmer, te linki zostały przeniesione do osobnego pliku i teraz znajdują się pod /etc/opkg/distfeeds.conf . Poniżej jest przykład konfiguracji:

dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
option check_signature 1

Linijki zaczynające się od dest określają miejsce docelowe dla instalowanych pakietów. Wyżej mamy zdefiniowane dwie lokalizacje: / oraz /tmp/ . Nazwy root i ram mogą być dowolne i robią za opisy. Te nazwy są wykorzystywane przy instalacji pakietów, co bardzo przydaje się, gdy dysponujemy routerem mającym flash o niewielkich rozmiarach. Opcja lists_dir wskazuje lokalizację pobieranych list pakietów. Opcja overlay_root odpowiada za system plików, który ma być sprawdzony pod kątem wolnego miejsca przy instalowaniu pakietów. Natomiast check_signature odpowiada za weryfikację sygnatur repozytoriów. W przypadku dokonania zmian w powyższej konfiguracji, dobrze jest wyczyścić katalog /var/opkg-lists/ przy pomocy poniższego polecenia:

# rm /var/opkg-lists/*

Szukanie pakietów

W przypadku, gdy nie pamiętamy dokładnej nazwy pakietu, który chcemy zainstalować lub odinstalować, możemy przeszukać listy pakietów. W opkg mamy do tego celu oddelegowane dwie opcje: list oraz list-installed . Pierwsza z nich zwraca wszystkie dostępne pakiety, druga zaś jedynie te, które są zainstalowane w systemie. Obie te listy mogą zostać przefiltrowane za pomocą narzędzia grep . Przeszukiwanie list odbywa się w oparciu o nazwę jak i opis danego pakietu. Poniżej przykłady:

# opkg list | grep dhcp
# opkg list-installed | grep dns

Wygląda to mniej więcej tak jak na poniższej fotce:

opkg-list-listinstalled-openwrt

Instalowanie pakietów

Pakiety możemy instalować za pomocą opcji install na trzy sposoby. Najpopularniejszym z nich jest instalowanie pakietu z repozytorium. W tym przypadku podajemy jedynie nazwę pakietu. Może się jednak zdarzyć tak, że pakiet nie jest dostępny w repozytoriach OpenWRT. Nie przeszkadza to jednak w jego instalacji. W dalszym ciągu możemy go zainstalować ręcznie, z tym, że trzeba mieć na uwadze zależności, których ten pakiet wymaga do poprawnego działania. Sam pakiet instalujemy zaś podając bezpośredni link do pliku .ipk , bądź też przez wskazanie ścieżki do tego pliku w przypadku, gdy pobraliśmy go już na dysk. Poniżej przykłady:

# opkg install ipset
# opkg install http://dl.eko.one.pl/chaos_calmer/ar71xx/packages/ipset_6.24-1_ar71xx.ipk
# opkg install /tmp/ipset_6.24-1_ar71xx.ipk

Pamiętajmy też, że nie należy mieszać modułów kernela. Dla przykładu, kernel pochodzi z repozytorium OpenWRT. Część modułów może nie być udostępniona z różnych powodów. Możemy za to dysponować zewnętrznym repozytorium, w którym będziemy mieć pożądany przez nas moduł. Nawet jeśli wersja tego modułu pasuje do wersji kernela, to nie powinniśmy instalować tego modułu.

Odinstalowanie pakietów

Pakiety mogą również zostać odinstalowane, np. w celu zwolnienia miejsca. Trzeba jednak pamiętać przy tym, że pakiety, które są dostarczane wraz z obrazem firmware nie mogą zostać fizycznie z niego usunięte. Mało tego, informacja o usunięciu tych pakietów zajmuje miejsce i paradoksalnie nie dość, że nie zwolnimy ani jednego bajta, to jeszcze tylko zmarnujemy trochę dostępnej przestrzeni.

Wszystkie inne pakiety, tj. te, które instalowaliśmy po flash'owaniu routera, możemy bez problemu odinstalować przy pomocy opcji remove . Problem w tym, że praktycznie każdy pakiet zawiera listę zależności, które są instalowane wraz z nim. Później, gdy taki pakiet chcemy usunąć, to w systemie zostaną nam śmieci w postaci nieużywanych pakietów. To z kolei zajmuje miejsce. Na szczęście opkg jest w stanie sobie z tego typu problemem poradzić. Mamy do tego celu dwa parametry: --autoremove oraz --force-removal-of-dependent-packages . Pierwsza z nich usunie zależności, które zostały zainstalowane wraz z pakietem. Niemniej jednak, cześć z tych zależności może być wykorzystywana przez inne pakiety. W efekcie część z nich nie zostanie usunięta, co jest logiczne. Druga z powyższych opcji usunie wszystkie zależności bez znaczenia czy inne pakiety z nich korzystają. Poniżej przykłady:

# opkg remove ipset
# opkg remove --autoremove ipset
# opkg remove --force-removal-of-dependent-packages ipset

Aktualizacja pakietów

Aktualizacja oprogramowania, które operuje na routerze, to bardzo ważna rzecz. Tak ważna, że opkg posiada możliwość aktualizowania pakietów przy pomocy opcji upgrade . Problem w tym, że flash routera jest nie za duży i aktualizacja pakietów nie zawsze jest możliwa. Trzeba także pamiętać o tym, że pakiety dostarczane standardowo z firmware po aktualizacji będą zjadać dwa razy tyle miejsca. A to z tego względu, że starych pakietów obecnych w obrazie firmware nie można usunąć. Aktualizacja pakietów ma tylko sens w przypadku instalowanych rzeczy po flash'owaniu routera. Listę pakietów, które wymagają aktualizacji, możemy uzyskać za pomocą opcji list-upgradable . Poniżej przykłady:

# opkg list-upgradable
# opkg upgrade ipset

Niektóre pakiety, w szczególności moduły kernela, nie powinny być nigdy aktualizowane. Taka akcja może sprawić, że router będzie działał bardzo niestabilnie. Bardziej jednak prawdopodobnego jest, że go w ten sposób powiesimy i trzeba będzie go ratować przy pomocy trybu failsafe.

Informacje o pakiecie

Menadżer pakietów opkg posiada pewne informacje, które mogą okazać się użyteczne dla nas. Możemy je wydobyć za pomocą opcji info . Poniżej informacje na temat przykładowego pakietu:

opkg-info-openwrt

Mamy tutaj nazwę pakietu, jego wersję oraz zależności, które muszą być spełnione, by ten pakiet mógł zostać zainstalowany w systemie. Dalej widzimy, że pakiet został zainstalowany przez użytkownika. Mamy także informacje o sekcji, do której pakiet przynależy oraz architekturę, dla której został zbudowany. Jest także suma kontrolna pakietu i rozmiar w bajtach. Przy czym, jeśli chodzi o rozmiar, to trzeba bać poprawkę, gdyż system plików routera jest skompresowany. W efekcie ten pakiet po zainstalowaniu zwykle będzie zajmował mniej miejsca niż jest uwzględnione w opisie pakietu. Dalej mamy pełną nazwę pliku .ipk . Są też wyszczególnione pliki konfiguracyjne wraz z sumami kontrolnymi (o nich niżej). Mamy też informacje o źródłach, z których pakiet został zbudowany. Na końcu zaś mamy opis pakietu i datę zainstalowania w formie unix'owego timestamp'a. W tym przypadku, 1460787028 wskazuje na 2016-04-16 08:10:28 CEST GMT+2:00 DST.

Na fotce widzimy, że ten pakiet (jak i cała masa innych) dostarcza pliki konfiguracyjne. Są one zwykle wgrywane do katalogu /etc/ . Wszystkie te pliki są monitorowane pod kątem zmian. Dlatego też opkg ma ich sumy kontrolne. Jeśli jakiś plik zmienimy w drodze konfiguracji routera, to suma kontrolna takiego pliku również ulegnie zmianie. W oparciu o ten fakt, menadżer pakietów jest nam w stanie zwrócić listę zmienionych plików konfiguracyjnych za pomocą opcji list-changed-conffiles . Poniżej przykład:

# opkg list-changed-conffiles

Każdy pakiet składa się zwykle też z szeregu innych plików, które na powyższym listingu nie figurują. Niemniej jednak, opkg posiada informacje na temat plików zawartych w poszczególnych pakietach. Dokładną listę tych plików możemy uzyskać za pomocą opcji files . Poniżej przykład:

# opkg files dnsmasq

Oczywiście na powyższych listach nie ma plików, które sami stworzyliśmy.

Jeśli chcemy ustalić do jakiego pakietu należy konkretny plik, to przy pomocy opcji search możemy taki pakiet odszukać. Poniżej przykład:

# opkg search /etc/dnsmasq.conf

Niezbyt czytelne wyniki zwracane w opkg

Przeszukiwanie pakietów za pomocą opkg list nie należy do przyjemnych rzeczy. Głównie chodzi tutaj o fakt, że lista pakietów, która jest nam zwracana po wydaniu powyższego polecenia, nie jest zbytnio czytelna. Wystarczy popatrzeć na poniższą fotkę:

opkg-list-openwrt

Na samym początku mamy nazwę pakietu, później jest jego wersja, a na końcu opis. Gdyby te wpisy były zwracane przez opkg na zasadzie jeden na linijkę, to nie byłoby jeszcze tak źle. Niemniej jednak, opisy mogą być bardzo długie i odnalezienie nazwy pakietu w gąszczu tekstu nie jest zbytnio łatwe i szybkie. By poprawić nieco przejrzystość komunikatów zwracanych przez opkg , tak by, np. nazwy pakietów odróżniały się nieco od ich opisów, możemy dodać poniższy blok kodu do pliku /etc/profile :

# Written by Gordio <me@gordio.pp.ua>
# Licence: MIT
opkg () {
	BOLD=$(echo -e '\033[1m');
	NORM=$(echo -e '\033[0m');
	COL="no";
	for arg in $*; do
		if [ $arg == "whatdepends" -o $arg == "list" \
		-o $arg == "list-installed" -o $arg == "list-upgradable" \
		-o $arg == "list-changed-conffiles" -o $arg == "status" \
		-o $arg == "info" -o $arg == "find" ]; then
			COL="yes";
			break;
		fi
	done
	if [ $COL == "yes" ]; then
		# (|\t*) added for 'whatdepends'
		/bin/opkg $* | sed -re "s/^(|\t*)[a-z0-9-]*/$BOLD&$NORM/g";
	else
		/bin/opkg $*;
	fi
}
# vim: set fdm=marker ts=4 sw=4 tw=80 fo-=t ff=unix:

By zmiany zaczęły obowiązywać, musimy się zalogować ponownie na router albo wpisać w terminalu to poniższe polecenie:

# source /etc/profile

Wyniki zwracane przez opkg powinny teraz być bardziej czytelne:

opkg-list-openwrt-fix

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.