前回BBBでvolimuoを試し、AKI.DAC-U2704と自作PCM5122 I2S I/F DACの二種類のDACで楽曲ファイルを鳴らす事ができた。
今回はもうすこしちゃんとvolumioの起動micro SDカードを構築してみることとする。
使用するmicro SDカードはSan DisKの16GBのものMobile Ultra。
16GBの容量をFAT32のパーティション1を11.5GiB、ext4のパーティション2を3.5GiBに分割する。
残りの容量は未使用領域として残す。
volumioの起動イメージのパーティション1はboot用であるが、ここに楽曲用のフォルダを作成し兼用させる。
volumioの起動イメージのパーティション2はrootfs用でデフォルトでは1.5GBの容量となっているが、狭いので拡張を行う。
作業は以下のステップで行う。
1) fdiskによりMBRを編集
2) パーティション1をFAT32にフォーマット
3) volumioディスクイメージのパーティション1の内容をcpコマンドによりコピー
4) volumioディスクイメージのパーティション2イメージをddコマンドによりコピー
5) パーティション2をresizefsによりMBRの内容に調整
6) パーティション1に楽曲サンプルをコピー
先ずは作成するmicro SDカードのMBRの編集を行う。
この作業は母艦(ゲストOS)で実施する。
当然のことながら母艦(ゲストOS)でmicro SDカードを認識できる必要がある。
以下は/dev/sdbとしてmicro SDが認識された前提とする。
また、必ずしも必要ではないがシリンダ境界を意識することとする。
temp-host@temp-host:~$ ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdb1 temp-host@temp-host:~$ sudo fdisk /dev/sdb [sudo] password for temp-host: コマンド (m でヘルプ): p Disk /dev/sdb: 15.9 GB, 15931539456 bytes ヘッド 255, セクタ 63, シリンダ 1936, 合計 31116288 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 8192 31116287 15554048 c W95 FAT32 (LBA) コマンド (m でヘルプ): m コマンドの動作 a ブート可能フラグをつける b bsd ディスクラベルを編集する c dos 互換フラグをつける d パーティションを削除する l 既知のパーティションタイプをリスト表示する m このメニューを表示する n 新たにパーティションを作成する o 新たに空の DOS パーティションテーブルを作成する p パーティションテーブルを表示する q 変更を保存せずに終了する s 空の Sun ディスクラベルを作成する t パーティションのシステム ID を変更する u 表示/項目ユニットを変更する v パーティションテーブルを照合する w テーブルをディスクに書き込み、終了する x 特別な機能 (エキスパート専用) コマンド (m でヘルプ): d 選択したパーティション 1 コマンド (m でヘルプ): p Disk /dev/sdb: 15.9 GB, 15931539456 bytes ヘッド 255, セクタ 63, シリンダ 1936, 合計 31116288 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム コマンド (m でヘルプ): c DOS Compatibility flag is set (DEPRECATED!) コマンド (m でヘルプ): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p パーティション番号 (1-4, 初期値 1): 1 最初 セクタ (63-31116287, 初期値 63): 8192 Last セクタ, +セクタ数 or +size{K,M,G} (8192-31116287, 初期値 31116287): 22467279 コマンド (m でヘルプ): p Disk /dev/sdb: 15.9 GB, 15931539456 bytes ヘッド 255, セクタ 63, シリンダ 1936, 合計 31116288 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 8192 22467279 11229544 83 Linux コマンド (m でヘルプ): l 0 空 24 NEC DOS 81 Minix / 古い Li bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux スワップ c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 隠し C: ド c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux 拡張領域 c7 Syrinx 5 拡張領域 41 PPC PReP Boot 86 NTFS ボリューム da 非 FS データ 6 FAT16 42 SFS 87 NTFS ボリューム db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux プレーン de Dell ユーティリ 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX ブート可能 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 ブートマネ 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad ハ eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95 拡張領域 (L 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC 11 隠し FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq 診断 5c Priam Edisk a9 NetBSD f4 SpeedStor 14 隠し FAT16 <32M 61 SpeedStor ab Darwin ブート f2 DOS セカンダリ 16 隠し FAT16 63 GNU HURD または af HFS / HFS+ fb VMware VMFS 17 隠し HPFS/NTFS 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 65 Novell Netware b8 BSDI スワップ fd Linux raid 自動 1b 隠し W95 FAT32 70 DiskSecure Mult bb 隠し Boot Wizar fe LANstep 1c 隠し W95 FAT32 75 PC/IX be Solaris ブート ff BBT 1e 隠し W95 FAT16 80 古い Minix コマンド (m でヘルプ): t 選択したパーティション 1 16進数コード (L コマンドでコードリスト表示): c パーティションのシステムタイプを 1 から c (W95 FAT32 (LBA)) に変更しました コマンド (m でヘルプ): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p パーティション番号 (1-4, 初期値 2): 2 最初 セクタ (63-31116287, 初期値 63): 22467280 Last セクタ, +セクタ数 or +size{K,M,G} (22467280-31116287, 初期値 31116287): 29301360 コマンド (m でヘルプ): p Disk /dev/sdb: 15.9 GB, 15931539456 bytes ヘッド 255, セクタ 63, シリンダ 1936, 合計 31116288 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 8192 22467279 11229544 c W95 FAT32 (LBA) /dev/sdb2 22467280 29301360 3417040+ 83 Linux コマンド (m でヘルプ): a パーティション番号 (1-4): 1 コマンド (m でヘルプ): p Disk /dev/sdb: 15.9 GB, 15931539456 bytes ヘッド 255, セクタ 63, シリンダ 1936, 合計 31116288 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 * 8192 22467279 11229544 c W95 FAT32 (LBA) /dev/sdb2 22467280 29301360 3417040+ 83 Linux コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 警告: パーティションテーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。 カーネルはまだ古いテーブルを使っています。新しいテーブルは 次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に 使えるようになるでしょう 警告: DOS 6.x パーティションを作成、または変更してしまった場合は、 fdisk マニュアルの追加情報ページを参照してください。 ディスクを同期しています。 temp-host@temp-host:~$
母艦(ゲストOS)をリブートする。
temp-host@temp-host:~$ sudo sync temp-host@temp-host:~$ sudo sync temp-host@temp-host:~$ sudo sync temp-host@temp-host:~$ sudo reboot
母艦(ゲストOS)はubuntsuであるが、SDカードは自動マウントされる。
以下/dev/sdb2にmicro SDの物理デバイスが認識された前提。
先ず、パーティション1をボリューム名vomukioとしてFAT32でフォーマットを行う。
-cオプションは付けていないが、時間があるのならば不良ブロックの検出は行った方が良い。
ただし、11.5GiBともなるとかなりの時間がかかるので今回は省略。
temp-host@temp-host:~$ ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdb1 /dev/sdb2 temp-host@temp-host:~$ sudo umount /dev/sdb1 temp-host@temp-host:~$ sudo mkfs.vfat -v -n volumio -F 32 /dev/sdb1 mkfs.fat 3.0.26 (2014-03-07) mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows /dev/sdb1 has 64 heads and 32 sectors per track, hidden sectors 0x2000; logical sector size is 512, using 0xf8 media descriptor, with 22459088 sectors; drive number 0x80; filesystem has 2 32-bit FATs and 16 sectors per cluster. FAT size is 10956 sectors, and provides 1402321 clusters. There are 32 reserved sectors. Volume ID is 170c3c3f, volume label volumio . temp-host@temp-host:~$
フォーマット後、母艦(ゲストOS)で自動マウントされる。
temp-host@temp-host:~$ mount /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/cgroup type tmpfs (rw) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) udev on /dev type devtmpfs (rw,mode=0755) devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755) none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880) none on /run/shm type tmpfs (rw,nosuid,nodev) none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755) none on /sys/fs/pstore type pstore (rw) rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw) systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd) nfsd on /proc/fs/nfsd type nfsd (rw) vmware-vmblock on /run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other) gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=temp-host) /dev/sdb1 on /media/temp-host/volumio type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2) temp-host@temp-host:~$ ls -la /media/temp-host/volumio/ 合計 12 drwx------ 2 temp-host temp-host 8192 1月 1 1970 . drwxr-x---+ 4 root root 4096 2月 23 00:12 .. temp-host@temp-host:~$
マウントポイントは/media/temp-host/volumio/となっている。
Volumio1.5BBB.imgのパーティション1の内容を作成するmicroSDカードのパーティション1にcpコマンドによりコピーを行う。
Volumio1.5BBB.imgのパーティション1はループデバイスとして母艦(ゲストOS)にマウントする。
temp-host@temp-host:~$ fdisk -l Volumio1.5BBB.img ディスク Volumio1.5BBB.img: 1468 MB, 1468006400 バイト ヘッド 255, セクタ 63, シリンダ 178, 合計 2867200 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスク識別子: 0x000768ee デバイス ブート 始点 終点 ブロック Id システム Volumio1.5BBB.img1 * 2048 4095 1024 1 FAT12 Volumio1.5BBB.img2 4096 2666789 1331347 83 Linux temp-host@temp-host:~$ sudo mount Volumio1.5BBB.img /mnt/loop1/ -o loop,offset=$((512*2048)) temp-host@temp-host:~$ sudo cp -r /mnt/loop1/* /media/temp-host/ MLO uEnv.txt System Volume Information/ volumio/ u-boot.img temp-host@temp-host:~$ sudo cp -r /mnt/loop1/* /media/temp-host/volumio/ temp-host@temp-host:~$
続いてVolumio1.5BBB.imgのパーティション2の内容を作成するmicroSDカードのパーティション2にddコマンドによりコピーを行う。
temp-host@temp-host:~$ sudo dd if=./Volumio1.5BBB.img skip=4096 count=$((2666789-4096)) of=/dev/sdb2 2662693+0 レコード入力 2662693+0 レコード出力 1363298816 バイト (1.4 GB) コピーされました、 207.957 秒、 6.6 MB/秒 temp-host@temp-host:~$
ubuntsuではddコマンド実行後、パーティション2は自動マウントされる。
この状態ではパーティション2の状態はMBRとi-nodeテーブルの内容が一致していないのでresize2fsを用いてMBRの内容に合わせてリサイズする。
temp-host@temp-host:~$ sudo resize2fs /dev/sdb2 resize2fs 1.42.9 (4-Feb-2014) Resizing the filesystem on /dev/sdb2 to 854260 (4k) blocks. The filesystem on /dev/sdb2 is now 854260 blocks long. temp-host@temp-host:~$
パーティション1にミュージックファイル用のディレクトリを作っておく。
temp-host@temp-host:~$ sudo mkdir /media/temp-host/volumio/music temp-host@temp-host:~$
母艦(ゲストOS)で楽曲ファイルをmicro SDの/media/temp-host/volumio/music/に保存する。
今回は以下のサイトからダウンロードした。
http://www.lessloss.com/high-resolution-audiophile-recordings-c-68.html
ダウンロードを行う為には算数の問題を解く必要がある。
コピー後、micro SDカードを母艦(ゲストOS)から取り外しBBBに挿入して電源投入を行う。
初回起動はシリアルケーブルとethernet接続を行う。
今回自作PCM5122 I2S I/F DACを接続したまま初回起動を行ったのだが、起動後に起動後のチャイムが鳴動したのに驚いた。
どうやらデフォルトでI2S DACが選択された状態となるようだ。
ethernet経由でDHCPに割り振られたIPアドレスにssh接続を行う。
userはroot、passwdはvolumioでログインできる。
Linux volumio 3.8.13-bone20 #1 SMP Wed May 29 03:11:01 UTC 2013 armv7l ___ /\_ \ __ __ __ ___\//\ \ __ __ ___ ___ /\_\ ___ /\ \/\ \ / __`\\ \ \ /\ \/\ \ /' __` __`\/\ \ / __`\ \ \ \_/ |/\ \L\ \\_\ \_\ \ \_\ \/\ \/\ \/\ \ \ \/\ \L\ \ \ \___/ \ \____//\____\\ \____/\ \_\ \_\ \_\ \_\ \____/ \/__/ \/___/ \/____/ \/___/ \/_/\/_/\/_/\/_/\/___/ Free Audiophile Linux Music Player - Version 1.5 C 2013 Michelangelo Guarise - Volumio.org Volumio Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Feb 22 16:09:31 2015 from 192.168.1.20 root@volumio:~# df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 3331296 555620 2604836 18% / /dev/root 3331296 555620 2604836 18% / devtmpfs 253720 0 253720 0% /dev tmpfs 50776 364 50412 1% /run tmpfs 5120 0 5120 0% /run/lock tmpfs 524288 0 524288 0% /run/shm Ramdisk 524288 0 524288 0% /run/shm /dev/mmcblk1p1 98094 73336 24758 75% /mnt/USB //192.168.1.14/dlna 968628480 376249492 592378988 39% /mnt/NAS/dlna root@volumio:~#
意図したように/rootfsが拡張されている事を確認できた。
デフォルトではパーティション1がマウントされていないので、/etc/fstabを修正し、起動時に自動マウントされるようにする。
root@volumio:~# fdisk -l Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes 255 heads, 63 sectors/track, 1936 cylinders, total 31116288 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/mmcblk0p1 * 8192 22467279 11229544 c W95 FAT32 (LBA) /dev/mmcblk0p2 22467280 29301360 3417040+ 83 Linux Disk /dev/mmcblk1: 3867 MB, 3867148288 bytes 4 heads, 16 sectors/track, 118016 cylinders, total 7553024 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/mmcblk1p1 * 2048 198655 98304 e W95 FAT16 (LBA) /dev/mmcblk1p2 198656 7553023 3677184 83 Linux Disk /dev/mmcblk1boot1: 2 MB, 2097152 bytes 4 heads, 16 sectors/track, 64 cylinders, total 4096 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mmcblk1boot1 doesn't contain a valid partition table Disk /dev/mmcblk1boot0: 2 MB, 2097152 bytes 4 heads, 16 sectors/track, 64 cylinders, total 4096 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mmcblk1boot0 doesn't contain a valid partition table root@volumio:~# cat /etc/fstab Ramdisk /run/shm tmpfs defaults,size=512M,noexec,nodev,nosuid 0 0 /dev/mmcblk0p1 /mnt/USB vfat utf8 0 0 root@volumio:~#
ついでにWiFiの設定も行っておく。
root@volumio:~# nano /etc/network/interfaces root@volumio:~# cat /etc/network/interfaces iface lo inet loopback auto eth0 iface eth0 inet dhcp auto wlan0 iface wlan0 inet dhcp wpa-ap-scan 1 wpa-scan-ssid 1 wpa-bssid 10:6F:3F:4B:20:55 wpa-key-mgmt WPA-PSK wpa-proto RSN wpa-pariwise COMP TKIP wpa-group CCMP TKIP wpa-ssid MY-AP-001 wpa-psk hogehoge root@volumio:~#
再起動を行う。
root@volumio:~# sync root@volumio:~# sync root@volumio:~# sync root@volumio:~# reboot
これで再度立ち上げると、WiFi経由でDHCPから割り当てられたIPアドレスにWEBブラウザでアクセスするとWEB UIを開く事ができる。
I2S driver関連の設定はMENUの”System”の”System Updates”で”CHECKUPDATES”を選択し終了後再起動したら選択できるようになった。
ただ、出現条件は絞れていない。
設定は先ずMENUの”Playback”の”Volume control mixer”を”Software”とする。
これを行わなければ音量を絞る事ができないからだ。
希望としてはDACからは加工していない元データそのままをI2S DACに出力したいが、今の構成では実現できていない。
NASの設定とLibraryの更新はMENUの”Library”で行う。
micro SDのパーティション1の/musicフォルダはMENUの”Library”で”UPDATE LIBRARY”を実行すると認識されるようになる。
とりあえずこれでmicro SDカードの作成はできた。
一応自作PCM5122 I2S I/F DACから楽曲ファイルの再生もできるようだ。
ただ、しばらく再生していると時々無音期間が発生したり、キーというノイズが発生したりするようだ。
PCM5122 I2S I/F DACでの場合、音量を100%にした場合の激しいポップノイズは24bit/96KHzサンプルのwavファイルでは少なくとも起動直後では出ないようだ。
16bit/44.1KHzサンプルのwavファイルでは出だしから激しくポップノイズが出るのでリサンプリングに問題があるように見える。
どちらにしても再生を続けていると/proc/budyinfoを見る限りどんどん4MByteの連続ページが減ってゆき、残り28位から無音期間やキー音が出だす。
最初のファイルは良い音で鳴動するので、再生終了・リブートを繰り返せば曲は聴くことはできる。
ちなみにAKI.DAC-U2704 USB DACの場合は16bit/44.1KHzのwavファイルの場合音量100%でもポップノイズは出ない。
反対に24bit/96KHzサンプルのwavファイルを音量100%で再生すると激しいポップノイズが出るので、やはりリサンプリングに問題がある疑いが強まる。
また、AKI.DAC-U2704 USB DACで16bit/44.1KHzのwavファイルの場合は4MByteの連続ページの減りは緩やかであるので、この組み合わせならば長時間での連続再生に耐えられるようだ。
I2sドライバとUSB DACドライバは以下のように認識されている。
root@volumio:~# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: Black [TI BeagleBone Black], device 0: HDMI nxp-hdmi-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: DAC [USB Audio DAC], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 root@volumio:~#
I2SドライバはTIの純正ドライバなのだろうか?
volumioをBeagleBone Blackで試して見たが、現時点ではI2S I/Fでは多少不安定であるようだ。
プロジェクトとしては非常に面白く有用であるので、この先を是非見てみたい。
また、電子工作としては楽曲を鳴らす事ができているので非常に楽しいものだ。
しばらくこの環境で遊んでみることとする。