內容

名稱

perlsynology - Synology DSM 系統上的 Perl 5

說明

Synology 生產大量網路附加儲存 (NAS) 裝置,在大型組織、小型企業和家庭中都非常受歡迎。

NAS 系統配備 Synology Disk Storage Manager (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 連結也顯示應支援哪些環境。

H.Merijn Brand 已在 DS218+ 和 DS220+(均為 Intel x64)上的 DSM-7.1 中進行測試。

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

iPkg 已在 DSM 6 中棄用,但 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="your.email@goes.here"

# 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,

到冒煙設定中,或新增另一個修補程式,將

exit 0 if $] == 5.008006;

插入到 regen.pl 程式開頭。

新增函式庫

上述程序說明了基本環境,因此會產生基本的 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 <jvromans@squirrel.nl> H. Merijn Brand <cpan@tux.freedom.nl>