QNAPでipkファイルを作る

2016年7月31日NAS,パソコン・インターネット

QNAPのNAS、TS-412を買いました。

[amazonjs asin="B0076N2VHO" locale="JP"]

その環境を改善するために、色々実験しています。QNAPに、独自コマンドをインストールする時、ipkg化されたファイルを使った方が、管理が楽になります。「管理が楽」とは、インストールと削除が簡単にできる様になるからです。

ここでは、"Hello, world!"と表示するプログラムのipkg(ipkファイル)を作ってみます。

まずは、コンパイル環境が構築されている事が前提です。

まずは、準備です。

  1. treeコマンドのインストール(必須ではありません)
  2. findutilsのインストール(必須)
  3. ipkg-utilのインストール(必須)
  4. 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}は、各自違うと思いますので、ご自身で設定して下さい。

準備が終わったら、次の手順で作ります。

  1. 作業ディレクトリとソースファイルの準備
  2. パッケージ用ディレクトリの準備
  3. バイナリのビルド
  4. controlファイルの作成
  5. ipkファイルの作成
  6. 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を作る方法も書かれています。

Posted by お市のかた