Como executo programas de 32 bits em um Debian / Ubuntu de 64 bits?

74

Eu tenho uma instalação Debian ou Ubuntu de 64 bits (amd64 aka x86_64). Preciso executar programas de 32 bits (i386 / i686) ocasionalmente ou compilar programas para um sistema de 32 bits. Como posso fazer isso com um mínimo de confusão?

Bônus: e se eu quiser executar ou testar com uma versão mais antiga ou mais recente da distribuição?

Gilles
fonte
Possível mesmo em pedir ubuntu: askubuntu.com/questions/359156/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

52

Suporte nativo

Desde o Ubuntu 11.04 e o Debian wheezy (7.0), o Debian e o Ubuntu têm suporte a multiarch: você pode misturar os pacotes x86_32 (i386) e x86_64 (amd64) no mesmo sistema de maneira direta. Isso é conhecido como suporte a multiarch. Consulte a resposta do warl0ck para obter mais detalhes.

Em versões mais antigas, o Debian e o Ubuntu são fornecidos com várias bibliotecas de 32 bits no amd64. Instale o pacote para ter um conjunto básico de bibliotecas de 32 bits e, possivelmente, outros pacotes que dependem dessa. Seus executáveis ​​de 32 bits devem ser executados simplesmente se você tiver todas as bibliotecas necessárias. Para desenvolvimento, instale e, novamente, possivelmente outros pacotes que dependem dele, como . Você pode achar útil também, e no Debian. Passe a opção para o gcc para compilar para o ix86.ia32-libs Instale ia32-libsgcc-multilib Instale o gcc-multilibg++-multilibbinutils-multiarch Instale binutils-multiarchia32-libs-dev-m32

Observe que uname -mainda será exibido x64_64se você estiver executando um kernel de 64 bits, independentemente dos componentes de modo de usuário de 32 bits que você instalou. Schroot descrito abaixo cuida disso.

Schroot

Esta seção é um guia para instalar uma distribuição semelhante ao Debian "dentro" de outra distribuição Linux. Ele está redigido em termos de instalação de um Ubuntu de 32 bits dentro de um Ubuntu de 64 bits, mas deve ser aplicado com pequenas modificações em outras situações, como a instalação do Debian instável no Debian stable ou vice-versa.

Introdução

A idéia é instalar uma distribuição alternativa em uma subárvore e executar a partir dela. Você pode instalar um sistema de 32 bits em um sistema de 64 bits dessa maneira, ou uma versão diferente da sua distribuição ou um ambiente de teste com diferentes conjuntos de pacotes instalados.

A chrootchamada de comando e sistema inicia um processo com uma visualização do sistema de arquivos restrita a uma subárvore da árvore de diretórios. O Debian e o Ubuntu disponibilizam o schroot , um utilitário que envolve esse recurso para criar um sub-ambiente mais utilizável.

Instale o schrootpacote Instalar schroot ( Debian ) e o debootstrappacote Instale o debootstrap ( Debian ). O Debootstrap é necessário apenas para a instalação da distribuição alternativa e pode ser removido posteriormente.

Configurar schroot

Este exemplo descreve como configurar um ambiente alternativo do Ubuntu 10.04LTS (lucid lynx) de 32 bits. Uma configuração semelhante deve funcionar com outras versões do Debian e Ubuntu. Crie um arquivo /etc/schroot/chroot.d/lucid32com o seguinte conteúdo:

[lucid32]
description=Ubuntu 10.04LTS 32-bit
directory=/32
type=directory
personality=linux32
users=yourusername
groups=users,admin

A linha directory=/32informa ao schroot onde colocaremos os arquivos da instalação de 32 bits. A linha username=yourusernamediz que o usuário yourusernamepoderá usar o schroot. A linha groups=users,admindiz que os usuários de qualquer grupo poderão usar o schroot; você também pode colocar uma users=…diretiva.

Instale a nova distribuição

Crie o diretório e comece a preenchê-lo com debootstrap. O Debootstrap baixa e instala um conjunto principal de pacotes para a distribuição e arquitetura especificadas.

mkdir /32
debootstrap --arch i386 lucid /32 http://archive.ubuntu.com/ubuntu

Você quase já tem um sistema em funcionamento; o que se segue são pequenas melhorias. O Schroot sobrescreve automaticamente vários arquivos /32/etcquando você o executa, em particular a configuração do DNS /etc/resolv.confe o banco de dados do usuário /etc/passwde outros arquivos (isso pode ser substituído, consulte a documentação). Há mais alguns arquivos que você pode copiar manualmente de uma vez por todas:

cp -p /etc/apt/apt.conf /32/etc/apt/      # for proxy settings
cp -p /etc/apt/sources.list /32/etc/apt/  # for universe, security, etc
cp -p /etc/environment /32/etc/           # for proxy and locale settings
cp -p /etc/sudoers /32/etc/               # for custom sudo settings

