Raspberry Pi 2 Model B に Arch Linux ARM を入れて雑なメディアサーバにした記録

概要

Raspberry Pi 2 Model B (以下 RPi)に Arch Linux ARM (以下 ALARM)を入れて雑なメディアサーバにした記録です。ほぼ自分用の備忘録です。この記事だけ読んで完璧に ALARM on RPi 環境を構築できるというわけではないです。

というか既存の記事と Arch Wiki が優秀すぎるので新たに書くべきことはあまりないという。RPi / ALARM 特有の事情もそこまで多くないので、Arch Linux 使いがいつも通りやればそれなりに簡単に構築できるはず。とりあえず詰まりかけた所を中心に書いていく。

経緯については、半年ほど ALARM on RPi を使ってきたけどなんか立ち上がらなくなったので、どうせなら 1 から再構成しようとなった、という感じです。その気になれば再構成せずに復活させることも可能だっただろうけど、旧環境にも色々不満があったのでクリーンインストールの方がいいと判断。そのステップをせっかくなのでまとめた、という感じの記事です。

現状

実際の写真を以下に示す。

Raspberry Pi と周辺機器の写真

画質悪い、燃えそう、などといった感想がまず浮かんでくる。

USB ハブ・光学ディスクドライブ・Bluetooth ドングル・ありあわせの外付け HDD 3 台・各種電源を上記のように(わからん)接続している。ちなみにストレージについては btrfs の RAID 機能を利用している。また、実際には大きな HDD(写真右)の位置を物理的に離したりしている(保険)。といっても数十 cm 程度だけど。

以下は SSH 接続して archey3 したスクリーンショット。

archey3 のスクリーンショット

ちなみにマシン名は ubume, moryo, kyokotsu, ... の順に命名している(どうでもいい)1

全体の流れ

  1. microSD のマウントと ALARM ファイルの展開
    • x86_64 上の Arch Linux を使って ALARM を microSD に入れる
  2. 初期設定
    • qemu + arch-chroot を用いて初期設定を行う
  3. RPi の起動
    • microSD を RPi に挿し起動させる
  4. 各種設定・インストール
    • SSH 越しに各種設定を行う
    • Samba, MPD, PulseAudio, BlueZ, abcde 等をインストールする

1. microSD のマウントと ALARM ファイルの展開

ここは既存の記事に書かれていることをそのまま実行すればよい(手抜き解説)。

変更点:btrfs のマウントオプション

経験上 microSD への書き込みの遅さがどうしてもネックになることがわかっているので、ルートのファイルシステムについては速度を重視したマウントオプションにする。効果のほどは不明。

# client
mount -o noatime,discard,ssd,compress=lzo,space_cache /dev/sdX3 /mnt/sdcard  

2. 初期設定

microSD 上の ALARM のルートディレクトリに arch-chroot する。先述の記事に従い qemu 関連のファイルをインストールしていれば armv7l 用のバイナリを x86_64 上でも動かすことができる。それ以外は普通の Arch Linux のインストールと同様にやればよい(手抜き解説)。

必要なソフトウェアのインストール

# rpi (chroot)
pacman -S base-devel --needed  
pacman -S btrfs-progs  
pacman -S emacs-nox vim tmux zsh wget git rsync  

初期状態だと base-devel が入っておらず sudo ができないなどの悲しみが発生するのでちゃんと入れておく。ファイルシステムを btrfs にした場合は btrfs-progs を入れる。あとは必要そうなソフトウェアを適当に入れておく。

ユーザの追加

# rpi (chroot)
useradd -m $USER  
passwd $USER  
visudo  # %wheel ALL=(ALL) ALL 行のコメントアウトを外す  
gpasswd -a $USER wheel  
chsh $USER  

ユーザを追加して wheel グループのユーザに sudo 権限を与えるいつもの流れ($USER は適宜読み替えること)。自分の場合ここでついでにログインシェルを zsh にしている。

ロケール・タイムゾーン

# rpi (chroot)
$EDITOR /etc/locale.gen
locale-gen  

