[HACK] Android 手機 (HTC Hero) SD 卡與檔案系統

這一篇只用 Hero 的官方 ROM 進行測試喔。

第一天拿回這只 Hero,還沒有開機就先把專案附的 8GB SD 卡裝上,接著插上 SIM 卡,就直接開機用了。後來想要使用網路分享的功能,才在 HTC 的官方網站上下載了 HTC Sync 軟體,當時心裡還暗罵 HTC 在包裝中居然沒有附上完整的手冊、同步軟體,還要購買者到網站上去下載。有一天突然想要把原機的 2GB SD 拿來給 NDSL 裝遊戲用,才發現這張原廠所附的卡上有一些 DEMO、PDF 手冊、還有一些其他包含了資料的資料夾。原來是我自己錯怪 HTC 了,用 SD 卡來包裝這些檔而不使用光碟,的確是比較環保的作法呀。

昨天看了一篇檔案系統的文件,突然想到如果把手機上的 SD 卡格式化成其他的檔案系統,不要用 FAT 的話,會不會有比較好的執行效能,畢竟 Android 手機上已經是執行 Linux 作業系統,所以理應可以支援不同的檔案系統,但是這樣如果要掛載給 Windows 讀寫的話,在 Windows 上也要安裝有相對應的檔案系統支援,那麼前一段所說的環保手段就不可行了。

想到這裡,打嘴砲是不好的習慣,直接來試試看。備份一下 SD 卡上的資料,然後拿到 Ubuntu 系統下,看一下 SD 卡的 Mount 位置:

james@wino:/$mount

/dev/loop0 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
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 tmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
/dev/sda3 on /host type fuseblk (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
gvfs-fuse-daemon on /home/james/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=james)
/dev/sda2 on /media/System Disk type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
/dev/mmcblk0p1 on /media/96F1-0993 type vfat (rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,flush)

看到是在 /dev/mmcblk0p1,先把它 Unmount 掉:

james@wino:/$umount /media/96F1-0993

接著 mkfs.ext3 (先試一下 ext3 可不可以被 Android 掛載吧)

james@wino:/$ sudo mkfs.ext3 /dev/mmcblk0p1
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
120720 inodes, 482311 blocks
24115 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=494927872
15 block groups
32768 blocks per group, 32768 fragments per group
8048 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

先試著把 SD 卡拔出來重新插上,確定在 Ubuntu 上可以掛載,然後卸載,拿到 HTC Hero 上面看看能不能使用。
–[結果]– SD 卡為空白: SD 卡為空白或使用不支援的檔案系統。
耶~等一下,不能在手機上掛載,並不表示不能在 Ubuntu 接上手機掛載它吧,試一下,結果是可以在 Ubuntu 上看到的 (透過手機連接掛載成功)。
這是格式化為 ext3 的結果,看來 HTC 這個 Android OS 的 Kernel 並沒有把 ext3 的支援編譯進來,殘念。

效能測試:

(這是 ext3)

james@wino:/media$ sudo hdparm -Tt /dev/sdb1

/dev/sdb1:
Timing cached reads: 2226 MB in 2.00 seconds = 1113.57 MB/sec
Timing buffered disk reads: 18 MB in 3.03 seconds = 5.94 MB/sec

(格式化回 FAT 吧)

james@wino:/media$ sudo mkfs.vfat /dev/mmcblk0p1
mkfs.vfat 3.0.3 (18 May 2009)

把 SD 卡放回手機,已經可以讀到,因為已經改回 FAT 檔案系統了,再由連接線掛載,測試一下效能作比較:
(這是 FAT)

james@wino:/media$ sudo hdparm -Tt /dev/sdb1

/dev/sdb1:
Timing cached reads: 2198 MB in 2.00 seconds = 1099.92 MB/sec
Timing buffered disk reads: 26 MB in 3.19 seconds = 8.15 MB/sec

FAT 好像比較快,理論跟實際跑出來的數值有不同,這個 Hack 應該到這邊了吧,因為不能給手機讀到的檔案系統,改了也沒有用呀,乖乖的用 FAT。
PS. 有時間的話該來試一下,看看 JFS 或是 XFS 會不會讓在 Android 手機 SD 卡上執行的 IO 速度變快吧。

另外,有誰知道 HTC 官方的 Android OS Kernel 編譯了哪些檔案系統支援?

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>