Não haverá um arquivo /etc/mtabou /etc/fstabno chroot. Não recomendo usar o mountcomando manualmente no chroot, faça-o de fora. Mas crie um suficientemente bom /etc/mtabpara fazer comandos como o dftrabalho razoavelmente.

ln -s /proc/mounts /32/etc/mtab

Com o directorytipo, schroot irá realizar montagens bind de um número de diretórios, ou seja, os diretórios serão compartilhados com a instalação parent: /proc, /dev, /home, /tmp.

Serviços no chroot

Conforme descrito aqui, um schroot não é adequado para executar daemons. Os programas no schroot serão eliminados quando você sair do schroot. Use um schroot "simples" em vez de um schroot de "diretório" se desejar que ele seja mais permanente e configure montagens de ligação permanentes na /etc/fstabinstalação pai.

No Debian e Ubuntu, os serviços iniciam automaticamente na instalação. Para evitar isso (que pode interromper os serviços executados fora do chroot, principalmente porque as portas de rede são compartilhadas), estabeleça uma política de não execução de serviços no chroot. Coloque o seguinte script como /32/usr/sbin/policy-rc.de torne-o executável ( chmod a+rx /32/usr/sbin/policy-rc.d).

#!/bin/sh
## Don't start any service if running in a chroot.
## See /usr/share/doc/sysv-rc/README.policy-rc.d.gz
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  exit 101
fi

Preencher o novo sistema

Agora podemos começar a usar o chroot. Você deseja instalar mais alguns pacotes neste momento.

schroot -c lucid32
sudo apt-get update
apt-get install lsb-core nano
...

Pode ser necessário gerar algumas localidades, por exemplo

locale-gen en_US en_US.utf8

Se o schroot é para uma versão mais antiga do Ubuntu, como 8.04 (hardy), observe que o pacote ubuntu-standard puxa um MTA. Selecione em nullmailervez do padrão postfix(você pode querer que seu chroot envie correio, mas definitivamente não deseja que ele receba nenhum).

Indo além

Para mais informações, consulte o schrootmanual , as Perguntas frequentes sobre o schroot e o schroot.confmanual . Schroot faz parte do projeto Debian autobuilder (buildd) . Pode haver dicas adicionais úteis na página da comunidade Ubuntu sobre o debootstrap .

Máquina virtual

Se você precisar de um isolamento completo do ambiente alternativo, use uma máquina virtual como KVM ( qemu-kvm Instale o qemu-kvm ) ou VirtualBox .

Gilles
fonte
@Gilles Você pode adicionar uma explicação sobre o que a [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]condição faz?
FaHememit Mitha
1
@FaheemMitha Testa se o script está sendo executado em um chroot . Está lá para oferecer suporte à inicialização da instalação do chroot como um sistema independente.
Gilles
Sugiro adicionar uma linha como users=faheemno seu exemplo. Por padrão, pelo menos para mim, não sou membro do grupo de usuários. Eu esperava, no entanto.
FaHemem Mitha
25

Desde que o Ubuntu 11.04 (natty) e o Debian 7.0 (wheezy) introduziram o suporte a multiarch , as bibliotecas de 32 e 64 bits podem coexistir em um sistema. Para instalar uma biblioteca de 32 bits libXX, primeiro adicione a arquitetura de 32 bits necessária ao seu sistema:

Para o Ubuntu:

sudo dpkg --foreign-architecture i386

E para o Debian:

sudo dpkg --add-architecture i386

Em seguida, instale a biblioteca de 32 bits:

sudo apt-get install libXX:i386

O pacote ia32-libs. A partir do Ubuntu 12.04, preciso, ele não contém mais bibliotecas, apenas atrai libXX:i386pacotes como dependências.

A parte de compilação é bastante fácil para programas em C e C ++, adicionar -m32a CFLAGou CXXFLAG, o que tornará o programa gerado em 32 bits, por exemplo

export CFLAGS="-m32"
gcc main.c -o main

Isso funciona para projetos baseados em makefile também.

margarida
fonte
2
apt-get install ia32-libstrabalhou para mim (13.04)!
Étienne
1
para o ubuntu 14.04, é "sudo dpkg --add-architecture i386"
diyism
Por exemplo, no Debian Jessie: dpkg --add-architecture i386; atualização apt-get; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham
0

Se você possui apenas um binário de 32 bits que deseja executar em um moderno sistema Debian / Ubuntu de 64 bits, faça o seguinte:

dpkg --add-architecture i386
apt update
apt install libc6-i386

Isso foi testado no Debian 9.

Curt J. Sampson
fonte
1
Eu também precisava sudo apt-get install lib32z1do meu executável de 32 bits específico, se isso ajudar. O erro foi: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Sim, é 2019 e não consigo encontrar um cliente sqlite3 de 64 bits pré-compilado, suportado pelo projeto sqlite :( Estou bastante limitado no que tenho permissão para instalar neste recurso compartilhado, por isso tenho que remover pacotes sqlite pré-compilados. Felizmente eu posso instalar lib32z1.
harperville 19/09/09