如何在64位版本的Ubuntu上运行32位程序?

我使用的是64位的Ubuntu 13.10版本。我想运行一个32位的程序。然而,我发现在13.10版本中没有包含ia32-libs。是否有替代的软件包或其他解决方法?

1可能是64位Ubuntu 14.04运行32位二进制文件的重复问题。 - bain
@bain 这不是重复的问题。这个问题涉及一般情况,而那个是一个具体问题,更不用说这个问题是较早且更好的问题了。 - Seth
而Braiam的回答真是太棒了!所以如果有人想要复制它,应该将其合并。 - Mateo
2个回答

不再需要ia32-libs软件包(从12.04开始确切说),如果您使用APT系统,在64位系统中安装32位软件包无需担心。这是因为引入了multiarch,这是Debian在处理依赖关系方面最具影响力的政策之一。这种方法允许在同一个系统中拥有不同的二进制目标,而不必考虑内核架构。这并不意味着您可以随意运行任何32位软件包,但如果安装了库和二进制文件,理论上应该能够运行任何应用程序。这对于从64位到32位以及反过来都是成立的。

enter image description here

使用这种方法时,建议使用APT管理器来防止未满足的依赖关系。更新日志中包含了有关如何进行更改的简要历史记录。
1. 精确地说,该软件包已被清空并制作成一个过渡性软件包。它添加了一些依赖项,这些依赖项尚未转移到多架构系统中的软件包。
2. 慢慢但稳定地,所有软件包都重新构建以支持多架构,并且反向依赖关系正在被删除或更改为ia32-lib-multiarch。当这些软件包不再需要ia34-libs软件包时,依赖关系同时被删除。依赖关系从ia32-libs更改为package:arch,其中package是所需库的名称,arch是体系结构(下面有一个skype的示例)。
3. 在最新版本中,预发布的raring版本中删除了ia32-libs-multiarch软件包,并且ia32-libs没有在saucy中发布。所有Ubuntu软件包都支持多架构,您可以在系统中安装不同体系结构的软件包。
现在,当安装需要32位二进制文件的软件包时,如果不注意,你将永远不会知道自己正在使用一个32位的软件包,因为包管理器会自动获取所需的依赖项。
sudo apt-get --no-install-recommends -q -y install skype
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  libaudio2:i386 libjbig0:i386 liblcms1:i386 libmng1:i386 libqt4-dbus:i386 libqt4-declarative:i386
  libqt4-network:i386 libqt4-opengl:i386 libqt4-script:i386 libqt4-sql:i386 libqt4-xml:i386
  libqt4-xmlpatterns:i386 libqtcore4:i386 libqtgui4:i386 libqtwebkit4:i386 libssl1.0.0:i386 libtiff5:i386
  libxss1:i386 libxv1:i386 skype-bin:i386
Suggested packages:
  nas:i386 liblcms-utils:i386 libqt4-declarative-folderlistmodel:i386 libqt4-declarative-gestures:i386
  libqt4-declarative-particles:i386 libqt4-declarative-shaders:i386 qt4-qmlviewer:i386 libqt4-dev:i386
  libthai0:i386 libicu48:i386 qt4-qtconfig:i386
Recommended packages:
  libqt4-sql-mysql:i386 libqt4-sql-odbc:i386 libqt4-sql-psql:i386 libqt4-sql-sqlite:i386 libcups2:i386
  sni-qt:i386 libasound2-plugins:i386
The following NEW packages will be installed:
  libaudio2:i386 libjbig0:i386 liblcms1:i386 libmng1:i386 libqt4-dbus:i386 libqt4-declarative:i386
  libqt4-network:i386 libqt4-opengl:i386 libqt4-script:i386 libqt4-sql:i386 libqt4-xml:i386
  libqt4-xmlpatterns:i386 libqtcore4:i386 libqtgui4:i386 libqtwebkit4:i386 libssl1.0.0:i386 libtiff5:i386
  libxss1:i386 libxv1:i386 skype skype-bin:i386
