Galaxy S5 SCL23ではbindオプションつきmountができない

事の発端は簡単なことだった。現在メインで使っているGalaxy S5 SCL23にはmicro SDカードが挿入してある。さて、この状態で以下のような設定になっていた。

  • DLNAのDMS/DMR/DCP/DMP機能を持つBubbleUPnPアプリで、他のDLNAサーバ(DMS)からローカルにダウンロードしたメディアファイルを保存するディレクトリが /mnt/sdcard/ext_sd/BubbleUPnP。
  • ポッドキャッチャーのBeyondPodアプリがダウンロードしたポッドキャストファイルを保存するディレクトリが/mnt/sdcard/ext_sd/BeyondPod/Podcasts。

これは前の端末での設定をそのまま引き継いでいる。前の端末(HTC J)では/mnt/sdcard/ext_sdは外部SDカードのマウントポイントを指していた。しかし、SCL23ではそうではないため、単に内部(エミュレーションによる)SDカードの一ディレクトリに過ぎない。外部SDカード上のディレクトリを指すようにしないと、と考えた。

最終的には後で述べる安直な解決策を取ったが、その結論に至るまでには紆余曲折があった。最初は、「だったら外部SDカードのマウントポイントから/mnt/sdcard/ext_sdへのシンボリックリンクを張っとけば後々楽ちん、ルートは取ってあるんだし」、という極めて安直な発想だった。が、内部SDカードのファイルシステムはFAT32(後で述べるようにこれは正確ではないが)なのでシンボリックリンクは張れない。

代替手段として、Busyboxのmountアプレットにbindオプションをつけることで実現できそうであることを知った。さらにそれをアプリで実現できる[ROOT] Directory BindFolderMount [ROOT]があることも知った。

が、残念ながらGalaxy端末の独自性のためにこれで解決とはならなかった。”Review of Android Partition Layout“に説明があるように、昔はFAT32でフォーマットしてあるSDカードを素直にFAT32としてマウントしていたが、PCにUSB接続した際にはUSBマスストレージデバイスとして動作させるたびに、SDカードにapp2sdで移したアプリは使えなくなっていた。その不便さを解消するためにFUSEファイルシステムを採用し、PCからはMTPデバイスとしてアクセスできるようにした。このようにFUSEでマウントしてある場合、bindオプションつきmountが利用できるようだ。

Galaxy S5上でLink2SDを使ってobbや外部データを外部SDカードに移そうとすると表示されるメッセージ

Galaxy S5上でLink2SDを使ってobbや外部データを外部SDカードに移そうとすると表示されるメッセージ

ところが、理由ははっきりわかってないんが(しかしおそらくはパフォーマンス向上のため)Galaxy S5ではFUSEではなくsdcardfsというのを内部SDカード、外部SDカードともに採用している(添付したmountの出力参照)。で、どうやらこうだとbindオプションつきmountが利用できない。これは以下からも窺い知れる。

Link2SDには以下のような機能がある

Linking obb and external data;
On devices that have emulated SD card, obb and external data files are actually located on the internal storage, not on the external (real) SD card.
This method moves these folders into the first or the second partition of your external SD card (depending on your selection) and with the bind option of the mount command remounts the file hierarchy at external SD card while it is still available at the original location.

しかし我がSCL23でこれを利用しようとすると、図にあるようなメッセージが出る。

FolderMount [ROOT]は、Galaxy端末で利用する場合、「パッチ」が必要である旨の記載がある。/system/bin/sdcard バイナリを置き換えるということだが、これも要はデフォルトのsdcardfsでのマウントを止めるということだろう。

デフォルトのsdcardfsの利用を止めFUSEに替えればbindオプションつきmountが利用できるということのようだが、今回はそれには及ばないと結論づけた。

BubbleUPnPについては、ダウンロード先として任意のパスが設定できるのでそれで外部SDカード上のディレクトリを指すようにした。パス指定のとき、画面で上のディレクトリに上がることができることがはっきりとは示されなかったため、内部SDカードの中しか指定できないものと思い込んだが、バックキーを押すと上のディレクトリに上がれることに後で気づいた。

BeyondPodについてはアプリが提示する内部SDカード上のディレクトリか、上記の外部SDカード上(であるはず)のディレクトリしか選べない。これは特に変更しないことした。内部SDカード上に保存すると端末の初期化時などに消去されてしまうかもしれないが、そもそもポッドキャストファイルはずっと保存する性質のものではないのでそれでも構わない。

rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,size=942892k,nr_inodes=128663,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,size=942892k,nr_inodes=128663,mode=750,gid=1000 0 0
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,size=942892k,nr_inodes=128663,mode=700 0 0
tmpfs /mnt/secure/asec tmpfs rw,seclabel,relatime,size=942892k,nr_inodes=128663,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,size=942892k,nr_inodes=128663,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,size=942892k,nr_inodes=128663,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/efs /efs ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/persdata /persdata/absolute ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/apnhlos /firmware vfat ro,context=u:object_r:firmware:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
/dev/block/platform/msm_sdcc.1/by-name/modem /firmware-modem vfat ro,context=u:object_r:firmware:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
/data/knox/sdcard /mnt/shell/knox-emulated sdcardfs rw,nosuid,nodev,relatime,uid=1000,gid=1000,derive=none 0 0
/data/privatemode /mnt/shell/privatemode sdcardfs rw,nosuid,nodev,relatime,uid=1000,gid=1000,derive=none 0 0
/data/media /mnt/shell/emulated sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023,derive=legacy,reserved=20MB 0 0
/dev/block/vold/179:66 /data/sdext2 vfat rw,relatime,uid=1000,gid=1000,fmask=0133,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
/dev/block/dm-0 /mnt/asec/com.kddi.market-1 ext4 ro,dirsync,seclabel,nosuid,nodev,noatime,errors=continue 0 0
/dev/block/vold/179:65 /mnt/media_rw/extSdCard exfat rw,dirsync,nosuid,nodev,noexec,noatime,nodiratime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=utf8,namecase=0,errors=remount-ro 0 0
/dev/block/vold/179:65 /mnt/secure/asec exfat rw,dirsync,nosuid,nodev,noexec,noatime,nodiratime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=utf8,namecase=0,errors=remount-ro 0 0
/mnt/media_rw/extSdCard /storage/extSdCard sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023,derive=unified 0 0
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中