• symphonic-mpd特殊ネタ集

    SDカードをライブラリとして使用する
     symphonic-mpdではNAS・RAM・USBと3つの場所で楽曲を配置して演奏できますが、標準設定ではSDカードに配置した楽曲は認識出来ません。
     もしかしたら、ファイルIOアクセスのレイテンシー関係でSDカードへの楽曲保存は標準で行わないようにしているかもしれませんが、
    NASが手元にない場合やSDカードに潤沢な空き容量がある場合などにSDカードもライブラリとして使用したい場合の設定について以下で説明します。
    (以下の通りやらなくても頭を使えばラズパイのSDカードへのファイル転送は可能ですが、本設定を有効にした場合は容易に転送出来るようになります。)
     当然ながら、FAQにありますSDカードのパテーション拡張を事前にしておく必要があります。

    • 設定方法

    ①標準状態でUSBディレクトリをそのまま使う場合。
     sshログインにて以下の通りコマンドを入力します。

    sudo chmod 777 /var/lib/mpd/music/USB
    

    これで/var/lib/mpd/music/USBにユーザpiで書き込むことが可能になり、Filezillaなどでファイルを転送出来るようになります。

    ②他のディレクトリを指定したい場合
     「上記のこのディレクトリ名はUSBメモリなので、ちょっと・・・」ってお思いの方は以下の通り変更が必要になります(要は/var/lib/mpd/music内に希望のディレクトリを作ってしまう)。
    (下記の方法だと/var/lib/mpd/music/SDが保存先になります。"SD"の部分を自分の好きな名前のディレクトリに変えることは可能です。)
     まずはsshログインにて以下の通り3つコマンドを入力します。

    sudo mkdir /var/lib/mpd/music/SD
    sudo chown pi.pi /var/lib/mpd/music/SD
    sudo chmod 777 /var/lib/mpd/music/SD
    

    次に、/etc/rc.local の後ろの方をエディタで以下の通り追記します。

    mpc update RAM
    mpc update USB
    
    

    に続いてmpd update SDを入力して保存します。

    • 楽曲転送後の対応
      FilezillaなどでPCから楽曲を転送したら、sshログインで必ず以下の通り入力するか、ympdのプラグインで”UPDATE LIBRARY”を選択してライブラリの更新をして下さい。
      ①の場合はmpc update USB もしくは フォームの入力部に USB
      ②の場合はmpc update SD もしくは フォームの入力部に SD(SD以外のディレクトリ名を指定した場合はその指定名を入力)
  • sshのリモートシェルにSDカードのマウント状況を表示させる
     今回のネタはコチラの記述を参考にいたしました。

    SDカードをリードオンリー化運用した場合、エディタなどを開いて書込が必要な作業を行う前には書込権限アリで再マウントする必要があります。
     しかし、いちいちmountコマンドや/etc/mtabを見て状況を確認するのはちょっとめんどくさい。

    という訳で、ここでは/home/pi/.bashrcを書き換えしてsshのリモートシェルのコマンド入力欄の左側にリードオンリーか、書込権限有りなのかを表示するようにします。
     合わせて、簡単なマウントコマンドをエイリアスとして追加してしまいます。

    /home/pi/.bashrc
    まずはファイルの頭にある #Aliases と書かれている場所の一番最後に以下の2行を追加します。

    alias ro='sudo mount -o remount,ro / ; sudo mount -o remount,ro /boot'
    alias rw='sudo mount -o remount,rw / ; sudo mount -o remount,rw /boot'
    

    これで、roと打てばリードオンリーに再マウントし、rwで書込権限有りに再マウントします。

    次に、中盤の#Functions 項目の最後(# append to the history ...の直前)に以下の行を入れます。

    function fs_mode() {
         echo $(mount | sed -n -e "s/^\/dev\/.* on \/ .*(\(r[w|o]\).*/\1/p")
    }
    

    簡単に意味を説明すると、マウントコマンドで/devを見てどういう状況か返すコマンドです。
    (リードオンリーの場合はro、書込可能な場合はrwと返す)

    最後に、PS1というコマンドプロンプト表示を制御している場所3箇所を以下の通り書き換えます。
    1箇所目と2箇所目

    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h($(fs_mode))\[\033[00m\]:\[\033[01;34m\]\w \$\[\033[00m\] '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h($(fs_mode)):\w\$ '
    fi
    

    if [ "$color_prompt" = yes ]; thenは現状そのままです。よく見て探してみて下さい。
    (実際に書き替えするのはPS1=で続く行ですが、探しやすいように記載しました。)
    そして3箇所目

    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h($(fs_mode)): \w\a\]$PS1"
        ;;
    *)
        ;;
    esac
    

    書換完了後、一旦sshログインから抜け出し、再度ログインして下さい。
    pi@smpd(rw):~ $ のようになっていたら成功です。
    この()内の値がroの場合、SDカードはリードオンリーでマウントされています。
    (rwの場合は書込可能)
    コマンドプロンプトが表示される度に現状のマウント状況を確認できますので、便利だと思います。

  • @sunatomo さん

    ここでお願いして良いことかと迷ったのですが・・・
    ympdの使い勝手なのですが、アルバムを追加するときは、ワンクリックで済むのですが、プレイリストから削除する時も同じようにワンクリックでできないものでしょうか?
    現在、プレイしストの画面にアルバム情報がないので、無理なお話でしょうか。もし、アルバム情報を追加するとなると、何かデメリットがありそうでしょうか。

  • @hiroget9 さま
    ご提示のアイデアについてはympdの仕様によるものになので、そちらのソースコードを改造しない限り難しいかと思います。
    少なくともキューに格納した楽曲一覧をCantataのキュー表示のようにアルバムでグルーピング選択可能な仕様に変更しないと希望の動作は無理ですね。
    (プラグインとして提供されるダイアログについてはHTML+JavaScriptの知識があれば色々出来ますが...)

  • @hiroget9 さん

    アルバム単位でキューから削除したいということですね。
    ちょっと考えてみます。

  • @パパリウス さん
    開発でお忙しい時に我儘な事で申し訳ありませんm(__)m
    ポチポチ消していけば済むことですので、後回しにしてください。

  • symphonic-mpdにスタンドアローンでupmpレンダーにする
    今回のネタは@donuts-shop73 さまのところとカブるかたちになりますが、
    私のように「symphonic-mpd向けのラズパイ1枚だけでDLNA/UPnP対応しないかなぁ」とお思いの方には使えると思います。
    @donuts-shop73 さま、くれぐれもお気を悪くされないで下さい。

    簡潔に言うと、「symphonic-mpdのイメージで現バージョンのupmpcliをビルドした」ということになります。
    GoogleDriveへのリンク

    動作確認についてはAndroidアプリのBubbleUPnPから以下の動作について実施できました。
     ・Android端末内の楽曲をリモートプレイ
     ・NASにインストールしたminim-serverから楽曲を指定しリモートプレイ
    (Tidal・Qubozなど他にも色々機能が現バージョンのv1.4.5では追加されていますが、
    動作は未確認です。)

    なお、今回ビルドした成果についてはRaspberry Pi2〜3B+までは動作するでしょう。(symphonic-mpdと同じく32bitのRaspbian jessieベースならば)
    ご自由にお使い下さい。

    ①ビルドの方法(今後何かをビルドする際の参考にどうぞ)
     ちなみにここで作成したSDカードのイメージは「開発用」として使用するためのもので、
     普段の音楽再生には使用しません。
     (cifsマウントの設定やtag_cacheの生成・レストアは行いませんでした)。
     apt-get upgradeは実行していませんが、明らかに標準では不要な開発用パッケージが山盛りになります。

    ・v0.9.1のイメージをダウンロードし、十分な空きのあるSDカードに焼きます。

    ・通常インストール処理のうち、IPアドレスの設定(固定化)とSDカードのパテーション拡張は
      やっておいて下さい。
     (IPアドレスの設定はsshによるリモートシェルが当然のように必要になるための措置です。
     パテーションの拡張はやっておかないと既定ではビルド環境には足りません。)
     もし起動音が聞きたい場合は/boot/config.txtの書換は必要です。

    ・Debian での sample build sequence hereに基づいて試作してみる。
     この方法では開発に必要なソースとバイナリのdebパッケージを生成します。
     ちなみに、上記のドキュメントに基づき、まず最初にaptのリポジトリを追加しておかないと、
     開発用のパッケージインストールの際に「そのようなパッケージは無い」と怒られます。

    また、ここに書かれている内容は基本的にはそのままですが
     (debuild -us -ucにはsudoが必要です)、
     中段のlibupnpp4は現バージョンでは「libupnpp5」になっていますので書き換えて実行する必要があります。
     最後のsudo dpkg -i *.debだけは実行しませんでした。

    ・別なディレクトリを作成し、Upmpdcli downloadsからダウンロードした
     ソースコードを解凍し、Building libupnpp and upmpdcli on Linuxに書かれている通り
     ビルドしてみる。

    ・sudo make installでそのまま開発機のSDにインストールさせ、実行ファイルを抜き取る。
     symphonic-mpdの作法では自分でビルドしたアプリは/usr/local/binに入れておくため、
     ビルドの際にインストールディレクトリもここに指定するのが望ましいでしょう。
     実行ファイルはfilezillaなどでPCに複写し、実動作環境のSDに複写します。
     (ラズパイ本体の電源断をしてしまえばSDカードは抜き取り可能ですので、
     その後PCにSDカードリーダを挿せばLinuxデスクトップがあれば中身を自由に取り出せます)。

    ・実実行環境でldd upmpcliを実行し、不足しているライブラリファイルを列挙してこれらを開発環境から複写する。
     このスレッドに添付のZIPにはこの方法で必要なライブラリファイルを探して添付しました。

    ②インストール方法
     Googleドライブから当該アーカイブをダウンロードして下さい。
     ラズパイ上でアーカイブを解凍して下さい。
     一応インストール用のシェルスクリプトは同梱しましたが、動作確認は行っていません。
     (すいません。動作の確認のため自分使いの環境に手動でインストールしたため。)

    添付しているzipの内容とインストール先は以下の通りになります。
     /etc/upmpdcli.conf (設定ファイル)
     /usr/local/bin upmpdcli・scctl(実行ファイル)
     /usr/local/lib の各種soファイル (ライブラリ)
     /usr/share/upmpdcli ディレクトリ配下(プラグイン?いまいち不明)
     /lib/systemd/system/upmpdcli.service(systemdの設定ファイル)

    /usr/local/binに実行ファイルを複写した後は必ず実行権限をつけて下さい。
     /usr/local/libにライブラリファイルを複写後は各ライブラリの短縮名でシンボリックリンクを
     作って下さい。

    また、ライブラリには+r, +xの読み取り・実行権限を付けないとプログラムから参照できません。
     さらに必ずldconfgを使ってライブラリのキャッシュ設定をして下さい。

    上記動作を実行後systemctl enable upmpdcli.serviceを実行して、systemdの設定を
     有効化して下さい。

    最後になりますが、upmpdcliはユーザー、グループともにupmpdcliという名前を作らないと動作しません。
    以下のコマンドが必要になります。

    groupadd -g 500 upmpdcli
    useradd -g upmpdcli -u 500 -h /usr/local/bin -s /sbin/nologin upmpdcli
    

    userとgroupのIDは仮に500にしましたが、自分で調べて若番に寄せることも可能です。

    なお、upmpdcli.confの設定は、私は最低限のmpdのところだけ有効化して動作確認しました。
     (現状ではupmpdcli側でUNIXソケットでMPDに接続する方法が不明のため、mpd.confで
     6600番ポートを開ける必要があります。)

  • ipv6を停止させる
    インターネット接続についてはipv6経由だと快適に使えるプロバイダが増えてきましたが、
    個人宅での閉じた環境で音楽を聴くだけでしたらipv6は不要という考え方はあるかと思います。
    というわけで、今回はラズパイでipv6を無効化する方法についてご説明します。

    • /etc/sysctl.confを編集する。
      末尾に以下の2行を追加して下さい。当該ファイルはユーザ・グループがrootのため、編集にはsudo nano /etc/sysctl.confと入力しなければなりません。
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    

    記載後にラズパイを再起動し、ifconfigもしくはip aと入力すると、
    各インターフェースのMACアドレスやIPアドレスが表示されますが、
    ipv6のアドレスが消えています。
    (下記は私の環境でのifconfigの出力例。MACアドレスは隠匿しました。)

    eth0      Link encap:Ethernet  HWaddr **:**:**:**:**:**  
              inet addr:192.168.11.161  Bcast:192.168.11.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:110394 errors:0 dropped:2113 overruns:0 frame:0
              TX packets:55921 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:2000 
              RX bytes:139225298 (132.7 MiB)  TX bytes:7449674 (7.1 MiB)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:9 errors:0 dropped:0 overruns:0 frame:0
              TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:720 (720.0 B)  TX bytes:720 (720.0 B)
    

    ちなみに当該ファイルを改変しなくても以下のコマンド入力ですぐにオフには出来ますが、
    コマンド入力だけでは再起動時に元に戻ります。
    (/etc/sysctl.confは下記のコマンドを起動時に実行すると思って良い。)

    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
    
    • /boot/config.txtcmdline.txtを編集する。
      (2019/12/03 記載に誤りが御座いました。編集するのはcmdline.txtになります。
      お試ししてうまく動かなかった方、大変ご迷惑をおかけしました。)
      実は先に記載した方法ですとnetstat -aで見るとまだ"tcp6"なるものが存在しているのですよね(どうやらv4-mapped-on-v6というものらしく、ipv6上でv4を使う技術のようです)。
      こいつまで消してしまいたい場合は/boot/config.txtcmdline.txtの末尾に以下の記述を追加して下さい。
    ipv6.disable=1
    

    皆さんのcmdline.txtの最後はraspberrypi.throttled_poll_sec=0で終了していると思うので、
    これの後に半角スペースを入れて上記を記載後にラズパイを再起動して下さい。

    最後に下記に参考で私のnetstat -aの結果を貼り付けします。
    (私の環境ではspotifydとshairport-syncの双方を無効化しているのと、
    sshで接続されているPCとcifsマウントされているNASはこの結果から消してあります。
    もちろんUNIXソケットも直接関係ありませんので消しています。)

    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 *:6600                  *:*                     LISTEN     
    tcp        0      0 *:http                  *:*                     LISTEN     
    tcp        0      0 *:ssh                   *:*                     LISTEN     
    udp        0      0 *:mdns                  *:*                                
    udp        0      0 *:47583                 *:*                               
    

    (mdnsはavahiですが、47583ポートは不明です。)

    ちなみにipv6を無効化した場合、/etc/ntp.confで以下の2行をコメントアウトしないとjournalctlで起動時にエラーが記録されますので、気になる方は対策すると良いでしょう。
    (コメントアウトは行先頭に"#"を付けて下さい。)

    restrict -6 default kod notrap nomodify nopeer noquery
    restrict ::1
    
  • sunamotoさん

    いろいろとcpu負荷を減らすアイデアを提供いただきありがとうございます!
    さっそくipv6停止を試してみました。
    /etc/sysctl.confの方はOKだったのですが、/boot/config.txtの方がうまく行きません。
    そもそもnoswapがなかったので、最後の行に
    noswap ipv6.disable=1
    と記載し、再起動してもnetstat -a で tcp6 は出てくるし、
    noswap無しにして、最後の行に
    ipv6.disable=1
    と変更し、再起動しても同様でした。。。

    ちょっと気になったのが、ps -ax とやると
    63 ? I< 0:00 [ipv6_addrconf]
    と表示されていました。

    何が原因かお分かりになりますでしょうか?
    mgroovy

  • @mgroovy さま
    私の環境で動いているのになぜなのかなぁと思い、手元のデータを見てみたところ
    config.txtではなくcmdline.txtの誤りでした。
    大変ご迷惑をおかけいたしました。🙏
    この記述をconfig.txtに書いても期待通りの動作はいたしません(本記述はカーネルオプションのため)。

    念の為、cmdline.txtにこれを追加した場合の例を添付します。
    (コチラは私のいじったものではなく、標準状態にipv6無効化を加えたもの。全て1行です。)

    dwc_otg.fiq_enable=0 dwc_otg.fiq_fsm_enable=0 dwc_otg.lpm_enable=0 sdhci_bcm2708.enable_llm=0 console=tty1 root=PARTUUID=55575038-02 rootfstype=ext4 idle=poll processor.max_cstate=1 elevator=noop fsck.repair=yes quiet rootwait logo.nologo cgroup_enable=cpuset isolcpus=0,1,2 xenomai.timerfreq=19200000 xenomai.sysheap_size=2048 xenomai.supported_cpus=0x00000002 rcu_nocbs=2 rcutree.rcu_fanout_leaf=4 snd_soc_bcm2835_i2s.dma_burst_length=8 snd_soc_bcm2835_i2s.tx_req_level=0 snd_soc_bcm2835_i2s.tx_sig_level=52 raspberrypi.throttled_poll_sec=0 ipv6.disable=1
    
  • sunamotoさん

    さっそくご確認くださりありがとうございました。
    ちゃんと動きました~♪

    mgroovy

  • ラズパイへのsshログイン時のnanoのシンタックスハイライティングを改良する

    いわゆるunix使いとしてはvimが最適なのですが、私のように中途半端なレベルの場合は基本的なエディタであるnanoが結構使いやすいんですよね。
    (vimの場合はカーソル移動がめんどくさい。)
     ただ、nanoでHTMLファイルを編集する場合、現状のシンタックスハイライティング(開いたファイルの文法を元に文字色を変更してくれる便利な機能)の設定は青で表記されて全然文字が見えない(背景色黒の場合)。
    というわけで、今回はnanoのシンタックスハイライティング設定の追加・変更方法についてお送りします。

    ・シンタックスハイライティング設定の保存場所
     /usr/share/nano になります。
     root権限でしかファイルの編集が出来ませんので、sudoコマンドを使用する必要があります。

    ・現状の定義を書き換えたい
     以下、私の目的であるhtmlの定義を書き換えする方法について説明します。
     1. シンタックスハイライティング設定のダウンロード
      scopatz氏が提供する以下のサイトからhtml.nanorcをダウンロードします。
      ファイルまるごと定義をすべてダウンロードする場合は「Clone or download」ボタンクリック後に表示されるダイアログ下部の「Download ZIP」リンクでZIPファイルをダウンロードしてラズパイに転送する形が良いですが、特定のファイルのみ書き換えたい場合は以下のとおり行います。
      (a).ダウンロードしたいファイル名をクリック
       この場合はhtml.nanorcになります。
      (b).html.nanorcの中身が表示されたら、上部右の「Raw」ボタンをクリック。
       これで、先に表示されたhtml.nanorcの中身がそのまま生ファイルとして表示されます。
      (c).クリップボードにhtml.nanorcの中身を複写
     2.ラズパイのsshログインで以下のコマンドを入力

    cd /usr/share/nano
    sudo mv html.nanorc html.nanorc.org
    sudo touch html.nanorc
    sudo nano html.nanorc
    

    この状態で、nanoでhtml.nanorcが編集状態になっていると思いますので、先にクリップボードで複写した内容をターミナルソフトで貼り付けします。
    (windowsのteratermを例に挙げると、マウスボタンの右クリックで貼り付け出来るはずです。)
    内容が複写された後、html.nanorcの内容を保存してください。
     3.最後のもうひと手間
      この状態でもシンタックスハイライティングは動作しますが、
     実はsymphonic-mpdにインストールされているnanoのバージョンが古く、
     htmlファイルを開くたびに警告が表示されますので

    #magic "HTML document"
    #comment "<!--|-->"
    

    のように4,5行目の行頭に#を付けてコメントアウトして下さい。

    ・他の拡張子のファイルでもシンタックスハイライティングを有効化したい
     .conf, .jsonなどはsymphonic-mpdを触る際に直接nanoで編集する可能性があるかと思います。
     この場合、先述の通りconf.nanorcとjson.nanorcをダウンロードして/usr/share/nanoに保存しておく必要があります。
     また、新しい.nanorcファイルを保存しただけではシンタックスハイライティングは動作しません。
     /etc/nanorcを編集しinclude "/usr/share/nano/conf.nanorc"(conf.nanorcを追加する場合)と末尾にでも入力する必要があります。
    また、先に説明したハイライティング動作時に警告が表示される場合の当該行コメントアウトはものによっていは必要になりますので対応してください。