问题
- 我可以将我的 Ubuntu 18.04 LTS 服务器的架构从 转换
armhf
为 吗arm64
?我已经让它做了“多架构”的事情,但我不确定这是最好的解决方案。我应该怎么做? - 我如何系统地检查我已安装的所有
apt
软件包,并用可能/可用的软件包替换armhf
它们?arm64
我已经备份了这个磁盘映像,所以我不介意可能会破坏服务器的解决方案 - 如果出现任何问题,我只需重新安装映像即可。
背景
我想在我的 Raspberry Pi 3 B 上将 armhf 转换为 arm64。我已按照说明进行操作这里,并生成了一个可以运行的 64 位 Ubuntu Bionic Server(很酷)。然而,我注意到,虽然我能安装并运行arm64
(即 64 位)软件包,我的服务器上的大多数软件包都是armhf
(即 32 位)。我想用 替换所有(或尽可能多的)。服务器当前列为“外部”armhf
架构,并列为其本机架构。我可以切换这些吗?arm64
arm64
armhf
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 不够智能,无法安全地交叉升级软件包,如果它认为某些依赖项已损坏,它会倾向于删除关键组件。在目标架构中安装所有dpkg
、apt
和aptitude
(如果使用)及其所有依赖项之前 - 交叉升级绝对必须手动完成,尽管至少应该可以部分编写脚本。
现在进入交叉评分的过程:
- 确保您有某种方式来启动系统并在出现问题时 chroot 到其中,例如在通常从 eMMC 启动的 Pinebook Pro 上,可以通过保留带有另一个操作系统的 microSD 卡来实现,在 x86 上 - 只需保留一个实时 CD/USB。
- 将目标体系结构添加到 dpkg,例如
dpkg --add-architecture arm64
- 更新 APT 源,例如
apt update
- 在目标体系结构中安装内核,例如
apt install linux-image-arm64:arm64
重新启动进入新内核 - 打开至少几个 root 终端,特别是如果你没有 root 密码并使用 sudo: 。在其中一个 root 终端中
sudo -i
安装并保持运行也非常有用- 它可以使一些恢复任务更容易。mc
- 使用类似于
apt-rdepends
获取目标体系结构版本的所有依赖项的完整递归列表dpkg
,apt
以及可选的,aptitude
使用下载所有这些软件包。对、、、apt download <package1> <package2> ...
执行相同操作-这些是的运行时依赖项,手动安装它们将减少进入自动阶段时系统损坏的可能性。sed
tar
coreutils
findutils
dpkg
- 使用
dpkg -i <package_file>
逐个安装所有下载的软件包,从最核心的依赖项开始,然后转到依赖包 - 这本质上是使用新架构包“升级”旧架构包,正确地删除旧文件并安装新文件(对于非多架构包)dpkg
,以及同时安装新文件和多架构包(例如)libc6
。 - 一旦安装了新架构版本,
apt
您就可以运行apt update
并尝试apt -f install
安装/交叉升级目标架构的任何缺失依赖项,但要小心确保 APT 不会尝试删除任何与包管理或网络相关的包 - 如果没有这些包,系统仍然可以恢复,但这个过程相当繁琐。如果您看到 APT 建议删除任何这些关键包 - 请返回apt-rdepends
并手动安装缺失的依赖项。 - 一旦您成功运行了至少一次,
apt -f install
您就应该至少运行apt full-upgrade
一次 - 它可能会在目标架构中选择更多仍需要安装的软件包。 - ...
- 利润!!!
我如何系统地检查我已安装的所有 apt 包,并在可能/可用的情况下用 arm64 替换 armhf 包?
我的做法是使用并通过搜索旧架构来aptitude
管道输出,例如。对于所有找到的软件包 - 首先,尝试安装新的 arch 版本,例如,如果上述命令列出,则只需执行,这应该会将 armhf 版本替换为 arm64。最终只会安装多架构软件包,此时应该可以清除返回的所有软件包。清除所有旧架构软件包后,您应该能够运行。grep
aptitude search ~i | grep :armhf
firefox:armhf
apt install firefox
aptitude search ~i | grep :armhf
dpkg --remove-architecture armhf