手のひらサイズのミニPCで作るオーディオサーバーの最終回です。
やっとオーディオネタに戻ってきました。今年はこんなことばっかやってますね・・・
(2024/1追記)
Broadcomによるvmware社の買収が完了し、ここで紹介したvSphere Hypervisor(ESXi)にも影響が取りざたされています。はっきりしたところで記載したいと思います。
(2024/2追記)
無償版vSphere Hypervisor(ESXi)の提供終了が公式に発表 されました。残念です。
(2024/7追記)
ESXiの代わりにProxmox VEで作り直しました。
仮想化オーディオサーバーをProxmox VEで再構築した
(2025/4追記)
無償版ESXi8の提供が再開されました。
前回までで仮想化基盤とファイルサーバーを準備しました。いよいよオーディオサーバーに仕上げます。
DLNA(UPnP/OpenHome)もRoonも使える、多機能ファンレスサーバーを目指します。SMBプロトコル(NFSも追加可能)のファイルサーバーと併せ、ネットワークオーディオと名の付くプレーヤーにはたいてい対応できると思います。
前回からまた少し変わって、最終的にはこんな構成になりそうです。
メインのファイルサーバー、TrueNASの仮想マシンVM1は旧サーバーからデータを引っ越し、既に稼働状態に入っています。
WindowsServerからのデータ移動には
FreeFileSync を使いました。
VM1にある楽曲ファイルを使ってオーディオ配信を行うのがVM2とVM3です。メインのサーバーを動作させたままで安全に機能追加できるのは仮想化のメリットですね。
CPUの性能の範囲で、とはなりますが、軽量OSを選べば今回のような省電力PCでも2つ3つは動かせます。
作成した仮想マシンは、こんな風に仮想ネットワークでつながります。
物理的なLANポートは1つしか接続していないのに、それぞれのマシンが独立したアドレスを持ち、ネットワーク上に台数分のPCが出現したように見えます。マネジメントネットワークとはESXi自身の管理画面のことです。
MinimServer2のインストール
当ブログではお馴染み、DLNA/UPnPサーバーの
MinimServer2 をインストールします。
どのマシンで動作させるか。MinimServer2はWindows・Macの他Linuxでも動作しますが、TrueNASのベースOSであるFreeBSDには未対応です。
調べてみたところ、MinimServer公式の掲示板に
FreeBSDで動作させたという投稿 がありました。ただし一部のライブラリはLinuxとFreeBSDで互換性がなく再コンパイルが必要になるそうです。MinimServerがバージョンアップするたびライブラリを入れ替えるのはちょっと面倒、もう一つのRoonは未知数ですがリソース喰いではありそう、というわけで今回はバックアップサーバーのOpenMediaVaultに載せることにしました。
OMVのベースOSはDebianでRaspberry Pi OSと同じ、rootのシングルユーザー運用である点はルーター用OSのOpenWrtと同じです。今年とった杵柄、キネヅカでサクッと行くよ。
ffmpegのインストール
MinimStreamerによるトランスコード(変換)配信を行う場合に必要なコーデック群です。SSHからコマンド一発で入ります。
root@openmediavault5:~# apt update
root@openmediavault5:~# apt install ffmpeg
以上。
Java実行環境のインストール
Javaはリリースされたばかりの最新LTS(長期サポート)版、Oracle JDK17(Java Platform, Standard Edition (Java SE) Development Kit)を使いました。
WindowsPCでOracleの
公式サイト にアクセスし、Linux用の「x64 Compressed Archive」をダウンロードします。
(2021/10/4追記)
長時間(24hとか)稼働するとNASにアクセスできなくなることがあり、旧バージョンに変更しました。とりあえずJDK8では問題なさそうです。
せっかくのNASなので、Windowsからは共有フォルダ経由でOpenMediaVaultに転送します。shareという名前でフォルダを作成しています。
共有フォルダはOpenMediaVault側では/srv下のdevで始まる名前のディレクトリにあり、任意の場所(ここでは/usr/share)に展開します。
root@openmediavault5:~# cp /srv/dev-disk-by-uuid-xxxx-xxxx/share/jdk-17_linux-x64_bin.tar.gz /usr/share
root@openmediavault5:~# cd /usr/share
root@openmediavault5:/usr/share# tar xzvf jdk-17_linux-x64_bin.tar.gz
chownコマンドでファイルのオーナー設定を修正。パスの通ったディレクトリにリンクを張って起動確認します。
root@openmediavault5:/usr/share# chown -hR root:root jdk-17
root@openmediavault5:/usr/share# ln -s /usr/share/jdk-17/bin/java /usr/sbin
root@openmediavault5:/usr/share# java -version
java version "17" 2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)
リモートマウントプラグインのインストール
MinimServerの楽曲ファイルは、メインサーバーTrueNASの共有フォルダを使用します。(ローカルのバックアップHDDには手を付けたくないので)
OpenMediaVaultのプラグインを使って他のNASにアクセスできるようにします。管理画面の「プラグイン」からインストールします・・・が、デフォルトでは純正プラグインしか表示されないので、最初に以下のコマンドでサードパーティー製のプラグインを使用可能にします。詳しくは
こちら 。
root@openmediavault5:~# wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash
表示された「openmediavault-remotemount」をインストールします。
TrueNAS側でユーザーを作成し、OpenMediaVault側からそのユーザー名でアクセスします。設定方法は
こちら 。
「ファイルシステム」画面にTrueNASの共有フォルダが表示されています。
MinimServer2のインストール
MinimServer2は64bitのLinux Intel版を使います。
やり方はJavaと同様で、インストールパッケージをWindowsPCで
ダウンロード してOpenMediaVaultに転送、任意の場所(ここでは/usr/share)に展開します。
root@openmediavault5:~# cp /srv/dev-disk-by-uuid-xxxx-xxxx/share/MinimServer-2.0.18-linux-intel.tar.gz /usr/share
root@openmediavault5:~# cd /usr/share
root@openmediavault5:/usr/share# tar xvf MinimServer-2.0.18-linux-intel.tar.gz
MinimServerのセットアッププログラムを実行。rootのシングルユーザーとして設定します。
root@openmediavault5:/usr/share# minimserver/bin/setup root
MinimServer desktop integration is disabled
MinimServer automatic startup is disabled
Do you want to change these settings (y/n)?
y
Enable desktop integration for MinimServer (y/n)?
n
Enable automatic startup for MinimServer (y/n)?
y
MinimServer automatic startup has been enabled
MinimServerの初期設定を行うため、コマンドライン版のstartcで起動します。
root@openmediavault5:/usr/share# minimserver/bin/startc
初回だけライブラリの場所を聞かれるので、上でマウントしたTrueNASの楽曲フォルダ名を入力します。
ライブラリのスキャンが始まり、しばらく経って「MinimServer is running」と表示されれば起動完了。
MinimWatch(とJava)をインストールしたPCに同じ内容が通知され、アイコンが緑色になります。ならない場合はPCのファイアウォールがJavaをブロックしていないかチェック。パブリックネットワークあるある。
startcによる起動ではコンソールを閉じるとMinimServerも止まってしまうので、いったん終了します。
>exit
リブートしてPCのタスクトレイにあるMinimWatchのアイコンが再度緑色になれば成功です。
root@openmediavault5:/usr/share# reboot
MinimStreamerのインストール
必要によりMinimStreamer(有償)をインストールします。設定方法は以前のブログをご覧ください。
ネットワークオーディオ自作(8) ラズパイサーバーを改良する
以上でMinimServer2はセットアップ完了です。lightMPDなど、DLNA/UPnP対応のレンダラーで再生します。
Roon Coreのインストール
Roonについて
最新バージョンの1.8。相変わらずの美しい画面です。
Roonについて語りだすとブログ1本になってしまうので、ちょっと古いですが以前の投稿をご覧ください。
Roonとラズパイで遊ぶ
逆木さん (PC関係が不得手な評論家センセーの多い中、この方のコンピューターオーディオ論は納得感があります)呼称するところの「総合音楽鑑賞ソフト」Roon。提供される圧倒的な情報量と、それにより演出される「曲との出会い」が楽しく、音楽好きの方には特に体験をおススメします。統合運用できるTIDALに(2021/10/4追記:Qobuzにも!)国内導入の噂もあり、実現すればさらに強力な音楽コンシェルジュになってくれることでしょう。
とはいえ、有料(年間サブスクリプションまたは永年ライセンス制)かつ楽曲情報が英語のみ(操作系やタグの日本語表示は可能)という2点から、日本ではまだヒットしそうにないのが残念なところです。
Roonのサーバー機能は「コア」と呼ばれています。今まで使ってきたのはWindows版、今回はLinux版のコアをセットアップしました。最初はNUC用に最適化されたROCK(Roon Optimized Core Kit)を使うつもりでしたが、仮想マシンに入れるにはトリッキーな作業が必要なようで通常のLinux版にしました。
仮想マシンVM3の設定とUbuntu Serverのインストール
Roonのハードウェア要件は
こちら 。
Roonでは、再生デバイスに合わせたサンプルレート変換などをコアで行うため、サーバー側のハードウェア要求スペックが高くなっています。Linux版はOSが軽量な分、他のプラットフォームに比べハードルが少し下がります。
推奨ディストリビューションはUbuntuかArch。今回はUbuntuをデスクトップレスのサーバー構成で導入します。サーバーと聞くと重そうですが、GUIが無いので最小構成ではデスクトップ版よりかえって軽量にできます。
仮想マシンのリソースはこのくらい。CPUの性能からDSPなどRoonのフル機能は無理でも、通常の再生には支障ない程度を狙います。
プロビジョニングポリシーをThic(Eager Zeroed)にして128GBを確保しようとしたら、60%前後初期化したところでESXiが他の仮想マシンもろともコケました。
安全ちゃうやんか!
この設定はディスクの初期化時に高負荷がかかり、再現性があることからNVMeあたりのハードウェアに問題がありそうです。安全な環境は堅牢なハードウェアあってこそ、ということですか。
デフォルト設定のThic(Lazy Zeroed)なら大丈夫でしたので続行します。
(2021/10/1追記)
M.2 SSDをキングストンの低消費電力タイプに変更。高負荷でも安定したかな?
Ubuntu Server(20.04 LTS)のインストールISOイメージを
公式サイト からダウンロード、ESXiのデータストアにアップロードし、仮想マシンのCD/DVDドライブにセットしてインストールします。
画面表示に従って設定を進めてゆきます。といってもユーザー名等を設定するこの画面以外特に変更するところはありませんでした。
インストールが完了したら再起動。CDROMを取り出してと言われたらESXiの管理画面でISOイメージの接続を外します。
起動したらログインし、タイムゾーンの設定とシステム更新を行っておきます。
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo apt update
$ sudo apt upgrade
Roon Coreのインストール
インストールガイドは
こちら 。引き続き、以下のコマンドでインストールします。
$ sudo apt install ffmpeg
$ sudo apt install cifs-utils
$ curl -O http://download.roonlabs.com/builds/roonserver-installer-linuxx64.sh
$ chmod +x roonserver-installer-linuxx64.sh
$ sudo ./roonserver-installer-linuxx64.sh
これだけ。
(2021/10/23追記)
11月のアップデートの前にライブラリ「libicu」をインストールしておいてね!とのメールが届きました。
$ sudo apt update
$ sudo apt install libicu66
これはUbuntu20の場合。libicuはUnicodeのライブラリで、Linux版のフレームワークをMonoから.NETに移行してパフォーマンスを改善するため、だそうです。
以降サーバーに触る必要はなく、このコンソールもexitして閉じてしまってOKです。設定はネットワーク上のPCやスマホ・タブレットから行えます。
Roon Coreの設定
コマンドにCIFSの文字が出てきたことからわかるように、Roonのファイル共有はWindows互換です。TrueNASにユーザーを作成し、SMBプロトコルで楽曲フォルダにアクセス可能としておきます。
PCで
Windows版Roon を起動するとコアを見つけてくれます。Roon Remoteアプリをインストールしたスマホなどでも可能です。
Roonのライセンスはコア単位なので、1ライセンスで運用できるコアは1台のみ。旧サーバーとはここでお別れ(削除はされず無効状態)となります。
ログイン後、楽曲フォルダを登録します。ホスト名が通らずIPアドレスで指定しました。
TrueNASの音楽フォルダが見えました。「Select this folder」すると楽曲のスキャンが始まります。仮想ネットワークでつながっているので高速です。
数分で普通に使えるようになり、引き続きバックグラウンドで曲の解析が行われ数日間はCPUパワーを消費します。サーバーなので放っておけばよいです。(状況は「Settings」-「Library」で確認できます)
Roonのコアはそれ自体はファイルサーバー機能を持たず、今回のように外部のPCやNASの音源を参照するか、OSのファイル共有を使う必要があります。仮想化でNASと組み合わせると1台でコアとライブラリを兼用でき使いやすくなります。NASやNAS用OSにコアをインストールするのも良いかも、と思いました。
あとは好みのオーディオデバイスを接続すれば再生可能。Roonのハードウェア対応は多彩です。
Roon Readyの機器であれば確実で音質も担保されますが、音を出すだけならPCにつながるものは大抵使えます。デバイスをPCに接続する場合は、Roon BridgeをインストールしておけばRoonを起動しなくてもスマホなどから再生コントロール可能です。
Bluetoothアダプターで気軽に聴いたりもできますし、自分は古のネットワークオーディオ:
Squeezebox Boomを再利用したりしています。
ピュアオーディオ用途でPCを経由するのは嫌だけどRoon Readyのプレーヤーなんて持ってない、そんな場合は市販のRoon対応ブリッジでUSBやS/PDIFに変換したり、ラズパイにRoon BridgeやRoon対応ディストリビューションを入れて自作することもできます。
以上で完成です。今回は「ホームネットワークに接続するファイルサーバー兼オーディオサーバー」というシナリオで構成してみました。
より音質を重視するなら、LANアダプターと
以前作成した OpenWrtによるルーター(ネットワーク分離)を追加して、「オーディオ専用LANポート付きサーバー」なんてこともできると思います。
HUB基板を内蔵しただけの市販「オーディオ用」サーバーとは一味違うぞ!
とかね。
仮想化を使ってみて、OS/2やBeOS、はたまたNeXTSTEPなどOSを取っ換え引っ換えしていた時代の楽しさを思い出しました。あの頃は仮想化もなく、自分はOSを起動し直しては変わるUIで遊ぶ程度でしたが、現在はファイルサーバーやルーター、オーディオサーバーなど専用OSが多数あり、これらを並列動作させて実用的に使える環境になりました。
ただ、その一方でPCは電源を入れれば選択の余地なくWindowsが立ち上がるようになって久しく、簡単にはOSを変えられないモノになってしまっています。今こそ
クリーンコンピューター の思想が必要なのだ!
(2021/9/26追記)
リソースの割り当て状況はこんな感じです。このあたりのチューニングも仮想化で面白いところです。
使用するコアの総数が物理コア数を超える(オーバーコミット)と、ESXiによるスケジューリングが入りパフォーマンスが低下します。実際に発生する頻度が高くなり過ぎない程度が良いでしょう。
メモリーとストレージは、ESXiが使う分を含めて物理的な容量の範囲に収めています。メモリーのオーバーコミットは避けるべき、ストレージはThicプロビジョニングの場合オーバーコミットできません。
欲を言えば8コア・32GB位あると遊ぶ余裕ができますが、そうなるとメーカー製PCの多くは強制空冷になってしまい、オリオさんあたりのファンレスPCが欲しくなります。
まぁ、この位で留めておくのが乙ってもんですかね。
(2021/10/8追記)
MinimServer2もRoonも安定動作しています。OSの選択、リソース設定などまだ最適解には達していない気もしつつ、ひとまず正式運用に入りました。
Roonで有名なシグナルパス表示です。オーディオファイル向けにはビットパーフェクトで再生できているかどうかのインジケータとして使えますが、あえてフォーマット変換させて負荷をかけてみました。以前のサーバーでは無理だった、DSD256からPCM48kHzへの変換も途切れることなく再生できています。ただしギャップレス再生はできず曲間で一瞬止まります。
なんでそんな変換を?と思うかもしれませんが、Bluetoothヘッドホンで聴く時はDSD不可、とかじゃ困るわけですよ。こういう能力は大事。
処理性能はこの条件(DSP機能はOFF)でリアルタイムの3倍程度と表示されています。flacなどのPCM音源やDSDでもネイティブ再生なら負荷はこれよりずっと軽くなり、1ストリームであればDSPを入れても一通りの再生はこなせそうです。上出来でしょ。
(2024/5/19追記)
RoonのベースOSにしたUbuntuを最新版にアップグレードしたところ動作が不安定となり、数日放っておくとRoonの仮想マシンがCPU100%状態で固まるようになってしまいました。車でRoon ARCを使う時にこれでは脱力感半端ないので、
ROCK(Roon Optimized Core Kit) に入れ替えました。
現在のROCKはUEFIに対応し、ESXi環境にも比較的容易にインストールできるようになっています。コミュニティに上がっているこの手順でいけました。
ROCK VM on ESXi
中で必要と説明されているキーボードのパススルーについてはこちらの動画が分かりやすいです。
VIDEO
ただ、肝心のESXiが冒頭朱書きの状況ですので、このブログ自体あまり有用ではなくなってしまいました。仮想化基盤でNASとRoonを動かすと
・仮想ネットワークで高速に接続できる
・Roonが重くなったり最悪フリーズしてもファイルサーバーに影響しない
などメリットがありますが、今から同じことをするなら
Proxmox VE とかですかね?