y2blog » UPnP/OpenHome Music Server の自作(その9)

9

08

2018

UPnP/OpenHome Music Server の自作(その9)

KVM仮想環境上で “upmpdcli” を動かしてみる


前回は、CnetOS7上で苦労して”upmpdcli” 動作環境を構築したが、今回はバイナリパッケージが最初から用意されている Debian Stretch(Version 9)を用いて”upmpdcli”を動作させてみることにする.


CentOS7はRed Hat Enterprise Linux系列のOSであり、どちらかというとエンタープライズ分野でのメインサーバ環境として提供されているのもであるので、KVMという仮想サーバ環境を運用する機能が備わっている.仮想サーバ環境で仮想マシンを運用する事はITエンジニアにとっては極々当たり前の事なのだが、一般の人達にとっては仮想サーバと言われても中々イメージが掴めないかも知れない.VMWare WorkstationやVMWare FusionなどのPCやMacintosh上で動作する仮想環境であれば、利用している人は多いので、何となく仮想マシンのイメージが掴めるかもしれない.


KVM Environment
KVM環境上でDebian OSを動かし、”upmpdcli” アプリを稼働させるときのイメージ

Multi MPD Clients
iPad上の”fidata”アプリから複数の出力先を選択している様子


今回構築するKVM(Kernel-based Virtual Machine)仮想マシンは、オープンソースの仮想環境実装フレームワークで、エンタープライズ系のITの世界ではVMWare ESXiと並んで広く普及している.さくらインターネットやConoHaなどのVPS系のサービスは、殆どがこのKVM環境上に構築された仮想サーバ(VPS)で提供されており、安定性も高くとても実績のある仮想化技術である.


今回は仮想環境についての話では無く、”upmpdcli” をKVM仮想環境上に構築することが目的なので、実装の手順だけの紹介に留めることにする.KVM仮想環境を使いこなすにはそれなりのLinuxスキルが必要になるので、Linuxに不慣れな人は手を出さない方が良いだろう.


KVM環境をホストOS(CentOS7)側へインストールする


今回構築している、CentOS7サーバは、ベースが基本最小構成 “Minimal” で構築しているので、KVM仮想環境を実装するためのライブラリや関連モジュールが全く組み込まれていないので、先ずはKVM仮想環境から整える必要がある.


KVM環境のインストールは yum コマンドを用いてインストールを行う.今回は既に dnf コマンド環境を構築済みであるので、dnfコマンドの例を示してあるが、”dnf” の部分を単純に “yum” に置き換えれば良い.



ホストOS(CentOS7)側のネットワーク設定


KVM仮想環境を用いてゲストOSのDebianを動かす場合、ゲストOS側のネットワークがホストOS側のネットワーク環境を通じて外部とアクセスすることになる.これを実現する方法は幾つかあるが、今回は一番単純なブリッジ接続による方法を紹介する.


ブリッジ接続はホストOS側にブリッジという、L2レベルで直接通信が行える機能を持ったインタフェースデバイスを作成し、それを介してゲストOS側のネットワークインタフェースがつながるようにする.


ブリッジはL2スイッチとは異なり、全てのパケットをブリッジ配下のネットワーク機器に垂れ流す役目を担っていると考えれば良いだろう.ブリッジインタフェースの機能は昔のダムハブ(所謂リピータハブ)を思い起こせば良いだろう.


APU2C4の3つの物理NICを3つのブリッジにそれぞれ割り当てる.割り当てられたブリッジを介して、ホストOS側のCentOS7とゲストOS側のDebian Stretchが同じ3つのネットワークセグメントを共有することになる.


KVM-Bridge-Network
ブリッジ方式によるゲストOSをホストOS側への接続イメージ

既存インタフェース設定ファイルのバックアップ

先ずは、既存のホストOS側のインタフェース設定ファイル “/etc/sysconfig/network-scripts/ifcfg-eth0″, eth1, eth2” のバックアップを取っておく.同一フォルダ内に、ifcfg-eth0.bak などの名前で保存して置けば良いだろう.設定作業を失敗した場合の切り戻しの際の保険だと思って欲しい.



ブリッジインタフェースの作成

新規にブリッジインタフェースを作成する.この際に、インタフェース”eth0″, “eth1”, “eth2” に対して行った設定と同じにしておく.



既存インタフェース “eth0”, “eth1”, “eth2″の削除

