QNAPでipkファイルを作る
QNAPのNAS、TS-412を買いました。
- NAS補完計画〜ナスが、来宅〜: プラスα空間 (2013年3月21日)
その環境を改善するために、色々実験しています。QNAPに、独自コマンドをインストールする時、ipkg化されたファイルを使った方が、管理が楽になります。「管理が楽」とは、インストールと削除が簡単にできる様になるからです。
ここでは、"Hello, world!"と表示するプログラムのipkg(ipkファイル)を作ってみます。
まずは、コンパイル環境が構築されている事が前提です。
- QNAP TS-412にコンパイル環境: プラスα空間 (2013年3月31日)
まずは、準備です。
- treeコマンドのインストール(必須ではありません)
- findutilsのインストール(必須)
- ipkg-utilのインストール(必須)
- PATHの変更(必須)
(1) treeコマンドのインストール(必須ではありません)
あらかじめ、treeコマンドをインストールしておくと、ディレクトリのtree表示ができます。必須ではありません。
# ipkg install tree Installing tree (1.6.0-1) to root... Downloading http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/tree_1.6.0-1_arm.ipk Configuring tree Successfully terminated.
(2) findutilsのインストール(必須)
標準のfindは、busyboxにリンクされています。busyboxのfindではオプションが足りずに、ipkファイルを作るユーティリティ"ipkg-build"の実行でエラーになります。
findutilsをインストールしておきます。
# ipkg install findutils
(3) ipkg-utilのインストール(必須)
これが、一番重要です。探すと色々出てくるのですが、どれがオリジナルなのか、よくわかりません。
“ipkg-utils 1.7 download"で検索すると、色々出てくるので、信頼できそうな所からダウンロードして下さい。
私は、次の所からダウンロードしたようです。
(4) PATHの変更(必須)
# export PATH=/opt/bin:/opt/sbin:$PATH:{ipkg-utilをインストールしたpath}
{ipkg-utilをインストールしたpath}は、各自違うと思いますので、ご自身で設定して下さい。
準備が終わったら、次の手順で作ります。
- 作業ディレクトリとソースファイルの準備
- パッケージ用ディレクトリの準備
- バイナリのビルド
- controlファイルの作成
- ipkファイルの作成
- ipkファイルのインストールと確認
(1) 作業ディレクトリとソースファイルの準備
まず、作業ディレクトリとソースファイルの準備です。
# cd /opt # mkdir work # cd work # mkdir Hello-World-1.0 # cd Hello-World-1.0 # mkdir src # cd src # vi hello-world.c
viで作るソースファイルは、次の通りです。
#include <stdio.h>
main(int argc, char **argv)
{
printf("Hello, world!\n");
}
ソースファイルの準備ができました。
(2) パッケージ用ディレクトリの準備
次にインストールするファイルを準備します。作業ディレクトリは、/opt/work/Hello-World-1.0にいるとします。
# cd /opt/work/Hello-World-1.0 # mkdir Hello-World_1.0 # mkdir Hello-World_1.0/opt # mkdir Hello-World_1.0/opt/bin # mkdir Hello-World_1.0/CONTROL
(3) バイナリのビルド
作業ディレクトリは、/opt/work/Hello-World-1.0にいるままとします。
# gcc -o Hello-World_1.0/opt/bin/hello-world src/hello-world.c
ここまでが、"hello-world"コマンドの準備となります。
(4) controlファイルの作成
次に、ipkgで必要となる、controlファイルを作成します。作業ディレクトリは、/opt/work/Hello-World-1.0にいるままとします。
# vi Hello-World_1.0/CONTROL/control
controlの中身は、次の様な感じです。
Package: hello-world
Architecture: arm
Priority: optional
Section: Misc
Version: 1.0-1
Maintainer: Oichinokata <webmaster@oichinote.com>
Source: https://oichinote.com/plus/files/2013/04/Hello-World-1.0.tar.gz
Depends:
Conflicts:
Description: Hello, world!
“Maintainer"と"Source"は、ご自身の内容に書き換えて下さい。ソフトを作った人ではなく、パッケージを管理する人の名前を書きます。
ここまでで、Hello-1.0の中身は、次のようになっているはずです。
# tree Hello-World-1.0 Hello-World-1.0 ├── Hello-World_1.0-1 │ ├── CONTROL │ │ └── control │ └── opt │ └── bin │ └── hello-world └── src └── hello-world.c 5 directories, 3 files
ソースファイルを置いておきます。
(5) ipkファイルの作成
次に、ipkg-buildユーティリティを使って、.ipkファイルを作ります。
# ipkg-build Hello-World_1.0 Packaged contents of Hello-World_1.0 into /opt/work/Hello-World-1.0/hello-world_1.0-1_arm.ipk
カレントディレクトリに、"hello_1.0-1_arm.ipk"と言うファイルができているはずです。
ちなみに、標準のfindはbusyboxにリンクされており、ipkg-buildHello-World-1.0.tar内のfindのオプション指定でエラーになります。
(6) ipkファイルのインストールと確認
次に、パッケージのインストールです。
# ipkg install hello-world_1.0-1_arm.ipk Installing hello-world (1.0-1) to root... Configuring hello-world Successfully terminated.
これで、"/opt/bin/hello-world"コマンドがインストールされたはずです。
# ipkg list_installed | egrep -i hello hello-world - 1.0-1 - # ls -l /opt/bin/hello-world -rwxr-xr-x 1 admin administ 5140 Mar 19 07:47 /opt/bin/hello-world* # hello-world Hello, world!
インストールされた"hello-world"に、Descriptionで指定した内容が表示されるはずなのですが、表示されません。何故でしょうか?
この原因が、未だにわかりません。普通に使うだけなら、問題ないのですけれど、配布しようとすると問題となります。
次に、パッケージの削除を試してみます。
# ipkg remove hello-world Removing package hello-world from root... Successfully terminated. # ipkg list_installed | egrep -i hello # ls -l /opt/bin/hello-world ls: /opt/bin/hello-world: No such file or directory
削除できました。
これで、自由自在に、パッケージ作成/インストール/削除ができます。
参考にしたウェブサイトです。ありがとうございます。
こちらには、Linux Zaurus用にipkファイルを作る方法を書かれています。Linux Zaurusの頃から、ipkgがあるとは、驚きでした。
また、一般的なソフトウェアをビルド(make)してipkgを作る方法も書かれています。
ディスカッション
[…] QNAPでipkファイルを作る […]