QNAP NAS TS-419P II にMinidlnaを導入

Click here for the English version of this article.

QNAP NAS TS-419P II (firmware 3.8.1 Build 20121205) に Minidlna (ver.1.0.25) をインストールした時のメモ。
MinidlnaはIPKGリポジトリにも入っているのだが、バージョンがちょっと古そうなので自分でビルドして入れてみる。

始める前に

QNAPのフォーラム
http://forum.qnap.com/viewtopic.php?p=61719
に先駆者がいらっしゃるので、基本的にはこの内容に従って進めればよい。

※ 以下、パス名など環境依存の記述があります(/share/MD0_DATA/とか、config ramblockの場所とか)。
もしも参考にする際は気をつけてください。


Minidlnaとは?

Netgear製ReadyNAS用に開発されたUPnP-AV media serverらしい。
プロジェクトページはこちら→ http://sourceforge.net/projects/minidlna/

プロジェクトページの説明には、「NASの購入を検討しているのであれば、ぜひReadyNASを第一候補に!」と書かれている。
ちなみに自分もNASを買う際、ReadyNASにしようかQNAPにしようか迷ったのだが…結局QNAPにしてしまった。
ごめんなさいReadyNASの中の人。とりあえずこの記事書いたので許して下さい。


1. Optware IPKGをインストール

QNAPのWebインターフェースからワンクリックでインストール。
インストール後、SSHでログインし念のため ipkg update を実施。


2. minidlnaのソースコードをダウンロード

とりあえず正式リリースなバージョンを持ってくる。
http://sourceforge.net/projects/minidlna/
のダウンロードページから minidlna_1.0.25_src.tar.gz を取得し適当な場所に展開する。


3. ライブラリの準備

INSTALL ファイルを見ると
Prerequisites :

- libexif
- libjpeg
- libid3tag
- libFLAC
- libvorbis
- sqlite3
- libavformat (the ffmpeg libraries)
- libuuid
と書いてある。それぞれをソースコードからビルドするのはめんどうなので
全てipkgで導入する。

SSHでログインし、
# ipkg install libexif
# ipkg install libjpeg
# ipkg install libid3tag
# ipkg install flac
# ipkg install libvorbis
# ipkg install sqlite
# ipkg install ffmpeg
※ "sqlite" パッケージがversion 3系、"sqlite2" パッケージがversion 2系のようだ。
ちなみにバージョン番号は ipkg info sqlite や ipkg info sqlite2 で確認できる。
※ libuuidはシステムに最初から入っていたので特に何もしていない。

その他、ビルドに必要なものもインストール。
# ipkg install gcc make


4. Makefile, genconfig.shの修正

ヘッダファイルのディレクトリが /usr/include 決め打ちになってしまっているので
とりあえずこれをOptwareの環境に合わせる。

Makefileを開き、 "/usr/include" を全て "/opt/include" に変更する。
同様にgenconfig.shを開き、"/usr/include" を全て "/opt/include" に変更する。

また、先ほどインストールしたライブラリは /opt/lib 以下に格納されているので、Makefile内に
LDFLAGS += -L/opt/lib -Wl,-rpath,/opt/lib
を追加してやる。
これがないと、ビルドは成功するものの、実行時に
  minidlna: error while loading shared libraries: libexif.so.12: cannot open shared object file: No such file or directory
というエラーで怒られました。

※ 元記事のように /opt/ 環境にchrootすればよいような気もするが、実際にやってみると
chroot: cannot execute /bin/sh: No such file or directory
のエラーが出てchrootできなかったのでとりあえずこうしてます。
参考にしたページ: http://okwave.jp/qa/q2006656.html


5. ビルド

今回は /opt/sbin 以下にインストールしたいので、Makefileに記載されているように INSTALLPREFIX を使ってみた。

# INSTALLPREFIX=/opt make
# INSTALLPREFIX=/opt make install

無事にmake installできたら動作確認。
# which minidlna
/opt/sbin/minidlna

# ldd /opt/sbin/minidlna
        libpthread.so.0 => /lib/libpthread.so.0 (0x40026000)
        libexif.so.12 => /opt/lib/libexif.so.12 (0x40046000)
        libjpeg.so.62 => /opt/lib/libjpeg.so.62 (0x4007f000)
        libsqlite3.so.0 => /opt/lib/libsqlite3.so.0 (0x400a8000)
        libavformat.so.52 => /opt/lib/libavformat.so.52 (0x4013c000)
        libavutil.so.49 => /opt/lib/libavutil.so.49 (0x401d8000)
        libavcodec.so.51 => /opt/lib/libavcodec.so.51 (0x401ef000)
        libid3tag.so.0 => /opt/lib/libid3tag.so.0 (0x406fc000)
        libFLAC.so.8 => /opt/lib/libFLAC.so.8 (0x40713000)
        libogg.so.0 => /opt/lib/libogg.so.0 (0x40765000)
        libvorbis.so.0 => /opt/lib/libvorbis.so.0 (0x40771000)
        libc.so.6 => /lib/libc.so.6 (0x407a5000)
        /lib/ld-linux.so.3 (0x40000000)
        libm.so.6 => /lib/libm.so.6 (0x408d9000)
        libdl.so.2 => /lib/libdl.so.2 (0x40989000)
        libz.so.1 => /opt/lib/libz.so.1 (0x40995000)