en_US.UTF-8ja_JP.UTF-8 を有効にして locale-gen するいつもの流れ。

# rpi (chroot)
rm /etc/localtime  
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime  

いつもの流れでタイムゾーンを設定する。既に /etc/localtime が存在している(UTC へのリンクになっている)ので予め消しておく。また、RPi の場合 hwclock --systohc --utc は不要(というか不可能)。

ホストネーム

# rpi (chroot)
echo $HOSTNAME > /etc/hostname  

いつもの流れでホストネームを設定する($HOSTNAME は適宜読み替えること)。ここで設定した hostname を使って Avahi で接続することになるので割と重要なステップ。

Avahi を有効にする

Avahi は Zeroconf の実装である2。これを有効にすると hostname.local のような名前で RPi にアクセスできるようになる。

# rpi (chroot)
pacman -S avahi  
systemctl enable avahi-daemon  

クライアント側の Arch Linux でも /etc/nsswitch.conf の設定が必要となる。詳細は Arch Wiki を参照のこと。

Windows からアクセスしたい場合は以下の記事を参照のこと。従来通り Apple 製の Bonjour for Windows を使ってもよい。

arch-chroot から抜ける

ここで arch-chroot から抜け、microSD カードを取り出す。

3. RPi の起動

RPi に microSD を挿して電源を入れる。無事起動するよう祈りましょう。 私の場合自宅にモニタが無いのでかなりマジの祈りだった。

Avahi を設定していれば *.local ドメイン名でアクセスできるようになっているはず($RPi_HOSTNAME は適宜読み替えのこと)。

# client
ssh $RPi_HOSTNAME.local  

Avahi を設定しなかった場合、ipv6 を有効にしていればマルチキャストアドレスを利用することで RPi の IP アドレスを知ることができる($NICifconfig とかで調べて適宜読み替えること。ensX とか wlpXsY みたいなやつが入る)。

# client
ping ff02::1%$NIC  

4. 各種設定・インストール

以降、RPi に SSH 接続して設定を行う。

Samba

Samba を有効にして RPi を Windows, macOS, Linux から接続できるファイルサーバにする。

# rpi
pacman -S samba  
$EDITOR /etc/samba/smb.conf

smb.conf を編集して設定を行う。この際、workgroup には hostname として設定したものを指定する。

実際に共有するディレクトリの設定をする。私は外付け HDD を /data にマウントし、そのディレクトリを Samba で共有している。 path, valid users については適宜読み替えること。

[data]
    comment = Data
    path = /data
    valid users = USER
    public = no
    writable = yes
    printable = no

その後 smbpasswd コマンドで Samba 用のユーザとパスワードを設定し、smbd, nmbd サービスを起動する。

# rpi
smbpasswd -a $USER  
systemctl start smbd nmbd  

この時点で Windows で \\hostname.local\data のようにパスを指定すればディレクトリにアクセスできるようになっているはず。

macOS をクライアントとする場合 .DS_Store をバラ撒かないようにするなどの設定をした方がよい(経験談)。

# client (macOS)
defaults write com.apple.desktopservices DSDontWriteNetworkStores true  

MPD

MPD をインストールして RPi をメディアサーバ化する。

# rpi
pacman -S mpd  
$EDITOR ~/.config/mpd/mpd.conf

mpd.confmusic_directory などの設定を行う。

PulseAudio(後述)を使うには以下のように設定する。

audio_output {  
    type     "pulse"
    name     "Pulse Output"
}

以下のように設定すれば FLAC 形式 の音声を垂れ流す HTTP サーバを立てられる3

audio_output {  
    type     "httpd"
    name     "HTTP Stream"
    encoder  "flac"
    port     "8000"
    format   "44100:16:2"
}

WAVE (PCM) 形式は Firefox だと再生できなかったりする(Chrome はできる)ので FLAC の方がよさそう?

MPD はシステムワイドでなくユーザ単位で動かすことが推奨されており、ユーザ用の systemd サービスが用意されている。

