问题
最近在调试一个嵌入式设备flash上的目录时,出现一个看似奇怪的现象:
执行卸载目录命令: umount test
后,ls test
查看该目录下仍存在文件。
重启设备,在mount前,ls查看时仍然有上述文件。
感觉很奇怪,查看了资料,原来是把该目录mount在了flash上,解决了这个问题。
详细描述
test是程序中使用的目录,程序会查询该目录下是否存在文件。
test挂载在/dev/mtd5
下,test的父目录parent挂载在/dev/mtd4
下。
test的目录结构为/parent/test
。
程序启动时,会创建这些目录并执行挂载命令:
mkdir -p parent
mkdir -p parent/test
mount /dev/mtd4 /parent
mount /dev/mtd5 /parent/test
程序中有一项业务是清除test目录,执行如下流程:
- 卸载test目录
- 分别用0和1清除分区
- 挂载test目录
在执行过程中,程序会读取test目录下是否存在文件,理论上从第1步开始该目录就应该是空了,但实际上卸载目录后,ls查看仍存在文件。
而在执行第3步后,ls查看时没有文件了。经过排查,发现再umount后,ls查看仍然存在文件。
分析完毕后,查找原因:
- test挂载在flash上,如果某次在mount到/dev/mtd5之前,有人写文件到test目录,就会写在flash上
- 此时,即使不mount,ls查看目录会看到已经写入的文件
- mount后,ls就只能查看到挂载点上的文件了,原写入文件查看不到
- 但,每次umount后,ls都能查看到原写入的文件
解决办法:
- 全面检查程序,排除在umount后,有向test写入文件的操作
- 把test挂载在内存而非flash上,这样每次重启时,test下均为空,某次操作失误在重启后会消除
- 在启动脚本中,每次创建test目录后,执行一次清空test目录的操作
rm -rf test/*
,确保启动后为干净状态
总结
对于这个现象,一开始还以为是清除flash操作有问题,没有把文件完全清除,思路比较狭隘。
在任何情况下,当程序出现问题时,都不应该首先怀疑通用组件出了问题,而应该检查自己程序的问题,最后的结果也表明,是自己程序的问题的概率远大于通用组件问题。
定位问题时要思路开阔,不能一开始就局限想法,列出所有的可能,再排查。