64 bit Debian / Ubuntu'da 32 bit programları nasıl çalıştırırım?


74

64 bit (amd64 aka x86_64) Debian veya Ubuntu kurulumum var. Zaman zaman 32 bit (i386 / i686) programları çalıştırmam veya 32 bit sistemler için programları derlemem gerekiyor. Bunu minimum telaşla nasıl yapabilirim?

Bonus: dağıtımın daha eski veya daha yeni bir sürümüyle çalışmak veya test etmek istersem ne olur?


Yanıtlar:


52

Yerel destek

Ubuntu 11.04 ve Debian wheezy (7.0) 'ten beri, Debian ve Ubuntu çoklu erişim desteğine sahip: Aynı sistemdeki x86_32 (i386) ve x86_64 (amd64) paketlerini kolay bir şekilde karıştırabilirsiniz. Bu multiarch desteği olarak bilinir Daha fazla bilgi için warl0ck'in cevabına bakınız.

Eski sürümlerde, Debian ve Ubuntu amd64'te bir dizi 32-bit kütüphaneyle birlikte gelir. Temel bir 32-bit kitaplık grubuna ve muhtemelen buna bağlı olan başka paketlere sahip olmak için paketi yükleyin . Gerekli tüm kütüphanelere sahipseniz, 32 bitlik çalıştırılabilir dosyalarınız çalıştırılmalıdır. Geliştirme, yükleme ve yine muhtemelen buna bağlı olan diğer paketleri . Ayrıca Debian'da da yararlı bulabilirsiniz . Geçiş ix86 için derlemeye gcc seçeneği.ia32-libs İa32-lib'leri yükleyingcc-multilib Gcc-multilib'i yükleying++-multilibbinutils-multiarch Binutils-multiarch'i yükleyinia32-libs-dev-m32

Hangi 32 bit kullanıcı modu bileşenini yüklediğinizden bağımsız olarak 64 bit çekirdek çalıştırıp çalıştırmadığınızı uname -mgöstermeye devam edeceğini unutmayın x64_64. Aşağıda açıklanan Schroot bununla ilgileniyor.

SCHROOT

Bu bölüm, başka bir Linux dağıtımının içine "Debian" benzeri bir dağıtım yüklemek için bir rehberdir. 64 bitlik bir Ubuntu içine 32 bitlik bir Ubuntu takma anlamında ifade edilir, ancak Debian'ın içinde kararsız veya Debian'ın içinde kararsız hale gelmesi gibi diğer durumlarda küçük değişiklikler yapılması gerekir.

Giriş

Fikir, alt ağaçlara alternatif bir dağıtım kurmak ve bundan kaçmaktır. Bu şekilde 64 bit bir sisteme 32 bitlik bir sistem ya da dağıtımınızın farklı bir sürümünü ya da kurulu farklı paket kümeleriyle birlikte bir test ortamı kurabilirsiniz.

chrootKomuta ve sistem çağrısı dizin ağacının bir alt ağaç için kısıtlanmış olan dosya sisteminin manzaralı bir süreci başlatır. Debian ve Ubuntu , daha kullanışlı bir alt ortam oluşturmak için bu özelliği tamamlayan bir yardımcı program olan schroot'u gönderiyor .

Yükleme schrootpaketi Schroot yükle ( Debian ) ve debootstrappaket Debootstrap yükleyin ( Debian ). Debootstrap sadece alternatif dağıtımın kurulumu için gereklidir ve daha sonra çıkarılabilir.

Schroot'u ayarla

Bu örnekte, 32 bit Ubuntu 10.04LTS (lucid lynx) alternatif bir ortamın nasıl kurulacağı açıklanmaktadır. Benzer bir kurulum diğer Debian ve Ubuntu sürümleriyle de çalışmalıdır. /etc/schroot/chroot.d/lucid32Aşağıdaki içeriğe sahip bir dosya oluşturun :

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

Satır directory=/32, schroot'a 32 bit kurulumun dosyalarını nereye koyacağımızı söyler. Çizgi username=yourusername, kullanıcının yourusernameschroot kullanmasına izin verileceğini söylüyor . Çizgi groups=users,admin, her iki gruptaki kullanıcıların schroot kullanmasına izin verileceğini söylüyor; ayrıca bir users=…yönerge de koyabilirsiniz .

Yeni dağıtımı yükle

Dizini oluşturun ve debootstrap ile doldurmaya başlayın. Debootstrap, belirtilen dağıtım ve mimari için temel bir paket kümesini indirir ve yükler.

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

Neredeyse çalışan bir sisteminiz var; takip eden küçük geliştirmelerdir. Schroot /32/etc, çalıştırdığınız sırada, özellikle de DNS yapılandırmasında /etc/resolv.confve kullanıcı veritabanında /etc/passwdve diğer dosyalarda otomatik olarak çalıştırır (bu geçersiz kılınabilir, belgelere bakın). Bir kez ve tümü için manuel olarak kopyalamak isteyebileceğiniz birkaç dosya daha var:

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

