Bagaimana cara menjalankan program 32-bit pada Debian / Ubuntu 64-bit?

74

Saya memiliki instalasi Debian atau Ubuntu 64-bit (amd64 alias x86_64). Saya perlu menjalankan program 32-bit (i386 / i686) sesekali, atau untuk mengkompilasi program untuk sistem 32-bit. Bagaimana saya bisa melakukan ini dengan sedikit keributan?

Bonus: bagaimana jika saya ingin menjalankan atau menguji dengan rilis distribusi yang lebih lama atau lebih baru?

Gilles
sumber
Mungkin sama di ask ubuntu: askubuntu.com/questions/359156/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

52

Dukungan asli

Sejak Ubuntu 11.04 dan Debian wheezy (7.0), Debian dan Ubuntu memiliki dukungan multiarch: Anda dapat mencampur paket x86_32 (i386) dan x86_64 (amd64) pada sistem yang sama secara langsung. Ini dikenal sebagai dukungan multiarch. Lihat jawaban warl0ck untuk lebih jelasnya.

Dalam rilis yang lebih lama, Debian dan Ubuntu dikirimkan dengan sejumlah perpustakaan 32-bit di amd64. Instal paket untuk memiliki satu set dasar perpustakaan 32-bit, dan mungkin paket lain yang bergantung pada yang satu ini. Eksekusi 32-bit Anda seharusnya dijalankan jika Anda memiliki semua pustaka yang diperlukan. Untuk pengembangan, instal , dan lagi mungkin paket lain yang bergantung padanya seperti . Anda mungkin menemukan berguna juga, dan di Debian. Lewati opsi untuk gcc untuk mengkompilasi untuk ix86.ia32-libs Instal ia32-libsgcc-multilib Instal gcc-multilibg++-multilibbinutils-multiarch Instal binutils-multiarchia32-libs-dev-m32

Perhatikan bahwa uname -mmasih akan muncul x64_64jika Anda menjalankan kernel 64-bit, terlepas dari komponen mode pengguna 32-bit apa yang telah Anda instal. Schroot yang dijelaskan di bawah menangani ini.

Schroot

Bagian ini adalah panduan untuk menginstal distribusi mirip-Debian “di dalam” distribusi Linux lainnya. Itu adalah kata dalam hal menginstal Ubuntu 32-bit di dalam 64-bit Ubuntu, tetapi harus diterapkan dengan modifikasi kecil untuk situasi lain, seperti menginstal Debian tidak stabil di dalam stabil Debian atau sebaliknya.

pengantar

Idenya adalah untuk menginstal distribusi alternatif dalam subtree dan lari darinya. Anda dapat menginstal sistem 32-bit pada sistem 64-bit dengan cara itu, atau rilis distribusi Anda yang berbeda, atau lingkungan pengujian dengan paket paket berbeda yang diinstal.

The chrootkomando dan sistem panggilan dimulai proses dengan pemandangan filesystem yang terbatas pada subtree dari pohon direktori. Debian dan Ubuntu mengirimkan schroot , sebuah utilitas yang membungkus fitur ini untuk membuat sub-lingkungan yang lebih bermanfaat.

Instal schrootpaket Instal schroot ( Debian ) dan debootstrappaket Instal debootstrap ( Debian ). Debootstrap hanya diperlukan untuk instalasi distribusi alternatif dan dapat dihapus sesudahnya.

Siapkan schroot

Contoh ini menjelaskan cara mengatur lingkungan alternatif Ubuntu 10.04LTS (lucid lynx) 32-bit. Pengaturan serupa harus bekerja dengan rilis Debian dan Ubuntu lainnya. Buat file /etc/schroot/chroot.d/lucid32dengan konten berikut:

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

Baris directory=/32memberitahu schroot di mana kita akan meletakkan file instalasi 32-bit. Baris username=yourusernamemengatakan pengguna yourusernameakan diizinkan untuk menggunakan schroot. Baris tersebut groups=users,adminmengatakan bahwa pengguna dalam kelompok mana pun akan diizinkan untuk menggunakan schroot; Anda juga bisa menaruh users=…arahan.

Instal distribusi baru

Buat direktori dan mulai mengisinya dengan debootstrap. Debootstrap mengunduh dan menginstal paket inti untuk distribusi dan arsitektur yang ditentukan.

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

Anda hampir memiliki sistem kerja; berikut ini adalah peningkatan kecil. Schroot secara otomatis menimpa beberapa file /32/etcketika Anda menjalankannya, khususnya konfigurasi DNS di /etc/resolv.confdan database pengguna di /etc/passwddan file lainnya (ini dapat ditimpa, lihat dokumentasi). Ada beberapa file lagi yang mungkin ingin Anda salin secara manual sekali dan untuk semua:

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

