Кросс-компиляция pkgsrc в NetBSD

Вместо вступления
Начнем с конца — немного ссылок:

Ну и собственно, на сколько я понял, планы: https://wiki.netbsd.org/projects/project/cross_nb_pkgsrc/.

Ссылки расставлены, на мой взгляд, в порядке полезности. Из них следует что pkgsrc в частности и netbsd в целом кросс-компиляция находится в экспериментальном режиме, имеются известные проблемы, как то невозможность собрать perl, python и в следствии зависимостей от этих пакетов, еще примерно три четверти пакетной базы pkgsrc в режиме кросс-компиляции. Альтернативой может послужить сборка пакетов на bare metal, либо посредством qemu. Прямым следствием такого положения вещей, является отсутствие пакетов к примеру для hppa/hp700. Видимо, железа мало, qemu нет, и как результат — пакетов нет. К слову о железе, на Sparc Classic какой-нибудь Perl 5 собирается двое суток, QT4 — больше недели. Собирается без проблем.

Наши бараны
PA-RISC based машина у меня есть, равно как и Alpha based и Sparc64 based, но играю чаще всего я в Sparc32 (sparc) просто из-за того, что мой Sparc Classic очень маленький и не занимает много места, находясь под руками, поэтому, кросс-компиляцию я буду описывать на примере архитектуры sparc. Так же, выбор этой архитектуры связан с тем, что официально собранных пакетов (для pkgsrc-2020Q3 на момент написания статьи) для архитектуры amd64 аж 22369 штук, для sparc64 — 19848, а для sparc — менее 14 тысяч. Причем отсутствие Firefox или SuperPi в общем понятно, а вот отсутствие mc — нет. Лицензия? Так под amd64 это не помешало 🙂 В любом случае, кросс-компиляция позволит дополнительно собрать минимум три сотни пакетов, которые отсутствуют в официальном хранилище (в зависимости от версии ОС и pkgsrc у меня собиралось обычно около 4 тысяч пакетов, почти 4 сотни из которых отсутствовали в официальном наборе).



Построение системы
Шаг 0. Установка
В качестве базы я использовал виртуальную машину с четырьмя процессорными тредами, одним терабайтом дискового пространства и двумя гигабайтами оперативной памяти. Для попытки построения полного набора пакетов потребуется минимум 200GB дискового пространства, а вот много процессорных тредов или оперативной памяти совершенно не нужно. Так же, необходимо постоянное и не медленное подключение к сети Интернет.

Размер некоторых «пакетов» удивляет:

Здесь важно отметить, что pkgsrc это «как порты», а не «как сизиф». Непосредственно исходников в архиве pkgsrc-2020Q4.tar.gz нет, или почти нет, только правила для сборки. И для того, чтобы собрать тему оформления (icon theme) порой нужно собрать ImageMagick7… convert нужен. А для другой темы — ImageMagick 6. Тоже нужен convert, представляете? Ну да Бог им судья…

В качестве ОС использовалась NetBSD версии 9.1 для архитектуры x86-64. Установка штатная (всё место кроме свопа под корень), с включением ssh, созданием пользователя, настройкой сети на автоматическое получение реквизитов и пр. На этапе установки pkgsrc не конфигурировался. В общем, всё стандартно для NetBSD. Если на этапе установки возникают проблемы, наверное не стоит браться за реализацию кросс-компиляции.

Далее, в силу каких-то неведомых мне причин, скорость доступа до ftp.netbsd.org у меня очень маленькая, поэтому, я предварительно скачал sets, pkgsrc и пр. большие файлы и опубликовал их на своём ftp. Такой подход позволит сэкономить время в случае нескольких последовательных или параллельных разворачиваний системы. Тем не менее, далее, я буду использовать ссылки на официальные сайты netbsd.


Шаг 1. Заранее создаём mk.conf

mk.conf (/etc/mk.conf)

WRKOBJDIR=/usr/work
DISTDIR=/usr/distfiles
SKIP_LICENSE_CHECK=yes
ALLOW_VULNERABLE_PACKAGES=yes
USE_CROSS_COMPILE?=  yes
USE_PKG_ADMIN_DIGEST?=  no

PKG_DBDIR=/var/db/pkg

