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) 软件包。这称为多架构支持 - 请参阅Ubuntu或Debian wiki 更多信息。
有关简单的最新答案,请参阅warl0ck 的答案。
在旧版本中,Debian 和 Ubuntu 在 amd64 上附带了许多 32 位库。安装ia32-libs
包具有一组基本的 32 位库,以及可能依赖于这个库的其他包。如果您拥有所有必需的库,您的 32 位可执行文件应该可以直接运行。对于开发,安装
gcc-multilib
,以及可能依赖它的其他软件包,例如
g++-multilib
. 你可能会发现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
包 ( 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
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
。
如此处所述,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 FAQ和
schroot.conf
手册。Schroot 是Debian autobuilder (buildd) 项目的一部分。Ubuntu 社区页面上可能有关于 debootstrap 的其他有用提示。
如果您需要完全隔离备用环境,请使用KVM等虚拟机(qemu-kvm ) 或VirtualBox。
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++ 程序来说相当容易,添加-m32
到CFLAG
or CXXFLAG
,这将使生成的程序成为 32 位,例如
export CFLAGS="-m32"
gcc main.c -o main
Run Code Online (Sandbox Code Playgroud)
这也适用于基于 makefile 的项目。
如果您只有 32 位二进制文件,并且想在现代 64 位 Debian/Ubuntu 系统上运行,请执行以下操作:
dpkg --add-architecture i386
apt update
apt install libc6-i386
Run Code Online (Sandbox Code Playgroud)
这已经在 Debian 9 上进行了测试。
归档时间: |
|
查看次数: |
108023 次 |
最近记录: |