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


74

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

奖励:如果我想在发行版的旧版本或新版本上运行或测试,该怎么办?


Answers:


52

本机支持

从Ubuntu 11.04和Debian wheezy(7.0)开始,Debian和Ubuntu具有多体系结构支持:您可以直接在同一系统上混合使用x86_32(i386)和x86_64(amd64)软件包。这称为多体系结构支持。有关更多详细信息,请参见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位用户模式组件,如果您正在运行64位内核,它uname -m仍然会显示x64_64。下面介绍的Schroot会处理此问题。

施鲁特

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

介绍

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

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

安装schroot软件包 安装schrootDebian)和debootstrap软件包 安装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=yourusernameyourusername将允许用户使用schroot。该行groups=users,admin说,将允许任一组中的用户使用schroot。您还可以放置一个users=…指令。

安装新发行版

创建目录并开始用debootstrap填充它。Debootstrap下载并安装一组用于指定发行版和体系结构的核心软件包。

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

您几乎已经有了一个工作系统;接下来是一些小的增强。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

不会有文件/etc/mtab/etc/fstabchroot。我不建议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(强壮)),请注意,软件包ubuntu-standard引入了MTA。选择nullmailer而不是默认值postfix(您可能希望chroot发送邮件,但您绝对不希望它接收任何邮件)。

更进一步

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

虚拟机

如果需要完全隔离备用环境,请使用虚拟机,例如KVMqemu-kvm 安装qemu-kvm)或VirtualBox


@Gilles您能添加一下[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]条件说明吗?
Faheem Mitha 2014年

1
@FaheemMitha它测试脚本是否在chroot中运行。它在那里支持将chroot安装作为独立系统引导。
吉尔斯2014年

我建议users=faheem在您的示例中添加一行。默认情况下,至少对于我来说,我不是用户组的成员。但是,我本来希望如此。
Faheem Mitha 2014年

25

自从Ubuntu 11.04(natty)和Debian 7.0(heezy)引入了多体系结构支持以来,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 ++程序,编译部分相当容易,将其添加-m32CFLAG或中CXXFLAG,这将使生成的程序成为32位,例如

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

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


2
apt-get install ia32-libs为我工作(13.04)!
艾蒂安

1
对于Ubuntu 14.04,它是“ sudo dpkg --add-architecture i386”
diyism 2015年

例如,在Debian Jessie上:dpkg --add-architecture i386; apt-get更新;apt-get install libstdc ++ 5:i386 libpam0g:i386
Jonathan Ben-Avraham

0

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

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

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


1
sudo apt-get install lib32z1如果有帮助,我还需要特定的32位可执行文件。错误是:sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory。是的,这是2019年,我找不到sqlite项目支持的预编译的64位sqlite3客户端:(我在允许在此共享资源上安装的内容相当有限,因此我必须拉下预编译的sqlite软件包。值得庆幸的是我可以安装lib32z1
harperville
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.