mpdでLinux機をスマホから操作可能なミュージックサーバに(+SELinuxのお勉強)2017/11/05CentOSmpdsambaLinux機をファイルサーバにしてそこに音楽をボンボン放り込んでおいて、それをスマホから操作してスピーカーから流せたらいいなということで作りました。自宅に転がってるヤマハのTHR10というギターアンプで済ませました。ギターもすっかりやらなくなったな。ファイルサーバすでにCentOS7に立ててあるSambaを利用。Sambaと後述のミュージックサーバアプリでSELinuxのポリシーが競合して大変でしたのでそれも書きます。Daemon)を使います。デーモンアプリなのでフロントエンドでリソース喰わないのがいいよね。他にもGNOME標準のRhythmBoxなんてアプリにプラグインを追加したら同じようなことができるそうです。これはフロントエンドでリソース喰いますが。クライアントアプリAndroidのアプリMPDroidを使います。Andoroidのmpdクライアントならほぼこれ一択。iOSやWindowsにも似たようなアプリはあります。LinuxにUSB-DACを認識させるドライバを必要としない汎用DACならば、つないだだけでOSに認識されます。今回使うTHR10も汎用DACなので何もせずとも認識されていました。#01234567891011121314151617一番最後のTHR10のとこがそれです。カード名「THR10」、デバイス番号「0」をメモっておきます。nuxリポジトリからmpdのインストールmpdは標準のリポジトリにはありません。nuxリポジトリからダウンロードするので、それを追加。dextopってなんだdesktopじゃないのか。http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm1普段は本リポジトリを使わないこと、優先度を下げておくことを設定します。下記ファイルのすべてのセクションに「enable=0」と「priority=11」を追記します。/etc/yum.repos.d/nux-dextop.repo1そしてmpdインストール。依存関係でインストールするパッケージにEPELのものが含まれるので、EPELリポジトリを使用する旨もオプションで指定。「bind_to_address」を編集。デフォルトだと「"any"」になっており、ipv6にバインドされる可能性があるため、明示的にipv4に変更。#アンコメントで明示123456789audio_outputを編集。デフォルトでは以下のようになっていました。optional}123456ここをすべてコメントアウトし、下記のように追加。deviceのところは"plughw:<カード名>,<デバイス番号>"のように指定します。“none"はmpd側で音量調節をさせない設定です。音量調節はUSB-DACに任せます。"none"}123456misic_directoryを既存のSambaの音楽置き場のシンボリックリンクにする。/var/lib/mppd/music/1mpdが使用するディレクトリを作成。/var/run/mpd1mpdが使用するディレクトリの所有者を変更。/var/run/mpd12ファイアウォール穴あけ。SELinuxの設定ついつい無効化しがちなSELinuxですが、勉強のためEnforcingで自宅サーバを運用しています。今回はそれに結構詰まりました。SELinuxは、ユーザやリソースをユーザ、ロール、タイプの3つの識別子で識別します。ユーザのタイプは特にドメインと呼びます。このユーザのドメインとリソースのタイプの対応関係ごとに、「何を」「どうするか」の許可をホワイトリスト形式で記述していきます。「何を」はクラスにあたり、リソースを細分化したものです。ファイル、ディレクトリ、プロセス、ソケットなど。「どうするか」は読み、書き、検索、実行、メモリへのマッピングなどの挙動です。前提として、既存のSambaが利用するディレクトリには/home以下のディレクトリである/home/samba/shareを割り当てており、そこに「public_content_rw_t」というタイプを割り当てていました。mpdのドメインはmpd_tですが、このドメインがpublic_content_rw_tを読み書きできるようにする適切なデフォルトのポリシーがない。/var/log/audit/audit.logを見る感じ、その他にもいくつかSELinuxのエラーが出るようです。audit2allowなんていうログからポリシーを自動生成してくれるツールもあるのですが、自動生成なのでガバガバになりがちであること、せっかくなので勉強したいことの二つの理由から、ポリシーを自作することにします。適当なディレクトリでmympd.teというファイルを作成して編集。};123456789101112131415161718一行目には自作したポリシーの名前とバージョンを記述します。既存のポリシー名と被らないよう注意(警告が出ます)。requireディレクティブの中ではアクセス制御に利用するドメインやタイプ、クラスを列挙し、クラスの中に挙動を記述していきます。ドメインやタイプはログにベタ書きなのでわかりやすいですが、クラスはtclassのところに、挙動はdeniedの直後に書いてあります。定義が終わったら、allowに続いて許可したいドメイン、タイプ、クラス、挙動の組み合わせを列挙していきます。作成したらコンパイル。mympdを置いてあるディレクトリで実行します。コンパイルにはselinux-policy-develというツールがいるので、インストールしていない場合は事前にインストールしておく。/usr/share/selinux/devel/Makefile1成功したらインストール。mympd.pp1んで/var/log/audit/audit.logを見ながら動作を確認。動作の確認にはクライアントアプリであるMPDroidを利用します。ダメだった場合下記のコマンドでモジュールをアンインストールして、再びmympd.teを編集してコンパイルしてインストール。この繰り返しで少しずつエラーを減らしていきます。mympd1エラーが消えたらOK。満を持して起動&自動起動設定。スマホがリモコンのネットワークミュージックサーバが完成しました。MPDroidの操作画面はこんな感じ。スマホをWi-FiにつなぎCentOS7と同じネットワークに所属させ、MPDroidにCentOS7のIPとポートを入力することで、スマホがリモコンになります。MPDroidで再生を押すと、CentOS7に直結されたTHR10から音楽が流れます。Securityを受けようとしていたところだったので、SELinuxのいい勉強になりました。自宅の音楽環境も整ったことだし満足。三連休中も仕事でしたがいい息抜きになりました。