Come posso eseguire programmi a 32 bit su Debian / Ubuntu a 64 bit?


74

Ho un'installazione Debian o Ubuntu a 64 bit (amd64 aka x86_64). Ho bisogno di eseguire programmi a 32 bit (i386 / i686) di tanto in tanto, o di compilare programmi per un sistema a 32 bit. Come posso farlo con un minimo sforzo?

Bonus: cosa succede se voglio eseguire o testare con una versione precedente o più recente della distribuzione?


Risposte:


52

Supporto nativo

Poiché Ubuntu 11.04 e Debian wheezy (7.0), Debian e Ubuntu hanno il supporto multiarch: è possibile combinare i pacchetti x86_32 (i386) e x86_64 (amd64) sullo stesso sistema in modo semplice. Questo è noto come supporto multiarch. Vedi la risposta di warl0ck per maggiori dettagli.

Nelle versioni precedenti, Debian e Ubuntu vengono fornite con un numero di librerie a 32 bit su amd64. Installa il pacchetto per avere un set base di librerie a 32 bit e possibilmente altri pacchetti che dipendono da questo. I file eseguibili a 32 bit devono essere eseguiti semplicemente se si dispone di tutte le librerie richieste. Per lo sviluppo, l'installazione e, eventualmente, altri pacchetti che dipendono da esso come . Potresti trovare utile anche su Debian. Passa l' opzione a gcc per compilare per ix86.ia32-libs Installa ia32-libsgcc-multilib Installa gcc-multilibg++-multilibbinutils-multiarch Installa binutils-multiarchia32-libs-dev-m32

Si noti che uname -mverrà comunque mostrato x64_64se si esegue un kernel a 64 bit, indipendentemente dai componenti della modalità utente a 32 bit installati. Schroot descritto di seguito si occupa di questo.

schroot

Questa sezione è una guida all'installazione di una distribuzione simile a Debian "all'interno" di un'altra distribuzione Linux. È formulato in termini di installazione di Ubuntu a 32 bit all'interno di Ubuntu a 64 bit, ma dovrebbe applicarsi con lievi modifiche ad altre situazioni, come l'installazione di Debian instabile in Debian stable o viceversa.

introduzione

L'idea è di installare una distribuzione alternativa in una sottostruttura ed eseguire da quella. In questo modo è possibile installare un sistema a 32 bit su un sistema a 64 bit, oppure una diversa versione della propria distribuzione o un ambiente di test con diversi set di pacchetti installati.

Il chrootcomando e la chiamata di sistema avvia un processo con una vista del filesystem che è limitata a una sottostruttura dell'albero delle directory. Debian e Ubuntu forniscono schroot , un'utilità che avvolge questa funzione per creare un sottoambiente più utilizzabile.

Installa il schrootpacchetto Installa schroot ( Debian ) e il debootstrappacchetto Installa debootstrap ( Debian ). Debootstrap è necessario solo per l'installazione della distribuzione alternativa e può essere rimosso in seguito.

Installa schroot

Questo esempio descrive come configurare un ambiente alternativo Ubuntu 10.04LTS (lucid lynx) a 32 bit. Una configurazione simile dovrebbe funzionare con altre versioni di Debian e Ubuntu. Creare un file /etc/schroot/chroot.d/lucid32con i seguenti contenuti:

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

La linea directory=/32dice a Schroot dove inseriremo i file dell'installazione a 32 bit. La riga username=yourusernamedice che all'utente yourusernamesarà permesso usare la schroot. La riga groups=users,admindice che gli utenti di entrambi i gruppi potranno usare la schroot; puoi anche mettere una users=…direttiva.

Installa la nuova distribuzione

Crea la directory e inizia a popolarla con debootstrap. Debootstrap scarica e installa un set principale di pacchetti per la distribuzione e l'architettura specificate.

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

Hai quasi già un sistema funzionante; ciò che segue sono miglioramenti minori. Schroot sovrascrive automaticamente diversi file /32/etcquando viene eseguito, in particolare la configurazione DNS /etc/resolv.confe il database utente in /etc/passwde altri file (questo può essere sovrascritto, consultare la documentazione). Ci sono alcuni altri file che potresti voler copiare manualmente una volta per tutte:

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

Non ci sarà un file /etc/mtabo /etc/fstabnel chroot. Non consiglio di usare il mountcomando manualmente nel chroot, fallo dall'esterno. Ma creane uno abbastanza buono /etc/mtabper eseguire dfragionevolmente comandi come il lavoro.

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

