CentOS8でRoon Serverを構築する方法
えー、今回はちょっとオーディオマニア的な趣味に走って、CentOS8でRoon Serverを作った時の手順について書きます。
Roon Serverというのは、統合音楽ソフトウェアである「Roon」の中核を成す音楽サーバのことです。正確にはもっといろいろやっていることがあるんですが、Roonについてここで詳しく書くのは本筋ではないので、こちらの記事をご参照ください。
まあ、この記事にたどり着いた方ならRoonやCentOSについてはいちいち説明する必要は無いと思いますので、細かい説明はいろいろはしょります。ご了承ください。
なぜCentOSなのか?
最初にRoon Serverを作った時は、お試し的なノリで手軽に作ろうと思って、Ubuntuで構築したのです。が、できたものを実際に運用してみると、これが少々というか、かなり動作不安定でして。途中で再生が切れたり、サーバが無応答になったり等々、細かいトラブルが不意に起こることが多く、使っていてストレスが溜まるようになっていったのです。
- やっぱり元々デスクトップ向けのUbuntuでは24時間動かすサーバとしては頼りない
- そもそもUbuntuには余計なものがたくさん入っている(サーバとしてならX11すら必要ない)
- GUIを使って設定することが前提になっているのは面倒くさい(コマンドレベルで運用したい)
といった事項を勘案した結果、やはりサーバ用OSとして安定感のあるCentOSを使って構築した方がいいんじゃないかと。で、どうせなら現在のカレントであるCentOS8で立ててみようじゃないか、というサーバ屋としての好奇心が出てきまして、これまで動いてきたUbuntu版を潰して、CentOS8をインストールすることにしたのでした。
使用するマシン(参考として)
サーバとして使うマシンは、ASUSのPN50という小型PCにメモリ16GB、128GのSSDを入れたものを使います。このPCは24時間稼働することも考慮された耐久性があり、しかも軽い動作をさせる分にはほとんど動作音がしないという、自宅サーバ用としてはなかなか優秀なマシンです。
OSのインストール
PN50には当然のように光学ドライブがありませんので、インストール用のUSBメモリを作成します。今回はこの辺から今現在で最新のCentOS8.2のminimal.isoイメージをダウンロードしてきて、Rufusを使って起動可能なUSBメモリを作成しました。
インストールについての細かい手順は割愛します。「CentOS8 インストール」で検索すれば山ほど情報が手に入りますので、そちらをご参照ください。
今回は、パーティション構成のみに手を入れました。自動構成のパーティション構成だと/homeのパーティションに半分がた持って行かれてしまうので、ちともったいなさげです。とはいえ、Roonがどの辺のディレクトリを消費するかよくわからなかったので、手動構成にしてrootパーティション1本にしてしまいました(手抜き)。
OSインストール後の基本設定
まず、何はなくともSELinuxをdisabledにして再起動します。所詮自宅サーバですから、セキュリティよりも運用性の良さ優先ということで。disabledする方法は割愛します。「CentOS SELinux 無効化」で検索してください。
ネットワークの構成
これは特にどうということもなく、外部に接続できるようにできればそれで構いません。
今回の場合、インストールした直後に(ネットワークデバイス名と同じ)「enp2s0f0」というネットワーク接続ができていたので、以下のように設定しました。
$ sudo nmcli con mod enp2s0f0 ipv4.method manual ipv4.adresses [サーバのIPアドレス/サブネット]
$ sudo nmcli con mod enp2s0f0 ipv4.dns [参照するDNSサーバのIPアドレス] ipv4.gateway [ゲートウェイアドレス]
で、ここでひとつ確認することがあるので以下を実行します。
$ nmcli con show enp2s0f0 | grep "connection.autoconnect:"
これの結果が「yes」とか「はい」でない場合は、以下を実行します。
$ sudo nmcli con mod enp2s0f0 connection.autoconnect "yes"
connection.autoconnectがyesになっていないと、再起動した際にネットワーク接続の設定が全部飛んでしまうのです。私はこれに2度ほど引っかかったので、念のために付記しておきます。
これで、外部のサーバ(たとえばgoogle.co.jp)とかにpingが通れば、今の時点ではOKです。
必要なパッケージのインストール
Roon Serverを動作させるために必要なのは、以下の3つ4つです。
- FFmpeg
- ALSA library
- cifs-utils
- libicu
それぞれ、インストールする手順は以下のとおりです。
FFmpeg
$ sudo dnf install epel-release
$ sudo dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
$ sudo dnf --enablerepo=PowerTools install SDL2
$ sudo dnf install ffmpeg
コマンドとしてはわずが4つなのですが、方法を探るのにかなり時間を要しました。
FFmpegに必要なライブラリであるSDL2がPowerToolsに入っていたというところに一番シビレましたね。
ALSA library
FFmpegをインストールする際に依存関係で同時にインストールされるので、操作は不要です。
cifs-utils
普通にdnfでインストールします。
$ sudo dnf install cifs-utils
libicu
(2021/12/31追記)
Roon 1.8になってから、libicuも必須となりました。
これも普通にdnfでインストールします。
$ sudo dnf install libicu
以上で、必要なパッケージはすべてインストールされました。
Roon Serverのインストール
これは、Roon公式サイトに書いてあった方法をそのまま行ないます。
$ cd ~
$ curl -O http://download.roonlabs.com/builds/roonserver-installer-linuxx64.sh
$ chmod +x ./roonserver-installer-linuxx64.sh
$ sudo ./roonserver-installer-linuxx64.sh
何も異常がなければ、この時点でRoon Serverが起動するはずです。
ちなみに、Roon Serverは「roonserver.service」としてsystemdの配下でコントロールされます。
ファイアウォールの設定
さて、ここが肝心なところです。CentOS8ではデフォルトでfirewalldが起動していて、ssh他の最小限の通信しか許可されていません。
このままだとRoon Serverが正常に外部と通信できないので、以下のルールでファイアウォールに穴を開けます。
(11/29追記:以下の設定内容は不完全なものです。より細かいところまで詰めた設定を行なった記事をご覧下さい。
- 9003/UDPを許可
- 9100-9200/TCPを許可
- 9330-9332/tcpを許可 (←2021/12/31追記、Roon 1.8 build 880で必要になった)
- IGMPプロトコルを許可
- マルチキャストを受け取るために、以下を許可
- 224.0.0.0/4からの入力
- 240.0.0.0/5からの入力
224.0.0.0/4向けの通信の受信
firewalldのコマンドにすると、以下のとおりです。
(11/28 追記
$ sudo firewall-cmd --permanent --add-port=9003/udp
$ sudo firewall-cmd --permanent --add-port=9100-9200/tcp
$ sudo firewall-cmd --permanent --add-port=9330-9332/tcp
$ sudo firewall-cmd --permanent --add-protocol=igmp
$ sudo firewall-cmd --permanent --add-source=224.0.0.0/4
$ sudo firewall-cmd --permanent --add-source=240.0.0.0/5
$ sudo firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" destination address="224.0.0.0/4" accept'
$ sudo firewall-cmd --reload
いやあ、このルールを見つけるまで苦労しました。特にマルチキャストのところは、これをやっておかないとネットワーク上のRoon Output(簡単に言えば音を出すスピーカー等のオーディオデバイス)が認識されないのです。
我が家ではRoonでサポートされているSONOS One SLを設置していたのですが、CentOSにしたらこれがオーディオデバイスとして認識されなくなってしまい、firewalldを止めると認識される、ということが起きたので、まあ必死になってルールを調べたんですよ(Ubuntuではデフォルトでファイアウォールが起動していないので気がつかなかった)。で、ようやく上のようなものを見つけ出したという次第です。
以上で、Roon Serverの構築は終わりです。整理してしまえばたいした工数ではないのですが、いろいろ調べるのに時間がかかりました……。
結果として
まだ日が浅いのであくまで感覚としてなのですが、CentOS8でRoon Serverを稼働させてから、再生に関するトラブルはほぼなくなった感じです。やっぱり、サーバOSとしての安定度の違いでしょうか。これから使い込んでみてどうなるかですが、RHEL系OSのサーバ屋としては、もうこれでいいんじゃないかと満足しております。
最後に
数ヶ月前に導入したばかりで言うのも何ですが、Roonは音がいいですね。音楽ファイルをオーディオデバイスで直接デコードするよりも、一段上質な音になります。NASに貯めた音楽データをPCで再生したり、そのNASをDLNAサーバとして使ってらっしゃる方には、ぜひ導入をお勧めしたいです。まあ、この記事にたどり着くような方にとっては、釈迦に説法かもしれませんが……。
以上、どなたかのお役に立てば幸いです。