既存のインタフェース”eth0″, “eth1”, “eth2” を一旦削除した後、新しく作成したブリッジインタフェース “br0”, “br1”, “br2” と結びつける.



セキュリティーゾーンと追加(別名)IPアドレスの設定

セキュリティーゾーンをブリッジインタフェースと新しく設定したホストOS側の仮想インタフェースに対して設定する.



インタフェース設定とセキュリティーゾーンの確認

ネットワークを再起動したら、インタフェースの設定情報とセキュリティーゾーンが正しく設定されているか確認しておく.




ゲストOS(Debian Stretch)のインストール


KVM仮想環境下でゲストOSのDebian Stretchを新規にインストールするために、今回は”virt-install” コマンドを使って、インターネット経由でDebian Stretchイメージファイルをダウンロードし、ゲストOSイメージを作成する.


コマンドの細かなパラメータの説明は行わないが、今回は3つのブリッジインタフェースにつながる仮想ネットワークインタフェースを3つ作成するので、 “–network” パラメータを3つ追加する.(注:”upmpdcli” は実際には1つのNWインタフェースしか使わないので、今回の用途では br0 1つだけで良いが、他の用途も考えてここでは3つ作成している)


APU2C4はメモリを4GB搭載しているので、512MB程度の仮想サーバを1つ立ち上げることは問題ない筈だ.本来であればゲストOSを安定稼働させるために必要となるコンピューティングリソースをきちんと把握した上で、適切なリソースパラメータを設定するのが筋だが、今回は大雑把な設定で済ませている.


“dirt-install” コマンドの詳細は、RedHatのカスタマーポータルサイト「3.2. VIRT-INSTALL を使用したゲストの作成」を参照すると良いだろう.



今回のインストール例では、Debianイメージを日本のミラーサイトから取得しているが、ISOイメージファイルを予めダウンロードし、ホストOS上のISOイメージからゲストOSのインストーラーを起動させることも可能だ.ISOイメージを “/var/tmp/debian-9.5.0-amd64-netinst.iso” に置いた場合の “virt-install” コマンドのオプションは次の様に指定すれば良いだろう.



DebianText-based-Installer
やがてDebian Stretchのテキストベースインストーラが起動する

Debian-Text-based-Installer-04
勿論GUI関係は全て省いて軽量化を図る

Debian-Text-based-Installer-05
インストールが終わると自動的に再起動するが、コンソール画面は表示されなくなる

インストール作業が終了すると、自動的に再起動してDebian Stretchが起動するが、KVMのコンソール画面は “Loading initial ramdisk …” というメッセージの後で、何も表示されなくなる.これはゲストOSのDebian 9 のブートローダ(grub) のコンソール出力の設定が正しく行われていないためで、実際にはきちんと裏でDebian Stretchが正常に起動している.


この状態でホストOSや外部のPC上から、sshコマンドでログインが可能なので、普段はsshコマンドでログインさえできれば問題無いが、一番最初はDebianのIPアドレス設定がDHCPによる取得になっているので、ゲストOSのIPアドレスをコンソールから確認できないと不便だ.


ゲストOS側のコンソール画面を、ホストOS側のコンソール画面やsshなどのターミナル画面に表示させるには、最初の”GRUB”起動画面上でシリアルコンソール出力するためのパラメータを追加すれば良い.



Debian Start GRUB 01
Debian起動時のGRUB設定コンソールで “e” キーを押して編集モードに入る

Debian Start GRUB 02
Mac OS Xの ”Terminal”アプリ上ではカーソルキーが働かないのでNGだった

Mac OS Xの”Terminal”アプリ上でゲストOSのコンソール画面を表示させようとすると、何故かカーソル制御ができず、GRUBのパラメータを編集することができなかった.編集すべきGRUBのパラメータは、

linux /boot/vmlinuz-4.9.0-7-amd64 root=/dev/vda1 ro quiet

という行で、この行の末尾の “quiet” を削って、後に

linux /boot/vmlinuz-4.9.0-7-amd64 root=/dev/vda1 ro console=ttyS0

を追加する.追加したら CTRL-x か F10 を押下してブートローダに制御を渡せばよい.


これで、ホストOS側のコンソール画面上にゲストOSのコンソール画面が表示されるようになるはずである.