Tidak akan ada file /etc/mtabatau /etc/fstabchroot. Saya tidak merekomendasikan menggunakan mountperintah secara manual di chroot, lakukan dari luar. Tapi jangan buat yang cukup bagus /etc/mtabuntuk membuat perintah seperti dfbekerja dengan wajar.

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

Dengan directoryjenis, schroot akan melakukan mengikat tunggangan dari sejumlah direktori, yaitu direktori akan dibagi dengan instalasi orangtua: /proc, /dev, /home, /tmp.

Layanan di chroot

Seperti dijelaskan di sini, schroot tidak cocok untuk menjalankan daemon. Program di schroot akan dibunuh ketika Anda keluar dari schroot. Gunakan schroot "biasa" alih-alih schroot "direktori" jika Anda menginginkannya lebih permanen, dan atur pemasangan ikatan permanen /etc/fstabpada instalasi induk.

Di Debian dan Ubuntu, layanan mulai secara otomatis saat instalasi. Untuk menghindari hal ini (yang dapat mengganggu layanan yang berjalan di luar chroot, khususnya karena port jaringan dibagikan), buat kebijakan tidak menjalankan layanan di chroot. Letakkan skrip berikut sebagai /32/usr/sbin/policy-rc.ddan buat itu executable ( 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

Mengisi sistem baru

Sekarang kita bisa mulai menggunakan chroot. Anda ingin menginstal beberapa paket lagi pada saat ini.

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

Anda mungkin perlu membuat beberapa lokal, mis

locale-gen en_US en_US.utf8

Jika schroot untuk rilis Ubuntu yang lebih lama seperti 8.04 (hardy), perhatikan bahwa paket standar-ubuntu menarik dalam MTA. Pilih nullmailersebagai ganti default postfix(Anda mungkin ingin chroot mengirim email tetapi Anda jelas tidak ingin menerima).

Melangkah lebih jauh

Untuk informasi lebih lanjut, lihat schrootmanual , FAQ schroot dan schroot.confmanual . Schroot adalah bagian dari proyek autobuilder (buildd) Debian . Mungkin ada tips berguna tambahan di halaman komunitas Ubuntu tentang debootstrap .

Mesin virtual

Jika Anda membutuhkan isolasi lengkap dari lingkungan alternatif, gunakan mesin virtual seperti KVM ( qemu-kvm Instal qemu-kvm ) atau VirtualBox .

Gilles
sumber
@Gilles Bisakah Anda menambahkan penjelasan tentang apa [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]kondisinya?
Faheem Mitha
1
@FaheemMitha Menguji apakah skrip berjalan dalam chroot . Itu ada di sana untuk mendukung boot instalasi chroot sebagai sistem mandiri.
Gilles
Saya sarankan menambahkan baris seperti users=faheempada contoh Anda. Secara default, setidaknya untuk saya, saya bukan anggota grup pengguna. Namun saya berharap demikian.
Faheem Mitha
25

Karena Ubuntu 11.04 (natty) dan Debian 7.0 (wheezy) memperkenalkan dukungan multiarch , perpustakaan 32-bit dan 64-bit dapat hidup berdampingan pada satu sistem. Untuk menginstal libXX perpustakaan 32-bit, pertama tambahkan arsitektur 32bit yang diperlukan ke sistem Anda:

Untuk Ubuntu:

sudo dpkg --foreign-architecture i386

Dan untuk Debian:

sudo dpkg --add-architecture i386

Kemudian instal perpustakaan 32bit:

sudo apt-get install libXX:i386

Paket ia32-libs. Pada Ubuntu 12.04 tepat, tidak lagi berisi perpustakaan, hanya menarik libXX:i386paket sebagai dependensi.

Bagian kompilasi agak mudah untuk program C dan C ++, tambahkan -m32ke CFLAGatau CXXFLAG, yang akan membuat dihasilkan 32bit Program, misalnya

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

Ini berfungsi untuk proyek berbasis makefile juga.

bunga aster
sumber
2
apt-get install ia32-libsbekerja untuk saya (13,04)!
Étienne
1
untuk ubuntu 14.04, ini "sudo dpkg --add-architecture i386"
diyism
Misalnya, di Debian Jessie: dpkg --add-architecture i386; pembaruan apt-get; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham
0

Jika Anda hanya memiliki biner 32-bit yang ingin Anda jalankan pada sistem Debian / Ubuntu 64-bit modern, lakukan hal berikut:

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

Ini telah diuji pada Debian 9.

Curt J. Sampson
sumber
1
Saya juga diperlukan sudo apt-get install lib32z1untuk eksekusi 32-bit khusus saya, jika itu membantu. Kesalahan adalah: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Ya, ini tahun 2019 dan saya tidak dapat menemukan klien sqlite3 64-bit yang dikompilasi yang didukung oleh proyek sqlite :( Saya agak terbatas pada apa yang saya boleh instal pada sumber daya bersama ini jadi saya harus menarik paket sqlite yang telah dikompilasi. Untungnya aku dapat menginstal lib32z1.
harperville