Замечание: оригинал этого документа новее, чем перевод.
Debian GNU/Hurd
Разработка дистрибутива
Создание пакетов с ПО Hurd
Специфичные для Hurd пакеты сопровождаются в рамках команды https://salsa.debian.org/hurd-team/.
Перенос пакетов Debian
Если вы хотите помочь переносу Debian GNU/Hurd, вам следует познакомиться с системой создания пакетов Debian. После того, как вы прочтёте доступную документацию и посетите Уголок разработчика, вы будете знать, как распаковывать пакеты Debian с исходным кодом и собирать пакеты Debian. Для ленивых людей имеется ускоренный курс:
Получение исходного кода и сборка пакетов
Вы можете получить исходный код, просто выполнив команду apt source
package
, эта команда также развернёт исходный код.
Для распаковки пакета Debian с исходным кодом требуется файл
package_version.dsc
и указанные в нём файлы. Вы создаёте
каталог Debian для сборки с помощью команды
dpkg-source -x package_version.dsc
Сборка пакета происходит в созданном каталоге Debian для сборки
package-version
с помощью команды
dpkg-buildpackage -B "-mMyName <MyEmail>"
.
Вместо -B
вы можете использовать
-b
, если также хотите собрать независимые от архитектуры
части пакета (однако обычно это бесполезно, так как они уже имеются
в архиве, а для их сборки могут потребоваться дополнительные
зависимости). Вы можете добавить
-uc
, чтобы не подписывать пакет вашим OpenPGP-ключом.
Для сборки могут потребоваться дополнительные пакеты. Проще всего
выполнить команду apt build-dep package
, которая установит все требуемые пакеты.
Удобно испольовать pbuilder. Пакет может быть собран с помощью команды
sudo pbuilder create --mirror http://deb.debian.org/debian-ports/ --debootstrapopts --keyring=/usr/share/keyrings/debian-ports-archive-keyring.gpg --debootstrapopts --extra-suites=unreleased --extrapackages debian-ports-archive-keyring
,
затем можно использовать команду pdebuild -- --binary-arch
, которая загрузит сборочные зависимости и др., а потом поместит результат в /var/cache/pbuilder/result
.
Выберите пакет
Над каким пакетом нужно поработать? Ну, над любым пакетом, который ещё не был перенесён, но должен быть перенесён. Список таких пакетов постоянно меняется, поэтому предпочтительно сконцентрироваться в первую очередь на пакетах с большим количеством обратных зависимостей, список таких пакетов можно посмотреть на графике зависимости пакетов https://people.debian.org/~sthibault/graph-radial.pdf, обновляемом каждый день, либо в списке наиболее желаемых пакетов https://people.debian.org/~sthibault/graph-total-top.txt (это список пакетов, желаемых в далёкой перспективе, список пакетов, желаемых в короткой перспективе находится здесь: https://people.debian.org/~sthibault/graph-top.txt). Неплохо также выбрать какой-нибудь пакет из списков устаревших пакетов https://people.debian.org/~sthibault/out_of_date2.txt и https://people.debian.org/~sthibault/out_of_date.txt, поскольку обычно они работают, но сломаны в настоящий момент лишь вероятно из-за пары каких-то причин. Вы также можете случайным образом выбрать один из отсутствующих пакетов, либо посмотреть журналы автоматической сборки в списке рассылки debian-hurd-build-logs, либо использовать список пакетов, которые требуют доработки https://people.debian.org/~sthibault/failed_packages.txt .
Также проверьте, может быть работа по переносу какого-то пакета уже выполнена, см. https://alioth.debian.org/tracker/?atid=410472&group_id=30628&func=browse, https://alioth.debian.org/tracker/?atid=411594&group_id=30628&func=browse, систему отслеживания ошибок (https://bugs.debian.org/cgi-bin/pkgreport.cgi?users=debian-hurd@lists.debian.org;tag=hurd) и https://wiki.debian.org/Debian_GNU/Hurd, а также статус пакетов на buildd.debian.org, напр. https://buildd.debian.org/util-linux.
Пакеты, которые не будут перенесены
Некоторые из этих пакетов или их части могут быть перенесены позже, но в настоящее время они считаются по меньшей мере непереносимыми. Обычно они помечены как NotForUs в базе данных buildd.
-
base/makedev
, поскольку Hurd имеет свою собственную версию этого сценария. Пакет Debian с исходным кодом содержит только версию, специфичную для Linux. -
base/modconf
иbase/modutils
, поскольку концепция модулей специфична для Linux. -
base/netbase
, поскольку оставшаяся часть этого специфична для ядра Linux. Hurd используетinetutils
. -
base/pcmcia-cs
, поскольку этот пакет специфичен для Linux. -
base/setserial
, поскольку это специфично для ядра Linux. Тем не менее, с переносом символьных драйверов Linux на GNU Mach, мы, вероятно, сможем использовать эту функциональность.
Общие проблемы переноса
Список общих проблем доступен на веб-сайте основной ветки разработки. Следующие общие проблемы специфичны для Debian.
До того, как предпринять попытку исправить что-то, проверьте, может быть в переносе на kfreebsd* это уже исправлено и нужно лишь распространить это решение на hurd-i386.
-
foo : Depends: foo-data (= 1.2.3-1), но пакет не будет установлен
Короткий ответ таков: пакет
foo
не был собран для hurd-i386, это требует исправления, обратитесь к странице статуса с ошибкой сборки на buildd.debian.org.Обычно это случается в том случае, когда пакет
foo
не может быть в настоящее время собран, но ранее успешно собирался. Используйтеapt-cache policy foo foo-data
, чтобы увидеть, что, например, доступна версия1.2.3-1
пакетаfoo
, и доступна более новая версия пакетаfoo-data
, например,2.0-1
. Это связано с тем, что на debian-ports независящие от архитектуры (arch:all) пакеты распространяются для всех архитектур, поэтому когда загружается более новая версия пакета с исходным кодомfoo
(из которого собираются двоичные пакетыfoo
иfoo-data
), устанавливается более новый arch:all пакетfoo-data
, даже если более новый hurd-i386 двоичный пакетfoo
не может быть собран, это ведёт к несовместимости версий. Для исправления этого требуется заставить архив debian-ports использовать dak вместо mini-dak, работа над чем всё ещё продолжается. -
некоторые символы и шаблоны исчезли из файла с символами
В которые пакетах имеются списки символов, которые ожидаются в библиотеках. Однако такой список обычно создаётся в системе Linux, а потому он включает в себя символы, которые не имеют смысла для отличных от Linux систем (например, из-за каких-то характерных только для Linux возможностей). Можно, однако, добавить условные утверждения в файл
.symbols
, например:(arch=linux-any)linuxish_function@Base 1.23
-
Сломанная зависимость libc6
Некоторые пакеты используют ошибочную зависимость от
libc6-dev
. Это неправильно, посколькуlibc6
специфична для некоторых архитектур GNU/Linux. Соответствующий пакет для GNU —libc0.3-dev
, но другие операционные системы имеют свои пакеты. Мы можем обнаружить проблему в файлеdebian/control
в дереве исходного кода. Типичное решение предполагает обнаружение операционной системы, используяdpkg-architecture
, и добавления версии so-библиотеки (soname), или, что ещё лучше, использования логического ИЛИ, напр.:libc6-dev | libc6.1-dev | libc0.3-dev | libc0.1-dev | libc-dev
. Пакетlibc-dev
является виртуальным пакетом, которые работает для любой версии so-библиотеки, но вам следует указывать его только как последнее средство. -
undefined reference to snd_*, SND_* undeclared
Некоторые пакеты используют ALSA даже на архитектурах, отличных от Linux. Пакет oss-libsalsa предоставляет некоторую эмуляцию над OSS, но он ограничен 1.0.5, и не предоставляет некоторые возможности, такие как все операции секвенсера.
Если пакет разрешает это, поддержка alsa должна быть отключена на всех архитектурах
!linux-any
(например, через параметрconfigure
), к alsaBuild-Depends
добавлен спецификатор[linux-any]
, а кBuild-Conflicts
добавлено обратное утверждение, такое какBuild-Conflicts: libasound2-dev [!linux-any]
. -
dh_install: не удаётся найти (совпадения с) "foo" (попытка произведена в ., debian/tmp)
Обычно это случается в том случае, когда код из основной ветки разработки не выполняет установку, если не удаётся определить операционную систему. Иногда это просто глупо (например, код не знает, что сборка разделяемой библиотеки на GNU/Hurd полностью совпадает со сборкой на GNU/Linux) и нужно это исправить. Иногда эта проблема имеет смысл (например, не установлены файлы служб systemd). В этом случае можно использовать dh-exec: добавьте dh-exec в список сборочных зависимостей, выполните команду chmod +x для файла .install и добавьте к проблемным строкам [linux-any] или [!hurd-any].
Изучение и работа с программой установки Debian
Чтобы создать ISO-образ, проще всего начать с существующего образа, размещённого на странице CD-образов Hurd. Его можно примонтировать и скопировать:
mount debian-sid-hurd-i386-NETINST-1.iso /mnt cp -a /mnt /tmp/myimage umount /mnt chmod -R +w /tmp/myimage |
Далее, можно примонтировать начальный ram-диск и, например, заменить какой-то транслятор на ту версию, которая вам нужна:
gunzip /tmp/myimage/initrd.gz mount /tmp/myimage/initrd /mnt cp ~/hurd/rumpdisk/rumpdisk /mnt/hurd/ umount /mnt gzip /tmp/myimage/initrd |
Теперь можно заново собрать iso с помощью grub-mkrescue:
rm -fr /tmp/myimage/boot/grub/i386-pc grub-mkrescue -o /tmp/myimage.iso /tmp/myimage |