ちなみに、ゲストOSのコンソール画面からホストOS側のコンソール画面に切り替える(戻す)には、”CTRL-] “(コントロールキーと “]” キーを同時押下)を打てば良い.



ゲストOS側のコンソール出力設定

ゲストOSのコンソール出力をホストOS側のコンソールへ表示できないのは何かと不便なので、ゲストOSのコンソール出力を表示できるように設定を変更することにする.


ゲストOSにrootでログインし、次の設定を行えば次回のゲストOS起動時から、自動的にゲストOSのコンソール画面がホストOS側のコンソール上に表示されるようになるだろう.

# systemctl enable serial-getty@ttyS0.service
# systemctl start serial-getty@ttyS0.service


ゲストOS稼働時のホストOS側のネットワークインタフェース

ゲストOSが稼働している状態で、ホストOS側のネットワークインタフェースの状態を示すと次の様になっている.”vnet0″, “vnet1”, “vnet2” が動的に生成されていることが確認できる.




“upmpdcli” のインストール


KVM環境の構築やゲストOSのインストールで大部時間を費やしてしまったが、いよいよ本題の “upmpdcli” のインストール作業に取り掛かることにしよう.インストール作業と言ってもCentOS7のときのような面倒な作業は必要なく、Debian Stretch(AMD64) 環境用のバイナリパッケージを導入するだけだ.


インストールの方法は、”Upmpdcli downloads” ページに詳しく書かれているので、”Debian” の “Non-ARM Debian Stretch” の設定内容を、”/etc/apt/sources.list.d/upmpdcli.list” に書き込めば良い.


インストール後の設定はCentOS7の場合と同じように、”/etc/upmpdcli.conf” を適切に設定するだけだ.Debian環境であれば何の苦労も無く “upmpdcli” を稼働させることができるのだ.APU2C4のOSはCentOSではなく最初からDebianにしておいた方が苦労なく進められたかもしれない...




ゲストOS(Debian Stretch)のIPアドレス設定


Debian Stretchはインストール時点ではDHCPによる自動割り当て状態になっており、DHCPでの運用が前提であれば特に何も設定する必要は無い.以前、Debian StretchのRaspberry Pi ディストリビューションでの固定IPアドレス設定について簡単に紹介したが、御本家のDebian Stretchの実装では、従来のIPアドレス設定方法をそのまま踏襲しているようだ.詳しい内容は、御本家のマニュアル「Debian 管理者ハンドブック 8.2. ネットワークの設定」を参照すると良いだろう.


インストール後のネットワークの状態を確認すると、


“/etc/network/interfaces” の設定例


networkを再起動後に確認してみると、

正常に固定IPで運用されていることが確認できる.




Appendix: KVM環境の運用あれこれ


KVM環境による仮想サーバの運用はとても便利なのだが、KVM環境下での仮想サーバの運用は、通常のLinux運用とは別に、KVM環境に対する運用スキルが必要だ.ここでは、KVM環境下の仮想サーバを運用するための”virsh”コマンドを幾つか簡単に紹介する.


【仮想マシンの状態表示】

仮想マシンの一覧や状態を表示する.


 ・稼動中の仮想マシンの一覧表示
   # virsh list
 ・全仮想マシンの一覧表示
   # virsh list –all


【仮想マシンの状態表示】

仮想マシンの一覧や状態を表示する.


 ・稼動中の仮想マシンの一覧表示
   # virsh list
 ・全仮想マシンの一覧表示
   # virsh list –all


【仮想マシンの起動】

仮想マシンを起動するには、ホストOS側で次の “virsh” コマンドを入力する.xxxxは作成した仮想マシンの名前


 ・仮想マシンの単純起動(コンソール画面出力なし)
   # virsh start xxxxxx
 ・仮想マシンの起動(コンソール画面出力あり)
   # virsh start xxxxxx –console

【仮想マシンの停止】

停止は通常 “shutdown” で行うが、上手く行かない場合は “destroy” で強制的に仮想サーバを停止する方法がある.但し、ゲスト仮想マシンのファイルシステムが破損する可能性があるので、virsh destroy コマンドは、ゲスト仮想マシンが反応しない場合のみに使用すること.


 ・仮想マシンの停止
   # virsh shutdown xxxxxx
 ・仮想マシンの強制停止
   # virsh destroy xxxxxx



【仮想マシンの自動起動の設定】

