Ubuntu

如何在 64 位 Debian/Ubuntu 上執行 32 位程序?

  • August 18, 2020

我有一個 64 位(amd64 aka x86_64)Debian 或 Ubuntu 安裝。我需要偶爾執行 32 位 (i386/i686) 程序,或者為 32 位系統編譯程序。我怎樣才能以最少的麻煩做到這一點?

獎勵:如果我想使用較舊或較新版本的發行版執行或測試怎麼辦?

對於目前版本

目前的 Debian 和 Ubuntu 支持多架構:您可以在同一系統上以簡單的方式混合 x86_32 (i386) 和 x86_64 (amd64) 軟體包。這被稱為多架構支持 - 請參閱UbuntuDebian wiki 更多資訊。

請參閱warl0ck 的答案以獲得簡單的最新答案。


對於舊版本

在舊版本中,Debian 和 Ubuntu 在 amd64 上附帶了許多 32 位庫。安裝該軟體包以獲得一組基本的 32 位庫,以及可能依賴於該庫的其他軟體包。如果您擁有所有必需的庫,您的 32 位執行檔應該可以簡單地執行。對於開發,安裝,以及可能依賴它的其他軟體包,例如. 您可能會發現在 Debian 上也很有用。將選項傳遞給 gcc 以針對 ix86 進行編譯。ia32-libs 安裝 ia32-libsgcc-multilib 安裝 gcc-multilibg++-multilibbinutils-multiarch 安裝 binutils-multiarchia32-libs-dev-m32

請注意,無論您安裝了哪些 32 位使用者模式組件,它uname -m仍然會顯示x64_64您是否正在執行 64 位核心。下面描述的 Schroot 會處理這個問題。

廢料

本節是在另一個 Linux 發行版“內部”安裝類似 Debian 的發行版的指南。它的措辭是在 64 位 Ubuntu 中安裝 32 位 Ubuntu,但應該對其他情況稍作修改,例如在 Debian stable 中安裝 Debian stable 或反之亦然。

介紹

這個想法是在子樹中安裝一個備用發行版並從中執行。您可以通過這種方式在 64 位系統上安裝 32 位系統,或者您的發行版的不同版本,或者安裝了不同包集的測試環境。

命令和系統呼叫啟動一個程序,該chroot程序具有文件系統的視圖,該文件系統被限制在目錄樹的子樹中。Debian 和 Ubuntu發布了schroot,這是一個圍繞此功能創建更可用的子環境的實用程序。

安裝schroot軟體包 安裝廢料( Debian ) 和debootstrap軟體包 安裝引導程序( Debian )。只有在安裝備用發行版時才需要 Debootstrap,之後可以將其刪除。

設置報廢

此範例描述如何設置 32 位 Ubuntu 10.04LTS (lucid lynx) 備用環境。類似的設置應該適用於 Debian 和 Ubuntu 的其他版本。創建一個/etc/schroot/chroot.d/lucid32包含以下內容的文件:

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

該行directory=/32告訴 schroot 我們將把 32 位安裝的文件放在哪裡。該行 username=yourusername表示yourusername將允許使用者使用 schroot。該行groups=users,admin表示將允許任一組中的使用者使用 schroot;你也可以放一個users=…指令。

安裝新發行版

創建目錄並開始使用 debootstrap 填充它。Debootstrap 為指定的發行版和架構下載並安裝一組核心軟體包。

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

你幾乎已經有了一個工作系統;接下來是小的改進。/32/etc當您執行Schroot 時,它會自動覆蓋其中的幾個文件,特別是其中的 DNS 配置/etc/resolv.conf和使用者數據庫/etc/passwd以及其他文件(這可以被覆蓋,請參閱文件)。您可能還想一勞永逸地手動複製一些文件:

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

不會有文件/etc/mtab/etc/fstab在 chroot 中。我不建議mount在 chroot 中手動使用命令,從外部執行。但是一定要創建一個足夠好的/etc/mtab命令來使諸如df合理工作的命令。

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

使用該directory類型,schroot 將執行多個目錄的綁定掛載,即這些目錄將與父安裝共享:/proc/dev/home/tmp

chroot 中的服務

如此處所述,schroot 不適合執行守護程序。當您退出 schroot 時,schroot 中的程序將被終止。如果您希望它更永久,請使用“普通” schroot 而不是“目錄” schroot,並/etc/fstab在父安裝中設置永久綁定掛載。

在 Debian 和 Ubuntu 上,服務在安裝時自動啟動。為避免這種情況(這可能會中斷在 chroot 之外執行的服務,特別是因為網路埠是共享的),請制定不在 chroot 中執行服務的策略。將以下腳本作為/32/usr/sbin/policy-rc.d並使其可執行(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

填充新系統

現在我們可以開始使用 chroot。此時您需要安裝更多的軟體包。

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

您可能需要生成一些語言環境,例如

locale-gen en_US en_US.utf8

如果 schroot 用於舊版本的 Ubuntu,例如 8.04 (hardy),請注意軟體包 ubuntu-standard 引入了 MTA。選擇nullmailer而不是預設postfix(您可能希望您的 chroot 發送郵件,但您絕對不希望它接收任何郵件)。

走得更遠

有關更多資訊,請參閱schroot手冊schroot FAQschroot.conf手冊。Schroot 是Debian autobuilder (buildd) 項目的一部分。Ubuntu 社區頁面上可能有關於 debootstrap 的其他有用提示。

虛擬機

如果您需要完全隔離備用環境,請使用KVM ( qemu-kvm 安裝 qemu-kvm ) 或VirtualBox等虛擬機。

引用自:https://unix.stackexchange.com/questions/12956