SATtva Персональная страница
темы архив все rss xml 2.0
 
 
блог
досье
связь
english
 

Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно

16.03.2009
линукс

За последнее время в руки попало несколько приложений, скомпилированных под 32-разрядную среду. Приложения закрытые, так что пересобрать их не представляется возможным, а на ноуте, как назло, давно стоит чистая 64-битная система (собственно, харденд-Гента).

Но я человек нехитрый, тупо переключил профиль на multilib и стал надеяться, что оно полетит. Разумеется, пересборка тулчейна (и, персонально, glibc) никуда не полетела, а вывалилась с жалобами на /lib/cpp, не прошедший sanity check. А на что я надеялся, если в системе нет инструментария для сборки x86-кода?

Полез в гугл, где быстро наткнулся на неутешительный ответ:

Warning: Currently you cannot switch from a no-multilib to a multilib-enabled profile, so think over your decision twice before you use the no-multilib profile.

Несправедливо! Из дальнейшего гугленья выяснилось, как всяческие проблемы с /lib/cpp решают в иных дистрибутивах: просто ставят подходящий бинарный пакет. Ну а мы чем хуже? Итак, ниже представлен действенный процесс перевода Gentoo Linux с чистого профиля amd64 на amd64-multilib (наличие hardened-патчей не играет роли), не прибегая к кросс-компиляции.

(Прежде, чем продолжить, настоятельно советую сделать резервную копию тулчейна: quickpkg binutils gcc glibc. Если у вас несколько версий gcc в слотах, укажите нужную атомом, особенно если это hardened-версия компилятора. Затем скопируйте файлы бинарных пакетов из /usr/portage/packages/All (или где там у вас PKGDIR) в какой-нибудь надёжный каталог.)