仮想マシンを自動的に起動させる.


 ・仮想マシンの自動起動設定
   # virsh autostart xxxxxx
 ・仮想マシンの自動起動設定解除
   # virsh autostart –disable xxxxxx

【コンソール出力の制御】

ホストOS側のコンソール画面にゲストOS側のコンソール画面を表示させたり、元のホストOS側のコンソール画面に戻すためのコマンド.


 ・ホストOSからゲストOS側のコンソールへの切り替え
   # virsh console xxxxxx
 ・ホストOS側へコンソールを戻す
   Ctrl + ]  (コントロールキーと”]”キーの同時押下)


【仮想マシンのACPI設定】

Debian Stretchのインストール時に ACPI 関係のモジュールが組み込まれていないと、”virsh shutdown” コマンドでシャットダウンができない場合がある.この場合はゲストOS側でACPIによる電源管理機能を有効にしておくことで、正常にゲストOSをシャットダウンできるようになる.


Debian Stretch でのACPI機能の追加


【仮想マシンの削除】

仮想マシンを削除するには、ドメイン名(xxxxxx)の定義を解除した後、仮想マシンイメージファイルを削除する.オプションで関連するストレージボリュームを削除することもできる.詳細は、RedHatのKVM関連のマニュアル 「21.9. 仮想マシンの削除」を参照すると良いだろう.


 ・仮想マシンドメイン(xxxxxx) の定義削除
   # virsh undefine xxxxxx

    –remove-all-storage  関連付けられたすべてのストレージボリューム削除

ちなみに、不要となった仮想マシンを手順を踏んで手動で削除する場合は、次の手順で削除すると良いだろう.


 1. autostart設定の解除
   # virsh autostart –disable xxxxx

 2. virshの管理対象から外す
   # virsh undefine xxxxxx

 3. 仮想サーバのイメージファイルが格納されているプールを確認
   # virsh pool-list –all

 4. プールに紐づくデバイスを確認
   # virsh vol-list yyyyy

 5. プール中の該当仮想イメージファイルを削除する
   # virsh vol-delete –pool yyyyy xxxxx



Appendix: APU2C4に物理シャットダウンスイッチをつなぐ


APU2C4のマザーボードの J2コネクタの Pin:2-3 は “power button” となっており、このピンを電気的にショートさせると、ACPU2C4を強制的にシャットダウンさせることができる.ホストOS側のCentOS7でACPIが有効に設定されていれば、CentOS7が自動的にシャットダウンして、電源断状態になる.


電源断状態で、再びこの”power button” をショートさせると、電源 “ON” 状態になり、CentOS7 が自動起動するので、J2 端子のPin:2-3を外部のコンタクトSWに接続しておくと、APU2C4の運用がとても楽になるので、是非ともこの外部電源制御SW機能を実装しておいて欲しい.


APU2C4 Power Button
APU2C4のJ2コネクタのPin:2-3間に外部コンタクトSWを接続する

この”power button” 機能と小型のUPSを組み合わせると、突然の電源断にも対処可能な完全版の家庭用ミュージックサーバの完成形が出来上がるだろう.現在、APU2C4用の小型UPS装置の自作に取り組んでいるので、近いうちに紹介できることだろう.




最後に


今回はAPU2C4にCentOS7を載せ、オールインワンタイプのミュージックサーバ兼オーディオ専用ルータ機能を実装してみたが如何だっただろうか.恐らく殆どの人は余りにも難しくて途中で諦めたのではないだろうか.


今回の記事内容は単にPC関係に詳しいだけでは無理で、ネットワークやLinuxサーバを相当熟知していなければ太刀打ちできないだろう.一応一通り手順は示してはいるが、Linuxなどの基本的な知識を持っている事を前提に説明しているので、一般のオーディオマニアレベルでは、この手順通りに設定することも難しいことと思う.


残念ながら現状では一般のユーザがハイエンドネットワークオーディオの世界に足を踏み入れるのは相当な苦難を強いられるだろう.何百万円もする超高級機材を導入したところで、ネットワーク環境を工夫しなければ「画竜点睛を欠く」と言えるだろう.


お金なんか無くても工夫次第でハイエンドネットワークオーディオの世界を楽しむことはできるということで...

Local Search

Calendar

September 2018
S M T W T F S
« Aug    
 1
2345678
9101112131415
16171819202122
23242526272829
30  
  • Blogroll

  • Meta