内容

名称

perlsynology - Synology DSM 系统上的 Perl 5

描述

Synology 制造了大量网络附加存储 (NAS) 设备,这些设备在大型组织以及小型企业和家庭中非常受欢迎。

NAS 系统配备了 Synology 磁盘存储管理器 (DSM),这是一个精简的 Linux 系统,增强了几个用于管理 NAS 的工具。硬件有几种类型:Marvell Armada (ARMv5tel, ARMv7l)、Intel Atom (i686, x86_64)、Freescale QorIQ (PPC) 等等。有关完整列表,请参阅 Synology 常见问题解答

由于它基于 Linux,因此 NAS 可以运行许多流行的 Linux 软件包,包括 Perl。事实上,Synology 提供了一个现成的 Perl 安装包,具体取决于 DSM 的版本,安装的 perl 版本从 DSM-4.3 上的 5.8.6 到 DSM-7.1 上的 5.28.1 不等。

有一个活跃的用户社区为 Synology DSM 系统提供许多软件包;在撰写本文时,他们提供了 Perl 5.28.1 版本。

本文档描述了 Synology DSM 操作系统的各种功能,这些功能会影响 Perl 5(以下简称 Perl)的配置、编译和/或运行方式。它已由 Johan Vromans 为 Synology DS413 (QorIQ) 编译和验证,并获得了 H.Merijn Brand (DS213: ARMv5tel, RS815: Intel Atom x64 和 DS218+: Celeron J3355) 的反馈。

设置构建环境

DSM 7

为了获得舒适的开发环境,Entware 目前是唯一可行的解决方案。只需按照 在 Synology NAS 上安装 Entware 上的详细说明进行操作。支持的架构包括 armv5、armv7、mipsel、wl500g、x86_32 和 x86_64。查看 此处 以了解支持的平台。

该 github 链接还显示了应支持哪些环境。

它在 DSM-7.1 上由 H.Merijn Brand 在 DS218+ 和 DS220+(均为 Intel x64)上进行了测试。

Entware 附带一个预编译的 5.26.1(2018 年 1 月),允许构建共享 XS 代码。请注意,此安装**不**使用 site_perl 文件夹。可用的 `cpan` 可以正常工作。如果所有必需的开发包也安装了,那么 XS 也一样。

从社区软件包中心安装 perl

要完成开发环境,请安装 make 和 gcc

ds220# opkg install make gcc

然后,可选地,确保您使用较新的 bash 和 gawk。

ds220# opkg install bash gawk
ds220# cd /usr/bin
ds220# mv bash bash.syno
ds220# ln -s /opt/bin/bash .

为了让 Configure 找到所需的库

ds220# cd /opt/lib
ds220# ln -s libcrypt.so.?       libcrypt.so
ds220# ln -s libdl.so.?          libdl.so
ds220# ln -s libgdbm.so.?        libgdbm.so
ds220# ln -s libgdbm_compat.so.? libgdbm_compat.so
ds220# ln -s libm.so.?           libm.so
ds220# ln -s libpthread.so.?     libpthread.so
ds220# ln -s libutil.so.?        libutil.so

DSM 6

在 DSM 6 上,使用 iPkg 已被弃用,但 DSM 6 提供了一种替代方案:entware/opkg。有关如何使用它的说明,请阅读 在 Synology NAS 上安装 Entware-ng

遗憾的是,这在 QorIQ 上(目前)无法使用。在撰写本文时,支持的架构为 armv5、armv7、mipsel、wl500g、x86_32 和 x86_64。查看 此处 以了解支持的平台。

Entware-ng 附带一个预编译的 5.24.1(2017 年 6 月),允许构建共享 XS 代码。请注意,此安装**不**使用 site_perl 文件夹。可用的 `cpan` 可以正常工作。如果所有必需的开发包也安装了,那么 XS 也一样。

DSM 5

由于 DSM 是一个精简的 Linux 系统,因此它缺少 Linux 上常见的许多工具和库。基本的工具,如 sh、cp、rm 等,是使用 BusyBox 实现的。

下一步是向系统库添加一些符号链接。例如,开发软件需要一个名为 `libm.so` 的库,该库通常是 `libm.so.6` 的符号链接。Synology 仅提供后者,而不提供符号链接。

这里,Synology 系统的实际架构很重要。您需要找出 gcc 库的安装位置。在 `/opt` 中查找类似于 `arm-none-linux-gnueab` 或 `powerpc-linux-gnuspe` 的目录。在下面的说明中,我将使用 `powerpc-linux-gnuspe` 作为示例。

警告:当您执行系统软件升级时,这些链接将消失,需要重新建立。

编译 Perl 5

当构建环境设置好后,构建和测试 Perl 就很简单了。您只需要像往常一样下载源代码,并添加一个名为 `Policy.sh` 的文件,如下所示

# Administrivia.
perladmin="[email protected]"

# Install Perl in a tree in /opt/perl instead of /opt/bin.
prefix=/opt/perl

# Select the compiler. Note that there is no 'cc' alias or link
# on older DSM versions
cc=gcc
awk=/opt/bin/gawk

# Build flags. Optional
ccflags="-DDEBUGGING"

# Library and include paths.
locincpth="/opt/include"
loclibpth="/opt/lib /usr/local/lib /usr/lib"
libpth="/opt/lib /usr/local/lib /usr/lib"

您可能希望在安装之前创建目标目录并赋予其正确的权限,从而无需以超级用户身份构建 Perl。

在您解压缩源代码的目录中,执行熟悉的命令

$ bash ./Configure -Dusedevel -Duseshrplib -Duse64bitall -des
$ make -j2
$ env TEST_JOBS=2 make test_harness
$ make install

已知问题

配置

GNU C 编译器在 `-v` 下可能会输出意外的内容,这会导致对 `cppsymbols` 的分析失败,因为引号不匹配。

如果 `config.sh` 出现语法错误,您会注意到。

构建

错误消息“未找到错误定义”。

由于 Synology 文件系统的非典型结构,当无法找到错误代码的本地定义时,会生成此错误。

此错误已在 Perl 开发 git 的 5.19 版本中修复,提交为 7a8f1212e5482613c8a5b0402528e3105b26ff24。

失败的测试

ext/DynaLoader/t/DynaLoader.t

由于 Synology 文件系统的非典型结构,一个子测试失败。文件/lib/glibc.so 丢失。

警告: 不要将/lib/glibc.so.6 符号链接到/lib/glibc.so,否则一些系统组件将开始出现故障。

Perl 烟雾测试

如果构建成功完成,您可以按照 Test::Smoke 文档中描述的设置烟雾测试。

对于烟雾测试,您需要一个正在运行的 Perl。您可以安装 Synology 提供的 Perl 5.8.6 包,或者构建并安装您自己的、更新得多的版本。

请注意,我无法在由 Synology 任务计划程序启动时运行成功的烟雾测试。我通过使用 ssh 在另一个系统上运行的 cron 作业来启动烟雾测试。

ssh nas1 wrk/Test-Smoke/smoke/smokecurrent.sh

本地补丁

当使用烟雾测试应用本地补丁时,测试驱动程序将在应用补丁后自动请求重新生成某些表。Synology 提供的 Perl 5.8.6(至少在 DS413 上)无法生成这些表。它将生成具有虚假值的 opcode,导致构建失败。

您可以通过添加设置来防止重新生成

'flags' => 0,

到烟雾配置中,或者通过添加另一个补丁,在regen.pl 程序的开头插入

exit 0 if $] == 5.008006;

添加库

上述过程描述了一个基本环境,因此会导致一个基本的 Perl。如果您想向 Perl 添加其他库,您可能需要一些额外的设置。

例如,基本的 Perl 没有任何 DB 库(db、dbm、ndbm、gdsm)。您可以使用 iPKGui 添加这些库,但是,您需要将环境变量 LD_LIBRARY_PATH 设置为适当的值

LD_LIBRARY_PATH=/lib:/opt/lib
export LD_LIBRARY_PATH

此设置需要在构建 Perl 时生效,以及在运行程序时生效。

修订

2022 年 7 月,适用于 DSM 5.1.5022 和 DSM 6.1-15101-4,以及 DSM-7.1-42661-3。

作者

Johan Vromans <[email protected]> H. Merijn Brand <[email protected]>