我们有一个产品,想要安装在基于 AMD64/x86 的 Ubuntu 服务器和基于 ARM 的 Ubuntu 服务器上。我们将产品打包为 deb 包。所以我需要创建一个可以安装在 AMD64 和 ARM64 上的 deb 包。我确实参考了https://wiki.ubuntu.com/MultiarchSpec。
我开始Architecture
在我的包(all" ...
)控制文件中使用通配符(我也尝试过any
):
Package: my-package
Version: X.Y.Z
Architecture: all
...
因此我创建了一个 deb 包并尝试将其安装在目标服务器上。
但是,我发现apt
包管理器无法识别我的包。我猜这是因为 deb 包使用的通配符不在 的“外部架构”列表中dpkg
。因此,我尝试使用以下dpkg
命令添加架构通配符:
# add foreign architectures
dpkg --add-architecture all
然而这给了我一个错误(参见 另一个具体问题已发布对于 dpkg --add-architecture 错误) - 但基本上我放弃了
出于绝望,我添加了“ALL”,我可以成功添加。然而,这(正如预期的那样)给了我一个错误,因为通配符“ALL”无效,不等于“all”。我得到的错误如下
# apt update
...
N: Skipping acquire of configured file
'restricted/binary-ALL/Packages' as repository
'http://ports.ubuntu.com/ubuntu-ports focal-
updates InRelease' doesn't support architecture
'ALL'
N: Skipping acquire of configured file
'restricted/binary-linux-any/Packages' as
repository 'http://ports.ubuntu.com/ubuntu-ports
focal-updates InRelease' doesn't support
architecture 'linux-any'
所以我现在不确定如何创建针对多种架构的软件包,以及如何在运行 AMD64 和 ARM64 处理器系列的 Ubuntu 服务器上安装这些软件包
欢迎任何建议。
答案1
我的 PPA 中有一个包(ppa:mafoelffen/系统信息),即 Multi-Arch。苏多杜斯是我的一位贡献者。他请我来这里回答我为此做了什么。
参与测试此包中我的脚本的人员确保它在 amd64、arm64、armhf、ppc64el、powerpc、riscv64、s390x 上测试良好。
这是我所做的(参考:https://www.debian.org/doc/debian-policy/ch-controlfields.html#architecture):
dpkg-architecture -L
对于 Debian 包,在./PackageName-VersionNumber/debian folder/control
文件中,我有以下内容:
Architecture: all
这就是控制文件中所需的全部内容。在本地构建它将创建一个ProjectName-VersionNumber_all.deb
文件。在将源包上传到 PPA 之前,我会在本地测试此包。
在 PPA“更改详细信息”页面中,对于“处理器”,我已选择允许我以自助方式执行的所有架构。(riskv64 除外。说来话长。)
当它首次上传到 PPA 时,在 PPA“查看软件包详细信息”页面中,它最初会显示其构建所基于的架构的状态。对我来说,这是“amd64”。发布后,该状态将变为绿色复选标记。如果我查看软件包详细信息,它有system-info_02.00.07_all.deb
,然后我在所有目标架构上对其进行了测试。“riscv64”是另一个讨论,但由于我的没有上游代码(我是“上游”)作为依赖项,因此它也是为此构建的。如果有,那将是另一个故事,有更多细节。
PPA 页面上没有显示有关 arch/package 详细信息的任何内容。我不得不在其他地方进行调查才发现...
Risc-V 64 对我来说是个问题,因为我想包含该 arch 目标,但它不允许我自己选择该选项。我知道这不是你的目标 arch,但我发现的细节会回答这个问题。我去了由构建创建的 PPA 存储库,使用 PPA 的人会从以下位置获取软件包:回购协议。如果您在那里检查,构建后它会创建不同的 arches,命名为binary-<arch>
。如果您沿着目录树的分支向下找到每个 arch 的发布文件,它会告诉您它是为哪个 arch 构建的。这就是我确认它是为每个 arch 构建的。
然后我通过(从具有该架构的机器)添加 PPA、在每个架构上进行安装和测试来测试每个架构。
请注意,如果您正在创建 Debian 软件包的本地构建(.deb
),则Architecture
控制文件中的该行将确定***_arch***.deb
软件包的部分,指示目标架构。对于只有两个架构的软件包,如您所指出的,然后在一个控制文件中执行“amd64”,构建软件包.deb
,然后执行“arm64”,然后再次构建它。这将创建PackageName_VersionNumber_amd64.deb
和PackageName_VersionNumber_arm64.deb
软件包。每个架构一个。
我使用它来构建要上传到 PPA 的源:
debuild -us -uc -i -I -S -sa
我使用它在本地构建软件包来创建.deb
要测试的 Debian 软件包:
debuild -us -uc