默认分类 安卓应用查询硬盘可用空间与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/ 阅读全文 2020-03-17 dogify 0 条评论 2649 次浏览