Статья содержит инструкции по созданию мультибиблиотечной Slackware64. Мультибиблиотечная 64-битная система Linux способна исполнять как 32-битные, так и 64-битные программы. Стандарт иерархии файловой системы документирует оптимальный метод достижения чистого разделения между 64-битным и 32-битным программами на одной системе. Начав разработку «Slackware64» (официального порта на архитектуру x86_64), мы решили придерживаться этого стандарта. Поэтому Slackware64 была настроена на поиск 64-битных библиотек в каталогах /lib64
и /usr/lib64
. Вот почему я называю Slackware64 готовой к мультибиблиотечности — хотя 32-битные библиотеки будут искаться в /lib
и /usr/lib
, в поставке Slackware64 нет 32-битных программ. Требуется сделать ещё один шаг (вам, пользователю), прежде чем Slackware64 можно будет назвать «мультибиблиотечной».
Это достигается следующим образом:
Когда вышла Slackware64, она имела преимущество перед прочими существовавшими 64-битными «форками». Последние добавляли 32-битный слой совместимости путём перекомпиляции множества своих пакетов как 32-битных бинарников. С другой стороны, Slackware — это дистрибутив, состоящий из 32-битного и 64-битного выпуска, разрабатываемых параллельно. Это означает, что вам не нужно компилировать 32-битные пакеты с нуля для добавления мультибиблиотечности в 64-битную систему. Можно просто взять их из дерева пакетов 32-битной Slackware!
Это было одной из причин не добавлять в Slackware64 полную мультибиблиотечность — мы создали необходимые условия, но если пользователю нужна мультибиблиотечность, то ему нужно действовать самостоятельно.
В разделе ниже я объясню, как взять 32-битный пакет Slackware (скажем, пакет «mesa») и перепаковать его содержимое в пакет «mesa-compat32», который можно установить непосредственно в Slackware64.
Я приведу несколько примеров программ, которые требуют поддержки мультибиблиотечности на 64-битной Slackware, поскольку они не запускаются или не компилируются на Slackwre64 без 32-битного слоя совместимости:
К счастью, поддержка 64 бит становится всё более распространённой. Довольно долго больным местом был Adobe, но в конце концов они выпустили свой плагин Flash для браузера в 64-битном варианте. Sun (ныне поглощённый Oracle-ом) выпустила 64-битную версию своего плагина Java для браузера. Эти два события послужили спусковым крючком для начала работы над Slackware64.
Можете загрузить набор мультибиблиотечных пакетов и сценариев с моего сайта: http://slackware.com/~alien/multilib/ .
Наряду с несколькими файлами README (эта статья вики — расширенная версия одного из тех файлов) ниже каталога верхнего уровня «multilib» находятся подкаталоги для каждого 64-битного выпуска Slackware. Там же расположен каталог «source». Он содержит исходные тексты и сценарии SlackBuild.
Что вам действительно нужно — бинарные пакеты — доступны в каталоге <номер_выпуска_slackware> ниже каталога верхнего уровня. Каждый такой каталог содержит подкаталог «slackware64-compat32», где находится основной набор конвертированных 32-битных пакетов Slackware, готовых к установке на 64-битной Slackware.
Для поддержки актуальности советую обратить внимание на ChangeLog ( лента RSS), которые я поддерживаю для моих мультибиблиотечных пакетов. Обычно обновляются пакеты glibc and gcc в течении дня после обновления их в Slackware.
Автоматизация:
# slackpkg update # slackpkg upgrade multilib # slackpkg install multilib
Последняя команда покажет новые «compat32» пакеты, например недавно добавленные llvm-compat32 и orc-compat32.
SLACKPKGPLUS=on VERBOSE=1 ALLOW32BIT=off USEBL=1 WGETOPTS="--timeout=5 --tries=1" GREYLIST=on PKGS_PRIORITY=( multilib restricted alienbob ktown ) REPOPLUS=( slackpkgplus multilib restricted alienbob ktown ) MIRRORPLUS['multilib']=http://bear.alienbase.nl/mirrors/people/alien/multilib/current/ MIRRORPLUS['alienbob']=http://bear.alienbase.nl/mirrors/people/alien/sbrepos/current/x86_64/ MIRRORPLUS['restricted']=http://bear.alienbase.nl/mirrors/people/alien/restricted_sbrepos/current/x86_64/ MIRRORPLUS['ktown']=http://bear.alienbase.nl/mirrors/alien-kde/current/latest/x86_64/ MIRRORPLUS['slackpkgplus']=http://slakfinder.org/slackpkg+/
Этот раздел содержит основные инструкции по добавлению полной поддержки мультибиблиотечности в вашу систему Slackware64. Если хотите разобраться в процессе более подробно или нужна информация о том, как компилировать 32-битные программы в Slackware64, прочтите и последующие разделы.
Обратите внимание, знак «#» в начале команд означает приглашение суперпользователя root.
# SLACKVER=14.2 # mkdir multilib # cd multilib # lftp -c "open http://bear.alienbase.nl/mirrors/people/alien/multilib/ ; mirror -c -e ${SLACKVER}" # cd ${SLACKVER}
# upgradepkg --reinstall --install-new *.t?z
после перехода в каталог с загруженными пакетами.
Эта команда также установит дополнительный пакет «compat32-tools».
lftp
» делает это) — вам повезло, потому что я уже выполнил преобразование 32-битных пакетов! Всё, что нужно, это выполнить команду: # upgradepkg --install-new slackware64-compat32/*-compat32/*.t?z
которая установит все 32-битные пакеты Slackware (или обновит их, если установлены более старые их версии, например, при обновлении до новой версии Slackware). Это всё!
/home/ftp/pub/slackware/slackware-14.2/slackware/
»./media/SlackDVD/slackware/
», но в примерах команд ниже я его не буду использовать).# mkdir slackware64-compat32 ; cd slackware64-compat32
# massconvert32.sh -i /home/ftp/pub/slackware/slackware-14.2/slackware/
# upgradepkg --install-new *-compat32/*.t?z
glibc
и gcc
в его чёрный список. Если не принять подобных мер предосторожности, есть риск, что пакетный менеджер случайно заменит мультибиблиотечные версии версиями из оригинальной чисто 64-битной Slackware!/etc/slackpkg/blacklist
для внесения в чёрный список всех моих пакетов (включая мультибиблиотечные пакеты gcc и glibc и все пакеты compat32
): [0-9]+alien [0-9]+compat32
С другой стороны, если используете расширение slackpkg slackpkg+, то не включайте эти пакеты в чёрный список, иначе slackpkg+ не сможет ими управлять!
# massconvert32.sh -u http://someserver.org/path/to/slackware-14.2/slackware
Следующие пакеты glibc/gcc являются заменой, не добавлением, к стандартным пакетам Slackware. Для обновления до моих мультибиблиотечных версий пакетов gcc и glibc используйте программу «upgradepkg
». Они нужны для исполнения (glibc) и сборки (gcc) 32-битных программ на компьютере с 64-битной Slackware:
gcc-java
больше не существует, так как его разработка прекращена.
glibc-zoneinfo
не содержит кода и поэтому не входит в мультилиб. Этот пакет устанавливается из 64-битной Slackware.
Есть один дополнительный пакет для установки программой «installpkg». Актуальная версия для каждого из выпусков Slackware может отличаться, но пакет находится в том же каталоге, что и мультибиблиотечные версии gcc
и glibc
:
Обновление glibc и gcc, описанное в предыдущем разделе, делает из «готовой к мультибиблиотечности» действительно «мультибиблиотечную» систему.
Теперь всё, что осталось — это установить 32-битные версии системных компонент Slackware, чтобы установленные и/или компилируемые в последующем программы смогли найти все необходимые им 32-битные библиотеки.
Это несколько сложнее, чем взять пакеты из 32-битной Slackware и установить их в Slackware64:
/usr/lib/foo
), одноимённые 64-разрядные файлы будут перезаписаны при установке поверх 32-битного пакета и наоборот. Если такое случится, система будет серьёзно попорчена.Потребуются дополнительные меры предосторожности для удаления ненужных/нежелательных файлов из 32-битных пакетов перед их установкой. Нужны 32-битные пакеты, которые не конфликтуют с тем, что уже есть в 64-битной Slackware. Отсюда и название «32-битный пакет совместимости».
Я решил, что если 32-битные пакеты совместимости для Slackware буду делать я сам, это будет пустой тратой загрузочного канала. В конце концов, вероятно, у вас уже есть купленный DVD Slackware 14.2, то есть уже имеется в наличии и 64-битная, и 32-битная версии Slackware… в противном случае дерево пакетов 32-битной Slackware, безусловно, доступно для свободной загрузки
Вместо этого я написал несколько сценариев (часть кода написана Fred Emmott для небезызвестной Slamd64) и обернул их в пакет «compat32-tools». Их назначение — позволить вам самостоятельно извлечь необходимое из произвольного 32-битного пакета Slackware и и использовать его для создания нового пакета, который можно безопасно устанавливать на 64-битной Slackware.
Пакет «compat32-tools» требует некоторых пояснений.
Прочтите подробный файл «README» в каталоге /usr/doc/compat32-tools-*/
, он станет хорошим подспорьем. Пакет устанавливает три полезных сценария:
x/mesa-7.5-i486-1.txz
) и выполняем # convertpkg-compat32 -i /path/to/mesa-7.5-i486-1.txz
который создаст новый пакет mesa-compat32-7.5-x86_64-1compat32.txz
. Этот новый пакет (созданный в каталоге /tmp
, если не указали другой каталог) основан на прежнем 32-битном пакете, но не содержит лишнего. Смена базового имени пакета (mesa на mesa-compat32) позволяет установить этот новый пакет в Slackware64, где он сможет сосуществовать с 64-битным пакетом mesa не перезаписывая его файлов.
Временные файлы, оставленные сценарием в каталоге «/tmp/package-<prgnam>-compat32
», можно удалить.
/mnt/dvd
): # massconvert32.sh -i /mnt/dvd/slackware -d ~/compat32
В результате примерно 150 МБ новых пакетов будут записаны во вновь созданный каталог ~/compat32
(имя каталога выбрано для примера и, конечно, может быть произвольным). Эти пакеты содержат 32-битный костяк мультибиблиотечной системы Slackware64.
Установите их при помощи «installpkg
», и они обеспечат вам достаточно полный 32Внешняя ссылка-битный слой совместимости поверх Slackware64:
# installpkg ~/compat32/*/*.t?z
Конечно, при обновлении с предыдущих версий этих пакетов (например, при обновлении 64-битной Slackware до новой версии) нужно использовать «upgradepkg –install-new
» вместо «installpkg
»:
# upgradepkg --install-new ~/compat32/*/*.t?z
Параметр «–install-new» нужен, чтобы добавленные в новую версию Slackware новые пакеты compat32
были установлены.
compat32
можно заметить сообщения об отсутствующих файлах в /etc
. Так задумано, игнорируйте эти ошибки. Эти сообщения вызваны тем фактом, что файлы в /etc
удаляются из пакетов «-compat32» при конвертации (за исключением pango и gtk+2). Я полагаю, что файлы в /etc
уже установлены оригинальными 64-битными пакетами.cups-compat32
: Executing install script for cups-compat32-1.3.11-x86_64-1.txz. install/doinst.sh: line 5: [: too many arguments cat: etc/cups/interfaces: Is a directory cat: etc/cups/ppd: Is a directory cat: etc/cups/ssl: Is a directory cat: etc/cups/*.new: No such file or directory cat: etc/dbus-1/system.d/cups.conf.new: No such file or directory chmod: cannot access `etc/rc.d/rc.cups.new': No such file or directory cat: etc/rc.d/rc.cups.new: No such file or directory Package cups-compat32-1.3.11-x86_64-1.txz installed.
convertpkg-compat32
для конвертации в пакет -compat32 пакта не из Slackware, настоятельно не рекомендую этого делать. Сценарий написан для единственной цели — сделать 32-битные версии официальных бинарных файлов/библиотек Slackware доступными для мультибиблиотечной установки. Поэтому сценарий оставляет в 32-битном пакете только необходимое для слоя совместимости, полагая, что всё остальное установлено в составе 64-битного пакета.Когда подготовка системы согласно приведённым выше инструкциям завершена, запуск скомпилированных 32-битных программ несложен. Просто загрузите, установите и запускайте!
Время от времени могут попадаться программы, требующие определённых 32-битных библиотек, которых нет в системе. В этом случае найдите, какой пакет в 32-битной Slackware содержит отсутствующую библиотеку. Используйте сценарий «convertpkg-compat32» для конвертации исходного 32-битного пакета и установите полученный 32-битный «-compat32» пакет в Salckware64.
Если нужно скомпилировать 32-битную программу (wine и grub — пара примеров исключительно 32-битных программ с открытым исходным кодом), сперва настройте окружение суперпользователя root запуском следующей команды:
# . /etc/profile.d/32dev.sh
Обратите внимание на точку в начале строки — это тоже часть команды. Использование точки эквивалентно команде source.
Запуск команды изменяет или создаёт несколько переменных окружения. В результате при компиляции 32-битные версии бинарных файлов получат приоритет над 64-битными — будет запускаться 32-битная компиляция. Изменения действуют до выхода (logout) из шелла суперпользователя root.
В этом изменённом окружении возможно использовать стандартные SlackBuild-ы для сборки 32-битных пакетов для Slackware64. Несколько важных замечаний:
# convertpkg-compat32 -i /path/to/your/fresh/foo-VERSION-i486-BUILD.txz # upgradepkg --install-new /tmp/foo-compat32-VERSION-x86_64-BUILDcompat32.txz
-compat32
» возможно потребуется переустановить бинарные драйверы видеокарт Nvidia или Ati для X.Org. Эти пакеты драйверов содержат одновременно 64-битные и 32-битные библиотеки для максимальной пользы на 64-битной мультибиблиотечной ОС. Если установили файлы драйвера для обоих архитектур, пакет «mesa-compat32
» перезапишет некоторые из 32-битных библиотечных файлов.
Вот список пакетов, преобразованных в «-compat32» версии сценарием massconvert32.sh
. Отметьте, что некоторые из этих пакетов не входят в Slackware 13.0 или 13.1, они были добавлены в более поздних версиях Slackware, и поэтому станут причиной сообщения «* FAIL: package 'package_name' was not found!» («* СБОЙ: пакет 'имя_пакета' не найден!») при запуске сценария на ранних версиях Slackware.
# Набор A/: aaa_elflibs attr bzip2 cups cxxlibs dbus e2fsprogs eudev libgudev openssl-solibs udev util-linux xz # Набор AP/: cups cups-filters flac mariadb mpg123 mysql sqlite # Набор D/: libtool llvm opencl-headers # Набор L/: SDL2 alsa-lib alsa-oss alsa-plugins atk audiofile cairo dbus-glib elfutils esound expat ffmpeg fftw freetype fribidi gamin gc gdk-pixbuf2 giflib glib2 gmp gnome-keyring gtk+2 gst-plugins-base gst-plugins-base0 gst-plugins-good gst-plugins-good0 gst-plugins-libav gstreamer gstreamer0 hal harfbuzz icu4c jasper json-c lame lcms lcms2 libaio libart_lgpl libasyncns libclc libedit libelf libexif libffi libglade libgphoto2 libidn libieee1284 libjpeg libjpeg-turbo libmng libmpc libnl3 libnotify libogg libpcap libpng libsamplerate libsndfile libtasn1 libtermcap libtiff libunistring libusb libvorbis libxml2 libxslt lzo ncurses ocl-icd openjpeg orc pango popt pulseaudio python-six qt readline sbc sdl seamonkey-solibs speexdsp startup-notification svgalib v4l-utils zlib # Набор N/: curl cyrus-sasl gnutls libgcrypt libgpg-error libtirpc nettle openldap-client openssl p11-kit samba # Набор X/: fontconfig freeglut glew glu libFS libICE libSM libX11 libXScrnSaver libXTrap libXau libXaw libXcomposite libXcursor libXdamage libXdmcp libXevie libXext libXfixes libXfont libXfont2 libXfontcache libXft libXi libXinerama libXmu libXp libXpm libXprintUtil libXrandr libXrender libXres libXt libXtst libXv libXvMC libXxf86dga libXxf86misc libXxf86vm libdmx libdrm libepoxy libfontenc libinput libpciaccess libva libva-intel-driver libvdpau libxcb libxshmfence mesa pixman vulkan-sdk xcb-util # Набор XAP/: sane
Загрузить мультибиблиотечные пакеты можно (как минимум) по этим адресам:
./source
).Удачи!
Эрик