it-swarm.it

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

Ho un'installazione Debian o Ubuntu a 64 bit (AMD64 a.k.a. 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?

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 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 ia32-libsInstall ia32-libs 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, installa gcc-multilibInstall gcc-multilib , e possibilmente altri pacchetti che dipendono da esso come g++-multilib. Puoi trovare binutils-multiarchInstall binutils-multiarch utile anche, e ia32-libs-dev su Debian. Passa l'opzione -m32 A gcc per compilare per ix86.

Si noti che uname -m Mostrerà comunque x64_64 Se 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 comando chroot 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 pacchetto schrootInstall schroot ( Debian ) e debootstrap pacchettoInstall 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. Crea un file /etc/schroot/chroot.d/lucid32 Con i seguenti contenuti:

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

La riga directory=/32 Dice a Schroot dove inseriremo i file dell'installazione a 32 bit. La riga username=yourusername Dice che all'utente yourusername sarà permesso di usare la schroot. La riga groups=users,admin Dice che gli utenti di entrambi i gruppi saranno autorizzati a usare schroot; puoi anche inserire una direttiva users=….

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 in /32/etc Quando lo esegui, in particolare la configurazione DNS in /etc/resolv.conf E il database utente in /etc/passwd E altri file (questo può essere sovrascritto, vedi 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/mtab O /etc/fstab Nel chroot. Non consiglio di usare manualmente il comando mount nel chroot, fallo dall'esterno. Ma crea un /etc/mtab Abbastanza buono per far funzionare ragionevolmente comandi come df.

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

Con il tipo directory, schroot eseguirà bind mounts di un numero di directory, ovvero quelle directory saranno condivise con l'installazione padre: /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" anziché uno "root" se si desidera che sia più permanente e impostare montaggi di binding permanenti in /etc/fstab Sull'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 un criterio di non eseguire i servizi nel chroot. Inserisci il seguente script come /32/usr/sbin/policy-rc.d e 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 nullmailer invece del predefinito postfix (potresti voler inviare la tua chroot ma sicuramente non vuoi che ne riceva nessuna).

Andare avanti

Per ulteriori informazioni, consultare schroot manual , schroot FAQ e schroot.conf Manual . Schroot fa parte del progetto Debian autobuilder (buildd) . Potrebbero esserci ulteriori suggerimenti utili nella pagina della community di Ubuntu su debootstrap .

Macchina virtuale

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

Poiché bunt 11.04 (natty) e Debian 7.0 (wheezy) introdotto multiarch supporto, 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:i386 pacchetti come dipendenze.

La parte di compilazione è piuttosto semplice per i programmi C e C++, aggiungi -m32 a CFLAG o 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.

27
daisy

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.

2
cjs