¿Cómo ejecuto programas de 32 bits en un Debian / Ubuntu de 64 bits?

74

Tengo una instalación de Debian o Ubuntu de 64 bits (amd64 aka x86_64). Necesito ejecutar programas de 32 bits (i386 / i686) ocasionalmente, o compilar programas para un sistema de 32 bits. ¿Cómo puedo hacer esto con un mínimo de alboroto?

Bonificación: ¿qué sucede si quiero ejecutar o probar con una versión anterior o más reciente de la distribución?

Gilles 'SO- deja de ser malvado'
fuente
Posible lo mismo en ask ubuntu: askubuntu.com/questions/359156/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

52

Apoyo nativo

Desde Ubuntu 11.04 y Debian wheezy (7.0), Debian y Ubuntu tienen soporte multiarch: puede mezclar paquetes x86_32 (i386) y x86_64 (amd64) en el mismo sistema de una manera directa. Esto se conoce como soporte multiarch. Consulte la respuesta de warl0ck para obtener más detalles.

En versiones anteriores, Debian y Ubuntu incluyen varias bibliotecas de 32 bits en amd64. Instale el paquete para tener un conjunto básico de bibliotecas de 32 bits, y posiblemente otros paquetes que dependen de este. Sus ejecutables de 32 bits simplemente deberían ejecutarse si tiene todas las bibliotecas necesarias. Para el desarrollo, instale y, de nuevo, posiblemente otros paquetes que dependen de él, como . Puede que te resulte útil también, y en Debian. Pase la opción a gcc para compilar para ix86.ia32-libs Instalar ia32-libsgcc-multilib Instalar gcc-multilibg++-multilibbinutils-multiarch Instalar binutils-multiarchia32-libs-dev-m32

Tenga en cuenta que uname -maún se mostrará x64_64si está ejecutando un kernel de 64 bits, independientemente de los componentes de modo de usuario de 32 bits que haya instalado. Schroot se describe a continuación se encarga de esto.

Schroot

Esta sección es una guía para instalar una distribución similar a Debian "dentro" de otra distribución de Linux. Está redactado en términos de instalación de un Ubuntu de 32 bits dentro de un Ubuntu de 64 bits, pero debe aplicarse con modificaciones menores a otras situaciones, como la instalación de Debian inestable dentro de Debian estable o viceversa.

Introducción

La idea es instalar una distribución alternativa en un subárbol y ejecutar desde allí. Puede instalar un sistema de 32 bits en un sistema de 64 bits de esa manera, o una versión diferente de su distribución, o un entorno de prueba con diferentes conjuntos de paquetes instalados.

El chrootcomando y la llamada al sistema comienzan un proceso con una vista del sistema de archivos que está restringido a un subárbol del árbol de directorios. Debian y Ubuntu envían schroot , una utilidad que envuelve esta característica para crear un sub-entorno más utilizable.

Instale el schrootpaquete Instalar schroot ( Debian ) y el debootstrappaquete Instalar debootstrap ( Debian ). Debootstrap solo es necesario para la instalación de la distribución alternativa y se puede quitar después.

Configurar schroot

Este ejemplo describe cómo configurar un entorno alternativo Ubuntu 10.04LTS (lúcido lúcido) de 32 bits. Una configuración similar debería funcionar con otras versiones de Debian y Ubuntu. Cree un archivo /etc/schroot/chroot.d/lucid32con los siguientes contenidos:

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

La línea directory=/32le dice a Schroot dónde colocaremos los archivos de la instalación de 32 bits. La línea username=yourusernamedice que el usuario yourusernamepodrá usar el schroot. La línea groups=users,admindice que los usuarios en cualquier grupo podrán usar el schroot; También puedes poner una users=…directiva.

Instala la nueva distribución

Cree el directorio y comience a llenarlo con debootstrap. Debootstrap descarga e instala un conjunto básico de paquetes para la distribución y arquitectura especificadas.

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

Ya casi tienes un sistema de trabajo; Lo que sigue son mejoras menores. Schroot sobrescribe automáticamente varios archivos /32/etccuando lo ejecuta, en particular la configuración de DNS /etc/resolv.confy la base de datos del usuario /etc/passwdy otros archivos (esto puede anularse, consulte la documentación). Hay algunos archivos más que puede copiar manualmente de una 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

No habrá un archivo /etc/mtabo /etc/fstaben el chroot. No recomiendo usar el mountcomando manualmente en el chroot, hágalo desde afuera. Pero cree un elemento lo suficientemente bueno como /etc/mtabpara hacer que los comandos, como dftrabajar razonablemente.

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

