Table of Contents

Adicionando capacidade Multilib ao Slackware na arquitetura x86_64

Este artigo contém instruções sobre como criar um Slackware64 verdadeiramente multilib. Um sistema Linux 64 bits multilib é capaz de rodar programas de 64 bits e 32 bits. O Filesystem Hierarchy Standard descreve o método ideal para obter uma separação clara entre os softwares de 64 bits e 32 bits em um único sistema. Ao iniciar o desenvolvimento do “Slackware64” (o porte oficial para a arquitetura x86_64) optamos por adotar este padrão. Portanto, o Slackware64 foi configurado para procurar bibliotecas de 64 bits nos diretórios /lib64 e /usr/lib64. É por isso que chamo o Slackware64 de “multilib-ready” (multilib-preparado)- embora as bibliotecas de 32 bits sejam procuradas em /lib e /usr/lib, o Slackware64 não vem com nenhum software de 32 bits. Há mais um passo que deve ser executado (por você, o usuário) antes que o Slackware64 possa ser chamado de “multilib-enabled” (multilib-habilitado).

Isso é feito da seguinte maneira:

  1. Primeiro, precisamos mudar para as versões multilib de
    • glibc (ou seja, uma glibc que suporta a execução de binários de 32 e 64 bits) e
    • gcc (ou seja, capaz de compilar binários de 32 bits, bem como binários de 64 bits).
  2. Em seguida, as bibliotecas do sistema são retiradas do Slackware 32 bits e instaladas no sistema Slackware de 64 bits junto com suas versões de 64 bits, o que completa o processo de criação de uma camada de software de compatibilidade de 32 bits.

O Slackware64 tem uma vantagem sobre outros “forks” de 64 bits que existem. Esses forks criam a camada de compatibilidade com sistema de 32 bits recompilando grande parte de seus pacotes para 32 bits. Por outro lado, o Slackware é uma distribuição que possui uma versão para 32 bits e 64 bits, em que cada versão é desenvolvida de forma paralela. Isto quer dizer que você não precisa compilar todos os pacotes de 32 bits a partir do zero para que seja possível adicionar a camada de compatibilidade ao sistema 64 bits. Você simplesmente pega os pacotes da árvore de pacotes do Slackware 32 bits! \\Essa é uma das razões para não adicionar todos os pacotes multilib ao Slackware64 - nós criamos as condições adequadas, mas é necessário que o usuário atue caso necessite da compatibilidade.
Em uma seção posterior, eu vou explicar como você pode buscar um pacote do Slackware 32 bits (digamos, o pacote “mesa”) e reempacotá-lo em um pacote “mesa-compat32” que pode ser instalado diretamente no Slackware64.

Slackware para a arquitetura x86_64 (ou “Slackware64”) é um sistema operacional puro de 64 bits, porém pode ser facilmente atualizado para a multlib. Originalmente, o Slackware64 só é capaz de compilar e executar programas de 64 bits.

Vantagens de um sistema multilib

Vou dar alguns exemplos de programas que necessitam do multilib em um Slackware de 64 bits, porque eles não serão inciados ou compilado no Slackware64 sem uma camada de compatibilidade 32 bits:

Felizmente, o suporte a 64 bits está se tornando cada vez mais comum. A Adobe foi um ponto sensível por muito tempo, mas eles finalmente lançaram seu plugin do navegador Flash em uma versão de 64 bits. A Sun (agora absorvida pela Oracle) revelou uma versão de 64 bits de seu plugin de navegador Java. Esses dois eventos foram os principais gatilhos para começar a trabalhar no Slackware64.

Obtendo os pacotes multilib

Você pode baixar um conjunto de pacotes e scripts para multilib-enabled no meu site: “http://slackware.com/~alien/multilib”.

Além de vários arquivos README (este artigo Wiki basicamente é uma versão aprimorada de um desses READMEs), você encontrará um subdiretório para cada versão do Slackware de 64 bits abaixo do diretório superior “multilib”. Existe outro diretório chamado “source”. O diretório “source” contém as fontes de pacotes e scripts SlackBuild.

