安卓应用查询硬盘可用空间与df查询不一致的研究结果

现象描述

基于安卓平台的机顶盒,在搭载一块大小为2.8T的硬盘时,df命令查看可用空间为164G,但采用安卓API查看可用空间仅为24G。

测试步骤

1.写一个测试程序,不断地向硬盘里写入东西,检测安卓应用读到的24G可用空间是否真实可靠。
2.在测试程序读到可用空间为10M时,再尝试写入一个100M的文件,安卓抛出写入异常。此时,df命令查看的可用空间为140G,而测试程序读到的可用空间为0。在测试程序读到的可用空间为0时,仅允许创建一个空文件,不允许写入内容。
3.以上测试步骤在FAT32和NTFS格式上的硬盘上未发现问题。

测试结论

查阅资料发现ext2、ext3、ext4格式的硬盘存在一个root用户保留区域,用于root用户维护系统或者记录系统关键日志的时候使用,大小默认为硬盘总大小的5%。而安卓软件查询可用空间调用函数是返回普通用户的可用空间,这就导致了软件查询可用空间与df结果不符的问题。
由于安卓软件的权限最高只能拉到SYSTEM,所以无法访问root保留空间。

解决办法

利用命令减少root保留区间,参考命令在最后。利用这个命令,将root保留区块减为0,测试软件读到的可用空间与df所查询到的一致。
综上,这个问题解决。

之前的保留区有 732463 块
lily@LLY:~$ sudo tune2fs -l /dev/sda7 | grep "Reserved block count"
Reserved block count:     732463
已用空间+可用空间 和 总空间 相比,还少了近3个G
lily@LLY:~$ df
文件系统             1K-块      已用      可用 已用% 挂载点
/dev/sda7             57677500  47662588   7085060  88% /home
调整:
lily@LLY:~$ sudo tune2fs -r 25600 /dev/sda7
tune2fs 1.41.9 (22-Aug-2009)
Setting reserved blocks count to 25600
再来看看空间,哈哈
lily@LLY:~$ df
文件系统             1K-块      已用      可用 已用% 挂载点
/dev/sda7             57677500  47662584   9912516  83% /home
确认调整成功
lily@LLY:~$ sudo tune2fs -l /dev/sda7 | grep "Reserved block count"
Reserved block count:     25600

参考链接

减少root保留区块命令参考链接:http://luy.li/2010/01/08/reserved_block/