MPD on Cubox(24)
随分間が空いてしまいましたが、前回の続きです。グラフと見比べながら、お読みください。
まず、グラフの説明ですが、最初の二枚はカーネル別のcpu負荷の比較です。y軸のメモリは%表示の負荷状況。x軸は時系列に並べたサンプルで、後半(34番以降)部分が3.10.10-rt7で、同じデータです。前半(1番から30番まで)は一枚目がrtカーネル同士の比較で、3.8.11-rt8との比較。二枚目はnone-RTカーネルとの比較で前半部分は3.10.10-Preempltです。番号は10秒おきの状態を意味します。
グラフは面表示の積み上げグラフとなっていて右側に注釈があるように、青い部分がユーザ処理(%user)のcpu負荷、赤い部分がシステム処理(%system)のcpu負荷です(あと値が小さいので見えませんが、黄色い部分はiowaitのcpu負荷)。sarのデータでは以下のように表示されます。
07:23:11 PM CPU %user %nice %system %iowait %steal %idle 07:23:21 PM all 2.97 0.00 9.13 0.00 0.00 87.90 07:23:31 PM all 2.87 0.00 9.13 0.00 0.00 88.00 07:23:41 PM all 5.21 0.00 9.57 0.00 0.00 85.21 ・・・
%niceと%stealは全て0なので省略。また%idleは 100 - %user - %system - %iowait となるので、省略しました。
次に三枚目のグラフですが三つのカーネルのロードアベレージを比較したもの。「ロードアベレージって何じゃ」という方はリンク先を参照して下さい。cpu負荷との関係も説明していて、なかなか参考になります。
y軸がロードアベレージの数値で実行待ち状態にあるプロセスの数です。サーバの管理では、この値が1.0を超えると確実に待たされているプロセスが存在することになるので、システムのチューニングが必要と言われています。ただし、音楽用サーバの場合は待たされてもかまわないプロセスは存在するので、適切にrt処理が行われていれば、すぐに問題になるということはないようです。 x軸は三つのカーネルを比較のため時系列に並べたものです。こちらは折れ線グラフでロードアベレージの遷移状況を表示しています。三つの折れ線はそれぞれ画面右側の注釈にあるように、青の線が直近一分間の平均待ち数、赤い線が直近五分間の平均待ち数、黄色い線が直近十五分間の平均待ち数となります。
これもsarのサンプルを示すとこんな具合になります。
07:23:11 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 07:23:21 PM 0 79 0.75 0.55 0.24 0 07:23:31 PM 0 79 0.63 0.53 0.23 0 07:23:41 PM 0 79 0.53 0.51 0.23 0 ・・・
cpu負荷もそうですが、ご覧のようにtopで先頭部分に表示されるデータと同じものです。
また、cpu負荷のグラフとロードアベージのグラフは同じタイミングでとられたデータです。
以上で長い前段の解説は終わりで、ここからが内容の分析です。しかし、本論に入る前にrtカーネルについてすこし寄り道。
rtカーネルが音楽再生にどういう具合に機能するかという件についてはこの記事を参照して下さい。rtoptの紹介時に書いた記事ですが、現時点でも有効です。ちょっと長いですが、この内容を理解しないと、以降の説明の意味が分からないと思います。また、最新の優先度の設定についてはこの記事を参照して下さい。
また、syuさんに教えて頂きましたが、このサイトの記述はrtカーネルの理解に陥りがちな誤解を解消するのに有効だと思います。是非ご一読を(リンク先ではrtパッチをRT-Preemptパッチと呼び、コンフィグで Basic RT または RT を指定してビルドしたカーネルをRT-Preemptカーネルと呼んでいますが、preempt指定((Low-Latency Desktop)のカーネルと紛らわしいので、ここではrtパッチ、rtカーネルと記述します)。
さて以上のリンク先の記述を前提に内容の分析です。
リンク先でも記述されているように、rtカーネルという仕組みはプロセス(スレッド)の優先度に合わせてコンテキストスイッチを繰り返し行い、プロセスを頻繁に切り替えることになるので、通常のカーネルよりcpu負荷は高くなります(コンテキストスイッチとは何かについてはリンク先を参照して下さい)。一番目と二番目のグラフの左半分を比較すると3.10.10_PREEMPTが3.8.11-rt8よりcpu負荷が低いのはこれが理由です。二つを比較すると青いユーザ処理の部分はほぼ同じですが、赤いシステム処理の部分は3.8.11-rt8の方が多少大きくなっていることが分かります。rtカーネルの走行はシステム処理としてカウントされるので、こういう結果になるのだと思います。
問題なのは二つのグラフの右半分の3.10.10-rt7で青いユーザ処理の部分は左半分と同じなのに、赤い部分は3.8.11-rt8と比較しても以上に大きいこと。これが、3.8.13以降のrtパッチの問題点を現しています。推測ですが、この異常な状態がrtカーネルの場合だけ問題を発生させているのだと思います。
次にロードアベレージに関して三つのカーネルを比較したのが三番目のグラフです。こちらもcpu負荷と同じでrtカーネルの方が高い値になります。面白いのはrtカーネルの方が大きく変動することですね。ギザギザ型の上がり下がりを繰り返すということになります。理由はデコード処理など優先レベル低く、時間のかかる処理が待たされやすいからだと思います。
3.8.11-rt8と3.10.10-rt7でグラフの形に多少の差がありますが、これは時系列での偶然でたまたまそうなったように見えます。
この問題、armだけだと思っていましたが、intelアーキテクチャでも同じだったのですね。 New alixを試していて知りました。3.10rtカーネルで発生していて、3.12でも解決していないようです。bbbで確認したところでは3.12.6ではかなり改善されていたのですが 、New alixでは違いはないので、わけが分からん状態ですね。
(PC_Audio) 2014/01/26
MPD on Cubox(23)
公開したカーネル3.10の問題点について、もうすこし解説します。
カーネル3.10のrtパッチのレベルダウンについては「MPD on Cubox(21)」で紹介しましたが、最新のrtパッチにしても、dsd再生で中断するというバグは解消できません。原因はカーネル3.8.13以降のrtパッチでネットワーク(or USB)関連のrt化機能の動作が不安定になっているためだと思います。
僕の環境(aitlabo社のdac、ddc部分はUDA3)でのdsd再生の中断ですが、中断したあと見かけは再生が継続しているように見えます。この状態で一旦再生をストップさせ、再開すると何も無かったように再生をはじめることができます。dacの再生状態の表示は正常時にはdsdと表示され、再生中断中はI2S 172KHz(172KHzのwavデータの再生中という意味です)と表示されます。再開するとdsdに戻ります。
再生中断する場所はランダムでどこで止まるかは一定しません。また、再生中断中もデータの転送は行われているようで、cpu負荷や動いているプロセスに変わりはありません。再生中断が発生する確率は接続するnasの種類や接続方法(cifsかnfsか)などでコロコロ変わります。
なぜこのような不思議なトラブルが発生するかですが、カーネルを比較して調べてみました。調べたカーネルは 3.10.10-rt7、Linux 3.8.11-rt8、3.10.10_PREEMPTの三つ。cpu負荷とロードアベレージを比較してみました。cpu負荷とロードアベレージを選んだ理由は、topで眺めていたら、カーネル毎にかなり差があるなと分かったからです。
topでは履歴の管理が難しいので、調査にはsysstatというツールを使いました。公開しているイメージには入っていないので、インストールする必要があります。
archの場合 pacman -Sy sysstat debianの場合 apt-get install sysstat
実行時に -o オプションで保存ファイルを指定でき、-uq と指定すれば、実行中のcpu負荷とロードアベレージの情報を保存できます。結果は -f オプションで保存ファイルを指定し、テキストファイルにおとせます。
sar -uq -o data.file 10 30 > /dev/null & sar -uq -f data.file > data.txt nano data.txt
「10 30」というのはデータを取得する間隔と回数の指定です。例では、10秒毎に30回データを取得します。
このツールサーバ管理者には必携のしろもののようでibmとoracleのサイトに詳しい使い方が紹介されています。
またテキストファイルに出力された内容の意味についてはこのサイトに詳しく解説しています。使い方とまとめたこのページ)も便利ですね。
以上有意義な情報を公開されているサイトに感謝です。
測定方法ですが、2.8M 5分位のdiffファイルをmpdのリピート機能を使い連続再生しながら、上記のように10秒毎に30回のcpu負荷とロードアベレージのデータを取得する方法をとりました。カーネルを切り替える以外の測定条件は全て同じです。archで起動しています。mpdはrtopt無しのmpd-dsdを使い、rt優先度の設定は公開したアップデートのままです(mpdのスレッド毎の優先度は設定されることになります)。
結果をOpenOfficeのCalcを使い、編集したものです。
まず、rtカーネル同士のcpu負荷の比較
次に3.10.10のpreemptカーネルとrtカーネルの比較
最後に三つのロードアベレージの比較
画面上をクリックすると拡大することができます。
いかがですか ? 一目瞭然。「3.10.10-rt7って問題ありだなぁ」と分かるグラフじゃないかなと思います。長くなったので、詳しくは次回にまわしますが、上の二つのグラフで右半分と左半分を比較すると、右半分が異常に赤の面積が大きいことに気が付かれると思います。これはrtカーネルが暴走していることの証拠です。
(PC_Audio) 2013/10/20
MPD on Cubox(22)
前回に続き、梅雨入り版をカーネル3.10に対応させるtarボール(xz圧縮)のdebian版を公開します。
tarボールの中味は以下の通りです。
root@(cubox):~# tar -Jcvf /data/cu-rainy-debian.tar.xz /root/mpdcubox/dsd* /etc/mpd* /etc/init.d/mpdset.conf /usr/local/sbin/rtkworker.sh /usr/local/sbin/selboot /usr/local/sbin/selmpd /usr/local/bin/mpd /root/rtopt.scr tar: メンバ名から先頭の `/' を取り除きます /root/mpdcubox/dsd/ /root/mpdcubox/dsd/mpd /root/mpdcubox/dsdy/ /root/mpdcubox/dsdy/mpd /etc/mpd.conf /etc/mpd0.conf /etc/mpd1.conf /etc/init.d/mpdset.conf /usr/local/sbin/rtkworker.sh /usr/local/sbin/selboot /usr/local/sbin/selmpd /usr/local/bin/mpd /root/rtopt.scr
debian用のdsd/mpdとdsdy/mpdと、debian対応のスクリプトの修正、追加分からなります。3.10カーネルはarch用のtarボールでインストールしておいて下さい(共通に使います)。
インストール方法は以下の通りです。
ログインプロンプトがroot@(cubox):~#でない場合 selpart d drbian側rootでログイン ------------------------- cd / wget -Ocu-rainy-debian.tar.xz http://mimizukobo.sakura.ne.jp/cgi-bin/downlog.cgi\?edata/cu-rainy-debian.tar.xz tar -Jxvf cu-rainy-debian.tar.xz rbt
archより簡単にできます。
使い方はarchと同じなので省略します。
(PC_Audio) 2013/10/13
MPD on Cubox(21)
梅雨入り版をカーネル3.10に対応させるtarボール(xz圧縮)を公開します。
とりあえずarch側のみです。尚、詳細は後述しますが、linuxカーネル3.10のrtパッチにはまだ問題が残っています。at your own risk でお使いください。
また、今回アップロードした内容に関して、掲示板でいろいろな方から貴重なアドバイスを頂戴しました。お名前は省略しますが、お礼申し上げます。
tarボールの中味は以下の通りです。
[root@cubox ~]# tar -Jcvf /data/cu-rainy-arch.tar.xz /media/build_files/uImage-24-* /media/build_files/uImage-26-* /root/mpdcubox/dsd* /etc/init.d/mpdset.conf /usr/local/sbin/selboot /usr/local/sbin/rtkworker.sh /usr/local/sbin/selmpd /usr/lib/systemd/system/rtkworker.service /root/rtopt.scr tar: Removing leading `/' from member names /media/build_files/uImage-24-CFQ /media/build_files/uImage-24-Deadline /media/build_files/uImage-24-Noop /media/build_files/uImage-26-CFQ /media/build_files/uImage-26-Deadline /media/build_files/uImage-26-Noop /root/mpdcubox/dsd/ /root/mpdcubox/dsd/mpd /root/mpdcubox/dsdy/ /root/mpdcubox/dsdy/mpd /etc/init.d/mpdset.conf /usr/local/sbin/selboot /usr/local/sbin/rtkworker.sh /usr/local/sbin/selmpd /usr/lib/systemd/system/rtkworker.service /root/rtopt.scr
uImage-24-は3.10.10、uImage-26-は3.10.10+rt7、dsd/mpdとdsdy/mpdはmpdのdsd対応の作者Jurgenさんが作成された私家版のmpd(中味は0.17.5+α、dsdyはrtoptパッチ適用版)、その他は MPD on Cubox対応のスクリプトの修正、追加分です。
インストール方法は以下の通りです。
ログインプロンプトが\[root@cubox ~\]#でない場合 selpart a arch側rootでログイン ------------------------- pacman -Syy pacman -S libsoup cd / wget -Ocu-rainy-arch.tar.xz http://mimizukobo.sakura.ne.jp/cgi-bin/downlog.cgi\?edata/cu-rainy-arch.tar.xz tar -Jxvf cu-rainy-arch.tar.xz systemctl --system daemon-reload systemctl enable /usr/lib/systemd/system/rtkworker.service systemctl start rtkworker.service & rbt
当たり前ですが、ルートへのディレクトリ変更(cd /)を忘れると、上手くいきませんので、ご注意下さい。wgetの-Oオプションは指定しないとファイル名が変になります。libsoupのインストールはarchがローリング・リリースしているために必要になったようです。pacmanの-Syyでの更新もそのために必要なようです。rtkworker.serviceはバックグラウンドで起動しないと無限ループに嵌まることになります。
というところで、Arch Linux 罠だらけ。嵌まるとどうなるかよく分かりませんが、ご健闘をお祈りします。
インストール後のディフォルトのカーネルは3.10.10+rt7、mpdはdsd/mpd(rtopt無、ただし /etc/init.d/mpdset.confで/root/rtopt.scrを使いrt優先度の設定は行っています)に設定されています。
カーネルとmpdの切替は以下の通りです。
selboot [24-CFQ|24-Deadline|24-Noop|26-CFQ|26-Deadline|26-Noop] selmpd [dsd|dsdy]
なお、3.8以前のカーネルや正規版のmpdも残っていますので、selboot、selmpdで切り替えることは可能です。ただし、3.6以前のカーネルではスクリプトが対応していない部分がありますので、ご注意ください。
さて、3.10カーネルの問題点です。
掲示板でやりとりされていますが、linuxカーネルのrtパッチに関しては3.8.13位からレベルダウンし、
- full rtでビルドできない
- 起動できない
- ハイレソ/dsd再生でmpdがハングする
- ハイレソデータの再生でノイズがのりやすい
- dsd再生が中断する
というようなトラブルが発生しています。原因はrtカーネルだとUSBのhigh speed転送にレベルダウンが起きているためのようです。このため梅雨入り版では3.8.11+rt11を最終版にしました。
その後、カーネルは3.10にバージョンが上がっていますが、rtパッチのこのトラブルを引きずったままでした。
ただ、最近の3.10.9+rt5以降ではノイズと再生中断以外のトラブルは解決されているようです。また、ノイズと再生中断の件もrt優先レベルの調整で発生しないようにすることはできることが分かりました。
以上の詳細は以下のリンク(掲示板)を参照して下さい。
- 3.8.13のレベルダウン
- rtカーネルのレベルダウン
- dsd再生中断に対応するためのrt優先レベルの調整 このスレッドはBBBの話題ですが、リンク先のcuboxの優先度についてです
内容を要約すると、カーネル3.10系列へのレベルアップのポイントは
- 3.10.9-rt5以上を使うこと
- rtoptパッチをかけていないmpdを使うか、rt優先レベルの調整を適切に行うこと
です。二つ目はrtoptパッチをかけないとrt優先レベルが設定されないので、調整したのと同じことになるという意味です。これでハイレソデータやdsd再生は問題なく行えるようになります。
10/07 20:30 追記
tarボールを作り間違えていたので、差し替えました。
/media/boot/uImage、/etc/mpd*、/usr/local/bin/mpdを入れ忘れたので、古い版ではカーネルとmpdのディフォルトが変更されません。また、selmpdがエラーになります。
ダウンロードされた方はやり直して下さい。
(PC_Audio) 2013/10/05
サルでも作れる MPD on Arch Linux(3)
今回は公開したイメージのarch linux部分をどのように作成したかを紹介します。
まず、定番の初期設定です。
pacman -Syy パッケージリストの更新 pacman -Syu パッケージのアップグレード timedatectl status timedatectl set-timezone Asia/Tokyo 日時を日本に passwd パスワードをcuboxに変更
日本語化(これはグローバル対応のため、省略しています)とロケール設定についてはここを参照。
nano /etc/locale.gen 日本語化 ja_JP.UTF-8 UTF-8 locale-gen localectl set-locale LANG="ja_JP.UTF-8"
次にネットワークをホスト名でアクセスできるように、必要はパッケージをインストールします。AvahiとActive_Directoryをインストールすることになります。このページとこのページの情報を参考にしました。
まず、Avahi。
pacman -S avahi nss-mdns systemctl enable avahi-daemon.service systemctl start avahi-daemon.service nano /etc/hosts 127.0.0.1 localhost cubox 127.0.1.1 cubox 127.0.1.1の設定は問題を起こすことがあるようなので、その場合はコメントアウトして下さい ipv6設定のコメントアウト #::1 localhost.localdomain localhost nano /etc/hostname alarmcuboxという行を削除して cubox nano /etc/nsswitch.conf hosts: files wins dns mdns4_minimal [NOTFOUND=return] mdns4
次にActive_Directory。
pacman -S samba cp /etc/samba/smb.conf.default /etc/samba/smb.conf nano /etc/samba/smb.conf ; workgroup = MYGROUP ; server string = Samba Server ; load printers = yes wins support = yes wins supportだけを有効にします
smbd.serviceは自動的に設定されるようなので、「systemctl start smbd.service」は不要です。
次にmpd関連で必要なモジュールをインストール。nfs-utilsについてはこのページの情報にお世話になりました。
pacman -S cifs-utils nfs-utils ntfs-3g pacman -S alsa-plugins alsa-utils alsaplayer pacman -S gnome-alsamixer pacman -S mpd mpc ncmpc
後は、前回又は前々回のオリジナルのmpd.serviceを使うという方法でもよいのですが、debianhfとマルチブートにしているので、なるべく二つのrootfsで同じスクリプトを使いたいと考え、mpdを独自の方法で起動することにしました。具体的にはarch側に/etc/init.d(debian側でブート時に呼び出されるスクリプトを置く)ディレクトリを作成し、mpdset.confというmpdをdeamon起動するスクリプトを置くという方法をとりました。
ちょっと長くなりますが、/etc/init.d/mpdset.confの内容です。
#!/bin/sh ### BEGIN INIT INFO # Provides: mpd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Set mpd at boot time # Description: Set mpd at boot time ### END INIT INFO mpd_start () { mkdir /tmp/mpd cp /etc/mpd.conf /tmp/mpd/ cp /var/lib/mpd/tag_cache /tmp/mpd/ cp /var/lib/mpd/state /tmp/mpd/ cp /var/lib/mpd/sticker.sql /tmp/mpd/ touch -r /var/lib/mpd/tag_cache /tmpmpd//tag_cache touch -r /var/lib/mpd/state /tmp/mpd/state touch -r /var/lib/mpd/sticker.sql /tmp/mpd/sticker.sql chmod -R 766 /tmp/mpd chown -R mpd:audio /tmp/mpd if uname -r|egrep "3\.8\." > /dev/null; then sed -i "s/\(device[\t ]\+\"hw:\)1/\10/" /tmp/mpd/mpd.conf else sed -i "s/\(device[\t ]\+\"hw:\)0/\11/" /tmp/mpd/mpd.conf fi /usr/local/bin/mpd /tmp/mpd/mpd.conf echo timer > /sys/class/leds/Power/trigger chrt -f -p 54 `pgrep irq/24-ehci_hcd` chrt -f -p 55 `pgrep irq/29-eth0` /usr/local/sbin/cifs.sh mount /dev/mmcblk0p1 /media echo "mpd start" } mpd_stop () { echo none > /sys/class/leds/Power/trigger if [ ! -e /var/lib/mpd/tag_cache ] || [ /tmp/mpd/tag_cache -nt /var/lib/mpd/tag_cache ] then cp /tmp/mpd/tag_cache /var/lib/mpd/ echo "new tag" fi if [ ! -e /var/lib/mpd/state ] || [ /tmp/mpd/state -nt /var/lib/mpd/state ] then cp /tmp/mpd/state /var/lib/mpd/ echo "new state" fi if [ ! -e /var/lib/mpd/sticker.sql ] || [ /tmp/mpd/sticker.sql -nt /var/lib/mpd/sticker.sql ] then cp /tmp/mpd/sticker.sql /var/lib/mpd/ echo "new sticker.sql" fi echo "mpd stop" } case "$1" in start) mpd_start ;; stop) mpd_stop ;; *) echo "Usage: $0 {start|stop}" exit 2 ;; esac
要するに以前のバージョンでrtset.confとshmset.confの内容を一つにまとめ、ついでにmpdの起動とled表示を行っているということです。これをdebianではこのページに書いた方法で起動させ、archでは/usr/lib/systemd/system/mpd.serviceから起動しています。書き換えたmpd.serviceは以下の内容です。
[Unit] Description=Music Player Daemon After=network.target sound.target Before=shutdown.target poweroff.target reboot.target [Service] Type=oneshot ExecStart=/etc/init.d/mpdset.conf start ExecStop=/etc/init.d/mpdset.conf stop RemainAfterExit=yes [Install] WantedBy=multi-user.target
全体的には見通しの良い構造に出来たかなと思います。mpd.serviceとmpdset.confの組み込みの操作方法は以下の通りです。
nano /etc/init.d/mpdset.conf 上記内容を編集 nano /usr/lib/systemd/system/mpd.service 上記内容を編集 nano /usr/local/sbin/cifs.sh #!/bin/sh sleep 10s chrt -f -p 53 `pgrep -n cifsd` chrt -f -p 53 `pgrep -o cifsd` 以上の内容を編集(cifsd起動のタイミングでこのように分離しないと上手くいかない) chmod +x /etc/init.d/mpdset.conf /usr/local/sbin/cifs.sh systemctl stop mpd.service systemctl disable mpd.service systemctl --system daemon-reload systemctl enable mpd.service systemctl start mpd.service
掲示板でt-taさんからシリアル接続するには以下のサービスを停止、削除する必要があるよと教えて頂きました。
systemctl stop serial-getty-fterm@ttyS0.service systemctl disable serial-getty-fterm@ttyS0.service
hiface対応のドライバを登録します。
modprobe snd-usb-hiface
最後に、リブートとパワーオフ用のコマンドを登録します。
nano profile alias rbt="systemctl reboot" alias pof="systemctl poweroff"
(PC_Audio) 2013/08/31
サルでも作れる MPD on Arch Linux(2)
前回、archのリポジトリからMPDをインストールし、動かす方法を紹介しましたが、今回はrtoptパッチをかけ、組み込む方法を解説します。
MPDのビルド方法はdebianなどと基本的には同じです。問題はビルドするためにインストールする必要のあるパッケージを用意することです。MPDをインストールすることによってビルドに必要な個別ライブラリはインストールされるので、開発用のパッケージだけインストールすればいいです。
pacman -S git make autoconf automake libtool pkg-config patch
これでOKです。あとはdebianなどでのビルドと同じ手順で対応できます。最新のgitであれば、
git clone git://git.musicpd.org/master/mpd.git cd mpd patch -p1 < ../mpd-rtopt-20130203.diff patch -p1 < ../mpd-dsdbugfix-20130203.diff nano ../my-config 最終行「CC=gcc-4.4 CXX=g++-4.4 CFLAGS="-O2"」を削除 pkill mpd ./autogen.sh sh ../my-config make && make install
0.17.4であれば、
wget http://www.musicpd.org/download/mpd/0.17/mpd-0.17.4.tar.xz tar -Jxvf mpd-0.17.4.tar.xz cd mpd-0.17.4 patch -p1 < ../mpd-0.17git-20120226rtopt.diff patch -p1 < ../buffer.c.diff 以降はgit版と同じ
archのgccは最新のmulti-arch対応なので、gccのバージョンの違いを設定する必要はなくなっているようです。という次第なので、個別ライブラリを組み込む必要がなく、gccのバージョンを意識する必要がないので、debianなどよりこちらの方がビルドは簡単ですね。
さて問題はここからです。arch linuxのmpd起動の方式はdebianとはまったく別ですので、/etc/default/mpdでバイナイリの置き場所を指定する方法が使えません。systemdのmpd.serviceを変更することになります。これもsystemdの変更の仕方だけの問題ですので、分かってしまえば簡単です。まさに「サルでも出来る」レベル(^^;;;。
systemctl stop mpd.service nano /usr/lib/systemd/system/mpd.service ExecStart=/usr/bin/mpd --no-daemon という行があるので ExecStart=/usr/local/bin/mpd --no-daemon /etc/mpd.conf と変更 systemctl daemon-reload systemctl start mpdsave.service
mpdの起動はExecStart文で指定されているので、/usr/local/bin/に変更。合わせて定義ファイルの置き場所(/etc/mpd.conf)を明示するということです。
「systemctl daemon-reload」はserviceファイルを変更した場合の再ロードのため必要です。
(PC_Audio) 2013/08/25
サルでも作れる MPD on Arch Linux
タイトルを読んで、気を悪くされた方もいらっしゃると思いますが、ごめんなさい。サルとは僕のことです。
arch Linux については、ここ(日本の総本山のトップ)を参照して下さい。ubuntuが「サルでも使えるLinux」を設計コンセンプトにして開発されているのに対して、「Linuxオタクにしか使えないLinux」を設計コンセプトとして、サルには近寄りがたいディストリビューションです。専門家からみるとシンプルで美しい構成なのが人気なようです。オーディオ的にも、シンプルな作りは音によさそうです。「僕のようなサルには縁はないなぁ」と思い手を出さなかったのですが、これをrootfsにすれば音が良くなるのではないかと考え、無謀(^^;;;にも試してみました。
驚きましたね。タイトル通りに意外に簡単です。
arch linuxシステムの作成
まずcubox用のarch linuxの在り処ですが、ここにあります。リンク先はarm用のarch linuxを公開しているサイトのcubox用のページですが、上のメニューから他のハード対応のarch linuxも選択できます。ほとんどのarm機種をカバーしているのが凄いです。
さて、このInstallationというページから、タールボールをダウンロードします。
arch linuxの特徴の一つはローリング・リリースであることです。従って、タールボールの名前もArchLinuxARM-cubox-latest.tar.gzとなります。常に最新版を追っかけるということですね。
インストールはページの指示通り行えば問題なく出来ます。インストールの仕方は簡単ですが、何らかのlinux環境が必要です。空のマイクロsdカード(2GB以上のもの)をセットし、そこにarch linuxのシステムを作成します。
以下は僕のVmwarePlayerのubuntu 12.4環境での操作例です。
wget http://archlinuxarm.org/os/ArchLinuxARM-cubox-latest.tar.gz sudo fdisk /dev/sdb n -> 全てディフォルトを選択 -> w mkfs.ext3 /dev/sdb1 sudo mkdir /media/rootfs sudo mount /dev/sdb1 /media/rootfs sudo tar xf ArchLinuxARM-cubox-latest.tar.gz -C /media/rootfs sudo umount /media/rootfs
これでシステムの作成は完了しました。カードをcuboxに差し、電源を入れます。
MPDを組み込み
以下の作業はssh接続で行うのが簡単です。cubox用のarch linuxはディフォルトの設定でsshがオンになっているのですが、そのままではホスト名での接続はできないので、最初だけシリアルで接続し、ログイン(ユーザ名=root、パスワード=root)し、ifconfigでipアドレスを確認。取得したipアドレスを使い、sshでログインしました。
必要なパッケージをインストールします。arch linuxの場合、パッケージの管理はpacmanというシステムで管理されています。pacmanについてはこのページを参照。
パッケージリストの更新 pacman -Syy 必要なバッケージのインストール(nasがcifsならば、cifs-utilsだけでOK) pacman -S cifs-utils nfs-utils ntfs-3g pacman -S alsa-plugins alsa-utils alsaplayer パッケージの更新(これをやらないと次のmpdのインストールが出来ません) pacman -Syu pacman -S mpd mpc ncmpc
これでインストールが完了しました。
MPDのセットアップ
arch linuxはdebianやubuntuのようにmpdをインストールすれば直ぐ起動されて、使えるようにはなっていません。セットアップは全て自力で行う必要があります。詳しい解説はこのページにあります。
簡単なのはVoyageMPDなど他で使っている/etc/mpd.confを持ってきて、それに環境を合わせるというやり方です。
ここではsambaサーバ(/public)に置いてあるcubox用のmpd.confを使い、mpdをセットアップする方法を紹介します。
マウントポイントなど必要なディレクトリを作成 mkdir /var/lib/mpd/music mkdir /music /publicをマウント nano /etc/fstab 以下の行を追加 //192.168.nnn.nnn/public /music cifs username=xxx,password=xxx,sec=ntlm,uid=mpd,file_mode=0666,dir_mode=0766,iocharset=utf8,rsize=130048,wsize=4096 0 0 sec=ntlmはカーネルを3.8にした場合は必要 mount -a cp /music/mpd.conf /etc/ ln -s /music/ /var/lib/mpd/music/ chown -R mpd:audio /var/lib/mpd/ systemctl enable mpd.service systemctl start mpd.service
最後のmpdの起動をsystemctlで行うこと以外はdebianと一緒です。案外簡単でしょ。
systemctlというのはsytemdのコマンドですが、詳しくはこちらを参照して下さい。
結局、arch linuxがubuntu、debianと大きくことなるのはパッケージの管理がpacmanであることとsystemdでアプリケーションの起動停止をコントロールしている二点だけです。それ以外は同じlinuxですので、大きな差はありません。
このarch linuxシステムは/bootに起動用のカーネル(uImage)があります。従ってこれを入れ換えることで、3.8にレベルアップさせることが可能です。
(PC_Audio) 2013/08/18
NFSのすゝめ
今回も掲示板で話題になった内容をベースにします。こことこことここに関連するやりとりがあります。おつき合いいただいたtinkerさん、なかなかさん、Kevinさんに感謝です。
音楽用のデータの置き場所として、nfsはcifsと比較すると負荷が低く(音楽再生には好条件となります)、接続が簡単なので、お勧めです。Windowsユーザにはnasといえば cifsというのが一般的ですが、linux環境があれば、nfsが簡単に使えます。「linux環境なんてないよ」とおっしゃるかもしれませんが、VoyageMPDが動いているマシンがあれば、立派なlinux環境です。これにusb接続でハードディスクを繫げば、nfsで動くnasの出来上がりとなります。
やり方は以下の通りです。
まず、前提条件ですが
- Voyage MPDにusbディスク(/dev/sdb1)を接続し、nfsサーバを動かす
- このusbディスクをcuboxなど(ipアドレスが192.168.0.*)から共有する
とします。nfsサーバを動かすためにはカーネルのビルドでnfsサーバ機能が有効になっている必要があります。Voyageの場合この設定は有効になっているようなので、そのまま使えます。
mkdir /mnt/sdb apt-get install nfs-common nano /etc/fstab /dev/sdb1 /mnt/sdb vfat noatime 0 0 reboot nano /etc/exports /mnt/sdb 192.168.0.*(rw,no_subtree_check,all_squash,sync)
二行目の install nfs-common がサーバ機能をインストールするためのコマンド。4行目は接続したfat32のusb ディスクをマウントするためにfstabに追加する内容。最終行がこのusbディスクをnfsで共有するための設定です。 オプションの書式についてはこのページを参照。
次にクライアント側ですが
mkdir /data nano /etc/fstab voyage:/mnt/sdb /data nfs rw,noatime,rsize=65536,wsize=16384 0 0 mount -a
となります。 3行目がnfsクライアントがマウントするためのfstabに追加する内容です。
簡単でしょ。
nfsを使う場合、Windows側からの共有が出来なくなるという問題があります。しかし、nfsで使うusbディスクをcifsでも登録し、Windows側からはこちらでアクセスするという方法をとれば共有出来るようになります。僕はそうしています。
(PC_Audio) 2013/07/28
MPD on Android(6)
6月に公開したイメージの作り方を紹介します。
掲示板でtinkerさんに「a10で3.4.24+rtパッチが動くようだよ」と教えてもらい、試してみたら、案外簡単に動かすことができました。「MPD on Android」というタイトルで何回か書き込みしていますが、作成方法を書いたことはないので、自分用のメモに書き残しておきます。
Android SmartTV BOX でカーネルをビルドする時、大変なのはシリアルコンソールが繋げないことです。カーネルをビルドし、起動させてみるのですが、上手くいかないと、手も足も出ないハメになります。箱を空けて、半田鏝を振り回せば出来るようになるらしいのですが、とてもそんな器量はないので、諦め、「a10 linux kernel image」という様なキーワードでググり、めくらめっぽう起動してみるという方法をとってみる。しかし、なかなか動くイメージが見つからないですね(^^;;;。
そこで、1月に公開した版はPhoniciaさんが捜し出した作者(Toby Corkindaleさん)のイメージを使ったことを思い出しました。捜したら、Tobyさんが Cubieboard用に公開している3.4用のイメージが見つかりました。試してみたら、SmartTV BOX でも動きます(^^)。このbootパーティションをベースにすることにしました。
イメージはboot用とrootfs用の2パーティションで構成されていて、boot側にuImageが置いてあるのでこれを入れ換えればrtカーネルに変更できます。またrootfsはcubox用のarchに入れ換え問題なく動きます。
rtカーネルのビルドはこのページの案内通り行います。
カーネルソースはここにあるものを使います。ポイントはソースのレベルをcheckoutして、rtパッチのレベルに合わせることです。
git clone git://github.com/linux-sunxi/linux-sunxi/tree/sunxi-3.4 wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.4/older/patch-3.4.24-rt35.patch.bz2 cd sunxi-3.4 git checkout 35ca01b958b56492c2fac61b809c71584ab15791 bzcat ../patch-3.4.24-rt35.patch.bz2 | patch -p1
さて、上記の通りrtパッチをあてるとkernel/power/suspend.cとdrivers/misc/Makefileがリジェクトされます。これは手修正で直すしかありません。
kernel/power/suspend.cのリジェクトファイルの内容
./kernel/power/suspend.c.rej BUG_ON(!irqs_disabled()); + system_state = SYSTEM_SUSPEND;
ということなので、BUG_ON(!irqs_disabled()
BUG_ON(!irqs_disabled());
という行を捜して、その後に
system_state = SYSTEM_SUSPEND;
をインサートします。
drivers/misc/Makefileのリジェクトファイルの内容
./drivers/misc/Makefile.rej obj-$(CONFIG_MAX8997_MUIC) += max8997-muic.o +obj-$(CONFIG_HWLAT_DETECTOR) += hwlat_detector.o
これも同じ要領で
obj-$(CONFIG_MAX8997_MUIC) += max8997-muic.o
という行を捜して、その後に
obj-$(CONFIG_HWLAT_DETECTOR) += hwlat_detector.o
をインサートします。
あと上記リンク先に
In order to avoid the hard lockup that occurs in the kernel at this revision, we need to modify the aw_ccu.h file so that the system will boot with the mali drivers. In the future, this may not be necessary and it has been reported to the sunxi-linux kernel developers (https://github.com/linux-sunxi/linux-sunxi/issues/113).
と解説がありますので、
emacs arch/arm/mach-sun4i/include/mach/aw_ccu.h
USE_PLL6M_REPLACE_PLL4という行を捜して、(0)を(1)に修正します。
#define USE_PLL6M_REPLACE_PLL4 (1)
あとは通常のビルドと変わりません。このページにsunxi用のビルド方法の解説があります。
export ARCH=arm export CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- make clean make sun4i_defconfig make menuconfig make -j3 uImage mkdir ../sunxi-modules make -j3 modules INSTALL_MOD_PATH=../sunxi-modules/ make modules_install cd ../sunxi-modules/ tar czf ../sunxi-modules.tar.gz *
出来上がったuImageをbootパーティションにコピーして、カーネルの入れ換えは完了です。本来、モジュールの展開も行う必要がありますが、やってみると起動出来なくなので、止めました。
rootfsはcubox用のarchと入れ換えます。やり方はいろいろな方法があるので省略。
android用の修正は
ホスト名をandroidに sudo nano etc/hosts sudo nano etc/hostname mpdset.confの変更 sudo nano etc/init.d/mpdset.conf 関連する処理を全てコメントアウト 割り込みドライバ名の変更 irq/39-ehci_hcd irq/55-eth0 使わないスクリプトを削除 sudo rm etc/rc.local sudo rm usr/local/sbin/selboot sudo rm usr/local/sbin/led mpdconfの変更 機番とrtオプション sudo nano etc/mpd.conf build_filesの内容を入れ換え 起動後 パスワードをandroidに passwd
となります。
(PC_Audio) 2013/07/21
リアルタイム処理での優先レベルの設定について
この件(リアルタイム処理での優先レベルの設定について)は以前にyanさんのパッチに関連して書き込んだことがあります。cubox用、android用共に梅雨入り版イメージの優先レベルの設定に関して問題があり、ハイレソファイルの再生で音切れが発生することが分かりましたので(掲示板のこの情報とこの情報です)、改めて解説します。音楽再生とRTカーネルの内容については最初のリンク先をご参照ください。
よくある誤解ですが、「RTカーネルにすれば不要な処理待ちはなくなり、自動的に最適化される」というのは間違いです。RTカーネル方がシステム全体の効率を下げることがありますし、RT化されて動くプログラムの作りが悪いと問題を引き起こす可能性は高いです。
どういうことかというと、RTカーネルとは各プログラムに優先度付けをして、その優先度に従いプログラムの実行順序をコントロールする仕組みだからです。従って、高い優先度を割りつけられたプログラムが暴走し、ずっと動き続けると、他のプログラムが動けなくなるという現象が発生します。
梅雨入り版のイメージでハイレソファイルの再生で音切れが発生するというご報告を頂戴したのですが、この時起こっていた現象がこれです。以下、具体的に説明します。
音楽再生に関連してリアルタイム優先度を設定するプログラムは以下の通りです。
デバイスドライバ
デバイスドライバとは接続されているハードウェアの割込みの処理、誤り制御などを行うプログラムのことです。カーネル内に装置別に組み込まれ、動作します。音楽再生に関連するものとしてはusb関連のプログラムとlan関連のプログラムがあります。
[root@cubox ~]# cat /proc/interrupts CPU0 0: 13985 orion_irq orion_tick 7: 378 orion_irq serial 11: 0 orion_irq mv64xxx_i2c 24: 477474 orion_irq ehci_hcd:usb1 25: 0 orion_irq ehci_hcd:usb2 29: 10607 orion_irq eth0 30: 86 orion_irq mv643xx_eth 31: 0 orion_irq f1030000.crypto 35: 8739 orion_irq mmc0 39: 2 orion_irq f1060800.dma-engine 40: 2 orion_irq f1060800.dma-engine 42: 2 orion_irq f1060900.dma-engine 43: 2 orion_irq f1060900.dma-engine 62: 0 orion_irq sata_mv 76: 0 f10d0400.gpio mmc0 Err: 0
で調べることができます。cpu0という列の下の数字が割り込み回数です。上記の内容は演奏開始後5分位経過してとったものですが、usb1が47万回、eth0(lan)が1万回割り込み処理が発生していることが分かります。
従ってこの二つ(ehci_hcd:usb1、eth0)のドライバの優先レベルをどのように設定するかがポイントとなります。
音楽再生関連のソフトウェア
yanさんのrtoptパッチをかけたmpdを使っている場合、mpdのプロセス単位に優先レベルを設定できます(詳細は最初のリンク先の記事を参照して下さい)。
nasクライアイント
nasを使っている場合はnasのファイルシステムに対応するクライアントの優先レベルを設定する必要があります。この場合、使用するnasのファイルシステムにより対応するクライアントが変わりますのでご注意下さい。cifsの場合はcifsd、nfsの場合はnfsv4.0となります。
以上の優先レベルは
[root@cubox ~]# ps -eLo pid,lwp,rtprio,priority,cmd .... 64 64 54 -55 [irq/24-ehci_hcd] .... 216 216 55 -56 [irq/29-eth0] .... 306 306 - 20 [nfsv4.0-svc] 328 328 53 -54 [cifsd] .... 361 365 52 -53 /usr/local/bin/mpd /tmp/mpd/mpd.conf 361 366 49 -50 /usr/local/bin/mpd /tmp/mpd/mpd.conf 361 367 54 -55 /usr/local/bin/mpd /tmp/mpd/mpd.conf
で確認できます。上の二つはデバイスドライバ、真ん中の二行はnfsとcifsクライアント、終わりの3行がmpd関連のプロセスとなります。リアルタイムの優先度は3列目に表示(rtprio)されます。
さて上記は梅雨入り版のディフォルトの設定内容ですが、どこがまずかったかというと最終行の
361 367 54 -55 /usr/local/bin/mpd /tmp/mpd/mpd.conf
です。これはmpd-outputプロセスの優先度ですが、雛祭り版以前では「53 -54」だったのを一つ上げてしまいました。この結果、最初の行のusb2のデバイスドライバ
64 64 54 -55 [irq/24-ehci_hcd]
と同じになってしまった。このため、mpd-outputに時間のかかる処理が入り込むと音源にデータを送り出すusb2の処理が行えなくなり、音切れを発生させたということです。
修正方法
優先レベルの設定を行っているファイルを修正します。設定ファイルは以下の通りです。
- デバイスドライバ
- /etc/init.d/mpdset.conf
- mpd関連プロセス
- /etc/mpd.conf
- nasクライアント
- /usr/local/sbin/cifs.sh
各ファイルの修正の仕方ですが、デバイスドライバとnasクライアントは chrt、mpd関連プロセスは priorityの優先レベルを変更すればいいです。詳しくは最初のリンク先をご覧下さい。
終わりにちょっと脱線します。
BeagleBone Blackという新しいSoCを使いはじめていますが、この機械、RTカーネルで動かすと、とても動作がシビアですね。理由はusb2接続をpio転送でデータのやりとりを行っているためのようです。rtカーネルにするとcpu負荷が通常時(preempt)の3倍位になり、ハイレゾデータの再生では20%を超えます。このためrt優先度の設定にも非常に敏感で、ちょっと間違えるととたんにノイズだらけになります。ただ、上手くチューニングした時の音は素晴らしいです。悪戦苦闘のあとは掲示板に残してありますので、興味のある方はどうぞ。
(PC_Audio) 2013/07/12
MPD on Cubox(20)
cuboxの新しいイメージは、初期トラブルを多発させているようですね。rootfsのディフォルトを arch linuxに変更したためだと思います。arch linuxはシステムのコントロール、パッケージの導入方法、ネットワーク管理、日本語化などに関して、従来のubuntu/debianとは大きく異なりますので、このあたりがトラブルの原因のようです。掲示板でやりとりしたトラブルについては全て解決済ですが、その内容を中心にして arch linuxの使い方のポイントをご紹介したいと思います。
arch linuxについて
arch Linux については、ここ(日本の総本山のトップ)とここ(wikipadia)を参照して下さい。要約すると「Arch はあらゆる用途に対応できる万能 GNU/Linux ディストリビューションで、シンプリシティ、ミニマリズム、およびコードの簡潔性が特徴です。最小限の基本システムの状態でインストールされ、ユーザー自身が、ユーザーの理想とする環境のために必要なものだけをインストールして構築することができます。」ということです。
従って、音楽専用の MPD on Cubox のような目的には最適なのですが、設計コンセプトが汎用指向の ubuntu/debianとは大きく異なりますので、最初はかなり面食らいます。例えば、mpdをインストールしても、ubuntu/debianのようにデーモンとして起動されるよう自動的に設定がされるということはなくて、サービスファイルやmpd.confを自分の環境に合わせ編集し、起動させることが必要になります。
システムコントロール
linuxディストリビューションのrootfsの主要な役割はブートプロセスでの初期設定です。ファイルシステム、ネットワーク、デーモンプログラムの初期化などを行うわけですが、ubuntu/debianではこのプロセスの初期化をSysVinitという旧来の方法で行っています。archではこの部分がsystemdという新しい方法に置き換わっています。archと他のディストリビューションで音が変わるのは多分これが理由だと思います。
従って、arch linuxに何らかの機能を追加しようとする場合、systemdの使い方を知らないと「手も足も出ない」ということになります。ただ、使い方そのものはシンプルで、やり方が分かれば、こちらの方がブラックボックスだらけの ubuntu/debianより簡単かもしれません。systemdの使い方についてはご本家のこのページに詳しい解説があります。
今回のイメージではmpdのブートプロセスでの起動とターミネートプロセスでの終了をsystemdを行っています。具体的には mpdサービス定義ファイルは
/usr/lib/systemd/system/mpd.service
起動終了用のスクリプトは
/etc/init.d/mpdset.conf
となります。
androidのイメージではmpdサービス定義ファイルを
/usr/lib/systemd/system/mpdset.service
に変更していますので、ご注意ください。内容はテキストファイルなので、nano で開けばご確認頂けるかと思います。
余談ですが、debianもwheezyだとsystemd化できるようですね。シンさんのサイトに実際に試された記事があり、興味深いです。
パッケージ管理
archのもう一つの難所がこれです。ubuntu/debianではapt-get又はapptitudeというパッケージマネジャで管理されていたのですが、archではこれが、pacmanに変わります。pacmanの使い方はご本家のこのページにあります。
apt-get又はapptitudeとpacmanはコマンドの入力方法は異なりますが、コンセプトは大差がないので、上記リンク先をお読みいただければ、使うのは簡単だと思います。
ここでは両者を比較してコマンドの使い方を示しておきます。
操作 | debian/ubuntu | arch |
---|---|---|
リポジトリの更新 | apt-get update | pacman -Syu |
インストール | apt-get install pkg名 | pacman -S pkg名 |
削除 | apt-get remove pkg名 | pacman -Rs pkg名 |
サーチ | apt-cache search key名 | pacman -Ss key名 |
厳密には右と左は同じでありませんので、詳しくはリンク先を参照して下さい。
ネットワーク管理
僕はdhcpとホスト名で自動接続している能天気な人なので、詳しくないのですが、ここ(ご本家)とここ(RaspberryPi/ArchLinux)に情報があります。要注意なのはすubox用のarchの場合ネットワークのディフォルトがipV6ですので、この設定が残っていると、都合の悪い場合があります。公開しているイメージでは、ipV6用の定義は全てコメントアウトしてあります。
固定アドレスにする方法は上記のリンク先に詳しく紹介されていますが、僕が試した範囲では、
/etc/network.d/ethernet-eth0
の
## Change for static
以下のコメントアウトしてある行を適当に設定すれば、動くようです。
あと、「固定アドレスにすると、fstabを使ったマウントがエラーになることがある」というご報告をPhoeniciaさんから頂いていますが、対応方法については掲示板の記事を参考にして下さい。
それから、archではなくcubox用のdebianhfの話になりますが、固定アドレスに変更した時にresolve.confを自動更新してくれないようです(えふさんからのご指摘で気が付きました)。今どきのディストリビューションにしては珍しい仕様だと思いますが、自力で設定する必要があります。詳しくはこちらを参照して下さい。
日本語化
イメージ公開時のアナウンスに書いたように、このイメージは海外でも利用されているようなので、コンソールメッセージの日本語化は行っていません。音楽データベースのコードがutf-8であれば問題なく日本語表示出来ることは確認していましたが、shift-jisだと駄目なようですね。掲示板でyukikiさんにご指摘頂き、分かりました。対応方法はリンク先にありますが、fstabにcodepage=cp932というオプションを指定することで、表示できるようになります。
尚、コンソールを日本語化するには、localeをja_JP.UTF-8 UTF-8にすれば可能です。詳しくはご本家のこのページを参照して下さい。
その他
alsamixer
インストールされているライブラリの関係で、alsamixerは
alsamixer -Dhw
として起動させて下さい。詳しくはこのスレッドを参照して下さい。
ジャケット表示
上記のパッケージ管理方法の違いにより、lighttpdのインストール方法とwebサーバの登録方法が変わったようです。詳しくは掲示板のこのスレッドを参照して下さい。
なお、archの場合は darkhttpdを使うという方法もあります(こちらの方がlighttpdよりコンパクトです)。インストール方法は
pacman -S darkhttpd
です。公開するディレクトリは起動時の引数で指定できるので、/etc/init.d/mpdset.confの mpd_start部分に
darkhttpd /var/lib/mpd/music/
という行を追加すればいいです。
音楽データベースのマウント
/etc/fstabにcifsとnfsのマウント用のテンプレートをコメントアウトして残してあります。このcifs用のテンプレート(上段の方です)で、「uid=root」と設定してありますが、不適切です。「uid=mpd」に変更してお使いください。詳しくはこのスレッドを参照して下さい。
以上のトラブルの状況報告、解決に関し、多く方のご協力を頂戴しました。お礼申し上げます。
(PC_Audio) 2013/06/21
MPD on Android(5)
今年の1月に公開したイメージのレベルアップ版です。前回の内容はここにあります。今回のレベルアップは掲示板でのtinkerさんの情報に助けられました。改めてお礼申し上げます。主な変更点はカーネルをレベルアップし、rt化したこと、rootfs部分をcubox用のarch linuxに入れ換えたことです。音の印象はかなり変わったと思います。
動作確認用に使ったハードについては上記リンク先を参照して下さい。Allwinnerという中国のメーカーが製造していた製品です。製造終了になっているようで、もう購入することは出来ません。仕様は
- Cortex A8
- Allwinner A10
- 1.5GHz シングルコア
- Memory 1GB
というものです。「Allwinner A10」でググると同じ仕様のボード(完成品もあり)はいろいろ見つかりますので、それらでも動くかもしれませんが、保証は出来ません。別のハードでお試しになる方は at your own risk でお願いします。
イメージは以下のリンクからダウンロードできます。
kernel
kernelを3.4.24にレベルアップし、対応するrtパッチ(rt35)を適用しました。
カーネルを組み込むためのイメージはこのページで公開されているTobyさんのCubieboard用のイメージをそのまま使い、ビルドしたカーネルと入れ換えました。configはsunxiのgitに入っている Allwinner A10用のsun4i_defconfigを利用しました。チューニングは前回公開のイメージでPhoeniciaさんが実施された内容を参考にしてほぼ同じ内容を適用してあります。selbootで選択出来るuImageは36-CDQ/36-Deadline/36-No-opとなります。
selboot 36-CFQ/36-Deadline/36-No-op
/build_filesにビルドに使用したコンフィグを残してあります。
rootfs
rootfsはcubox用に作成したarch linuxをほぼそのまま使用しています。
Cuboxのarch linuxからの変更点はselpartとled表示の削除です。
なお、hiface/mytek用のドライバは組み込んでありません。
mpd
Cuboxのarch linuxの公開イメージのmodをそのまま使っています。selmpdで18y/18g/174s/173sの切り替えが可能です。
selmpd 18y/18g/174s/173s
という次第なので、ログインのパスワードを「android」に変えていること、書き込む媒体は4GB以上のSDHCカードを使うことを除いて、注意事項、使い方もCuboxのイメージに準じます。直前の書き込みを参照して下さい。
(PC_Audio) 2013/06/15
MPD on Cubox(19)
新しいcuboxのイメージを公開します。梅雨入りバージョンということになりますね。今回のテーマはrootfs部分のチューンアップです。
イメージは以下のリンクからダウンロードできます。
概要
kernelは3.8系列にレベルアップしました。対応するrtパッチを適用してあります。
rootfsはこことここに公開されているcubox専用の arch linuxとdebianhfのrootfsを使い、mpd/alsaを組み込み、ホスト名によるネットワーク接続(avahi、winbind)、cifsとnfsの利用のためのパッケージなどをインストールしてあります。
mpdはgit版と安定版の最新のものにyanさんのrtoptパッチを適用し、ビルドし直しています。
kernel
kernelは3.8.4と3.8.11を対応するrtパッチをかけたもの使っています。また、雛祭り版の3.6.9と3.4.24のkernelも残してあります。selbootで選択できますので、お好みのものをお使い下さい。
kernel | rtパッチ | カーネル選択方法 |
---|---|---|
3.8.11 | rt11 | selboot 21-[CFQ/Deadline/No-op] |
3.8.4 | rt2 | selboot 20-[CFQ/Deadline/No-op] |
3.6.9 | rt35 | selboot 17-[CFQ/Deadline/No-op] |
3.4.24 | rt21 | selboot 10-[CFQ/Dead/ine] |
ディフォルトは3.8.4-CFQです。
カーネル3.8はそれ以前のバージョンとは大きく変わっています。詳しくはこの記事と掲示板を参照して下さい。音にも影響があります。ディフォルトは3.8.4としてありますが、3.8.11の方がお勧め場合もあると思います。適当に選択して下さい。
一部ddc連続再生の問題
雛祭り版で問題になった一部のddcで連続再生させると、vmallocを使い切ってmpdがハングする件は3.8.11で完全に直っているようです。3.8.4ではcmaサイズを増加させる回避策をとっていますので、2時間程度の連続演奏は可能です。
rootfs
パーティションの構成は以下の通りです。
パーティション名 | ファイルシステム | 用途 | パーティションの選択方法 |
---|---|---|---|
/dev/mmcblk0p1 | ext3 | boot | |
/dev/mmcblk0p2 | ext4 none journal | arch linux rootfs | selpart a |
/dev/mmcblk0p3 | ext4 none journal | debianhf rootfs | selpart d |
rootfsのディフォルトは arch linuxです。
rootfsのファイルシステムはxfsで構造体エラーと誤表示される件が3.8でも解決されていないようなので、ジャーナル無しのext4にしました。xfsでないと気が済まないという方は自力でrootfsの入れ換えをして下さい。kernelのxfsサポートは有効にしてあります。
arch linuxとdebianhfはどちらもlinuxのディストリビューションですが、構成方法はかなり大きく異なります。従って、音も違います。お好みでお選び下さい。
既知のバグ
arch linuxはlinuxの終了処理に時々ハングするというバグが残っています(3.8で発生するようです)。LED表示が消灯状態のままで変らなければ、この状態です。電源を入れ直して再度立ち上げることは可能ですので、その方法で対応して下さい。
mpdの起動方法について
この大きく異なるディストリビューションの間で、mpdの起動方法を統一するため、独自のものとしました。
/etc/init.d/mpdset.confが起動用の共通スクリプトです。雛祭り版でのrt優先度の設定(rtset.conf)、mpd関連のワークファイルの保存と復元(shmset.conf)などの処理もこの共通スクリプトに持ってきました。rt優先度などmpd関連の設定をいじる場合は/etc/init.d/mpdset.confと/etc/mpd.confをベースに行って下さい。
また、/etc/init.d/mpdによるmpdの再起動は使用しないで下さい。mpdの再起動は後述のselmpdで行うことができます。
snd_usb_hifaceとsnd_usb_mytek
それぞれビルドしたものを、archでは /usr/lib/modules/カーネルバージョン/kernel に、debianhfでは /lib/modules/カーネルバージョン/kernel に置いてあります。
snd_usb_hifaceは組み込み済です。
snd_usb_mytekはmytek社のファームウェアを組み込む必要があるのですが、勝手にイメージに入れて良いのか判断できなかったので、組み込んでありません。このページを参考にして自力で対応して下さい。
日本語化
雛祭り版以前では全てのrootfsは日本語化していました。しかし、このイメージ、海外の方も利用されていると分かりましたので、arch linuxのlocaleは英語のままにしてあります。日本語の方が良いという方はこことリンク先を参考にして自力で対応して下さい。
電源オフと再起動
archの電源オフと再起動は
systenctl poweroff systenctl reboot
と操作するのが正しい作法のようです。キー入力が面倒なので、aliasでそれぞれ「pof」「rbt」と登録してあります。よろしければお使い下さい。
LED表示
年末版、雛祭り版で行っていた、dsd/pcm再生の切り分け表示は廃止し、立ち上げ時に点滅、終了時に消灯というシンプルな方式にしました。「それじゃ寂しい」という方はスクリプト(/usr/local/sbin/led)は残してありますので、直前の記事を参考にして自力で対応して下さい。
また、このLED表示は3.8のみで有効です。カーネルのバージョンをチェックし、echoの仕方を変えれば対応できるのですが、パスです。
mpd
version | rtoptパッチ | mpdの選択方法 |
---|---|---|
0.18git(2012年09月) | 20130203+dsdbugfix | selmpd 18y |
0.18git(2013年04月) | 20120819+buffer.c | selmpd 18g |
0.17.4 stable | 20120226+buffer.c | selmpd 174s |
0.17.3 stable | 20120226+buffer.c | selmpd 173s |
ディフォルトは174sです。
selmpdはオペランド無しで使用すると、mpdを再起動します。
yanさんのパッチ一式についてはdebian側の /root/mpdcubox に残してあります。
使い方
解凍方法と書き込み方法
ダウンロードしたアーカイブは圧縮率を高めるため、7zipという圧縮方法を使っています。対応する展開プログラムを使って、解凍し、イメージの書き込みして下さい。僕はWindows環境で解凍にはAlzip、イメージ書き込みにはddwinを使っています。イメージサイズは4GBです。4GB以上のマイクロsdhcカードをお使い下さい。
ホスト名によるネットワーク接続
ネットワークはdhcpによる自動接続機能を有効にしていますので、普通の家庭内の有線lan環境であれば、自動的にネットワーク接続出来ます。またホスト名による接続も有効にしてありますので、Windows環境であれば、「cubox.local」でssh接続出来ます(linux、MAC環境は「cubox」だけでOKなようです)。
以下の作業はcuboxをsshによるネットワーク接続か、シリアル接続し、行います。sshによるネットワーク接続に関してはいろいろなアプリがあります。ここを参照して下さい。僕はPuttyを使っています。
なお、固定アドレスを使う場合、arch linuxのネットワーク設定はdebian系列とは異なり、
/etc/network.d/ethernet-eth0
が設定ファイルとなりますので、ご注意ください。
(06月09日追加)
固定アドレスを使う場合、/etc/hostsの127.0.1.1のalias定義を無効にしないと問題が起きるようです。詳しくは掲示板の情報(こことここ)を参照して下さい。
ログイン方法
ログイン名は「root」、パスワードは「cubox」です。
音楽データベースのマウント
音楽用のデータベースのマウントはfstabに設定する方法をお勧めします。nasかhd(usbまたはesata接続)が使えます。nasはcifsまたはnfsが使えます。nasはホスト名でマウントできます。cifsとnfs接続の雛型をfstabにコメントアウトして残してありますので、ご自身の環境に合わせ適当なマウントポイントにマウントさせて下さい。
hdの場合は「fdisk -l」でデバイス名を確認し(通常は/dev/sda1)、同様の操作を行うことになります。
mpdへの音楽データベースの登録
音楽データベースをmpdに認識させる標準的な手順は以下の通りです。
mkdir /music マウントポイントの作成 nano /etc/fstab fstabの編集
以下の内容が表示されるので、環境に合わせ、5行目(cifs用)、6行目(nfs用)をコメントアウト。ホスト名/ディレクトリ名、マウントポイント、オプション(username、passwordなど)を修正
編集後、保存、終了(ctrl+o ctrl+x)
mount -a 音楽データベースのマウント ls /music マウントされたことを確認 ln -s /music /var/lib/mpd/music マウントポイント(/music)にmpdを接続(link)
その他
今回のイメージは掲示板でのやりとりをベースにして完成しました。改めて貴重な情報を頂戴した皆様に感謝します。ありがとうございました。
なお、公開されたバイナリイメージは無保証です。僕は内容について一切の責任はもちませんので、ご自身のリスクでお試し下さい。
(PC_Audio) 2013/06/09
CuboxのLED表示
今回の書き込みは掲示板でt-taさんやtinkerさんから頂いた情報に助けられています(こことここです)。お二人にお礼申し上げます。
cuboxのled点灯については、solid-runのサイトに紹介の記事があります。問題はこの記事の内容はkernelのバージョンが3.6以前のものについて有効なことです。3.8でカーネルの内容が大きく変わったので、このサイトのこの記事により3.8を作成した場合は以下の通り変更する必要があります。
- led点灯
- echo default-on > /sys/class/leds/Power/trigger
- led点滅
- echo timer > /sys/class/leds/Power/trigger
- led鼓動型点滅
- echo heartbeat > /sys/class/leds/Power/trigger
- led消灯
- echo none > /sys/class/leds/Power/trigger
また、このled操作はrootfsがarmelの場合は無効のようで、armhfでないと操作できません。従って、雛祭り版以前のdebianでは操作できません。
実際のled表示のスクリプト(/usr/local/sbin/led)はこういう具合に処理しています。
#!/bin/sh Status_Before=0 Status_Now=0 while : do if mpc | grep \.dff$ > /dev/null 2>&1 || mpc | grep \.dsf$ > /dev/null 2>&1 then Status_Now=1 elif mpc | grep playing > /dev/null 2>&1 then Status_Now=2 else Status_Now=0 fi if [ $Status_Before -ne $Status_Now ] then case $Status_Now in 0) echo default-on > /sys/class/leds/cubox:red:health/trigger ;; 1) echo heartbeat > /sys/class/leds/cubox:red:health/trigger ;; 2) echo timer > /sys/class/leds/cubox:red:health/trigger ;; esac fi Status_Before=$Status_Now sleep 2 done
要するにmpcのメッセージを2秒毎に拾って、dff演奏中ならheartbeatをそれ以外を演奏中ならtimer表示をさせているわけです。
このスクリプトはrc.localで起動させていますので、煩いという方はその行をコメントアウトして下さい。