Android 上 用 Fuse 的幾個 project:
第一點有說明 libfuse 難 port 的原因,因為 bionic 的關係。
1的現成的,舊的 :
http://code.google.com/p/fuse-android/downloads/detail?name=fuse-2.8.5-android.tar&can=2&q=
要重新 build kernel,enable FUSE support
xda 上有另一個 port,包含 exfat, prebuild:
http://forum.xda-developers.com/showthread.php?t=1371621&page=3
前幾篇有說 build 的方法:
http://forum.xda-developers.com/showthread.php?t=1371621
這是用 static link,所以完全不管 bionic,也不用 so.
實際使用就是把 prebuild. static link 的檔案 download 回來,解開,push 到 /system/bin 下。
PC 的 XP 要安裝 MS 的
KB955704 號更新。
然後格式化就會出現 exfat 的選項。
要注意,因為 android 的 vold 在偵測 device mount 後,會用 fsck fix 一些error 標投。
所以直接插入 exfat 格式的 sdcard,標投會被改掉,這樣 mount.exfat-fuse 就不認識這個 partition,
mount 時會出現 "Find no exfat system info" 的msg。
所以要記得把 vold.fstab 的相關行 comment 掉。
插入由 PC 作exfat 格式化的 sdcard。
#mkdir /data/exfat
#mount.exfat-fuse /dev/block/mmcblk1p1 /data/exfat
這樣就 mount 成功了。
vold 問題,找到 CM 的 vold 有 support fat/ext/ntfs ,只是將 fat/ext 寫一起,然後,else 就是 ntfs。
-- 找不到真正 mount 的 function, 都說是 extern ...
這一篇古老的google group 討論有一些方法。
大概就是把 mount 改成執行外部 mount 命令。
由logcat 來看,破壞 partition info 的地方:
I//system/bin/fsck_msdos( 2360): Invalid signature in fsinfo block
I//system/bin/fsck_msdos( 2360): FIXED
I//system/bin/fsck_msdos( 2360): Invalid cluster size: 0
I/logwrapper( 2360): /system/bin/fsck_msdos terminated by exit(8)
I/PackageManager( 2431): Updating external media status from unmounted to unmounted
E/Vold ( 2360): Filesystem check failed (unknown exit code 8)
大概是 fsck_msdos 作的..
比較插入 ext4 的 sd:
/Vold ( 2360): /dev/block/vold/179:9 is checking for volume extsd
D/Vold ( 2360): Volume extsd state changing 1 (Idle-Unmounted) -> 3 (Checking)
I/StorageNotification( 2529): Media {/mnt/sdcard/extsd} state changed from {bad_removal} -> {checking}
I//system/bin/fsck_msdos( 2360): ** /dev/block/vold/179:9
I//system/bin/fsck_msdos( 2360): Invalid signature in boot block: 0000
I/logwrapper( 2360): /system/bin/fsck_msdos terminated by exit(2)
I/PackageManager( 2431): Updating external media status from unmounted to unmounted
E/Vold ( 2360): Filesystem check failed (not a FAT filesystem)
W/Vold ( 2360): /dev/block/vold/179:9 does not contain a FAT filesystem
E/Vold ( 2360): Volume extsd found no suitable devices for mounting :(
ext4 的 sd 插入後,不會被破壞 (拿回 pc 還可以正確 mount)。
所以猜測應該是 exfat 有跟 fat 類似的 partition id info,導致 msdos_fsck 誤判。
-- 所以作法應該是先用 exfat mount fail 再用 fat mount ?
實際使用 Cyanogen 7 的 Fat.cpp/h
ext2 formatted SD, 插入後,e2fsck 說有 error,要手動run 一次 e2fsck。
所以照作,在系統上手動
#e2fsck /dev/block/mmcbpk1p1
果然有寫 error fixed。
再插入後,就 自動 mount OK 了。
另外,用 XP format 成 exfat 的 SD,在系統上用 exfatfsck 檢查,是 OK 的。
所以應該可以用。
--- 是否要看 FAT/FAT32 用 exfatfsck 會不會也 OK ?
結果 OK。
修改 Fat.cpp , Fat.h
在 ::check 和 ::doMount 加入 filesystem 的 id 。
還要注意,FAT 的 fsck 會修改 exfat 的 partition head,所以要放在最後。
這樣,就可以 support ext4, exfat, fat 三種 filesystem 了..
ntfs 的話,一樣,在
xda 的神人 作了 static link ntfs-3g fuse 的 prebuild binary。
只要依樣話葫蘆就可以。
但是 ntfs 沒有 fsck,所以只好寫成這樣:
check 時,所有的 filesystem 都是 mismatch 時,assume ntfs。
然後一樣在 domount 用 logwrap( ) 來執行 ntfs-3g 作 mount。