.if !empty(USE_CROSS_COMPILE:M[yY][eE][sS])
MACHINE_ARCH=        sparc

TOOLDIR=             /usr/obj/tooldir.NetBSD-9.1-amd64
CROSS_DESTDIR=       /usr/obj/destdir.sparc
PACKAGES=            ${PKGSRCDIR}/packages.${MACHINE_ARCH}
WRKDIR_BASENAME=     work.${MACHINE_ARCH}
USE_CWRAPPERS=       no

.endif

Шаг 2. Исходники
Делаем директории:

mkdir /usr/src
mkdir /usr/xsrc
mkdir /usr/obj

Качаем исходники

ftp -i ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-9.1/source/sets/
mget *.tgz
quit

Извлекаем:

$ for file in *.tgz
> do
> tar -xzf $file -C /
> done

В результате /usr/src и /usr/xsrc заполнятся содержимым ПЯТИ архивов. Не надо извлекать только src.tgz и xsrc.tgz, оставшиеся три архива тоже извлекаются в /usr/src/

Необязательный момент

#ftp -i ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-release-9/tar_files/src/
#mget *.tar.gz
#quit

#$ for file in *.tar.gz
#> do
#> tar -xzf $file -C /usr
#> done

Шаг 3. Собираем песочницу

cd /usr/src
./build.sh -m sparc tools
./build.sh -m sparc distribution

Шаг 4. Качаем и извлекаем pkgsrc

ftp ftp://ftp.netbsd.org/pub/pkgsrc/pkgsrc-2020Q4/pkgsrc-2020Q4.tar.gz
tar -xzvpf pkgsrc.tar.gz -C /usr

В результате /usr/pkgsrc заполнится содержимым архива pkgsrc-2020Q4.tar.gz


Шаг 5. Пробуем…

cd /usr/pkgsrc/cross/cross-libtool-base
make package
pkg_add -m sparc /usr/pkgsrc/packages.sparc/All/cross-libtool-base-sparc-2.4.6nb5.tgz

Если сова натянулась на глобус и ничего нигде не затрещало, то всё должно работать. Можно сделать что-то типа:

cd /usr/pkgsrc && make package

и потом изредка посматривать на рост количества пакетов командой:

ls /usr/pkgsrc/packages.sparc/All | wc -l

Да, не лишним будет отследить предложение системы сделать команду:

/usr/sbin/pkg_admin -K /var/db/pkg fetch-pkg-vulnerabilities

и собственно её сделать.


А вот если сова на глобус не натянулась то:

  • Пробуем установить дайджест из /usr/pkgsrc/packages/All, а не из /usr/pkgsrc/packages.sparc/All, естественно удаляя прежний
  • Если make package падает, пробуем «make package PKG_DBDIR=/var/db/pkg»
  • Если забыли сделать unset PKG_PATH, то… надо сделать unset PKG_PATH
  • И др. и пр. в зависимости от вывода системы и логов…


Известные проблемы:

  • Perl
  • Python
  • Fortran


Выводы
Для себя я выбор сделал в пользу того, что на картинке ниже, но шпаргалка по кросс-компиляции тоже нужна…

[UPD]
Небольшая статистика по NetBSD 8.1 и pkgsrc 2019Q3:
1. Официально под архитектуру sparc собрано 13027 пакетов.
2. Кросс-компиляция на x86_64 машине позволила собрать 3985 пакетов (355 пакетов отсутствуют в официальном наборе).
3. Примерно за то же время нативно (qemu) собрано 2803 пакета (344 пакета отсутствуют как в официальном наборе, так и в наборе после кросс-компиляции).

Важно отметить что команда make package в директории /usr/pkgsrc в случае кросс-компиляции отработала полностью и неоднократно, в то время как компиляция посредством qemu просто была остановлена. В итоге получилось 13725 (на 698 больше чем 13027 официальных) пакетов и есть потенциал для увеличения их количества. В подсчёте количества пакетов могут быть небольие неточности в силу использованных инструментов, но в целом, было 13 тысяч, а стало на 700 больше, и это не предел… а вот три с половиной сотни прироста для кросс-компиляции — это наверное предел.

По результатам сборки pkgsrc 2020Q4 в среде NetBSD 9.1 запись будет дополнена, либо написана новая.

Запись опубликована в рубрике Программки с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *