Synology のパッケージのビルド方法について調べてみたpost

Synology の NAS で利用可能なパッケージを作ってみようと思い、色々と調べてみました。 調べている最中に DSM 7.0 も正式リリースされたので、合わせてそのバージョンも調査の対象としました。

また、macOSでパッケージを作る場合の方法についても書きました。

パッケージインストールウィザード4

パッケージのビルドに必要な環境

ほぼ同じですが例としてあげられているUbuntuのLTSバージョンに変更がされているようです。

6.27.0
OS64bitの一般的なLinux環境
(例として Ubuntu 16.04 LTS)
64bitの一般的なLinux環境とルート権限
(例として Ubuntu 18.04 LTS)
bash>= 4.1.5>= 4.1.5
Python>= 2.7.3>= 2.7.3

どちらも、NASに直接インストールすることはせず、必要であれば Docker パッケージをインストールしてツールキットを動かしてほしいと書かれています。

macOS は残念ながら一般的なLinux環境ではないので synology-toolkit-for-non-linux というソリューションを作って開発できるようにしてみました。

DSM 6 と DSM 7 とのパッケージのビルド手順の違い

どちらも EnvDeployPkgCreate․py への引数の与え方に違いはなさそうです。

ただ、処理の内容には多少の違いがあるようです。

DSM 6.x

利用可能なプラットフォーム:

6281 alpine alpine4k apollolake armada370 armada375 armada37xx armada38x armadaxp avoton braswell broadwell broadwellnk bromolow cedarview comcerto2k denverton dockerx64 evansport geminilake grantley hi3535 kvmx64 monaco purley qoriq rtd1296 v1000 x64

  1. pkgscripts/EnvDeploy -v 6.2 -p x64
  2. pkgscripts/PkgCreate.py -v 6.2 -p x64 -c ExamplePackage

DSM 7.x

利用可能なプラットフォーム:

bromolow cedarview armadaxp armada370 armada375 evansport comcerto2k avoton alpine braswell apollolake grantley alpine4k monaco broadwell kvmx64 armada38x denverton rtd1296 broadwellnk purley armada37xx geminilake v1000

  1. pkgscripts-ng/EnvDeploy -v 7.0 -p braswell
  2. pkgscripts-ng/PkgCreate.py -v 7.0 -p braswell -c ExamplePackage

破壊的変更により署名のフェーズがなくなっているようで指定可能な引数が少し変わっていました。

パッケージ手動のインストール

出来たパッケージを試すには、Synology NAS にログインし、パッケージセンターから「手動インストール」を行うことで可能です。

パッケージインストールウィザード1パッケージインストールウィザード2<img src="/thumbs/9065d65d3300b28ef4d44bbeff637082-640x640.png" alt="パッケージインストールウィザード3>パッケージインストールウィザード4

インストールすると、試した ExamplePackage では、こんな感じにアイコンなどが設置されました。

パッケージインストール後1パッケージインストール後2パッケージインストール後3

なお、後述のパッケージのお作法がちゃんとされていないと、インストール時に「ファイル形式が正しくありません、パッケージ管理者に連絡してください」("Invalid file format. Please contact the package developer.") と表示されるようです。

ファイル形式が正しくありません

DSM 6.x から 7.0 へ実装を変更する場合の主な変更点

DSM Developer Guide 7.0 BETABreaking Changes in 7.0 (7.0 での破壊的変更) によると、DSM 6.x から DSM 7.x へは、パッケージフレームワークの次の点が変更されているようです。 下記の内容に従っていないと、パッケージのビルドが成功してもインストールすることができないなどが起こるようです。

#項目DSM 6.xDSM 7.x
1conf/privilege低い特権での実行をサポートしていないパッケージの場合は必須ではない必須
2INFO.sh必須ではないpackage
version
os_min_ver="7.0-40000" ※もしくはそれ以上
description
arch
maintainer
以上のフィールドが必要。
そうでないない場合は、ビルドは成功するがインストール時に「ファイル形式が正しくありません、パッケージ管理者に連絡してください」("Invalid file format. Please contact the package developer.") と表示される。
3パッケージ署名必要不要(つまり、gnupg も不要)
4conf/privilegedefaults.run-as"package"
"system"
"root"
"package"
"root"
特権操作はリソースワーカー経由での実行へ変更が必要
5ホームパス/var/packages/[package_name]/target/var/packages/[package_name]/home
権限は 0700(rwx------)
6PACKAGE_ICON.PNG72 x 7264 x 64
7FHS ディレクトリの所有者target などの FHS ディレクトリは conf/privilege に従って新しい特権設定が行われます。
8パッケージログの場所/var/log/synopkg.logパッケージ操作ログ:/var/log/synopkg.log
コントロールスクリプトログ:/var/log/packages/[package_name].log
9システム起動時の開始確認されないINFO.shprecheckstartstop="yes"の場合にされる

PkgCreate․py の使い方

とりあえず pkgscripts/PkgCreate.py -v {バージョン} -p {プラットフォーム} -c {パッケージ名} でことは足りる。

usage: PkgCreate.py [-h] [-p PLATFORMS] [-e ENV_SECTION] [-v ENV_VERSION] [-x DEP_LEVEL] [-X PARALLEL_PROJ] [-b BRANCH] [-s SUFFIX] [-c] [--no-collecter] [-L] [-l] [-B] [-I] [-i]
                    [-P PARALLEL] [--build-opt BUILD_OPT] [--install-opt INSTALL_OPT] [--print-log] [--no-tee] [--min-sdk SDK_VER]
                    package

固定引数:
  package               対象のパッケージ

オプションの引数:
  -h, --help            このヘルプメッセージを表示して終了
  -p PLATFORMS          ターゲットプラットフォームを指定。 省略時では、build_env/ 以下の利用可能なプラットフォームを検出。
  -e ENV_SECTION, --env ENV_SECTION
                        環境セクションを SynoBuildConf/depends で指定。省略時は [default] 。
  -v ENV_VERSION, --version ENV_VERSION
                        ターゲットDSMバージョンを手動で指定。
  -x DEP_LEVEL          ビルド依存レベルを指定
  -X PARALLEL_PROJ      SynoBuild 並列ビルドプロジェクト。 0 は 2 つの並列ジョブでビルドすることを意味。
  -b BRANCH             パッケージのブランチを指定。
  -s SUFFIX             ビルド環境のフォルダのサフィックス (build_env/) を指定。
  -c                    パッケージを収集。
  --no-collecter        すべての収集動作をスキップ。
  -L                    プロジェクトをリンクしません。
  -l                    プロジェクトを更新してリンク。
  -B                    プロジェクトを構築しない。
  -I                    プロジェクトをインストールしない。
  -i                    プロジェクトのみをインストール。
  -P PARALLEL           並列プラットフォーム、省略時は 2
  --build-opt BUILD_OPT 
                        SynoBuild への引数パス
  --install-opt INSTALL_OPT
                        SynoInstall への引数パス
  --print-log           SynoBuild/SynoInstall のエラーログを印字。
  --no-tee              stdout/stderr をログに記録しません。
  --min-sdk SDK_VER     最小 SDK バージョン、省略時=6.2

EnvDeploy や PkgCreate․py などで利用可能なプラットフォーム

型番からプラットフォームを調べる場合は What kind of CPU does my Synology NAS have? を参照する。

プラットフォーム6.27.0
6281利用可能
dockerx64利用可能
hi3535利用可能
qoriq利用可能
x64利用可能
alpine利用可能利用可能
alpine4k利用可能利用可能
apollolake利用可能利用可能
armada370利用可能利用可能
armada375利用可能利用可能
armada37xx利用可能利用可能
armada38x利用可能利用可能
armadaxp利用可能利用可能
avoton利用可能利用可能
braswell利用可能利用可能
broadwell利用可能利用可能
broadwellnk利用可能利用可能
bromolow利用可能利用可能
cedarview利用可能利用可能
comcerto2k利用可能利用可能
denverton利用可能利用可能
evansport利用可能利用可能
geminilake利用可能利用可能
grantley利用可能利用可能
kvmx64利用可能利用可能
monaco利用可能利用可能
purley利用可能利用可能
rtd1296利用可能利用可能
v1000利用可能利用可能

macOSでパッケージをビルドするには?

macOS で簡単にパッケージがビルドできるように synology-toolkit-for-non-linux というソリューションを作りました。

使い方は、まずレポジトリを clone して、環境を構築。

$ git clone https://github.com/sharkpp/synology-toolkit-for-non-linux.git
$ cd synology-toolkit-for-non-linux
$ docker/build.sh

次に、 EnvDeploy でツールキットをダウンロード

$ pkgscripts/EnvDeploy -v 7.0 -p braswell

最後に source フォルダにパッケージのソースを入れ PkgCreate․py でビルド。 ここでは ExamplePackage を利用。

$ git clone https://github.com/SynologyOpenSource/ExamplePackages.git source/ExamplePackages
$ mv source/ExamplePackages/ExamplePackage source
$ pkgscripts/PkgCreate.py -v 7.0 -p braswell -c ExamplePackage

result_spk フォルダにビルドされたパッケージが置かれます。

参考になりそうなパッケージ

Search · os_min_ver filename:INFO で適当に検索してリストアップしてみました。

パッケージ名DSM概要
ExamplePackage7.0公式サンプルパッケージ
nmap7.0公式サンプル nmap パッケージ
synology-package-template7.0/6.xサンプルパッケージ
Tailscale package7.0/6.xTailscale VPN パッケージ?
TorrServer package7.0/6.xTorrServerパッケージ
WireGuard package7.0/6.xWireGuardパッケージ
autorun7.0/6.xSynology NASで外付けドライブ(USB / eSATA)を接続するときにスクリプトを実行

参考


   /   変更履歴  /   Permalink  /  このエントリーをはてなブックマークに追加 
 カテゴリ: ブログ  /   タグ: Synology, NAS, DSM, Linux, Docker