投稿時刻: 2017-02-27 20:40:00
タグ: Arch LinuxRaspberry Pi
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 から再構成しようとなった、という感じです。その気になれば再構成せずに復活させることも可能だっただろうけど、旧環境にも色々不満があったのでクリーンインストールの方がいいと判断。そのステップをせっかくなのでまとめた、という感じの記事です。
現状
実際の写真を以下に示す。
画質悪い、燃えそう、などといった感想がまず浮かんでくる。
USB ハブ・光学ディスクドライブ・Bluetooth ドングル・ありあわせの外付け HDD 3 台・各種電源を上記のように(わからん)接続している。ちなみにストレージについては btrfs の RAID 機能を利用している。また、実際には大きな HDD(写真右)の位置を物理的に離したりしている(保険)。といっても数十 cm 程度だけど。
以下は SSH 接続して archey3
したスクリーンショット。
ちなみにマシン名は ubume, moryo, kyokotsu, ... の順に命名している(どうでもいい)1。
全体の流れ
-
microSD のマウントと ALARM ファイルの展開
- x86_64 上の Arch Linux を使って ALARM を microSD に入れる
-
初期設定
- qemu + arch-chroot を用いて初期設定を行う
-
RPi の起動
- microSD を RPi に挿し起動させる
-
各種設定・インストール
- SSH 越しに各種設定を行う
- Samba, MPD, PulseAudio, BlueZ, abcde 等をインストールする
1. microSD のマウントと ALARM ファイルの展開
ここは既存の記事に書かれていることをそのまま実行すればよい(手抜き解説)。
-
Raspberry Pi 2 | Arch Linux ARM
- ALARM 公式ページ。Installation の記述を参考にする
-
- Arch Wiki(日本語)の RPi のページ
-
Raspberry Pi 2 に BTRFS な Arch Linux ARM を入れた - Qiita
- 以下、この記事の記述を前提とする
- qemu を使って x86_64 で armv7l バイナリを動かし arch-chroot する方法もまとまっている
変更点: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-8
と ja_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 アドレスを知ることができる($NIC
は ifconfig
とかで調べて適宜読み替えること。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.conf
で music_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
は以下の通り(拡張子 .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 使いの方は是非。