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

Gil*_*il' 76 64bit ubuntu virtual-machine debian 32bit

我有一个 64 位(amd64 aka x86_64)Debian 或 Ubuntu 安装。我偶尔需要运行 32 位 (i386/i686) 程序,或者为 32 位系统编译程序。我怎样才能做到这一点,而不是大惊小怪?

奖励:如果我想使用较旧或较新版本的发行版运行或测试怎么办?

Gil*_*il' 56

对于当前版本

当前的 Debian 和 Ubuntu 具有多架构支持:您可以在同一系统上以简单的方式混合使用 x86_32 (i386) 和 x86_64 (amd64) 软件包。这称为多架构支持 - 请参阅UbuntuDebian wiki 更多信息。

有关简单的最新答案,请参阅warl0ck 的答案。


对于旧版本

在旧版本中,Debian 和 Ubuntu 在 amd64 上附带了许多 32 位库。安装ia32-libs 安装 ia32-libs包具有一组基本的 32 位库,以及可能依赖于这个库的其他包。如果您拥有所有必需的库,您的 32 位可执行文件应该可以直接运行。对于开发,安装gcc-multilib 安装 gcc-multilib,以及可能依赖它的其他软件包,例如g++-multilib. 你可能会发现binutils-multiarch 安装 binutils-multiarch也很有用,ia32-libs-dev在 Debian 上也有用。将-m32选项传递给 gcc 以针对 ix86 进行编译。

请注意,无论您安装了哪些 32 位用户模式组件,它uname -m仍会显示x64_64您是否正在运行 64 位内核。下面描述的 Schroot 负责解决这个问题。

施罗特

本节是在另一个 Linux 发行版“内部”安装类似 Debian 的发行版的指南。它的措辞是在 64 位 Ubuntu 中安装 32 位 Ubuntu,但应适用于其他情况,例如在 Debian 稳定版中安装 Debian 不稳定版,反之亦然。

介绍

这个想法是在子树中安装一个替代发行版并从中运行。您可以通过这种方式在 64 位系统上安装 32 位系统,或者您的发行版的不同版本,或者安装了不同组包的测试环境。

chroot命令和系统调用开始与同时限制在目录树的子树的文件系统的视图的过程。Debian 和 Ubuntu 提供schroot,这是一个实用程序,它围绕此功能创建一个更可用的子环境。

安装schroot 安装 schroot( Debian ) 和debootstrap软件包 安装 debootstrap( Debian )。Debootstrap 仅在安装备用发行版时才需要,之后可以删除。

设置 schroot

此示例描述如何设置 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
Run Code Online (Sandbox Code Playgroud)

该行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
Run Code Online (Sandbox Code Playgroud)

你几乎已经有了一个工作系统;下面是一些小的改进。Schroot 会在/32/etc您运行时自动覆盖多个文件,特别是 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
Run Code Online (Sandbox Code Playgroud)

不会有文件/etc/mtab/etc/fstab在 chroot 中。我不建议mount在 chroot 中手动使用该命令,而是从外部执行。但是确实创建了一个足够好的/etc/mtab命令,例如df合理地工作。

ln -s /proc/mounts /32/etc/mtab
Run Code Online (Sandbox Code Playgroud)

使用该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
Run Code Online (Sandbox Code Playgroud)

填充新系统

现在我们可以开始使用 chroot 了。此时您需要安装更多软件包。

schroot -c lucid32
sudo apt-get update
apt-get install lsb-core nano
...
Run Code Online (Sandbox Code Playgroud)

您可能需要生成一些语言环境,例如

locale-gen en_US en_US.utf8
Run Code Online (Sandbox Code Playgroud)

如果 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

  • @FaheemMitha [测试脚本是否在 chroot 中运行](http://unix.stackexchange.com/questions/14345/how-do-i-tell-im-running-in-a-chroot)。它支持将 chroot 安装作为独立系统启动。 (2认同)

dai*_*isy 27

由于Ubuntu 11.04 (natty) 和Debian 7.0 (wheezy) 引入了多架构支持,32 位和 64 位库可以在一个系统上共存。要安装 32 位库 libXX,首先将必要的 32 位架构添加到您的系统中:

sudo dpkg --add-architecture i386
Run Code Online (Sandbox Code Playgroud)

然后安装32位库:

sudo apt-get install libXX:i386
Run Code Online (Sandbox Code Playgroud)

ia32-libs 包。从 Ubuntu 12.04 开始,它不再包含任何库,它只将libXX:i386包作为依赖项引入。

编译部分对于 C 和 C++ 程序来说相当容易,添加-m32CFLAGor CXXFLAG,这将使生成的程序成为 32 位,例如

export CFLAGS="-m32"
gcc main.c -o main
Run Code Online (Sandbox Code Playgroud)

这也适用于基于 makefile 的项目。

  • `apt-get install ia32-libs` 对我有用(13.04)! (2认同)

cjs*_*cjs 5

如果您只有 32 位二进制文​​件,并且想在现代 64 位 Debian/Ubuntu 系统上运行,请执行以下操作:

dpkg --add-architecture i386
apt update
apt install libc6-i386
Run Code Online (Sandbox Code Playgroud)

这已经在 Debian 9 上进行了测试。