PDA

Bekijk de volledige versie : how to: Работа с пакетами ipk



angel_il
17-01-2008, 21:24
Маленькое вступление:
В основном пишу для себя чтобы не забыть через год :)

Исследование содержимого пакета
Разборка пакета
Так как на самом деле пакет ничто иное как tar.gz архив то и работать с ним можно как с обычным архивом. а именно расспаковать, запаковать просмотреть содержимое, извлечь часть файлов.
Например для расспаковки пакета с именем somepack.ipk можно выполнить следующие команды

tar -zxvf somepack.ipk
после чего в папке появятся 2 файла
data.tar.gz control.tar.gz
которые также являются архивами
data.tar.gz содержит инсталиремые файлы а control.tar.gz содержит сприпты установки и файл описания пакета.
Сборка пакета
для создания пакета ipk также можно восспользоваться архиватором tar, единственное что нужно сделать это указать упцию --format=ustar
итак например вам захотелось создать пакет somepack
для этого нужно создать файл с именем control приблизительно следующего содержания


Package: somepack
Architecture: mipsel
Priority: optional
Section: net
Version: 1.31-1
Maintainer: Vasili Pupkin
Source: ftp://ftp.domain.org/someprog.tar.gz
Description: pack descripton
Depends: zlib, libsomelibs
Suggests:
Conflicts: progmame


NB:поля Depends и Conflicts заполняются в случае если ваш пакет зависит от какого то другого пакета или конфликтует с чем то, соответственно.
далее необходимо создать в папке стпуктуру каталогов идентичную той в которую будут копироваться файлы
например

/opt
/opt/bin
/opt/etc
и разложить по этим каталогам файлы.
теперь необходимо упаковать сначала папку в которой лежит файл
control а за тем папку в которой находятся инсталируемые файлы например у нас имеется папка /opt/mypacks/somepak в которой находятся 2 поддиректории control и data. создаем архив control.tar.gz

cd /opt/mypacks/somepak/control
tar (завтра допишу устал :)

Установка ipk пакета
Чтобы избежать проблем с переполнением /tmp и как следствие зависание рутера, можно восспользоваться опцией -t. Например так:

ipkg install -t /opt/tmp somepackage
Чтобы скачать пакет без установки можно восспользоваться опцией

ipkg download somepackage
Прочее
Чтобы mc "понимал" ipk формат необходимо в файл расширений /opt/share/mc/mc.ext добавить следующие строки

regex/\.ipk
Open=%cd %p#utar
View=%view{ascii} gzip -dc %f 2>/dev/null | tar tvvf -

GUID
11-12-2009, 17:13
Стандартные "заклинания" при обновлении установленного софта:


ipkg update
ipkg upgrade

просты, но имеют один недостаток о котором еще Райкин говорил: "и тут я что-то куда-то воткнул". Т.е. меня не устраивает отсутствие конроля над процессом обновления.

Для того, чтобы получить список софта, для которого есть обновления, я делаю так:


ipkg update >> /dev/null
ipkg upgrade -test -V 2 | awk '$1 == "Upgrading" {print $2 " (last: " $8 " current: " $6 ")"}' | sed 's/\.\.\./,/'

Минус: при этом вроде как скачиваются (но не устанавливаются) новые пакеты. И вроде как на траффик наплевать, но время это занимает...
Может кто знает способ лучше?

GUID
12-12-2009, 17:34
вроде бы нашел более быстрый способ.
Рассматривая список установленных пакетов:


$ ipkg list_installed
bash - 3.2.49-1 - A bourne style shell
bzip2 - 1.0.5-1 -
cron - 4.1-7 - Standard vixie cron, with cron.d addition

Видим отсутствие описания для bzip2. Делаем:


$ ipkg info bzip2
Package: bzip2
Version: 1.0.5-1
Status: install ok installed
Architecture: mipsel

Package: bzip2
Version: 1.0.5-2
Status: unknown ok not-installed
Section: compression
Architecture: mipsel
maintainer: Christopher Blunck <christopher.blunck@gmail.com>
MD5Sum: afb1ecca8056433683c69777739002e8
Size: 83713
Filename: bzip2_1.0.5-2_mipsel.ipk
Source: http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz
Description: Very high-quality data compression program

Successfully terminated.

и получаем номера установленной и доступной версии.

Вообще-то данное поведение ipkg больше смахивает на баг, чем на фичу... Кто-нибудь может это прокомментировать?

GUID
13-12-2009, 00:24
"Докладываю" результаты, может кому пригодится.

1. Рабочие решения.
1а. Самый медленный


ipkg update
ipkg upgrade -noaction -V 2 | awk '$1 == "Upgrading" {print $2 " (" $6 " => " $8 ")"}' | sed 's/\.\.\.//'

2а. Приемлемый (тот, которым сейчас пользуюсь)


ipkg update
for PKG in $( ipkg list_installed | awk '$5 == "" && NF > 2 {print $1}' )
do
VERS=$( ipkg info "$PKG" | awk '$1 == "Version:" {print $2}' )
CUR_VER=$( echo $VERS | awk '{print $1}' )
NEW_VER=$( echo $VERS | awk '{print $2}' )
if [ "$CUR_VER" \> "$NEW_VER" ]; then #такое бывает из-за глюков (?) ipkg
tmp="$CUR_VER"
CUR_VER="$NEW_VER"
NEW_VER="$tmp"
fi
echo "$PKG ($CUR_VER => $NEW_VER)"
done

2. Для обновления одиночного пакета можно использовать


ipkg upgrade <pkg>

3. А теперь о плохом.
Т.к. при каждом вызове ipkg происходит достаточно большой объем работы (создание/удаление файлов), то чтобы получить значительный выигрыш в скорости надо разобраться в скрипте /usr/bin/ipkg.sh.
Я его к сожалению не осилил, а после слов "black magic" и "blacker magic" - вообще стал обходить стороной :rolleyes:

al37919
13-12-2009, 08:48
/usr/bin/ipkg.sh используется однократно при установке системы для загрузки пакета ipkg-opt. Остальное время используется /opt/bin/ipkg

GUID
13-12-2009, 15:24
/usr/bin/ipkg.sh используется однократно при установке системы для загрузки пакета ipkg-opt. Остальное время используется /opt/bin/ipkg
Вы правы.
С другой стороны: он слишком сложен (imho), чтобы только установить пакет ipkg-opt:
- наличие info, status...
- эта функция объясняет почему возможно обновление одно пакета (а не всех уставновленных):


ipkg_upgrade() {
if [ $# -lt 1 ]; then
local pkgs="`ipkg_status_matching 'Status:.*[[:space:]]installed'`"
else
pkgs="$*"
fi

for pkg in $pkgs; do
ipkg_upgrade_pkg $pkg
done
}

Может это был первоначальный вариант "системы управления пакетами", который потом уже переписали и скопилировали в ipkg...

Leemur
23-09-2010, 11:01
добрый день, не подскажите как установить tcpdump на WL500gpv2?