it-swarm.cn

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

我安装了64位(AMD64 a.k.a. x86_64)Debian或Ubuntu。我需要偶尔运行32位(i386/i686)程序,或为32位系统编译程序。我该怎么做才能大惊小怪?

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

75

本机支持

从Ubuntu 11.04和Debian wheezy(7.0)开始,Debian和Ubuntu具有多体系结构支持:您可以直接在同一系统上混合使用x86_32(i386)和x86_64(AMD64)软件包。这称为 multiarch支持 有关更多详细信息,请参见 warl0ck的答案

在较早的版本中,Debian和Ubuntu在AMD64上附带了许多32位库。安装 _ia32-libs_Install ia32-libs 软件包以具有一组基本的32位库,并且可能还有依赖于此库的其他软件包。如果您具有所有必需的库,则应该只运行32位可执行文件。为了进行开发,请安装 _gcc-multilib_Install gcc-multilib ,可能还有其他依赖它的包,例如_g++-multilib_。您可能会发现 _binutils-multiarch_Install binutils-multiarch 也很有用,在Debian上 _ia32-libs-dev_ 也很有用。将_-m32_选项传递给gcc以针对ix86进行编译。

请注意,如果您正在运行64位内核,则无论已安装的32位用户模式组件如何,_uname -m_仍将显示_x64_64_。下面介绍的Schroot会处理此问题。

施鲁特

本节是在另一个Linux发行版内部安装类似Debian的发行版的指南。它的用语是在64位Ubuntu中安装32位Ubuntu,但应对其他情况进行少量修改,例如在Debian稳定版中安装Debian不稳定版,反之亦然。

介绍

想法是在子树中安装备用发行版并从中运行。您可以通过这种方式在64位系统上安装32位系统,也可以在发行版的其他版本中安装,也可以在安装了不同软件包套件的测试环境中安装。

chroot 命令和系统调用使用仅限于目录树子树的文件系统视图启动进程。 Debian和Ubuntu发行了 schroot ,该实用程序包装了此功能以创建更可用的子环境。

安装 schroot软件包Install schrootDebian )和 debootstrap packageInstall debootstrapDebian )。仅在安装备用发行版时才需要Debootstrap,然后可以将其删除。

设置schroot

本示例说明了如何设置32位Ubuntu 10.04LTS(透明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
_

您几乎已经有了一个工作系统;接下来是一些小的增强。 Schroot在运行时会自动覆盖_/32/etc_中的多个文件,特别是_/etc/resolv.conf_中的DNS配置和_/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
_

Chroot中将没有文件_/etc/mtab_或_/etc/fstab_。我不建议在chroot中手动使用mount命令,请从外部进行操作。但是一定要创建一个足够好的_/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中建立 policy 禁止运行服务。将以下脚本作为 _/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(强壮)),请注意,软件包ubuntu-standard引入了MTA。选择nullmailer而不是默认的postfix(您可能希望chroot发送邮件,但您绝对不希望它接收任何邮件)。

更进一步

有关更多信息,请参见 schroot手册schroot FAQ_schroot.conf_手册 。 Schroot是 Debian autobuilder(已构建)项目 的一部分。在 关于debootstrap的Ubuntu社区页面 上可能还有其他有用的提示。

虚拟机

如果需要完全隔离备用环境,请使用虚拟机,例如 [〜#〜] kvm [〜#〜]qemu-kvmInstall qemu-kvm )或 VirtualBox

54

由于引入了 bunt 11.04(natty)和 Debian 7.0(heheyy) multiarch 支持,因此32位和64位库可以在一个系统上共存。要安装32位库libXX,请首先向系统中添加必要的32位体系结构:

对于Ubuntu:

Sudo dpkg --foreign-architecture i386

对于Debian:

Sudo dpkg --add-architecture i386

然后安装32bit库:

Sudo apt-get install libXX:i386

Ia32-libs软件包。从Ubuntu 12.04精确版开始,它不再包含任何库,只提取libXX:i386软件包作为依赖项。

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

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

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

27
daisy

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

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

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

2
cjs