Answers:
从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
gcc-multilib
g++-multilib
binutils-multiarch
ia32-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
软件包 (Debian)和debootstrap
软件包 (Debian)。仅在安装备用发行版时才需要Debootstrap,然后可以将其删除。
本示例说明如何设置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
运行时会自动覆盖其中的多个文件,尤其是其中的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
。
如此处所述,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 FAQ和
schroot.conf
手册。Schroot是Debian autobuilder(已构建)项目的一部分。在Ubuntu社区页面上可能还有关于debootstrap的其他有用提示。
如果需要完全隔离备用环境,请使用虚拟机,例如KVM(qemu-kvm )或VirtualBox。
[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]
条件说明吗?
users=faheem
在您的示例中添加一行。默认情况下,至少对于我来说,我不是用户组的成员。但是,我本来希望如此。
自从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 ++程序,编译部分相当容易,将其添加-m32
到CFLAG
或中CXXFLAG
,这将使生成的程序成为32位,例如
export CFLAGS="-m32"
gcc main.c -o main
这也适用于基于makefile的项目。
apt-get install ia32-libs
为我工作(13.04)!
如果您只有32位二进制文件,并且希望在现代的64位Debian / Ubuntu系统上运行,请执行以下操作:
dpkg --add-architecture i386
apt update
apt install libc6-i386
这已经在Debian 9上进行了测试。
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
。