iPhone文件系统简析

WeiPhone看到很多人讨论iPhone系统升级后剩余空间问题,闲来无事研究了一下,也算和大家一起了解其所以然,顺便巩固一下*NIX的知识。

iPhone 3g刚买不到一个月,今天升级2.2后发现/剩余空间才51M,之前2.1至少有85M多吧,带着点疑惑,靠N年Linux使用经验(N>6)去摸索了一下iPhone的基于Darwin的操作系统。

可以直接用MobileTerminal或者任何SSH client连接到iPhone用root运行df查看分区使用情况。
localhost:~ root# df -h Filesystem Size Used Avail Use% Mounted on /dev/disk0s1 500M 441M 55M 90% / devfs 25K 25K 0 100% /dev /dev/disk0s2 7.1G 1.8G 5.4G 25% /private/var
刚开始纳闷怎么BSD上没有fdisk这个很多Linux发行版带的工具,只能怪自己并不太熟悉BSD分支。

/和/private/var的剩余空间
其实大家看一下/etc/fstab就明白了,机器内置的Flash存储介质被分成两个分区mount到/(root,翻译为根)和/private/var
fstab的内容
/dev/disk0s1 / hfs rw 0 1 /dev/disk0s2 /private/var hfs rw 0 2

OS X是基于UNIX BSD分支的,Apple称之为Darwin。因此我暂且认为他FreeBSD的fstab结构是一样的,fstab文件的结构是:
device name | mount point (file system path prefix) | file system type | dump frequency | pass number on parallel fsck

熟悉 mount 命令的应该知道还有几个可选项,我就不多说了(因为没看到iPhone默认的fstab中有,可能是因为分区和文件系统相对比较简单),看 FreeBSD 文档: mount(8)

非常简单的配置文件,/dev/disk0s1应该就是第一个分区HFS (Hierarchical File System)文件系统,OS X 10.5^用的已经是HFS+,是HFS的升级版本,而10.6 Snow Leopard会直接用Sun的ZFS了,强大!权限是rw,read/write。后面是 dump frequency (备份相关)和 fsck (启动时扫描检查文件系统一致性),/默认为1,其他为2,0代表启动时候不扫描。

自己通过Cydia (我更喜欢说APT)安装的程序,比如Terminal和Finder都会在/Applications目录下相关的.app目录中。用Terminal连过去ls看了,发现/Applications是symbolic link,指向/private/var/stash/Applications.Ktadjr

结果如下:
localhost:~ root# ls -al /Applications /private/var/stash/ lrwxr-xr-x 1 root admin 30 Nov 25 21:53 /Applications -> /var/stash/Applications.KTadjr/
Terminal

后面的字符串应该是根据某种算法生成的,不同机器上肯定不同。升级后还会发现目录下会有同样前缀的重复目录,其实无所谓,不回重复占用空间。据说可以手动删除无用的,也可以用恢复的办法,但是我没有试过,洁癖不那么严重。所以Cydia安装的程序,也会在/private/var分区上。注意/的free space即可。

实在喜欢纠结的,可以用BossTool调整/分区大小,或者直接用别人定制的firmware。

App store安装的apps,ipa格式,都是在/private/var/mobile下,也就是另外一个分区上的,因此没必要对/的剩余空间过于纠结了,apple不至于傻b到让/分区空间不足导致OS X mobile crash掉吧?

有什么错误之处,欢迎指正,大家一同学习进步:)