Con il directorytipo, schroot eseguirà monta bind di una serie di directory, vale a dire queste directory saranno condivisi con l'installazione genitore: /proc, /dev, /home, /tmp.

Servizi nel chroot

Come descritto qui, uno schroot non è adatto per eseguire demoni. I programmi nella schroot verranno uccisi quando si esce dalla schroot. Utilizzare uno schroot "semplice" invece di uno "directory" se si desidera che sia più permanente e impostare montaggi di bind permanenti /etc/fstabnell'installazione padre.

Su Debian e Ubuntu, i servizi si avviano automaticamente all'installazione. Per evitare ciò (che potrebbe interrompere i servizi in esecuzione al di fuori del chroot, in particolare perché le porte di rete sono condivise), stabilire una politica di non eseguire i servizi nel chroot. Inserisci il seguente script come /32/usr/sbin/policy-rc.de rendilo eseguibile ( 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

Popolare il nuovo sistema

Ora possiamo iniziare a usare il chroot. A questo punto ti consigliamo di installare qualche altro pacchetto.

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

Potrebbe essere necessario generare alcune impostazioni locali, ad es

locale-gen en_US en_US.utf8

Se lo schroot è per una versione precedente di Ubuntu come 8.04 (hardy), si noti che il pacchetto ubuntu-standard inserisce un MTA. Seleziona al nullmailerposto di quello predefinito postfix(potresti volere che il tuo chroot invii posta ma sicuramente non vuoi che ne riceva nessuno).

Andare avanti

Per ulteriori informazioni, consultare il schrootmanuale , le FAQ di Schroot e il schroot.confmanuale . Schroot fa parte del progetto Debian autobuilder (buildd) . Potrebbero esserci ulteriori utili suggerimenti nella pagina della comunità di Ubuntu su debootstrap .

Macchina virtuale

Se è necessario l'isolamento completo dell'ambiente alternativo, utilizzare una macchina virtuale come KVM ( qemu-kvm Installa qemu-kvm ) o VirtualBox .


@Gilles Puoi aggiungere una spiegazione di cosa fa la [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]condizione?
Faheem Mitha,

1
@FaheemMitha Verifica se lo script è in esecuzione in un chroot . È lì per supportare l'avvio dell'installazione chroot come sistema autonomo.
Gilles 'SO- smetti di essere malvagio' il

Suggerisco di aggiungere una linea simile users=faheemal tuo esempio. Per impostazione predefinita, almeno per me, non sono un membro del gruppo di utenti. Mi sarei aspettato di esserlo, comunque.
Faheem Mitha,

25

Da quando Ubuntu 11.04 (natty) e Debian 7.0 (wheezy) hanno introdotto il supporto multiarch , le librerie a 32 e 64 bit possono coesistere su un sistema. Per installare una libreria libXX a 32 bit, aggiungi prima l'architettura a 32 bit necessaria al tuo sistema:

Per Ubuntu:

sudo dpkg --foreign-architecture i386

E per Debian:

sudo dpkg --add-architecture i386

Quindi installare la libreria a 32 bit:

sudo apt-get install libXX:i386

Il pacchetto ia32-libs. A partire da Ubuntu 12.04 preciso, non contiene più alcuna libreria, inserisce solo libXX:i386pacchetti come dipendenze.

La parte di compilazione è piuttosto semplice per i programmi C e C ++, aggiungere -m32a CFLAGo CXXFLAG, che renderà il programma generato a 32 bit, ad es

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

Questo funziona anche per progetti basati su makefile.


2
apt-get install ia32-libsha funzionato per me (13.04)!
Étienne,

1
per Ubuntu 14.04, è "sudo dpkg --add-architecture i386"
diyism,

Ad esempio, su Debian Jessie: dpkg --add-architecture i386; aggiornamento apt-get; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham

0

Se hai solo un binario a 32 bit che desideri eseguire su un moderno sistema Debian / Ubuntu a 64 bit, procedi come segue:

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

Questo è stato testato su Debian 9.


1
Avevo bisogno anche del sudo apt-get install lib32z1mio eseguibile a 32 bit, se questo mi aiuta. L'errore era: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Sì, è il 2019 e non riesco a trovare un client sqlite3 a 64 bit precompilato supportato dal progetto sqlite :( Sono piuttosto limitato in ciò che mi è permesso installare su questa risorsa condivisa, quindi devo eliminare i pacchetti sqlite precompilati. Per fortuna posso installare lib32z1.
Harperville
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.