# minidlna -V
Version 1.0.25
よしよし。


6. confファイルの作成

ここからが本番。
Minidlnaには設定ファイルが必要。先ほどのminidlna_1.0.25_src.tar.gzにはひな形としてminidlna.confが入っているので、これを改変していく。
ということで、minidlna.confをハードディスクのどこかにコピーする。

※ 注意!
/etc は RAMdisk なので、再起動すると 消 え ま す
/opt/etc/(自分の環境では/share/MD0_DATA/.qpkg/Optware/etc/へのシンボリックリンク)とかに置きましょう。

自分が使っているQNAP TS-419P IIの場合、/share/Multimedia/Samples/ にサンプルの写真と音楽が入っている。試しにこれらをDLNAで配信するようにしてみる。
media_dir= の行を以下のように変更。
media_dir=P,/share/Multimedia/Samples
media_dir=A,/share/Multimedia/Samples
次のポイントはdb_dir。デフォルトでは/var/cache 以下にデータベースが作られるのだが、/var もRAMdiskなので、管理するファイルが多くなってくるとRAMdiskがあふれて動作が止まってしまう。(Minidlnaが500 Internal Server Errorを返すようになります…。)
そこで、このディレクトリも適当な場所に変更する方が良い。今回はMinidlna用のディレクトリを作成し、そこに入れることにした。
db_dir=/share/MD0_DATA/.minidlna/cache
log_dir=/share/MD0_DATA/.minidlna/log
friendly_nameは好きな名前でOK。
他はそのままでよい。

ひとまずこんな感じ。
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
#network_interface=eth0

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
media_dir=P,/share/Multimedia/Samples
media_dir=A,/share/Multimedia/Samples

# set this if you want to customize the name that shows up on your clients
friendly_name=minidlna server on QNAP

# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
db_dir=/share/MD0_DATA/.minidlna/cache

# set this if you would like to specify the directory where you want MiniDLNA to store its log file
log_dir=/share/MD0_DATA/.minidlna/log

# set this to change the verbosity of the information that is logged
# each section can use a different level: off, fatal, error, warn, info, or debug
#log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn

# this should be a list of file names to check for when searching for album art
# note: names should be delimited with a forward slash ("/")
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

# set this to no to disable inotify monitoring to automatically discover new files
# note: the default is yes
inotify=yes

# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
enable_tivo=no

# set this to strictly adhere to DLNA standards.
# * This will allow server-side downscaling of very large JPEG images,
#   which may hurt JPEG serving performance on (at least) Sony DLNA products.
strict_dlna=no

# default presentation url is http address on port 80
#presentation_url=http://www.mylan/index.php

# notify interval in seconds. default is 895 seconds.
notify_interval=900

# serial and model number the daemon will report to clients
# in its XML description
serial=12345678
model_number=1

# specify the path to the MiniSSDPd socket
#minissdpdsocket=/var/run/minissdpd.sock

# use different container as root of the tree
# possible values:
#   + "." - use standard container (this is the default)
#   + "B" - "Browse Directory"
#   + "M" - "Music"
#   + "V" - "Video"
#   + "P" - "Pictures"
# if you specify "B" and client device is audio-only then "Music/Folders" will be used as root
#root_container=.


7. 動作確認

Minidlnaはデーモンとしてバックグラウンドで動くが、はじめは-d オプションをつけてフォアグラウンドで動かしてみる。
(ログが表示されるので、この方が動作確認しやすい。)

