现象描述

基于安卓平台的机顶盒,在搭载一块大小为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:~sudotune2fs−l/dev/sda7|grep“Reservedblockcount”Reservedblockcount:732463已用空间+可用空间和总空间相比,还少了近3个Glily@LLY:  df


文件系统 1K-块 已用 可用 已用% 挂载点

/dev/sda7 57677500 47662588 7085060 88% /home


调整:

lily@LLY:~sudotune2fs−r25600/dev/sda7tune2fs1.41.9(22−Aug−2009)Settingreservedblockscountto25600再来看看空间,哈哈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/