O que você realmente está interessado - os pacotes binários - está disponível no diretório com o número da versão do Slackware, abaixo do diretório de nível superior. Cada diretório também contém um subdiretório “slackware64-compat32” onde você encontrará um conjunto essencial de pacotes Slackware de 32 bits convertidos, prontos para instalação em seu Slackware de 64 bits.

Mantendo seu multilib atualizado

Para se manter atualizado, aconselho você a ficar de olho no ChangeLog (RSS feed) que mantenho para meus pacotes multilib. Normalmente, terei os pacotes glibc e gcc atualizados disponíveis um dia após o Slackware ter atualizações para gcc e glibc.

Automatização:

  1. Confira o compat32pkg, por Sėbastien Ballet, que automatiza este processo de forma semelhante ao slackpkg.
  2. Se você preferir o slackpkg para gerenciamento de pacotes, vale a pena conferir o slackpkg+, uma extensão do slackpkg que gerencia os pacotes que você instalou de repositórios de terceiros - incluindo multilib. Quando configurado corretamente, você poderá manter seu multilib facilmente executando:
       # slackpkg update
       # slackpkg upgrade multilib
       # slackpkg install multilib

    Esse último comando mostrará se algum pacote novo foi adicionado à coleção de pacotes “compat32”, como llvm-compat32 e orc-compat32 recentemente.

    • Esta é a aparência de uma configuração típica - para um computador executando o Slackware-current e usando o repositório de testes KDE do AlienBOB. O PKGS_PRIORITY garante que os pacotes multilib do gcc e glibc tenham precedência sobre os originais do Slackware. A palavra-chave “multilib”, que define o nome do repositório, deve ser a mesma palavra-chave usada nos comandos “slackpkg” acima. A escolha da palavra “multilib” é arbitrária, poderia muito bem ser “compat32”, desde que seja usada de forma consistente.
      O conteúdo de um arquivo de exemplo “/etc/slackpkg/slackpkgplus.conf” seria o seguinte:
      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+/

Ativando o Suporte multilib no Slackware64

Guia rápido

Esta seção contém as instruções essenciais para adicionar capacidade multilib completa ao seu sistema Slackware64. Se você deseja entender o processo em mais detalhes, ou precisa de informações sobre como compilar software de 32 bits no Slackware64, você também deve ler as seções a seguir.
Observe que o “#” na frente dos comandos representa um prompt de root.

depois de mudar para o diretório onde você baixou esses pacotes.
Este comando também instalará um pacote adicional chamado “compat32-tools”.

Se você usar um gerenciador de pacotes como slackpkg nas versões mais antigas do Slackware que 13.37, você terá que adicionar todos os nomes de pacotes glibc e gcc à blacklist de pacotes. Se você não tomar este cuidado, você corre o risco de seu gerenciador de pacotes substituir acidentalmente suas versões multilib pelas versões originais de 64 bits do Slackware!
Se você rodar o Slackware 13.37 ou mais recente, então o slackpkg suporta expressões regulares no arquivo de blacklist. Nesse caso, uma única linha em /etc/slackpkg/blacklist será suficiente para colocar todos os meus pacotes na blacklist (incluindo pacotes multilib gcc e glibc e todos os pacotes compat32):
[0-9]+alien
[0-9]+compat32

Por outro lado, se você está usando a extensão slackpkg chamada slackpkg+ então você definitivamente não deve colocar esses pacotes na lista negra, porque isso impede o slackpkg+ de gerenciá-los!

Se você estiver executando o Slackware 13.1 ou mais recente e baixou o pacote compat32-tools para essa versão, o script massconvert32.sh pode usar um servidor remoto para baixar os pacotes do Slackware de 32 bits, em vez de exigir um Slackware local mirror ou um DVD. Use o parâmetro “-u” para especificar o URL remoto dessa forma:
# massconvert32.sh -u http://algumservidor.org/path/para/slackware-14.2/slackware

Instruções detalhadas

Atualizando glibc e gcc

Os seguintes pacotes glibc/gcc são substituições para - não adições aos - pacotes padrão do Slackware. Use o programa “upgradepkg” para atualizar para minhas versões multilib do gcc e glibc. Você precisará deles para executar (glibc) e construir (gcc) software de 32 bits em seu computador Slackware de 64 bits:

Slackware64 13.0

Slackware64 13.1

Slackware64 13.37

Slackware64 14.0

Slackware64 14.1

Slackware64 14.2

Slackware64 current

Desde a atualização para o gcc 7, não há mais o pacote gcc-java porque seu desenvolvimento foi interrompido.
O pacote glibc-zoneinfo não faz parte do multilib, pois não contém código. Você precisa instalar o pacote glibc-zoneinfo do Slackware.

Todas as versões do Slackware

Existe um pacote adicional que você precisa instalar usando o programa “installpkg”. A versão pode variar para cada lançamento do Slackware, mas o pacote pode ser encontrado no mesmo diretório onde você também encontra as versões multilib de gcc e glibc:

Adicionando bibliotecas 32-bit Slackware

A atualização de glibc e gcc que descrevi na seção anterior muda seu sistema de “ multilib-ready ” para “ multilib-enabled ”.
Agora, tudo que você precisa fazer é instalar as versões 32 bits dos softwares do Slackware para que os futuros programas de 32 bits que você vai instalar e/ou compilar encontrem todas as bibliotecas de 32 bits de que precisam para funcionar.

Isso não é tão simples quanto pegar pacotes de 32 bits do Slackware e instalá-los no Slackware64: * Em primeiro lugar, você acabará com vários pacotes com o mesmo nome (dois pacotes 'mesa', dois pacotes 'zlib', etc …) o que será confuso para você e também para o slackpkg gerenciador de pacotes. * Além disso, se o pacote de 32 bits contiver binários (algo como /usr/bin/foo), eles sobrescreverão suas contrapartes de 64 bits quando você instalar o pacote de 32 bits. Vai bagunçar seriamente o seu sistema se isso acontecer.

Um pouco de cuidado extra é necessário para que arquivos desnecessários/indesejados sejam retirados dos pacotes de 32 bits antes de você instalá-los. O que você precisa é de um pacote de 32 bits que não entre em conflito com o que já está presente no Slackware de 64 bits. Daí o nome “pacote de compatibilidade de 32 bits”.

Decidi que seria um desperdício de banda de download se eu mesmo criasse versões de compatibilidade de 32 bits dos pacotes do Slackware. Afinal, você provavelmente comprou o DVD do Slackware 14.2, então já possui as versões de 64 e 32 bits do Slackware … ou então a árvore do Slackware de 32 bits está disponível para download gratuito, é claro ;-)

Em vez disso, escrevi alguns scripts (partes do código do script foram escritas por Fred Emmott da para o Slamd64) e os envolvi em um pacote “compat32-tools”. Seu objetivo é permitir que você extraia o conteúdo de qualquer pacote do Slackware de 32 bits e use-o para criar um novo pacote que possa ser instalado com segurança em seu Slackware de 64 bits.

Este pacote “compat32-tools” precisa de alguma explicação.
Por favor, leia o arquivo 'README' detalhado no diretório /usr/doc/compat32-tools - * /, ele irá ajudá-lo. Estes são os três scripts úteis que o pacote instala:

Ao instalar os pacotes compat32 você notará que alguns irão mostrar erros sobre arquivos ausentes em /etc. Isso ocorre “por definição” e esses erros podem ser ignorados. Essas mensagens são causadas pelo fato de que os arquivos em /etc são removidos de um pacote “-compat32” durante a conversão (exceto para pango e gtk+2). Presumo que os arquivos em /etc já terão sido instalados pelos pacotes originais de 64 bits.
Um exemplo desses “erros” para o pacote 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.
Se você está pensando em usar o script convertpkg-compat32 para converter um pacote não-Slackware em um pacote -compat32, eu devo aconselhar fortemente a não fazê-lo. O script foi escrito com um único propósito: disponibilizar versões de 32 bits dos binários/bibliotecas oficiais do Slackware64 em uma configuração multilib. Como tal, o script removerá muitas coisas que estão presentes no pacote original de 32 bits - coisas que se espera tenham sido instaladas como parte da versão de 64 bits do pacote.
Em quase todos os casos em que você baixou um pacote de 32 bits que não é do Slackware e quer fazê-lo funcionar no Slackware64, a melhor maneira é encontrar as fontes e construir uma versão de 64 bits do pacote. Alternativamente, apenas instale o pacote original de 32 bits em vez de tentar “convertê-lo” e, em seguida, execute-o na linha de comando para descobrir qualquer biblioteca de 32 bits ausente que você ainda possa ter que extrair de um pacote oficial do Slackware.

