2015年3月28日土曜日

Raspberry Pi 2 とフリスクDACでオーディオメディアサーバー

自宅サーバーをRaspberry pi 2 にしたら、メディアサーバーにしてみたくなって実際にやってみた記録です。
Raspberry Pi 2 はHDMIケーブルや3.5mmのミニジャックから音声出力が可能です。USBでDACを接続すれば音質の向上も期待できるはず。

今回は最近ちらほら話を聞くようになったMusic Player Daemon (MPD)を使います。 MPDとは、LinuxやUNIXで動作する、オーディオファイルを再生したりプレイリストを管理したりするデーモンです。 よく使われる FLAC, MP3, MP4/AAC, Ogg Vorbis, wave 辺りのサポートは万全なので安心。 DACがサポートしていればハイレゾ音源もいけるらしいですね。そんなモノ持ってないけど。

準備

音声の出力先から実際に音が出るようにしておきます。 いきなりUSB-DACを繋ぐと上手くいかなかったときに問題の切り分けが面倒なので、まずは Raspberry Pi 2 標準搭載の音声出力で試します。
NOOBSからのインストールで特に変更していなければ、デフォルトでHDMIか3.5mmのいずれかが自動で使われるようです。
設定の変更は raspi-config > 8 Advanced Options > A9 Audio から。
テレビとかにHDMIで繋いで作業しているなら何もしなくていいです。

MPDインストール

mpd と mpc をインストールします。mpcはCLIのmpdクライアント。動作の確認に便利なのでmpdと一緒にインストールします。

$ sudo apt-get install mpd mpc

mpdの設定ファイルを書き換えます。
/etc/mpd.conf

music_directory       "/mnt/data/music"
playlist_directory    "/mnt/data/playlists"
db_file               "/mnt/data/mpd/tag_cache"
log_file              "/mnt/data/mpd/mpd.log"
sticker_file          "/mnt/data/mpd/sticker.sql"
#bind_to_address      "localhost"
music_directory のフォルダーがメディアファイルの格納場所です。mpdが読めるようにパーミッションを設定します。 playlist_directory, db_file, log_file, sticker_file のファイル/フォルダーはmpdが書き込めるようにパーミッションを設定します。 bind_to_address の行はコメントアウトすればどこからでもTCP経由でコマンドを受け付けるようになります。

とりあえず動かすだけならこの設定だけで十分。mpd.confにはもっと細かい設定があるので man page は読んでおいた方がいいと思う。

mpdを起動します。

$ sudo service mpd start

mpcでmpdにコマンドを送ってみます。

$ mpc ls
music_directory 配下のフォルダーが表示されるはず。

プレイリストに音楽ファイルを登録します。

$ mpc add pops
pops フォルダー以下のすべての音楽ファイルをプレイリストに突っ込みました。

再生!

$ mpc play
簡単!
テンションあがりますね(・∀・)

これだけで、あとはLANに繋がっているマシンにクライアントソフトを入れておけばそこから音楽再生をコントロールできるようになります。 クライアントは Gnome Music Player Client がいいのかな? Windowsなら Auremo もよさげ。Android なら MPDroid とか Droid MPD Client とか。

USB-DACで音を出したい

なんでこんなことを始めたかというと、PU-2111(いわゆるフリスクDAC)が眠っていたからです。
価格の割に良い音が出ると聞いて買ってみて暫く使っていたのですが、音楽周りの環境が変わってから使わなくなってました。

まずデバイスの認識から

とりあえずPU-2111を直接繋いでみたらOSが突然の死。そして奇妙な再起動の連続でまともに起動しなくなりました。 挙動からなんとなく電圧不足のような印象。バスパワーに頼るのはやめて電源付きのUSBハブを経由して接続したら起動しました。 Raspberry Pi の電源に使っていた古いXperiaの付属品では出力不足っぽい? ケチった結果がこれだよ。

$ less /proc/asound/cards
0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                     bcm2835 ALSA
1 [DAC            ]: USB-Audio - USB AUDIO    DAC
                     BurrBrown from Texas Instruments USB AUDIO    DAC at usb-bcm2708_usb-1.4.3, ful