Для дальнейших манипуляций необходимо наличие Gentoo LiveCD (хотя, в принципе, подойдёт и InstallCD), который по сути -- универсальная multilib-система с нужным для наших целей тулчейном. У меня как раз на жёстком диске лежала исошка. Монтируем её и образ системы (если у вас это добро записано на CD, то первым mount'ом просто примонтируйте этот CD):

mkdir /mnt/{iso,squash}
mount -o loop ~/livecd-amd64-installer-2008.0-r1.iso /mnt/iso
mount -o loop /mnt/iso/image.squashfs /mnt/squash

Скопируем содержимое squashfs в нормальную файловую систему, в которой можно работать:

dd if=/dev/zero of=~/livecd_fs bs=1M count=2500
mkfs.ext3 -b1024 -I128 -m0 -O sparse_super -Fv ~/livecd_fs
mkdir /mnt/gentoo
mount -o loop,exec ~/livecd_fs /mnt/gentoo
cp -vrpP /mnt/squash/* /mnt/gentoo/

(Как и у большинства задач в линуксе, у этой тоже есть несколько решений. Так, если у вас InstallCD, то создавать образ на 2.5 гигабайта совершенно не требуется. Объём можно сократить и в случае LiveCD, если не копировать всё содержимое squashfs. Я здесь пошёл по простейшему пути.)

Всё почти готово. Подключаем служебные {псевдо}-файловые системы и актуальное дерево портежа:

mount -t proc none /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
mount -o bind /usr/portage /mnt/gentoo/usr/portage/

Если каталоги с дистрибутивами и бинарными пакетами лежат у вас не в /usr/portage/{distfiles,packages}, а за пределами директории portage, не забудьте примонтировать аналогичным образом и их. Теперь завершаем приготовления и чрутимся в созданную среду:

cp -vPf /etc/make.* /mnt/gentoo/etc/
chroot /mnt/gentoo /bin/bash

С помощью ls -l /etc/make.profile убедитесь, что символьная ссылка ведёт к нужному вам multilib-профилю. (Тут стоит оговориться, что если ваша основная, не-chroot-система использует hardened-профиль, не указывайте его, если только не перенесли в chroot и hardened gcc. Иными словами, достаточно выбрать обычный десктопный профиль amd64, который по умолчанию multilib.) Затем отредактируйте /etc/make.conf, добавив в список USE-флагов multilib. Также, если в переменной FEATURES прописывали всяческие ограничения привилегий для работы портежа (типа usersandbox, userpriv и т.п.) и при этом сидите на hardened-ядре с укреплённым chroot'ом, уберите их, иначе не сможете выполнить сборку.

Наконец, обновляем среду и компилируем мультилибнутый glibc, создавая бинарный пакет. Имейте в виду, необходимо собрать ту же самую версию glibc, что и в основной системе, так что указывайте пакет атомом.

env-update ; source /etc/profile
emerge --metadata
emerge --buildpkgonly =sys-libs/glibc-2.6.1

Если на этапе конфигурации не возникнет проблем, то и сборка наверняка пройдёт успешно. Итак, если нам повезло, и glibc с USE-флагом multilib собран, возвращаемся из чрута на свет божий: logout.

Убедитесь, что у вас установлен флаг multilib (emerge --info | grep multilib) и, если нет, добавьте его в make.conf. Всё готово к установке glibc и пересборке тулчейна (не забудьте указать gcc атомом, если у вас hardened-профиль):

FEATURES="-collision-protect" emerge -K sys-libs/glibc
emerge =sys-devel/gcc-3.4.6-r2
emerge binutils glibc =sys-devel/gcc-3.4.6-r2

Осталось прибраться и пересобрать мир:

umount -v /mnt/gentoo/proc
umount -v /mnt/gentoo/dev
umount -v /mnt/gentoo/usr/portage/
# отмонтируйте остальные использованные вами файловые системы
# <...>
umount -v /mnt/gentoo
umount -v /mnt/squash
umount -v /mnt/iso
rm -vi ~/livecd_fs
rmdir /mnt/{iso,squash,gentoo}
emerge -e world

Миссия выполнена.
Комментарии

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от vdouo

06.04.2009 11:08

если вы используете как основу install-amd64-minimal-2008.0-r1.iso, то тогда не забудьте создать пакет sys-apps/portage, т.к. в минимальный образ не входит программа emerge!

Re: от SATtva

06.04.2009 17:39

Я, конечно, давно не использовал MinimalCD и не знаю о его текущем состоянии, но не совсем понимаю, как в его поставке может отсутствовать пакетный менеджер. А как систему разворачивать без emerge?

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от gremlin

10.05.2009 19:10

Забыл добавить что поддержка squashfs нужна в ядре

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от SATtva

10.05.2009 21:15

Думал, это само собой разумеется. :)

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от gremlin

17.05.2009 20:12

gremlin@zebra /usr/src/linux $ dmesg|tail
SQUASHFS error: Major/Minor mismatch, older Squashfs 3.1 filesystems are unsupported

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от SATtva

18.05.2009 08:47

Не должно быть такого. А версия ядра?

Кстати, vdouo был отчасти прав: в MinimalCD как таковом действительно отсутствует портеж. Всё, что нужно в этом случае, это распапаковать стейдж в чрут-среду.

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от SATtva

21.05.2009 16:36

Ситуацию с gremlin'ом тоже прояснили. Формат squashfs, поддерживаемый модулем ядра 2.6.29, изменился без сохранения обратной совместимости со старым форматом.

Если вы столкнулись с такой же проблемой, установите пакет sys-fs/squashfs-tools, и с помощью утилиты unsquashfs извлеките содержимое образа.

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от сергей

08.01.2010 12:25

отличная статья, спасибо!

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от alyuka

21.04.2011 22:46

вчера перешёл с no-mulyilib на multilib при помощи
USE="multilib" emerge glibc
USE="multilib" emerge gcc
ну и после этог всё пересобрал без проблем )

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от SATtva

21.04.2011 23:11

На момент написания этого howto так легко не получалось: в отсутствие ia32-тулчейна собрать miltilib-glibc было бы нечем. Возможно, в новых версиях gcc бутстрап улучшили, но всё равно мне это кажется странным. Система была no-multilib изначально? Или когда-то ставилась multilib, потом переводилась на no-, а теперь обратно?

Re: Переход с no-multilib на multilib-enabled-профиль: если очень хочется, то можно от Поручик

06.06.2011 10:14

> multilib-enabled-профиль

Руская языка.
Оставить комментарий
Заголовок:

Текст:

Ваше имя:

Ваш e-mail:


Код подтверждения: