如何在 64 位 Debian/Ubuntu 上執行 32 位程序?
我有一個 64 位(amd64 aka x86_64)Debian 或 Ubuntu 安裝。我需要偶爾執行 32 位 (i386/i686) 程序,或者為 32 位系統編譯程序。我怎樣才能以最少的麻煩做到這一點?
獎勵:如果我想使用較舊或較新版本的發行版執行或測試怎麼辦?
對於目前版本
目前的 Debian 和 Ubuntu 支持多架構:您可以在同一系統上以簡單的方式混合 x86_32 (i386) 和 x86_64 (amd64) 軟體包。這被稱為多架構支持 - 請參閱Ubuntu或Debian wiki 更多資訊。
請參閱warl0ck 的答案以獲得簡單的最新答案。
對於舊版本
在舊版本中,Debian 和 Ubuntu 在 amd64 上附帶了許多 32 位庫。安裝該軟體包以獲得一組基本的 32 位庫,以及可能依賴於該庫的其他軟體包。如果您擁有所有必需的庫,您的 32 位執行檔應該可以簡單地執行。對於開發,安裝,以及可能依賴它的其他軟體包,例如. 您可能會發現在 Debian 上也很有用。將選項傳遞給 gcc 以針對 ix86 進行編譯。
ia32-libs
gcc-multilib
g++-multilib
binutils-multiarch
ia32-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 FAQ和schroot.conf
手冊。Schroot 是Debian autobuilder (buildd) 項目的一部分。Ubuntu 社區頁面上可能有關於 debootstrap 的其他有用提示。虛擬機
如果您需要完全隔離備用環境,請使用KVM ( qemu-kvm ) 或VirtualBox等虛擬機。