# rpi
systemctl --user start mpd  

クライアントは ncmpcpp がよさそう。

# rpi / client
pacman -S ncmpcpp  

Bluetooth ヘッドセット/スピーカー

Wiki の設定を参考に PulseAudio と BlueZ の設定をやっていけば Bluetooth ヘッドセット/スピーカーに音声を飛ばすことができる。

# rpi
pacman -S pulseaudio pulseaudio-alsa pulseaudio-bluetooth \  
          bluez bluez-libs bluez-utils bluez-firmware

……できるが、PulseAudio も BlueZ も機嫌が悪いとちゃんと動いてくれないタイプのソフトウェアなのでキツい。基本的に運ゲー。あと PulseAudio も BlueZ も GUI から操作したいタイプのソフトウェアだけど、そのためだけにデスクトップ環境と VNC を導入するのもなあ、という感じ。個人的には前述の Samba サーバと HTTP サーバだけでやっていけてしまっているので一旦保留。

現状、Samba 上のファイルをクライアント側のプレイヤーで再生するのがなんだかんだ一番手っ取り早くて、MPD をインストールした意義とは……という感じになっている。

abcde で CD をリッピングする

abcde と cdparanoia を用いて RPi で CD をリッピングできるようにする。

# rpi
pacman -S abcde cdparanoia fdkaac  

私の abcde.conf は以下の通り(GitHub Gist, 拡張子 .sh を付けているのはシンタックスハイライトのため)。 AAC (192 kbps) と FLAC(可逆圧縮形式)を並行して生成する。下記の設定だと FLAC ファイルは AAC ファイルの約 5 倍ほどのサイズになる。

使用ディスク容量

上記のソフトウェアと HTTP サーバ (H2O) を入れた状態で使用ディスク容量は 1.8 G(btrfs filesystem usage / の結果。多分 LZO 圧縮後のサイズ)。

消費電力

RPi 本体の待機中の消費電力は 2 W ほど。外付け HDD 3 台と周辺機器を含めると 14 W ほどになる。リッピング + エンコードでフル稼動させると 22 W ほど。

問題

  • PulseAudio / BlueZ の安定しなさ
    • 諦めたい
  • abcde のコンピレーションアルバム (Various Artists) の扱いがつらい
    • もれなく Various というディレクトリ名になってしまう
      • abcde.conf でそうしてるからなんだけど……
    • どうしたんだ abcde、なんのためのアルバムアーティスト情報だ
      • ${ARTISTFILE} みたいな変数でアルバムアーティスト名を扱いたい
    • VA をうまく扱えるようにした fork があるっぽいが……
      • abcde の実態は bash スクリプトなので書き換えようと思えば書き換えられる
    • 現状適当なスクリプトでディレクトリ名を置換している
  • abcde の ACTION に cue を指定すれば cue シートを出力できるらしい
    • 試してない
  • USB 2.0 なので外付け HDD の読み書きの速度が遅い
    • ここは諦める

その他

  • AUR の PKGBUILD については無理矢理 arch=("any") にしてしまえば普通に使えたりする
  • ALARM の aur リポジトリには packer が入っており pacman -S packer で入れることができる
    • まあ個人的には pacaur を使っているんですけど
  • データは極力 microSD カード上ではなく外付け HDD 上に置くようにした方がよさそう
    • シンボリックリンクと mount を駆使する

まとめ

RPi と余った HDD を有効活用してそれなりに便利なサーバを建てることができた。まあ結局 HDD は買い足したので普通に出費はあったんですけど……。まだ色々と改善の余地はありそうなので引き続きやっていく。

ALARM on RPi は割と普通の Arch Linux っぽく使えるので興味を持った Arch 使いの方は是非。

  1. ちなみに ubume には Ubuntu Server が入っている(どうでもいい)。

  2. 他の実装として Apple の Bonjour がある。

  3. MPD「お前はストリーミングサーバを建てるのに icecast が必要だと思っているようだが…… 別に無くても建てられる」