Re: Аналог debootstrap для udeb-пакетов

2017-02-03 Пенетрантность Alexander Galanin
On Mon, 30 Jan 2017 22:50:12 +0300
Alexander Galanin  wrote:

> Недавно понадобилось собрать нестандартный 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-пакетов

2017-02-03 Пенетрантность Alexander Galanin
On Tue, 31 Jan 2017 10:13:35 +0300
Victor Wagner  wrote:

> Так что я бы пожалуй бы брал и сетапил виртуальную машину в
> qemu-system-arm, и в ней уже бы развлекался. Это при условии что под
> рукой нет какой-нибудь banana pi, chroot На андроидном смартфоне или еще
> какой физической ARM-системы.

Чрут рядом есть (с основной системой), но его хоется оставить
нетронутым. Да и нашёл способ попроще, без эмуляции.

-- 
Alexander Galanin



Re: Аналог debootstrap для udeb-пакетов

2017-02-02 Пенетрантность Peter Pentchev
On Tue, Jan 31, 2017 at 10:13:35AM +0300, Victor Wagner wrote:
> On Tue, 31 Jan 2017 09:31:10 +0300
> Alexander Galanin  wrote:
> 
> > 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-пакетов

2017-01-30 Пенетрантность Victor Wagner
On Tue, 31 Jan 2017 09:31:10 +0300
Alexander Galanin  wrote:

> 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-пакетов

2017-01-30 Пенетрантность Alexander Galanin
On Tue, 31 Jan 2017 00:39:59 +0300
dimas  wrote:

> > Есть ли какой-нибудь ещё способ автоматически разобрать зависимости,
> > скачать и распаковать udeb-пакеты? Или даже так: собираете ли вы
> > initramfs автоматически, и если да, то как вы это делаете?
> ...
> принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для него, ищет
> нужные либо по всем углам и копирует их тоже.

В моём случае не подойдёт, т.к. ldd не работает с пакетами другой
архитектуры (я собираю initramfs под armhf). В манах к mkinitramfs
не нашёл упоминания о других архитектурах.

-- 
Alexander Galanin



Re: Аналог debootstrap для udeb-пакетов

2017-01-30 Пенетрантность dimas
"официальный" способ, который используется в родных хуках, через которые
создается инитрд - функция copy_exec из 
/usr/share/initramfs-tools/hook-functions
принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для него, ищет
нужные либо по всем углам и копирует их тоже.
примеры использования есть во многих хуках, да почти во всех, наверно.
в общем, в initramfs-tools есть дофига всего, чтобы обойтись без всяких танцев
с debootstrap и прочими ужасами))


2017-030 22:50 Alexander Galanin  wrote:
> Добрый вечер, 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-пакетов

2017-01-30 Пенетрантность Alexander Galanin
Добрый вечер, 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