認識されたっぽい。
$ sudo aplay -l
card 1: DAC [USB AUDIO    DAC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
ALSAでも見えてる。いい感じ。
あ、これは sudo しないと見れません。ちょっとハマった。

デフォルトの再生デバイスにする

モジュール名を調べます

$ cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio

モジュールの優先順位を設定します(optionsの2行を追記)
/etc/modprobe.d/alsa-base.conf

options snd_usb_audio index=0
options snd_bcm2835 index=1

そして再起動してみて…

$ sudo reboot

優先順位が変わってたらOKなのかな?

$ cat /proc/asound/modules
0 snd_usb_audio
1 snd_bcm2835

再生してみます。

$ mpc play
キター!(・∀・)


Linuxのサウンドデバイス周りの知識は皆無でぐーぐる先生を頼りにやっただけなので、これでいいのかちょっと不安だったり……

おまけ: PU-2111でのノイズ

一通り組み上がって配線周りを整理したらピーって高音(4242Hz)のノイズが聞こえるようになりました。それもかなり目立つ音量で。 そういえばこのPU-2111、以前使っていた環境では小さい音ですがサーってタイプのノイズが気になってました。
試しにUSBハブのACアダプタを同じ出力の別のものに変えてみたら聞こえなくなりました。 電子回路はよく分からないけど電源からのノイズを拾いやすいのかもしれません。

2015年3月24日火曜日

自宅サーバーをRaspberry Pi 2 にした

古いタワー型PCで動いていた自宅サーバーを Raspberry Pi 2 に置き換えました。
GPIOを使ってどうこうとかそういう面白そうなことはやってません。
Raspberry Pi 2 を単なる省電力小型Linuxマシンとして使っているだけです。
このエントリは通常のタワー型PCサーバーではやることが無かった類の作業の記録です。

自宅サーバーなんてイマドキ外部のサービスに頼れば殆ど不要なのですが、データ量がTB単位になるような深い業を背負った人間のファイルサーバーはちょっと困ります。そこに一ヶ月の電気代が50円未満なんて言われる小型PCがあれば惹かれていくのは人の性というものです。

用途

NASが主な用途です。sambaです。
HDDは2台接続して、それぞれメインとバックアップにします。
RAIDではありません。個人用途では常時クローンされることよりも誤操作時の復元容易性の方を重視していいと思っています。
ついでにRSSリーダーにも使っています。Tiny Tiny RSS です。

ハードウェアの準備

Raspberry Pi 2 本体の他に幾つか準備するものがあります。

  • 電源 ― ACアダプタなどは付属していません。本体側はマイクロUSB端子なので、スマートフォン用の充電ACアダプタがお手軽にそれなりのパワーを供給できてよいです。ケチな電源を使うと外部機器を繋いだときにシステムがダウンします。
  • HDMIケーブル ― 画面がないと始まりません。
  • キーボード ― USB接続の標準的なやつでいいです。セットアップが終わったら取り外してもOK。
  • マウス ― なくてもいいけど、あればNOOBSの始めにちょっとだけストレスが減ります。
  • 本体ケース ― サーバー用途なので放置することになります。基盤剥き出しではホコリとか被ってあまりよろしくなさそうです。カメラのフラッシュでも死ぬし。
  • microSD ― OSをインストールするストレージです。4GB程度だと apt-get update が失敗したりと残念な気持ちになれます。16GBぐらいあればとりあえず安心じゃないでしょうか。
準備は計画的に。

OSインストール

Raspbianにします。
Debianをベースにした Raspberry Pi 用のOSで、DebianUbuntu をよく使っている人ならあまり悩まず使えそうです。
インストールにはNOOBSを使って手を抜きます。
ダウンロードしたファイルをmicroSDに書き込んで電源ケーブルを差し込むだけなので超楽ちん。
NOOBSでのRaspbianインストール方法については既に多くの方が記事にしているので省略。

途中でマウスじゃないと選択しづらいボタンがあった気がします。マウスを使ったのはここだけ。

インストール中に日本語が化けて幾つかの項目を選ぶのが大変でした。
インストール後も sudo raspi-config で同じ設定画面を開けるので後回しにしてもいいです。

インストールが終わったらとりあえずOSのバージョン確認。

$ uname -a
Linux raspinas 3.18.7-v7+

$ cat /etc/debian_version
7.8

HDD接続

HDDは駆動部がある精密機械で、貴重なデータが詰まっています。裸で放置するのはちょっと躊躇われます。
はじめは段ボールで適当にHDDケースを作ったのですが、それなりに発熱する機械なので恐くなってやめました。
USB接続できるHDDケースに入れ、それを設置場所にしっかり固定。地震が来ても安心。
また電源のACアダプタが増え、ACアダプタが隣のコンセントを塞ぐ問題が予想されます。そのための短い延長コードがあると安心。

HDDを接続できたら、
マウントして、
パーミッションを設定して、
fstabで再起動時も自動でマウントされるようにして、
sambaを適当に設定してWindows機からの読み書きを確認し、
cron に rsync を仕込んで定期的にバックアップを取るようにして、
NAS完成。

SDカードの寿命を延ばしたい

このままだとログやスワップに使うストレージはSDカードなので、きっと1年ぐらいサーバーとして運用したら死ぬんじゃないかと思います。
予備のSDカードを用意して壊れたら入れ替えればいいじゃないという発想もありますが、出来ることなら寿命は延ばしたいですよね。
とりあえず2つの対策を実施します。

  • swapを無効に ― メモリが1GBもあるので無茶しなければswapなしでも暮らしていけます。
  • logをHDDに ― HDDは常時接続の前提なので。/var/log にHDDをマウントするだけです。一部書かれないログがありそうだけどまぁいいでしょ。
私はやってないですがRAMディスクを使うのもありだと思います。

swapを無効にする

まずは現状確認。

$ free -h
             total       used       free     shared    buffers     cached
Mem:          927M       916M        10M         0B        67M       758M
-/+ buffers/cache:        90M       837M
Swap:          99M         0B        99M
使われていないけど100MBぐらい予約されてる。
無効にしよう。
$ sudo swapoff --all
$ free -h
             total       used       free     shared    buffers     cached
Mem:          927M       914M        12M         0B        68M       755M
-/+ buffers/cache:        90M       836M
Swap:           0B         0B         0B
swapはいなくなったけど再起動したらきっと復活してくるので...
$ sudo apt-get remove dphys-swapfile
$ sudo reboot
再起動後
$ free -h
             total       used       free     shared    buffers     cached
Mem:          927M       652M       274M         0B        18M       574M
-/+ buffers/cache:        59M       867M
Swap:           0B         0B         0B
OK. swapいなくなってる。

他にも

/tmp をRAMディスクに逃がす とか
LAMPやLAPP環境を組むならデータベースファイルをHDDに置く とか
そんな風に書き込み頻度の高い部分を待避させていくのがよさそうです。
でもパフォーマンスは犠牲になります。
ご利用は計画的に。