Jak uruchomić 32-bitowe programy na 64-bitowym systemie Debian / Ubuntu?


74

Mam 64-bitową (amd64 aka x86_64) instalację Debiana lub Ubuntu. Od czasu do czasu muszę uruchamiać programy 32-bitowe (i386 / i686) lub kompilować programy dla systemu 32-bitowego. Jak mogę to zrobić przy minimum zamieszania?

Bonus: co zrobić, jeśli chcę uruchomić lub przetestować starszą lub nowszą wersję dystrybucji?


Odpowiedzi:


52

Natywne wsparcie

Ponieważ Ubuntu 11.04 i Debian wheezy (7.0), Debian i Ubuntu obsługują wiele kanałów: możesz w prosty sposób miksować pakiety x86_32 (i386) i x86_64 (amd64) w tym samym systemie. Jest to znane jako obsługa wielu kanałów. Aby uzyskać więcej informacji, patrz odpowiedź warl0ck .

W starszych wersjach Debian i Ubuntu są dostarczane z wieloma 32-bitowymi bibliotekami na amd64. Zainstaluj pakiet, aby mieć podstawowy zestaw bibliotek 32-bitowych i ewentualnie inne pakiety zależne od tego. Twoje 32-bitowe pliki wykonywalne powinny po prostu działać, jeśli masz wszystkie wymagane biblioteki. W celu rozwoju zainstaluj i ewentualnie inne zależne od niego pakiety, takie jak . Możesz również znaleźć przydatne i na Debianie. Przekaż opcję gcc, aby skompilować dla ix86.ia32-libs Zainstaluj ia32-libsgcc-multilib Zainstaluj gcc-multilibg++-multilibbinutils-multiarch Zainstaluj binutils-multiarchia32-libs-dev-m32

Pamiętaj, że uname -mnadal będzie się wyświetlać, x64_64jeśli używasz jądra 64-bitowego, niezależnie od zainstalowanych komponentów trybu użytkownika 32-bitowego. Schroot opisany poniżej zajmuje się tym.

Schroot

Ta sekcja jest przewodnikiem po instalacji dystrybucji podobnej do Debiana „wewnątrz” innej dystrybucji Linuksa. Jest to sformułowane w kategoriach instalacji 32-bitowego Ubuntu w 64-bitowym Ubuntu, ale powinno mieć zastosowanie z niewielkimi modyfikacjami w innych sytuacjach, takich jak instalowanie niestabilnej Debiana w stabilnej wersji Debiana lub odwrotnie.

Wprowadzenie

Chodzi o to, aby zainstalować alternatywną dystrybucję w poddrzewie i uruchomić z tego. W ten sposób można zainstalować system 32-bitowy w systemie 64-bitowym lub inną wersję dystrybucji lub środowisko testowe z zainstalowanymi różnymi zestawami pakietów.

chrootPoleceń oraz system połączeń uruchamia proces ze względu na system plików, który jest ograniczony do poddrzewa drzewa katalogów. Debian i Ubuntu dostarczają schroota , narzędzie, które obejmuje tę funkcję, tworząc bardziej użyteczne podśrodowisko.

Zainstaluj schrootpakiet Zainstaluj schroot ( Debian ) i debootstrappakiet Zainstaluj debootstrap ( Debian ). Debootstrap jest potrzebny tylko do instalacji alternatywnej dystrybucji i można go później usunąć.

Skonfiguruj schroota

W tym przykładzie opisano, jak skonfigurować 32-bitowe alternatywne środowisko Ubuntu 10.04LTS (lucid lynx). Podobna konfiguracja powinna działać z innymi wydaniami Debiana i Ubuntu. Utwórz plik /etc/schroot/chroot.d/lucid32o następującej treści:

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

Linia directory=/32mówi schrootowi, gdzie umieścimy pliki instalacji 32-bitowej. Linia username=yourusernamemówi, że użytkownik yourusernamebędzie mógł używać schroota. Linia groups=users,adminmówi, że użytkownicy w obu grupach będą mogli korzystać ze schroota; możesz również wprowadzić users=…dyrektywę.

Zainstaluj nową dystrybucję

Utwórz katalog i zacznij wypełniać go debootstrap. Debootstrap pobiera i instaluje podstawowy zestaw pakietów dla określonej dystrybucji i architektury.

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

Prawie masz już działający system; Poniżej przedstawiono drobne ulepszenia. Schroot automatycznie nadpisuje kilka plików /32/etcpodczas uruchamiania, w szczególności konfigurację DNS /etc/resolv.confi bazę danych użytkownika /etc/passwdoraz inne pliki (można to zmienić, patrz dokumentacja). Jest jeszcze kilka plików, które możesz chcieć skopiować raz na zawsze:

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

Nie będzie pliku /etc/mtabani /etc/fstabw chroot. Nie polecam używania mountpolecenia ręcznie w chroot, zrób to z zewnątrz. Ale stwórz wystarczająco dobre, /etc/mtababy polecenia takie jak dfpraca działały rozsądnie.

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

