问题

问题

问题

  1. 我可以将我的 Ubuntu 18.04 LTS 服务器的架构从 转换armhf为 吗arm64?我已经让它做了“多架构”的事情,但我不确定这是最好的解决方案。我应该怎么做?
  2. 我如何系统地检查我已安装的所有apt软件包,并用可能/可用的软件包替换armhf它们?arm64

我已经备份了这个磁盘映像,所以我不介意可能会破坏服务器的解决方案 - 如果出现任何问题,我只需重新安装映像即可。


背景

我想在我的 Raspberry Pi 3 B 上将 armhf 转换为 arm64。我已按照说明进行操作这里,并生成了一个可以运行的 64 位 Ubuntu Bionic Server(很酷)。然而,我注意到,虽然我安装并运行arm64(即 64 位)软件包,我的服务器上的大多数软件包都是armhf(即 32 位)。我想用 替换所有(或尽可能多的)。服务器当前列为“外部”armhf架构,并列为其本机架构。我可以切换这些吗?arm64arm64armhf

ubuntu@ubuntu:~$ dpkg --print-architecture
armhf
ubuntu@ubuntu:~$ dpkg --print-foreign-architectures
arm64

是否有某种方法可以让系统切换这两者,以便使其arm64成为默认设置,并且仅在没有可用包的armhf情况下使用?arm64


请注意:我没有计算机科学背景,所以请原谅我的天真。我的想法是,64 位计算平均比 32 位更快,因为任何试图处理大数字或高精度的软件都可以使用 Pi 3 B 上 ARMv8 芯片的 64 位架构,而不是将数字处理延长到几个时钟周期。我见过Raspberry Pi 论坛上的讨论关于转换为 64 位的利弊,人们提出了一些相互矛盾的观点。如果有人能整理一份简单的利弊清单,我将不胜感激,因为我不了解这些讨论的复杂性。

目前,我不知道转向 64 位是否会提高性能,但不管怎样 - 这是一个 Raspberry Pi - 你应该玩弄它们!


方法

我按照Ubuntu Wiki 页面;这样做:

sudo dpkg --add-architecture arm64 
sudo apt update

我现在发现

dpkg --print-foreign-architectures

返回

arm64

要确认服务器的 64 位性质:

uname -a

返回:

Linux ubuntu 4.15.0-1022-raspi2 #24-Ubuntu SMP PREEMPT Wed Aug 29 10:40:48 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux

此外:

dpkg-architecture --list

返回

DEB_BUILD_ARCH=armhf
DEB_BUILD_ARCH_ABI=eabihf
DEB_BUILD_ARCH_BITS=32
DEB_BUILD_ARCH_CPU=arm
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_LIBC=gnu
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=arm
DEB_BUILD_GNU_SYSTEM=linux-gnueabihf
DEB_BUILD_GNU_TYPE=arm-linux-gnueabihf
DEB_BUILD_MULTIARCH=arm-linux-gnueabihf
DEB_HOST_ARCH=armhf
DEB_HOST_ARCH_ABI=eabihf
DEB_HOST_ARCH_BITS=32
DEB_HOST_ARCH_CPU=arm
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_LIBC=gnu
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=arm
DEB_HOST_GNU_SYSTEM=linux-gnueabihf
DEB_HOST_GNU_TYPE=arm-linux-gnueabihf
DEB_HOST_MULTIARCH=arm-linux-gnueabihf
DEB_TARGET_ARCH=armhf
DEB_TARGET_ARCH_ABI=eabihf
DEB_TARGET_ARCH_BITS=32
DEB_TARGET_ARCH_CPU=arm
DEB_TARGET_ARCH_ENDIAN=little
DEB_TARGET_ARCH_LIBC=gnu
DEB_TARGET_ARCH_OS=linux
DEB_TARGET_GNU_CPU=arm
DEB_TARGET_GNU_SYSTEM=linux-gnueabihf
DEB_TARGET_GNU_TYPE=arm-linux-gnueabihf
DEB_TARGET_MULTIARCH=arm-linux-gnueabihf

这似乎表明,每当我使用 apt 安装包时,系统都会armhf默认选择一个包。

我想制作arm64非外来架构,并在该服务器上 armhf 我的外来架构。