Bir dosyada /etc/mtabveya /etc/fstabchroot'ta olmayacak . mountKomutu chroot içinde manuel olarak kullanmanızı tavsiye etmiyorum, dışarıdan yapın. Ancak, /etc/mtabbu tür komutları dfmakul şekilde yerine getirmek için yeterince iyi şeyler yaratın .

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

İle directorytürüne, SCHROOT gerçekleştirecek bağlama bağlar bu dizinleri ana tesisin paylaşılacaktır yani dizinleri bir dizi: /proc, /dev, /home, /tmp.

Chroot'taki hizmetler

Burada tarif edildiği gibi, bir schroot daemon çalışan için uygun değildir. Schroot'taki programlar, schroot'tan çıktığınızda öldürülecek. Daha kalıcı olmasını istiyorsanız, “dizin” schroot yerine “plain” bir schroot kullanın /etc/fstabve üst kurulumda kalıcı bağlama bağları kurun .

Debian ve Ubuntu'da hizmetler kurulum sırasında otomatik olarak başlar. Bunu önlemek için (özellikle ağ bağlantı noktaları paylaşıldığı için chroot dışında çalışan hizmetleri bozabilecek), chroot'ta hizmet çalıştırmama politikası uygulayın . Aşağıdaki betiği farklı koyun ve /32/usr/sbin/policy-rc.dyürütülebilir ( chmod a+rx /32/usr/sbin/policy-rc.d) yapın.

#!/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

Yeni sistemi doldur

Şimdi chroot kullanmaya başlayabiliriz. Bu noktada birkaç paket daha yüklemek isteyeceksiniz.

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

Örneğin, birkaç yerel alan oluşturmanız gerekebilir

locale-gen en_US en_US.utf8

Schroot, 8.04 (hardy) gibi eski bir Ubuntu sürümü içinse, ubuntu standard paketinin bir MTA'yı çektiğini unutmayın. Seç nullmailervarsayılan yerine postfix(eğer posta göndermek için chroot'u isteyebilir ama kesinlikle herhangi almak istemiyorum).

Daha ileri gidiyor

Daha fazla bilgi için schrootkılavuza , schroot SSS ve schroot.confkılavuza bakın . Schroot, Debian autobuilder (buildd) projesinin bir parçasıdır . Ubuntu topluluk sayfasında debootstrap ile ilgili ek yararlı ipuçları olabilir .

Sanal makine

Alternatif ortamın tamamen izole edilmesine ihtiyacınız varsa, KVM ( qemu-kvm Qemu-kvm'ı kurun ) veya VirtualBox gibi bir sanal makine kullanın .


@Gilles Durumun ne yaptığı hakkında bir açıklama ekleyebilir misiniz [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]?
Faheem Mitha

1
@FaheemMitha Komut dosyasının chroot içinde çalışıp çalışmadığını test eder . Chroot kurulumunu bağımsız bir sistem olarak başlatmayı desteklemek için var.
Gilles

Örneğinize benzer bir satır eklemenizi öneririm users=faheem. Varsayılan olarak, en azından benim için, kullanıcılar grubunun bir üyesi değilim. Ancak, olacağını umuyordum.
Faheem Mitha

25

Yana Ubuntu 11.04 (işe yatkın) ve Debian (hırıltılı) 7.0 tanıtıldı multiarch destek, 32-bit ve 64-bit kütüphaneleri tek bir sistemde bir arada bulunabilir. Bir 32-bit kitaplık libXX'i kurmak için, önce sisteminize gerekli 32 bit mimariyi ekleyin:

Ubuntu için:

sudo dpkg --foreign-architecture i386

Ve Debian için:

sudo dpkg --add-architecture i386

Ardından 32bit kütüphanesini kurun:

sudo apt-get install libXX:i386

İa32-libs paketi. Ubuntu 12.04'ten itibaren kesin, artık herhangi bir kitaplık içermiyor, sadece libXX:i386paketleri bağımlılık olarak alıyor.

Derleme bölümü eklemek, C ve C ++ programları için oldukça kolaydır -m32için CFLAGveya CXXFLAGhangi edecek oluşturulan program 32bit yapmak, örneğin,

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

Bu dosya tabanlı projeler için de geçerlidir.


2
apt-get install ia32-libsbenim için çalıştı (13.04)!
Étienne

1
ubuntu 14.04 için, "sudo dpkg
add

Örneğin, Debian Jessie'de: dpkg --add-architecture i386; apt-get güncelleme; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham,

0

Eğer sadece 64-bit bir ikili sisteminiz varsa, 64-bit Debian / Ubuntu sistemiyle çalıştırmak istiyorsanız, aşağıdakileri yapın:

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

Bu Debian 9'da test edildi.


1
Ayrıca sudo apt-get install lib32z1, eğer yardımcı olacaksa, 32 bitlik yürütülebilir dosyama da ihtiyacım vardı . Hata: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Evet, 2019 ve sqlite projesi tarafından desteklenen önceden derlenmiş bir 64 bit sqlite3 istemcisi bulamıyorum :( Bu paylaşılan kaynağa yüklenmesine izin verdiğimde sınırlı olduğum için önceden derlenmiş sqlite paketlerini çıkarmak zorundayım. Neyse ki yükleyebilirim lib32z1.
harperville
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.