Con el directorytipo, schroot llevará a cabo montaje de vínculos de una serie de directorios, es decir, los directorios serán compartidos con la instalación de los padres: /proc, /dev, /home, /tmp.

Servicios en el chroot

Como se describe aquí, un schroot no es adecuado para ejecutar demonios. Los programas en el schroot se eliminarán cuando salga del schroot. Utilice un schroot "simple" en lugar de un schroot "directorio" si desea que sea más permanente, y configure montajes de enlace permanentes /etc/fstaben la instalación principal.

En Debian y Ubuntu, los servicios se inician automáticamente en la instalación. Para evitar esto (que podría interrumpir los servicios que se ejecutan fuera del chroot, en particular porque los puertos de red están compartidos), establezca una política de no ejecutar servicios en el chroot. Ponga el siguiente script como /32/usr/sbin/policy-rc.dy hágalo ejecutable ( 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

Poblar el nuevo sistema

Ahora podemos comenzar a usar el chroot. Querrá instalar algunos paquetes más en este momento.

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

Es posible que deba generar algunas configuraciones regionales, por ejemplo

locale-gen en_US en_US.utf8

Si el schroot es para una versión anterior de Ubuntu como 8.04 (hardy), tenga en cuenta que el paquete ubuntu-standard extrae un MTA. Seleccione en nullmailerlugar del predeterminado postfix(es posible que desee que su chroot envíe correo pero definitivamente no desea que reciba ninguno).

Ir más lejos

Para obtener más información, consulte el schrootmanual , las preguntas frecuentes de schroot y el schroot.confmanual . Schroot es parte del proyecto de creación automática de Debian (buildd) . Puede haber consejos útiles adicionales en la página de la comunidad de Ubuntu sobre debootstrap .

Máquina virtual

Si necesita un aislamiento completo del entorno alternativo, use una máquina virtual como KVM ( qemu-kvm Instalar qemu-kvm ) o VirtualBox .

Gilles 'SO- deja de ser malvado'
fuente
@Gilles ¿Puede agregar una explicación de lo que hace la [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]condición?
Faheem Mitha
1
@FaheemMitha Se comprueba si la secuencia de comandos se ejecuta en un entorno chroot . Está ahí para admitir el arranque de la instalación de chroot como un sistema independiente.
Gilles 'SO- deja de ser malvado'
Sugiero agregar una línea como users=faheema su ejemplo. Por defecto, al menos para mí, no soy miembro del grupo de usuarios. Sin embargo, hubiera esperado que así fuera.
Faheem Mitha
25

Desde que Ubuntu 11.04 (natty) y Debian 7.0 (wheezy) introdujeron el soporte multiarch , las bibliotecas de 32 bits y 64 bits pueden coexistir en un sistema. Para instalar una biblioteca libXX de 32 bits, primero agregue la arquitectura de 32 bits necesaria a su sistema:

Para Ubuntu:

sudo dpkg --foreign-architecture i386

Y para Debian:

sudo dpkg --add-architecture i386

Luego instale la biblioteca de 32 bits:

sudo apt-get install libXX:i386

El paquete ia32-libs. A partir de Ubuntu 12.04 preciso, ya no contiene ninguna biblioteca, solo extrae libXX:i386paquetes como dependencias.

La parte de compilación es bastante fácil para los programas en C y C ++, añadir -m32a CFLAG, o CXXFLAG, lo que hará de 32 bits programa generado, por ejemplo,

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

Esto también funciona para proyectos basados ​​en makefile.

margarita
fuente
2
apt-get install ia32-libsfuncionó para mí (13.04)!
Étienne
1
para ubuntu 14.04, es "sudo dpkg --add-architecture i386"
diyism
Por ejemplo, en Debian Jessie: dpkg --add-architecture i386; apt-get update; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham
0

Si solo tiene un binario de 32 bits que desea ejecutar en un sistema Debian / Ubuntu moderno de 64 bits, haga lo siguiente:

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

Esto ha sido probado en Debian 9.

Curt J. Sampson
fuente
1
También necesitaba sudo apt-get install lib32z1mi ejecutable particular de 32 bits, si eso ayuda. El error fue: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Sí, es 2019 y no puedo encontrar un cliente sqlite3 precompilado de 64 bits compatible con el proyecto sqlite :( Estoy bastante limitado en lo que se me permite instalar en este recurso compartido, así que tengo que desplegar paquetes sqlite precompilados. Afortunadamente puedo instalar lib32z1.
harperville