当前位置: 首页>>技术教程>>正文


如何在 32 位机器上安装 64 位 .deb 文件?

问题描述

我有 Ubuntu 14.04。我最近下载了 Viber 。 Viber .deb 文件具有 64 位架构。我想在我的电脑上安装它,但我的电脑只支持32位。

运行lscpu的输出如下:

Architecture: i686
CPU op-mode(s): 32-bit, 64-bit 
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1 
Core(s) per socket: 2 
Socket(s): 1 
Vendor ID: GenuineIntel 
CPU family: 6 
Model: 23 
Stepping: 10 
CPU MHz: 2800.000 
BogoMIPS: 5586.12 
Virtualization: VT-x 
L1d cache: 32K 
L1i cache: 32K 
L2 cache: 2048K

最佳方案

前提是您的硬件支持 64 位,这会:

\\n

CPU op-mode(s): 32-bit, 64-bit

\\n

并且该包已准备好使用多架构,这也是如此:

 dpkg -I viber.deb
 new debian package, version 2.0. <--- here
 size 57046082 bytes: control archive=8024 bytes.
       0 bytes,     0 lines      0                    
    1210 bytes,    29 lines      control              
    9475 bytes,    33 lines   *  copyright            
    7404 bytes,    85 lines      md5sums              
      39 bytes,     2 lines   *  postinst             #!/bin/bash
     800 bytes,    35 lines   *  preinst              #!/bin/bash
     500 bytes,    24 lines   *  prerm                #!/bin/bash
 Package: viber
 Version: 4.2.2.6
 Section: non-free/net
 Priority: extra
 Architecture: amd64 <---- and here

您可以只安装必要的 64 位库和二进制文件,它们是运行应用程序所需的包的依赖项(没有,稍后会详细介绍),对性能的影响几乎为零。就我而言,我刚刚安装了该软件包:

$ sudo dpkg --add-architecture amd64
## adding 64-bits architecture package, in my system I didn't need to
## but it's likely you have
$ sudo apt-get update # this downloads the package list for amd64 arch
$ sudo dpkg -i viber.deb
Selecting previously unselected package viber.
(Reading database ... 268703 files and directories currently installed.)
Preparing to unpack viber.deb ...
Unpacking viber (4.2.2.6) ...
Setting up viber (4.2.2.6) ...
Processing triggers for hicolor-icon-theme (0.13-1) ...
Processing triggers for gnome-menus (3.13.3-1) ...
Processing triggers for mime-support (3.56) ...
Processing triggers for desktop-file-utils (0.22-1) ...

然后开始遇到问题……

包管理器决定他们不应该列出包的任何依赖项,

 Installed-Size: 141336
 Conflicts: Viber (<< 4.2.2.6)
 Replaces: Viber (<< 4.2.2.6)
 Maintainer: Viber Media Inc <[email protected]>

他们真正需要的:

ldd /opt/viber/Viber | grep 'not found'
    libXcomposite.so.1 => not found
    libxslt.so.1 => not found
    libxml2.so.2 => not found
    libgstreamer-0.10.so.0 => not found
    libgstapp-0.10.so.0 => not found
    libgstbase-0.10.so.0 => not found
    libgstinterfaces-0.10.so.0 => not found
    libgstpbutils-0.10.so.0 => not found
    libgstvideo-0.10.so.0 => not found
    libsqlite3.so.0 => not found

所以你必须手动找到并安装缺少的库!如果您知道正确的工具,这很容易。 apt-file 在这里很方便,http://packages.ubuntu.com 功能“搜索包的内容”也很好。但我继续寻找它们:

这些文件已经安装在我的系统中,您只需复制包名称,即冒号之前以 amd64 结尾的包名称。您应该按原样复制包名称:

dpkg -S $(ldd /opt/viber/Viber | awk '{print $3}' | grep -vP 'not|viber')
libc6:amd64: /lib/x86_64-linux-gnu/libpthread.so.0
libc6:amd64: /lib/x86_64-linux-gnu/libdl.so.2
libc6:amd64: /lib/x86_64-linux-gnu/librt.so.1
libstdc++6:amd64: /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libc6:amd64: /lib/x86_64-linux-gnu/libm.so.6
libgcc1:amd64: /lib/x86_64-linux-gnu/libgcc_s.so.1
libc6:amd64: /lib/x86_64-linux-gnu/libc.so.6
libx11-6:amd64: /usr/lib/x86_64-linux-gnu/libX11.so.6
libxext6:amd64: /usr/lib/x86_64-linux-gnu/libXext.so.6
zlib1g:amd64: /lib/x86_64-linux-gnu/libz.so.1
libgl1-mesa-glx:amd64: /usr/lib/x86_64-linux-gnu/libGL.so.1
libxrender1:amd64: /usr/lib/x86_64-linux-gnu/libXrender.so.1
libglib2.0-0:amd64: /lib/x86_64-linux-gnu/libglib-2.0.so.0
libglib2.0-0:amd64: /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
libxcb1:amd64: /usr/lib/x86_64-linux-gnu/libxcb.so.1
libglapi-mesa:amd64: /usr/lib/x86_64-linux-gnu/libglapi.so.0
libxdamage1:amd64: /usr/lib/x86_64-linux-gnu/libXdamage.so.1
libxfixes3:amd64: /usr/lib/x86_64-linux-gnu/libXfixes.so.3
libx11-xcb1:amd64: /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1
libxcb-glx0:amd64: /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0
libxcb-dri2-0:amd64: /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0
libxcb-dri3-0:amd64: /usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0
libxcb-present0:amd64: /usr/lib/x86_64-linux-gnu/libxcb-present.so.0
libxcb-sync1:amd64: /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1
libxshmfence1:amd64: /usr/lib/x86_64-linux-gnu/libxshmfence.so.1
libxxf86vm1:amd64: /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1
libdrm2:amd64: /usr/lib/x86_64-linux-gnu/libdrm.so.2
libpcre3:amd64: /lib/x86_64-linux-gnu/libpcre.so.3
libffi6:amd64: /usr/lib/x86_64-linux-gnu/libffi.so.6
libxau6:amd64: /usr/lib/x86_64-linux-gnu/libXau.so.6
libxdmcp6:amd64: /usr/lib/x86_64-linux-gnu/libXdmcp.so.6

这些我没有安装,我使用 ldd /opt/viber/Viber | grep 'not found' | awk '{printf "%s$\\n", $1}' | apt-file search -x -a amd64 -f - | sed 's/\\:/:amd64:/' 获得:

$ ldd /opt/viber/Viber | grep 'not found' | awk '{printf "%s$\n", $1}' | apt-file search -x -a amd64 -f - | sed 's/\:/:amd64:/'
libgstreamer-plugins-base0.10-0:amd64: /usr/lib/x86_64-linux-gnu/libgstapp-0.10.so.0
libgstreamer-plugins-base0.10-0:amd64: /usr/lib/x86_64-linux-gnu/libgstinterfaces-0.10.so.0
libgstreamer-plugins-base0.10-0:amd64: /usr/lib/x86_64-linux-gnu/libgstpbutils-0.10.so.0
libgstreamer-plugins-base0.10-0:amd64: /usr/lib/x86_64-linux-gnu/libgstvideo-0.10.so.0
libgstreamer0.10-0:amd64: /usr/lib/x86_64-linux-gnu/libgstbase-0.10.so.0
libgstreamer0.10-0:amd64: /usr/lib/x86_64-linux-gnu/libgstreamer-0.10.so.0
libsqlite3-0:amd64: /usr/lib/x86_64-linux-gnu/libsqlite3.so.0
libxcomposite1:amd64: /usr/lib/x86_64-linux-gnu/libXcomposite.so.1
libxml2:amd64: /usr/lib/x86_64-linux-gnu/libxml2.so.2
libxslt1.1:amd64: /usr/lib/x86_64-linux-gnu/libxslt.so.1

apt-file 是给我 64 位软件包的一个挑逗,所以我必须执行 sudo apt-file -a amd64 update 来强制它具有 64 位文件列表。

现在,让我解释一下以上内容:

  • ldd /path/to/binary :读取二进制文件并告诉您所需的库、符号等。

  • dpkg -S:搜索哪些包提供了特定的安装文件。

  • awksedgrep:正在修改文本流以仅处理感兴趣的部分或显示所需的输出。

  • |$(...) :第一个允许我将命令的输出通过管道传输到另一个命令,后者允许我在执行主要命令之前执行/评估命令。

TL;dr 只需安装这些软件包:

sudo dpkg --add-architecture amd64 ## adding 64-bits architecture package
sudo apt-get update
sudo apt-get install libgstreamer-plugins-base0.10-0:amd64 libgstreamer-plugins-base0.10-0:amd64 libgstreamer-plugins-base0.10-0:amd64 libgstreamer-plugins-base0.10-0:amd64 libgstreamer0.10-0:amd64 libgstreamer0.10-0:amd64 libsqlite3-0:amd64 libxcomposite1:amd64 libxml2:amd64 libxslt1.1:amd64 libc6:amd64 libdrm2:amd64 libffi6:amd64 libgcc1:amd64 libgl1-mesa-glx:amd64 libglapi-mesa:amd64 libglib2.0-0:amd64 libpcre3:amd64 libstdc++6:amd64 libx11-6:amd64 libx11-xcb1:amd64 libxau6:amd64 libxcb1:amd64 libxcb-dri2-0:amd64 libxcb-dri3-0:amd64 libxcb-glx0:amd64 libxcb-present0:amd64 libxcb-sync1:amd64 libxdamage1:amd64 libxdmcp6:amd64 libxext6:amd64 libxfixes3:amd64 libxrender1:amd64 libxshmfence1:amd64 libxxf86vm1:amd64 zlib1g:amd64

您还需要安装 64 位内核。

次佳方案

无法在 32 位操作系统上安装仅支持 64 位架构的软件,反之亦然。为了安装 64 位软件,您需要支持 64 位的硬件和在其上运行的 64 位操作系统。

另外我想提一下,无法在仅支持 32 位架构的硬件上安装 64 位操作系统作为虚拟机。您的硬件应支持 64 位架构以及虚拟化支持,才能创建 64 位虚拟机。

第三种方案

我不得不说你说的不是真的

\\n

my computer only supports 32-bit

\\n

根据运行 lscpu 的输出,您安装的 Ubuntu 版本是 32 位,而您的系统可以支持 64 位应用程序,如果您想安装 64 位应用程序,您必须安装 64 位 Ubuntu 操作系统。请参阅以下几行:

Architecture: i686              # <-- your kernel is 32 bit (32 bit Ubuntu)
CPU op-mode(s): 32-bit, 64-bit  # <-- your cpu can handle 32 or 64 bit instructions
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1 
Core(s) per socket: 2 
Socket(s): 1 
Vendor ID: GenuineIntel 
CPU family: 6 
Model: 23 
Stepping: 10 
CPU MHz: 2800.000 
BogoMIPS: 5586.12 
Virtualization: VT-x 
L1d cache: 32K 
L1i cache: 32K 
L2 cache: 2048K

Downloadinstall 64 位 Ubuntu 14.04.1,然后安装 Viber

第四种方案

您可以在使用 32 位硬件构建的计算机上安装 64 位软件,就像在 x86 目标上运行 ARM 软件一样,使用动态转换。

基本上,诸如 qemu 之类的软件位于程序和计算机中的 in-between 中,执行从 AMD64 指令集到 x86(可能是 i686)指令集的转换(不可否认,性能受到非常严重的影响,在您的情况下这是完全可以避免的) )。

鉴于您使用的是 ubuntu,您拥有出色的 piece of documentation on how to set this up 。基本上你有两个选择之一,你可以在带有自己内核的完整64位VM环境中运行程序,或者,我认为你想要的是user-space可视化,这使用了thunking(我不认为它通常被称为thunking这些天但忘记了新词)将系统调用从 64 位转换为 32 位,以便您可以使用自己的内核。

现在指南比我解释得更好,但简而言之,您需要安装 qemu 和 qemu-kvm-extras-static 包,然后使用 qemu-debootstrap 为您的 64 位程序设置环境和库。然后您需要使用 binfmt_misc 和静态 qemu 解释器(qemu-arch-static,在您的情况下可能是 x86_64、x64 或 AMF64)在其环境中运行您的程序。

但请注意,您的 CPU 似乎支持 64 位指令,因此您可以安装 64 位 ubuntu,您可以在没有任何仿真的情况下在 AMD64 机器上运行 x86 代码,如果您能够做到这一点,它可能会更容易,另一方面,如果您想探索 qemu 和架构仿真的世界(如果您有一个为例如 ARM 构建的程序,例如为手机构建的程序,可能会稍后出现)我建议您继续前进,但要小心,有时需要进行一些摆弄或调试才能正常工作。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14437.html,未经允许,请勿转载。