Dzięki directorytypu, złom wykona wierzchowce powiązań z wielu katalogów, czyli te katalogi będą udostępniane instalacji dominującej: /proc, /dev, /home, /tmp.

Usługi w chroot

Jak opisano tutaj, schroot nie nadaje się do uruchamiania demonów. Programy w chroot zostaną zabite po wyjściu z chroot. Użyj „zwykłego” schroota zamiast schroota „katalogowego”, jeśli chcesz, aby był bardziej trwały, i skonfiguruj stałe podłączanie do podłączenia w /etc/fstabinstalacji nadrzędnej.

W systemach Debian i Ubuntu usługi są uruchamiane automatycznie podczas instalacji. Aby tego uniknąć (które mogłyby zakłócać usług działa poza chroot, w szczególności dlatego, że porty sieciowe są wspólne), ustanawia zasady o nie prowadzenie usług w chroot. Umieść następujący skrypt jako /32/usr/sbin/policy-rc.di uczyń go wykonywalnym ( 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

Wypełnij nowy system

Teraz możemy zacząć korzystać z chroot. W tym momencie będziesz chciał zainstalować jeszcze kilka pakietów.

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

Może być konieczne wygenerowanie kilku ustawień regionalnych, np

locale-gen en_US en_US.utf8

Jeśli schroot dotyczy starszej wersji Ubuntu, takiej jak 8.04 (hardy), zwróć uwagę, że pakiet standardu ubuntu pobiera MTA. Wybierz nullmailerzamiast domyślnego postfix(możesz chcieć, aby chroot wysyłał pocztę, ale na pewno nie chcesz, aby otrzymywał).

Idąc dalej

Aby uzyskać więcej informacji, zapoznaj się z schrootinstrukcją , często zadawanymi pytaniami schroot i schroot.confinstrukcją . Schroot jest częścią projektu Debu autobuilder (buildd) . Na stronie społeczności Ubuntu mogą znajdować się dodatkowe przydatne wskazówki dotyczące debootstrap .

Maszyna wirtualna

Jeśli potrzebujesz pełnej izolacji alternatywnego środowiska, użyj maszyny wirtualnej, takiej jak KVM ( qemu-kvm Zainstaluj qemu-kvm ) lub VirtualBox .


@Gilles Czy możesz dodać wyjaśnienie, co [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]powoduje stan?
Faheem Mitha

1
@FaheemMitha Sprawdza , czy skrypt działa w chroot . Ma na celu wsparcie rozruchu instalacji chroot jako samodzielnego systemu.
Gilles,

Sugeruję dodanie linii podobnej users=faheemdo twojego przykładu. Domyślnie, przynajmniej dla mnie, nie jestem członkiem grupy użytkowników. Jednak bym się spodziewał.
Faheem Mitha

25

Ponieważ Ubuntu 11.04 (natty) i Debian 7.0 (wheezy) wprowadziły obsługę wielu kanałów , biblioteki 32-bitowe i 64-bitowe mogą współistnieć w jednym systemie. Aby zainstalować 32-bitową bibliotekę libXX, najpierw dodaj niezbędną architekturę 32-bitową do swojego systemu:

W przypadku Ubuntu:

sudo dpkg --foreign-architecture i386

A dla Debiana:

sudo dpkg --add-architecture i386

Następnie zainstaluj bibliotekę 32-bitową:

sudo apt-get install libXX:i386

Pakiet ia32-libs. Począwszy od wersji Ubuntu 12.04 precyzyjnej, nie zawiera ona już żadnych bibliotek, jedynie pobiera libXX:i386pakiety jako zależności.

Część kompilacyjna jest raczej łatwa dla programów C i C ++, dodaj -m32do CFLAGlub CXXFLAG, co spowoduje, że wygenerowany program będzie 32-bitowy, np

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

Działa to również w przypadku projektów opartych na plikach makefile.


2
apt-get install ia32-libspracował dla mnie (13.04)!
Étienne

1
dla Ubuntu 14.04 to „sudo dpkg --add-architecture i386”
diyizm

Na przykład w Debian Jessie: dpkg --add-architecture i386; apt-get update; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham

0

Jeśli masz tylko 32-bitowy plik binarny, który chcesz uruchomić na nowoczesnym 64-bitowym systemie Debian / Ubuntu, wykonaj następujące czynności:

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

Zostało to przetestowane na Debianie 9.


1
Potrzebowałem także sudo apt-get install lib32z1mojego 32-bitowego pliku wykonywalnego, jeśli to pomaga. Wystąpił błąd: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Tak, jest rok 2019 i nie mogę znaleźć wstępnie skompilowanego 64-bitowego klienta sqlite3 obsługiwanego przez projekt sqlite :( Jestem raczej ograniczony w zakresie tego, co wolno mi instalować w tym współdzielonym zasobie, więc muszę ściągnąć wstępnie skompilowane pakiety sqlite. Na szczęście mogę zainstalować lib32z1.
harperville
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.