先ほどのディレクトリを作成しておき
# mkdir /share/MD0_DATA/.minidlna
# mkdir /share/MD0_DATA/.minidlna/cache
# mkdir /share/MD0_DATA/.minidlna/log
以下のコマンドでサーバを起動。confファイルがデフォルトと異なる場所にあるので、-f で指定している。
# minidlna -d -f /opt/etc/minidlna.conf
結果。
# minidlna -d -f /opt/etc/minidlna.conf
[2013/02/23 02:38:40] minidlna.c:884: warn: Starting MiniDLNA version 1.0.25 [SQLite 3.7.14.1].
[2013/02/23 02:38:40] minidlna.c:907: warn: Creating new database...
[2013/02/23 02:38:40] scanner.c:731: warn: Scanning /share/MD0_DATA/Multimedia/Samples
[2013/02/23 02:38:40] minidlna.c:972: info: Enabled interface 192.168.1.10/255.255.255.0
[2013/02/23 02:38:40] minidlna.c:990: warn: HTTP listening on port 8200
[2013/02/23 02:38:40] minissdp.c:351: debug: Sending SSDP notifies
[2013/02/23 02:38:40] scanner.c:802: warn: Scanning /share/MD0_DATA/Multimedia/Samples finished (10 files)!
[2013/02/23 02:38:40] scanner.c:731: warn: Scanning /share/MD0_DATA/Multimedia/Samples
[2013/02/23 02:38:40] albumart.c:252: debug: Found new embedded album art in Sample Music 1.mp3
[2013/02/23 02:38:40] albumart.c:252: debug: Found new embedded album art in Sample Music 2.mp3
[2013/02/23 02:38:40] albumart.c:252: debug: Found new embedded album art in Sample Music 3.mp3
[2013/02/23 02:38:40] albumart.c:252: debug: Found new embedded album art in Sample Music 4.mp3
[2013/02/23 02:38:40] albumart.c:252: debug: Found new embedded album art in Sample Music 5.mp3
[2013/02/23 02:38:40] scanner.c:802: warn: Scanning /share/MD0_DATA/Multimedia/Samples finished (15 files)!
[2013/02/23 02:38:40] playlist.c:125: warn: Parsing playlists...
[2013/02/23 02:38:40] scanner.c:848: debug: Initial file scan completed
[2013/02/23 02:38:42] inotify.c:153: debug: Add watch to /share/MD0_DATA/Multimedia/Samples
[2013/02/23 02:38:42] inotify.c:153: debug: Add watch to /share/MD0_DATA/Multimedia/Samples
[2013/02/23 02:38:42] inotify.c:160: debug: Add watch to /share/MD0_DATA/Multimedia/Samples
[2013/02/23 02:38:42] inotify.c:160: debug: Add watch to /share/MD0_DATA/Multimedia/Samples

初回起動時は上記のようにデータベースが作成される。ファイルが多いと時間がかかるので気長に待つ。

エラー等がなさそうであれば、適当なDLNA clientから接続してみる。
iPod Touch上でMedia Link Player Liteを使ってみました。

認識されてる
中身も見えてる

ちなみにサーバを止める時はCtrl-C。


8. 自動的に起動

最後に、NASの起動時にMinidlnaサーバも自動的に起動するようにする。
基本的には
http://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup
に書いてある通りなのだが、自分の環境はHDDのマウントが少し(かなり?)遅いので少し工夫を入れた。

上記のwikiの通りにconfig ramblockと呼ばれる特殊な領域をマウントし、autorun.shを作成する。
# mount -t ext2 /dev/mtdblock5 /tmp/config/
# vi /tmp/config/autorun.sh
#!/bin/sh

MOUNT_TIMEOUT_SEC=600
NUM=0

while [ ! -e /share/MD0_DATA/.qpkg/autorun ]
do
  sleep 1

  NUM=`expr $NUM + 1`
  if [ $NUM -ge $MOUNT_TIMEOUT_SEC ]
  then
    exit 1
  fi
done

/share/MD0_DATA/.qpkg/autorun/autorun.sh &

HDD(RAIDアレイ)がマウントされるのを待ってから /share/MD0_DATA/.qpkg/autorun/autorun.sh を呼び出すようにした。その際に、一応10分のタイムアウトを設けている。
メモ:もしタイムアウトがないと、何らかの理由で /share/MD0_DATA/ がマウントされない場合に、このシェルスクリプトがずっと走り続けてしまう。その結果、QNAP NASのフロントパネルが "Starting Service Please Wait..." の表示のままになる。

編集が終了したら、umount /tmp/config/ をしてconfig ramblockのアンマウントを忘れずに。

次に、呼び出されるスタートアップ用シェルスクリプトを作成する。
# mkdir /share/MD0_DATA/.qpkg/autorun/
# vi /share/MD0_DATA/.qpkg/autorun/autorun.sh
#!/bin/sh

while [ ! -e /opt/sbin ]
do
  sleep 1
done
while [ ! -e /opt/etc ]
do
  sleep 1
done

# starting Minidlna server
/opt/sbin/minidlna -f /opt/etc/minidlna.conf &
そして実行権限をつけておけば、QNAP NAS起動時に自動的にminidlnaがデーモンとして立ち上がってくれるはず。


おまけ:データベースの再生成

何らかの理由でデータベースを作り直したい場合、コマンドラインに -R オプションをつけて起動する。
動いているサーバを kill して止めたあと、
# minidlna -R -f /opt/etc/minidlna.conf
してまた気長に待てばよい。
※ たぶん、データベースやサムネイルのファイルを全て消去してから普通に起動するだけでも良いと思うが未確認。

コメントを投稿

0 コメント