Re: Аналог debootstrap для udeb-пакетов
On Mon, 30 Jan 2017 22:50:12 +0300 Alexander Galaninwrote: > Недавно понадобилось собрать нестандартный initramfs... > захотелось узнать, как решать проблему разбора зависимостей и скачивания > пакетов автоматически. Решил задачку. Пришлось подглядеть, что именно делает multistrap, но зато получился скрипт, который ещё и подписи пакетов валидирует. Скачанные пакеты окажутся в packages/cache/archives, а распаковать их можно через dpkg -x. mkdir -p packages/cfg packages/cfg/conf packages/cfg/preferences.d packages/cfg/sources.list.d packages/state packages/cache echo 'deb http://apt-proxy:/debian jessie main/debian-installer' > packages/cfg/sources.list cp -r /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d packages/cfg printf '' > packages/status APT_OPTS="-o Apt::Architecture=armhf -o Apt::Default-Release=jessie -o Apt::Get::Download-Only=true -o Apt::Install-Recommends=false -o Apt::Install-Suggests=false -o Dir=$(pwd)/packages -o Dir::Etc=$(pwd)/packages/cfg -o Dir::Etc::Parts=$(pwd)/packages/cfg/conf -o Dir::Etc::Trusted=$(pwd)/packages/cfg/trusted.gpg -o Dir::Etc::TrustedParts=$(pwd)/packages/cfg/trusted.gpg.d -o Dir::Etc::PreferencesParts=$(pwd)/packages/cfg/preferences.d -o Dir::State=$(pwd)/packages/state -o Dir::State::Status=$(pwd)/packages/status -o Dir::Cache=$(pwd)/packages/cache" apt-get $APT_OPTS update apt-get $APT_OPTS -y install busybox-udeb e2fsprogs-udeb -- Alexander Galanin
Re: Аналог debootstrap для udeb-пакетов
On Tue, 31 Jan 2017 10:13:35 +0300 Victor Wagnerwrote: > Так что я бы пожалуй бы брал и сетапил виртуальную машину в > qemu-system-arm, и в ней уже бы развлекался. Это при условии что под > рукой нет какой-нибудь banana pi, chroot На андроидном смартфоне или еще > какой физической ARM-системы. Чрут рядом есть (с основной системой), но его хоется оставить нетронутым. Да и нашёл способ попроще, без эмуляции. -- Alexander Galanin
Re: Аналог debootstrap для udeb-пакетов
On Tue, Jan 31, 2017 at 10:13:35AM +0300, Victor Wagner wrote: > On Tue, 31 Jan 2017 09:31:10 +0300 > Alexander Galaninwrote: > > > On Tue, 31 Jan 2017 00:39:59 +0300 > > dimas wrote: > > > > > > Есть ли какой-нибудь ещё способ автоматически разобрать > > > > зависимости, скачать и распаковать udeb-пакеты? Или даже так: > > > > собираете ли вы initramfs автоматически, и если да, то как вы это > > > > делаете? > > > ... > > > принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для > > > него, ищет нужные либо по всем углам и копирует их тоже. > > > > В моём случае не подойдёт, т.к. ldd не работает с пакетами другой > > архитектуры (я собираю initramfs под armhf). В манах к mkinitramfs > > не нашёл упоминания о других архитектурах. > > Ну есть qemu-user emulation, в которой можно заставить ldd работать с > пакетами другой архитектуры. И насколько я помню, как раз для arm его > допилили до вполне приличного состояния когда Nokia развивала серию > N800-N810-N900-N9. ldd не всега нужно; можно его емулировать вручную с помощи readelf и несколько больше утилит. Я когда-то писал утилиту, которая искает подходящюю библиотеку для LD_PRELOAD - было как-то некомфортно пытатся preload-ить amd64 shared object для i386 бинарника... https://gitlab.com/roam-multiarch-tools/multiarch-query Как написано, оно использует кеш ldconfig-а и берет имя библиотеки на командную строку. Ну, имена библиотек, в которых програма нуждается, можно найти с помощи readelf: readelf -d /bin/login | perl -nle '/NEEDED.*Shared library: \[(.*)\]/ and print $1' Потом, если нет кеша ldconfig, но все библиотеки находятся в одном деревом директорий, можно сделать чего-то либо: readelf -d /bin/login | \ perl -nle '/NEEDED.*Shared library: \[(.*)\]/ and print $1' | \ while read lib; do find /lib/x86_64-linux-gnu/ /usr/lib/x86_64-linux-gnu/ -type f \( -name "$lib" -or -name "$lib.*" \) done | \ while read fname; do # Пример: еще проверки; конечно, у всех библиотек # в /lib/x86_64-linux-gnu/ будет "Machine: AMD" :) if readelf -h -- "$fname" | egrep -qe 'Machine:.*Advanced Micro Devices'; then echo "$fname" fi done Конечно, есть какие-то библиотеки, которых таким образом не найти (libc, ld-linux, ...), но, надеемся, их уже есть в initramfs, или можем поставить вручную. Всего лучшего, Петр -- Peter Pentchev r...@ringlet.net r...@freebsd.org p...@storpool.com PGP key:http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13 signature.asc Description: PGP signature
Re: Аналог debootstrap для udeb-пакетов
On Tue, 31 Jan 2017 09:31:10 +0300 Alexander Galaninwrote: > On Tue, 31 Jan 2017 00:39:59 +0300 > dimas wrote: > > > > Есть ли какой-нибудь ещё способ автоматически разобрать > > > зависимости, скачать и распаковать udeb-пакеты? Или даже так: > > > собираете ли вы initramfs автоматически, и если да, то как вы это > > > делаете? > > ... > > принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для > > него, ищет нужные либо по всем углам и копирует их тоже. > > В моём случае не подойдёт, т.к. ldd не работает с пакетами другой > архитектуры (я собираю initramfs под armhf). В манах к mkinitramfs > не нашёл упоминания о других архитектурах. Ну есть qemu-user emulation, в которой можно заставить ldd работать с пакетами другой архитектуры. И насколько я помню, как раз для arm его допилили до вполне приличного состояния когда Nokia развивала серию N800-N810-N900-N9. Вообще как раз тогда на примере этих машинок выяснилось что с кросс-сборкой в Debian все плохо и с тех пор становилось только хуже, потому что полявился multiarch, на который решили и это тоже перевалить, а он для этого подходит мало. Так что я бы пожалуй бы брал и сетапил виртуальную машину в qemu-system-arm, и в ней уже бы развлекался. Это при условии что под рукой нет какой-нибудь banana pi, chroot На андроидном смартфоне или еще какой физической ARM-системы.
Re: Аналог debootstrap для udeb-пакетов
On Tue, 31 Jan 2017 00:39:59 +0300 dimaswrote: > > Есть ли какой-нибудь ещё способ автоматически разобрать зависимости, > > скачать и распаковать udeb-пакеты? Или даже так: собираете ли вы > > initramfs автоматически, и если да, то как вы это делаете? > ... > принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для него, ищет > нужные либо по всем углам и копирует их тоже. В моём случае не подойдёт, т.к. ldd не работает с пакетами другой архитектуры (я собираю initramfs под armhf). В манах к mkinitramfs не нашёл упоминания о других архитектурах. -- Alexander Galanin
Re: Аналог debootstrap для udeb-пакетов
"официальный" способ, который используется в родных хуках, через которые создается инитрд - функция copy_exec из /usr/share/initramfs-tools/hook-functions принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для него, ищет нужные либо по всем углам и копирует их тоже. примеры использования есть во многих хуках, да почти во всех, наверно. в общем, в initramfs-tools есть дофига всего, чтобы обойтись без всяких танцев с debootstrap и прочими ужасами)) 2017-030 22:50 Alexander Galaninwrote: > Добрый вечер, d-r! > > Недавно понадобилось собрать нестандартный initramfs, в котором нужна > команда mkfs помимо шелла и модулей. Скачал и распаковал udeb-пакеты для > e2fsprogs, busybox и их зависимости. В общем-то проблему решил, но > захотелось узнать, как решать проблему разбора зависимостей и скачивания > пакетов автоматически. > > Пробовал debootstrap и multistrap. В обычном режиме они ставят слишком > много (первый - ставит все пакеты для базовой системы, второй - по > зависимостям вытянул даже sysv-rc). > > Попробовал заставить *-strap-ы скачивать udeb-пакеты. Для debootstrap > не смог найти подходящего ключика. Нашёл, как сделать это для multistrap > (components=main/debian-installer). Однако multistrap только разобрал > зависимости и скачал пакеты, но установить он их не смог. Судя по > исходникам, он привязывается к тому, что имя файла пакета оканчивается > на .deb. > > Есть ли какой-нибудь ещё способ автоматически разобрать зависимости, > скачать и распаковать udeb-пакеты? Или даже так: собираете ли вы > initramfs автоматически, и если да, то как вы это делаете? >
Аналог debootstrap для udeb-пакетов
Добрый вечер, d-r! Недавно понадобилось собрать нестандартный initramfs, в котором нужна команда mkfs помимо шелла и модулей. Скачал и распаковал udeb-пакеты для e2fsprogs, busybox и их зависимости. В общем-то проблему решил, но захотелось узнать, как решать проблему разбора зависимостей и скачивания пакетов автоматически. Пробовал debootstrap и multistrap. В обычном режиме они ставят слишком много (первый - ставит все пакеты для базовой системы, второй - по зависимостям вытянул даже sysv-rc). Попробовал заставить *-strap-ы скачивать udeb-пакеты. Для debootstrap не смог найти подходящего ключика. Нашёл, как сделать это для multistrap (components=main/debian-installer). Однако multistrap только разобрал зависимости и скачал пакеты, но установить он их не смог. Судя по исходникам, он привязывается к тому, что имя файла пакета оканчивается на .deb. Есть ли какой-нибудь ещё способ автоматически разобрать зависимости, скачать и распаковать udeb-пакеты? Или даже так: собираете ли вы initramfs автоматически, и если да, то как вы это делаете? -- Alexander Galanin