arc の日記

はてなダイアリーから引っ越してきました。さらに新しい記事は https://junkato.jp/ja/blog/ で書いています。

QNAP TS-239 Pro(研究室の新サーバ)導入の記録

QNAP(キューナップ) ターボNAS 黒 TS-239Pro僕が所属している研究室では、これまでファイル共有サーバとしてWindowsマシンを常時起動していましたが、明らかにエコでないのと、マシンのHDDが破損した際のダメージが大きいため、RAIDにより複数のHDDを用いてデータを冗長化できるネットワーク接続ストレージ(NAS)を探していました。また、十年近く前からあまりメンテされていないメールサーバが動いており、こちらも代替品が必要でした。
最近はファイル共有だけでなくWebサーバやメディアサーバなどとしても使える高性能なNASが多いのですが、とくにAtomプロセッサを積んだNASというのに興味を惹かれ、研究室でQNAP(キューナップ) ターボNAS 黒 TS-239Proを購入してもらいました。HDDはついていないので、1.5TB SATA HDDを2台、RAID1で冗長化して搭載しました。
QNAP製のNASはおおむねどれもRAM上で組み込みLinuxが走っており、電源を入れたまま自由にHDDを換装したりできます。また、はじめから Webサーバ(Apache+PHP+MySQL) / iTunesサーバ / UPnPマルチメディアサーバといった機能を使えるようになっている他、QPKGという形式のプラグインを入れることでメールサーバなどとしても使えるようになります。
とりあえず、実際にサーバが届いてからしたことを記録として残しておきます。後半にかけて結構マニアックですが、少なくとも研究室でサーバ管理者を引き継ぐ後輩には役立つはず…。

2つのHDDでデータを冗長化する

Seagate 3.5インチ内蔵HDD 1.5TB 7200rpm S-ATA/300 32MB ST31500341AS同容量同型のHDDを2個入れてNASを起動し、マニュアルに従ってRAID1でデータを冗長化しました。2つのHDDに同じ内容が書かれるため、どちらか片方が壊れてもデータが損失することはありません。
HDDには相性があるようで、Compatibility Listを確認してから購入するべきです。WesternDigital社製のものだとパフォーマンスが出ない模様。研究室ではSeagate社の1.5TBのHDDを使いました。

IPを固定にする

NASをサーバとして使うため、固定IPを振りました。TS-239 Proには2個Gigabit Ethernetのポートがついていて、両方に同じIPを振ってデータ転送を高速化できます(Port Trunkingというらしい)が、研究室内の諸事情により、それぞれに別個のIPを振ることにしました。Webインタフェースの入力フォームにIPを入れるだけの簡単設定です。
なお、このとき同時に、NASDHCPサーバの機能を持たせました。以前は古いLinuxサーバがその役割を果たしていましたが、これにてお役御免となりました。

昔のファイルをコピーする

タイムリー GROOVY HDDをUSB IDE接続3.5/5.25NASが使えるようになったところで、手始めに、研究室で使っていた旧共有サーバのデータをコピーしました。500GB HDD二つに合計700GBくらいのデータがあるので、ネットワーク越しでなく、NAS前面のUSBポートにHDDを接続してデータを直接吸い出しました。HDDとUSBポートの間の接続には、IDE-USB変換ケーブルを使います。最近のPCだとIDEでなくSATAコネクタのHDDも多いでしょうね。その場合はSATA-USB変換ケーブルが使えます。
QNAPのNASには前面パネルのボタンを押すと接続している外付けディスクの全データをコピーしてくれる機能がありますが、今回はコピーするデータを選びたかったので、NASの中からcpコマンドで必要なものをコピーしました。僕は、Web用の管理インタフェースでネットワークサービス > Telnet/SSHからsshアクセスを有効にしたあとsshNASの中に入ってcpしましたが、TS-239 ProはVGAのディスプレイポートとUSBポートがあり、実機にディスプレイとキーボードを繋いで直接ログインすることもできます。

Optware IPKGをインストールする

Optware IPKG (Itsy Package Management System)は組み込みLinux向けのパッケージマネージャで、標準では入っていないgccやmakeなどをインストールできます。また、標準で入っている機能を置き換えるのにも使えます。例えば、QNAPのNASは前に書いたとおりsshログインできるようになっていますが、なぜかroot(admin)ログインしか許しません。ふつう逆(root権限を持たないユーザだけログインを許可)ですよね。そこで、ipkgを使ってopensshをインストールし、既存のsshサーバを置き換えることができます。
IPKGのインストールには、QNAPの公式サイトで配布されているQPKGというプラグインパッケージを使います。パッケージは、Web用の管理インタフェースでアプリケーション > QPKGプラグイン > QPKGの取得からダウンロードできます。

opensshをインストールしてadmin以外でsshできるようにする

前述のとおり、IPKGでopensshをインストールして既存のsshと置き換えることによって、任意のユーザのsshアクセスを許可できるようになります。
ただし、sshのバイナリがRAM上にあるため、単に置き換えるだけだとNASを再起動したときに状況が元に戻ってしまいます。
そのため、起動時に実行されるスクリプトを新しく作成して、RAM上の特定のブロックに保存する必要があります。スクリプトの中では、NASが完全に起動するまで一定時間待って既存のsshプロセスを殺したあとopensshと入れ替えるトリッキーな手段が取られています。
この手順がなかなか厄介で、QNAPのフォーラムでもまだ確実な方法が確立していません。とりあえず、フォーラム内の記事へのリンクだけ示しておきます。

[HOWTO] openSSH installation cook book - Page 1 - QNAP NAS Community Forum

メールサーバの機能をインストールする

QPKGのXDoveというパッケージをインストールします。これは、簡単に言ってしまえば、XMailというメール転送エージェントとDovecotというメール配送エージェントをまとめたパッケージです。また、PHPベースの管理用インタフェース、PHPXMailもインストールされます。XDove Configuration - QNAPediaに載っている手順に従えば、比較的簡単に、NASをメールサーバとして使えるようになります。
QNAPediaのページにも載っていますが、メール転送エージェントはスパムの踏み台にされかねないので、PHPXMailのserver config >> IP mapsでローカルホストからの接続しか許可しないなど、しっかり対策を取るべきです。
研究室のメールアドレスは全員転送にしか使っていなかったため、Dovecotを利用する必要がありませんでした。そこで、Dovecotを起動しないように設定を変更しました。
QPKGでインストールされたソフトウェアは全部 /share/MD0_DATA/.qpkg (RAID1のミラーリングをしていない場合は /share/HDA_DATA/.qpkg らしい)に保存されています。 /share/MD0_DATA/.qpkg/XDove を覗いてみると、起動時に読み込まれるらしいシェルスクリプト xdove.sh が見つかりました。124行目以降、次のようにDovecotを起動する処理を呼んでいる行が見つかったのでコメントアウトしました。また、続けてDovecotを終了、再起動する処理が書かれた行も見つかったので、そちらもコメントアウトしました。

case "$1" in
  start)
                # exporting the required libraries
                export LD_LIBRARY_PATH="${QPKG_DIR}/lib"

                # Starting XMail...
                start_xmail

                # Starting dovecot...
                # start_dovecot

                RETVAL=$?
        ;;
  stop)
                # stopping xmail...
                stop_xmail

                # stopping dovecot
                # stop_dovecot

                RETVAL=$?
        ;;

  restart)
                restart_xmail
                sleep 1
                # restart_dovecot
                RETVAL=$?
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

これだけでメールサーバが動くかと思いきや、事態はそう甘くありませんでした。QNAPのNAS用のXDoveは、標準ではSMTP用のポートに50025を使うことになっています。これは、ウェルノウンポートである25番ポートをlistenするためにはroot権限が必要なのに、XMailのデーモンがxmailという一般ユーザアカウントで起動していることに起因しています。
このままでは通常25番ポート宛てに送られてくるメールを受け付けることができません。QNAPのNASイントラネットの内部で動作することを前提に設計されており、通常はルータのポートフォワーディングの設定で、WAN側25番をLAN側のNASの50025番にフォワーディングすれば解決できる、とされています。ただし、研究室ではQNAPのNASグローバルIPを与え、直接インターネットに晒すように設置したのでこの方法は使えません。
そこで、まずはXMailをルート権限で動かすように設定を変更します。 /share/MD0_DATA/.qpkg/XDove/xmail.sh の45行目付近に以下のような記述があるので、 --chuid xmail を外します。

        "${QPKG_DIR}/bin-utils/start-stop-daemon" --chuid xmail --start --exec $XMAIL_DAEMON

さらに、XMailデーモンの起動オプションを変更し、25番ポートをlistenするようにします。 xmail.sh によれば、起動オプションは /etc/xmail/cmdline に記述されているようです。見てみると、 -Sp 50025 とか -Pp 50110 といった記述がありました。これを -Sp 25 -Pp 110 に変更しました。 -Sp はSMTP、 -Pp はPOP3用にlistenするポート番号の設定です。これ以上の詳しい説明は、XMail mail server v 1.27を読んでください。
なお、NASをインターネットに直結してグローバルIPを付与するのは、一般的に全くお勧めできません。とくに、NASの標準的な機能であるSambaによるファイル共有はchatty(おしゃべり)なプロトコルであり、これがインターネットに公開されているとクラッキングの格好の標的になります。
研究室でNASグローバルIPを付与できたのは、研究室のネットワークのゲートウェイが、インターネットとイントラネットの間のパケットを厳密にフィルタリングしているからです。また、Sambaなどの設定ファイルでもイントラネットとの接続しか許可しないようにしています。
つまり、研究室のNASは、グローバルIPを持っているものの、外部との接続は明確に制限されているのです。これはあくまで特殊ケースなので、通常はルータの内側に置いてローカルでIPを振って使うようにしましょう。

その他諸々

  • Web用の管理インタフェースでユーザやグループを作成できますが、これは組み込みLinuxのユーザやグループと直結しています。
    • 裏を返せば、Web用の管理インタフェースはroot権限を持っています。
    • 管理インタフェースを提供するHTTPサーバはApacheとは別のもので、Apacheの接続待ち受けプロセスはhttpdusrユーザで起動しています。
  • 設定ファイルは /etc/config に集められており、これは /mnt/HDA_ROOT/.config へのシンボリックリンクです。これは、設定ファイルを組み込みLinuxが動いているRAMディスクの上でなくHDD上に保持し、NASが再起動しても消えたりリセットされないようにするための工夫です。
  • ApacheMySQLは /usr/local/ にあります。これは /mnt/ext/opt/apache などへのシンボリックリンクになっています。
  • 普通のLinuxディストリビューション同様 /etc/init.d/ にデーモンの起動・終了・再起動用のスクリプトがあります。