0 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.
Need to get 33.9 MB/38.2 MB of archives.
After this operation, 118 MB of additional disk space will be used.
Preconfiguring packages ...
Selecting previously unselected package libssl1.0.0:i386.
(Reading database ... 208485 files and directories currently installed.)
Unpacking libssl1.0.0:i386 (from .../libssl1.0.0_1.0.1c-4ubuntu8.1_i386.deb) ...
Selecting previously unselected package libaudio2:i386.
Unpacking libaudio2:i386 (from .../libaudio2_1.9.3-5ubuntu0.13.04.1_i386.deb) ...
Selecting previously unselected package liblcms1:i386.
Unpacking liblcms1:i386 (from .../liblcms1_1.19.dfsg-1.2ubuntu2_i386.deb) ...
Selecting previously unselected package libmng1:i386.
Unpacking libmng1:i386 (from .../libmng1_1.0.10-3build1_i386.deb) ...
Selecting previously unselected package libqtcore4:i386.
Unpacking libqtcore4:i386 (from .../libqtcore4_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-xml:i386.
Unpacking libqt4-xml:i386 (from .../libqt4-xml_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-dbus:i386.
Unpacking libqt4-dbus:i386 (from .../libqt4-dbus_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-network:i386.
Unpacking libqt4-network:i386 (from .../libqt4-network_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-script:i386.
Unpacking libqt4-script:i386 (from .../libqt4-script_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-sql:i386.
Unpacking libqt4-sql:i386 (from .../libqt4-sql_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-xmlpatterns:i386.
Unpacking libqt4-xmlpatterns:i386 (from .../libqt4-xmlpatterns_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libjbig0:i386.
Unpacking libjbig0:i386 (from .../libjbig0_2.0-2ubuntu1_i386.deb) ...
Selecting previously unselected package libtiff5:i386.
Unpacking libtiff5:i386 (from .../libtiff5_4.0.2-4ubuntu2.1_i386.deb) ...
Selecting previously unselected package libqtgui4:i386.
Unpacking libqtgui4:i386 (from .../libqtgui4_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-declarative:i386.
Unpacking libqt4-declarative:i386 (from .../libqt4-declarative_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqt4-opengl:i386.
Unpacking libqt4-opengl:i386 (from .../libqt4-opengl_4%3a4.8.4+dfsg-0ubuntu9.4_i386.deb) ...
Selecting previously unselected package libqtwebkit4:i386.
Unpacking libqtwebkit4:i386 (from .../libqtwebkit4_2.3.0-0ubuntu2_i386.deb) ...
Selecting previously unselected package libxss1:i386.
Unpacking libxss1:i386 (from .../libxss1_1%3a1.2.2-1_i386.deb) ...
Selecting previously unselected package libxv1:i386.
Unpacking libxv1:i386 (from .../libxv1_2%3a1.0.7-1ubuntu0.13.04.1_i386.deb) ...
Selecting previously unselected package skype-bin.
Unpacking skype-bin (from .../skype-bin_4.2.0.11-0ubuntu0.12.04.2_i386.deb) ...
Selecting previously unselected package skype.
Unpacking skype (from .../skype_4.2.0.11-0ubuntu0.12.04.2_amd64.deb) ...
Processing triggers for desktop-file-utils ...
Processing triggers for gnome-menus ...
Processing triggers for hicolor-icon-theme ...
Setting up libssl1.0.0:i386 (1.0.1c-4ubuntu8.1) ...
Setting up libaudio2:i386 (1.9.3-5ubuntu0.13.04.1) ...
Setting up liblcms1:i386 (1.19.dfsg-1.2ubuntu2) ...
Setting up libmng1:i386 (1.0.10-3build1) ...
Setting up libqtcore4:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-xml:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-dbus:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-network:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-script:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-sql:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-xmlpatterns:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libjbig0:i386 (2.0-2ubuntu1) ...
Setting up libtiff5:i386 (4.0.2-4ubuntu2.1) ...
Setting up libxss1:i386 (1:1.2.2-1) ...
Setting up libxv1:i386 (2:1.0.7-1ubuntu0.13.04.1) ...
Setting up libqtgui4:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-declarative:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqt4-opengl:i386 (4:4.8.4+dfsg-0ubuntu9.4) ...
Setting up libqtwebkit4:i386 (2.3.0-0ubuntu2) ...
Setting up skype-bin (4.2.0.11-0ubuntu0.12.04.2) ...
Setting up skype (4.2.0.11-0ubuntu0.12.04.2) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place

请注意 Skype 是一个 i386 软件包。如果我使用 apt-get 安装它,以后就可以避免很多麻烦。
但是有些人更喜欢使用 .deb 软件包,那么你需要做好准备,因为这可能会变得有点混乱。你应该提前手动安装所有依赖项,以免系统出现未满足的依赖关系。一个有用的命令是 dpkg-deb -I,因为它可以显示软件包的信息:
dpkg-deb -I zynaddsubfx-dssi_2.4.3-3_amd64.deb 
 new debian package, version 2.0.
 size 266936 bytes: control archive=845 bytes.
     917 bytes,    19 lines      control              
     232 bytes,     3 lines      md5sums              
 Package: zynaddsubfx-dssi
 Source: zynaddsubfx
 Version: 2.4.3-3
 Architecture: amd64
 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
 Original-Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org>
 Installed-Size: 633
 Depends: libasound2 (>= 1.0.16), libc6 (>= 2.15), libgcc1 (>= 1:4.1.1), libjack-jackd2-0 (>= 1.9.5~dfsg-14) | libjack-0.116, libmxml1, libstdc++6 (>= 4.6), zlib1g (>= 1:1.1.4)
[...]

如你所见,它列出了依赖项,所以你只需要使用sudo apt-get install命令安装它们,然后再使用sudo dpkg -i命令进行安装。再次强调,最好从软件源安装软件,而不是下载后手动使用dpkg -i命令安装。
现在,如果你是在开发方面,你可以使用apt-get语法来安装任何库。只需在要下载的库后面加上:i386,就完成了。如果你从软件源安装软件,就不需要手动操作了。
总之:不,如果你从软件源安装软件,你可以运行32位的软件包而无需安装ia32-libs。如果你从事开发工作,尽量始终使用APT系统。

我可以用一个检查ia32-libs软件包是否安装的.bin安装程序做什么?据我所知,即使我手动安装了正确的依赖项,.bin安装程序仍然无法安装,因为它会搜索ia32-libs软件包。有没有办法“欺骗”安装程序以认为ia32-libs已安装? - Merlijn Sebrechts
1@Galgalesh请维护者修复他们的东西,他们还停留在过去。 - Braiam
删除ia32-libs的唯一问题是当你有像PlayOnLinux这样的程序,它尝试使用32位库来运行32位的Windows程序。这将导致不兼容性问题。 - AlexLordThorsen
@Rawrgulmuffins 他们不得不进行更改... OpenSUSE和Red Hat已经符合LSB和FHS标准,ia32-libs软件包无法让他们轻松管理需要进行的更改,因为每个架构只有一个目录。开发人员应该遵循多架构介绍并相应地重新打包其软件包。如果他们在过去3年中没有这样做,那么他们就是懒惰的。 - Braiam
@Braiam 所以问题出在 LSB 和 FHS 标准上,它们破坏了向后兼容性。仅仅说这只需要开发者重新打包似乎有些愚蠢,因为这会导致所有依赖于 lib32 的软件包都无法使用。 - AlexLordThorsen
@Rawrgulmuffins你知道有多少发行版依赖ia32-libs吗? - Braiam
大部分的酒程序,Skype,Citrix。坦率地说,我主要是想让一些旧游戏(和一些新游戏)在Linux上运行。我不想创建一个Windows虚拟机。我希望能告诉我的朋友们,他们不需要一个Windows电脑来组建一个游戏机。 - AlexLordThorsen
@Rawrgulmuffins 更新到最新版本的Wine - 推荐的方法是使用Wine PPA: https://launchpad.net/~ubuntu-wine/+archive/ppa 当前版本的Wine已经支持多架构。Skype也是如此,不过我还没有研究Citrix。我在64位的Ubuntu 12.04上同时使用Crossover和原版Wine来运行很多游戏(包括Windows Steam游戏),效果非常好。 - user265140
@user265140 我觉得他的意思是“需要在Wine上运行的Windows应用程序”。Wine早在很久以前就支持多架构了,从Canonical软件源安装的Skype(直接从Skype官方下载总是会出问题)。 - Braiam


上述两个命令对我来说没有安装任何32位软件包。我错过了什么吗? - e40
2好的,对于我来说,我需要执行两个额外的命令:apt-get install libc6:i386apt-get install libgtk2.0-0:i386(后者是因为它是一个GTK应用)。 - e40