Executando programas 32 bits

Executar um programa pré-compilado de 32 bits é fácil depois de você ter feito a preparação do sistema descrita acima. Basta fazer o download, instalar e executar!

Às vezes, você pode se deparar com um programa que requer uma determinada biblioteca do Slackware de 32 bits que você ainda não tem disponível. Nesse caso, descubra qual pacote do Slackware de 32 bits contém essa biblioteca faltante. Use o script “convertpkg-compat32” para converter aquele pacote Slackware original de 32 bits e instale o pacote “compatível” de 32 bits resultante no Slackware64.

Compilando programas 32 bits

No caso de você precisar compilar um programa de 32 bits (wine e grub são dois exemplos de programas de código aberto que são apenas de 32 bits), primeiro configure o ambiente de shell do root executando o comando:

# . /etc/profile.d/32dev.sh

Observe o 'ponto' no início da linha - na verdade, é parte da linha de comando! O uso do ponto é equivalente ao comando 'source'.
A execução deste comando altera ou cria várias variáveis ​​de ambiente. O efeito disso é que as versões de 32 bits dos binários são preferíveis aos binários de 64 bits quando você compila o código-fonte - você estará executando uma compilação de 32 bits. O efeito durará até que você saia do shell do root.

Neste ambiente alterado, você poderá usar o SlackBuilds padrão para construir pacotes de 32 bits para o Slackware64. Há algumas coisas a se ter em mente:

  1. Você tem que definir a variável ARCH como 'i486' porque mesmo em seu computador 'x86_64' você está compilando um programa de 32 bits!
    Isto está relacionado ao tripleto de “$ ARCH-slackware-linux” que é normalmente usado no comando “configure”.
    1. Como exceção, você terá que compilar o pacote “wine” com 'ARCH = x86_64' porque você instalará este pacote diretamente em seu computador multilib sem converter para um pacote 'compat32'.
  2. Se você deseja instalar este pacote de 32 bits no Slackware64-multilib, você terá que convertê-lo em um pacote 'compat32':
    # convertpkg-compat32 -i /path/to/your/fresh/foo-VERSION-i486-BUILD.tgz
    # upgradepkg --install-new /tmp/foo-compat32-VERSION-x86_64-BUILDcompat32.txz

Ressalvas

Pacotes convertidos pelo massconvert32.sh

Esta é a lista de pacotes que são convertidos em versões “-compat32” pelo script massconvert32.sh. Observe que alguns desses pacotes não fazem parte do Slackware 13.0 ou 13.1, eles foram adicionados em uma versão posterior do Slackware, portanto, produzirão uma mensagem “FALHA: pacote 'nome_do_pacote' não foi encontrado!” quando você execute o script em uma versão mais antiga. O contrário também é verdadeiro - alguns pacotes foram removidos em versões posteriores do Slackware e também irão disparar a mensagem “FALHA: pacote 'nome_do_pacote' não foi encontrado!”. Não se preocupe com isso.

# Série A/:
 
aaa_elflibs
attr
bzip2
cups
cxxlibs
dbus
e2fsprogs
eudev
libgudev
openssl-solibs
udev
util-linux
xz
 
# Série AP/:
 
cups
cups-filters
flac
mariadb
mpg123
mysql
sqlite
 
# Série D/:
 
libtool
llvm
opencl-headers
 
# Série 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
 
# Série N/:
 
curl
cyrus-sasl
gnutls
libgcrypt
libgpg-error
libtirpc
nettle
openldap-client
openssl
p11-kit
samba
 
# Série 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
 
# Série XAP/:
 
sane

Mirrors para download do Multilib

Você pode baixar os pacotes multilib de (pelo menos) estes locais:

Ferramentas de suporte de terceiros

Traduções

Agradecimentos

Divirta-se!

Eric

Fontes