答案1

我可以将 Ubuntu 18.04 LTS 服务器的架构从 armhf 转换为 arm64 吗?我已经让它做了“多架构”的事情,但我不确定这是最好的解决方案。我应该怎么做?

是的,你可以,但这里有龙——初始转换过程必须主要是手动的,即使在之后,你也必须首先非常密切地关注你的包管理器想要做什么。我已经进行了多次转换——从 i386 到 amd64,从 armel 到 armhf 再到 arm64,反之亦然——从 amd64 到 i386,从 arm64 到 armhf 再到 armel。为什么?因为我可以。

首先要注意的是 - 如果您要从较不先进的架构交叉升级到较先进的架构(即 i386->amd64 和 armel->armhf->arm64),则需要先安装目标架构内核并启动它,然后才能交叉升级其余软件包。如果您要反过来交叉升级(我在发现 64 位软件包留下的可用 RAM 太少后在系统上这样做过),则需要先将所有软件包转换到较不先进的架构,然后才能转换内核(如果较不先进的架构中有内核可用)。第二件要注意的事情 - APT 不够智能,无法安全地交叉升级软件包,如果它认为某些依赖项已损坏,它会倾向于删除关键组件。在目标架构中安装所有dpkgaptaptitude(如果使用)及其所有依赖项之前 - 交叉升级绝对必须手动完成,尽管至少应该可以部分编写脚本。

现在进入交叉评分的过程:

  1. 确保您有某种方式来启动系统并在出现问题时 chroot 到其中,例如在通常从 eMMC 启动的 Pinebook Pro 上,可以通过保留带有另一个操作系统的 microSD 卡来实现,在 x86 上 - 只需保留一个实时 CD/USB。
  2. 将目标体系结构添加到 dpkg,例如dpkg --add-architecture arm64
  3. 更新 APT 源,例如apt update
  4. 在目标体系结构中安装内核,例如apt install linux-image-arm64:arm64重新启动进入新内核
  5. 打开至少几个 root 终端,特别是如果你没有 root 密码并使用 sudo: 。在其中一个 root 终端中sudo -i安装并保持运行也非常有用- 它可以使一些恢复任务更容易。mc
  6. 使用类似于apt-rdepends获取目标体系结构版本的所有依赖项的完整递归列表dpkgapt以及可选的,aptitude使用下载所有这些软件包。对、、、apt download <package1> <package2> ...执行相同操作-这些是的运行时依赖项,手动安装它们将减少进入自动阶段时系统损坏的可能性。sedtarcoreutilsfindutilsdpkg
  7. 使用dpkg -i <package_file>逐个安装所有下载的软件包,从最核心的依赖项开始,然后转到依赖包 - 这本质上是使用新架构包“升级”旧架构包,正确地删除旧文件并安装新文件(对于非多架构包)dpkg,以及同时安装新文件和多架构包(例如)libc6
  8. 一旦安装了新架构版本,apt您就可以运行apt update并尝试apt -f install安装/交叉升级目标架构的任何缺失依赖项,但要小心确保 APT 不会尝试删除任何与包管理或网络相关的包 - 如果没有这些包,系统仍然可以恢复,但这个过程相当繁琐。如果您看到 APT 建议删除任何这些关键包 - 请返回apt-rdepends并手动安装缺失的依赖项。
  9. 一旦您成功运行了至少一次,apt -f install您就应该至少运行apt full-upgrade一次 - 它可能会在目标架构中选择更多仍需要安装的软件包。
  10. ...
  11. 利润!!!

我如何系统地检查我已安装的所有 apt 包,并在可能/可用的情况下用 arm64 替换 armhf 包?

我的做法是使用并通过搜索旧架构来aptitude管道输出,例如。对于所有找到的软件包 - 首先,尝试安装新的 arch 版本,例如,如果上述命令列出,则只需执行,这应该会将 armhf 版本替换为 arm64。最终只会安装多架构软件包,此时应该可以清除返回的所有软件包。清除所有旧架构软件包后,您应该能够运行。grepaptitude search ~i | grep :armhffirefox:armhfapt install firefoxaptitude search ~i | grep :armhfdpkg --remove-architecture armhf

相关内容