安卓应用查询硬盘可用空间与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/

利用 laradock 快速搭建 laravel 开发环境

简介

编程的时候,最蛋疼的莫过于最开始的搭建开发环境了。有些开发环境搭建很方便,有些却很麻烦。国内 PHP 开发常见的框架 thinkphp 的环境搭建很简单,Windows 系统目前常见的方案是 PhpStudy 集成环境,而 linux 系统则一般是 LAMP(Linux + Apache + Mysql + PHP) 或 LNMP (Linux + Nginx + Mysql + PHP) 的架构。

目前我使用的开发系统是 Deepin 15.11,开发 IDE 是 PhpStorm,数据库访问工具是 PhpMyAdmin,因为所开发的项目需要使用 Redis 存储一些缓存数据,所以还需要安装 Reids。直接在搭建 LNMP + Redis + PhpMyadmin 的方式是可以满足我的需求,但手动安装太麻烦,且开发阶段,经常会碰到切换 PHP 版本的场景,手动搭建的切换版本麻烦。本着拿来主义的精神,我使用了 laradock 环境。

[1]laradock 是一套为 PHP 开发精心设计的 docker 配置,为了使用它,你必须安装了 git (获取laradock),docker 和 docker-compose。程序开发时,要讲究一个用,不懂原理不要紧,先用,后面再慢慢搞清楚。

必要软件安装

git的安装不做赘述,不会的自行搜索。
docker安装:请参考此书 [2]Docker 入门到实践
docker-compose 的安装请参考 [3]安装介绍

构建 laradock 环境

假设你的 PHP 工程代码都位于 /home/user/work 目录下,work 目录下有 A 和 B 两个工程。
1. cd 至 work 目录
cd /home/user/work
2. 获取 laradock 源码
git clone https://github.com/Laradock/laradock.git
3. 进入 laradock 目录,复制 env-example.env
cp env-example .env
laradock 提供的 env-example 文件是一个示例配置,主要用于配置各个软件的版本,默认采用对应软件的最新版,一般不用修改。
因为我本地开发使用的 mysql 是 5.7 的,所以我将 .env 中配置的 mysql 版本由 latest 改为了 5.7。
4. 配置站点
进入 laradock 下的 nginx 目录,在 sites 文件夹下有个 laravel.conf.example 文件,复制并重命名为 a.test.conf。编辑 a.test.conf,将 server_name 改为 a.test,将 root 改为 /var/www/A/public。因为在 docker 运行时,会根据默认配置,将与 laradock 的上级目录挂载至 nginx 容器的 /var/www 目录下,所以,原来的 A 工程在 nginx 容器内的路径实际为 /var/www/A。sever_name 改为 a.test 指定站点域名,因为是本地开发,此域名实际不存在,所以需要在本地的 hosts 文件中添加一行记录 127.0.0.1 a.test
5. 修改 A 工程的 .env 配置文件
DB_HOST=mysql
REDIS_HOST=redis
6. 运行需要的容器
docker-compose up -d nginx mysql phpmyadmin redis workspace
此步骤会按照 .env 的配置构建各个容器并运行,因为长城的存在,这步很可能会挂在某些步骤上,推荐挂梯子运行此步。另外,因为从 docker 官方仓库下载镜像速度很慢,推荐将docker配置为拉取国内镜像。
7. 开始使用
访问站点:浏览器访问 http://a.test
访问 phpmyadmin:浏览器访问 127.0.0.1:8080
运行 composer 或 laravel 工具:在 laradock 目录下运行 docker-compose exec --user=laradock workspace bash 进入容器,工程目录在 /var/www/A
查看 redis:在 laradock 目录下运行 docker-compose exec redis bash 进入容器,运行 redis-cli 命令。