


Linux 下大规模文件自动清理方法(2)
在指定绝对路径下删除一个文件,rm 就可以实现;如果只知道文件名,不知道路径,我们可以通过 `find` 找到它,然后删除。推而广之,如果我们可以根据预设的条件找到指定文件,我们就可以实施删除操作。这也就是文件自动清理的基本思路,根据预设条件生成待删 除文件列表,然后执行定期清除任务实施删除操作。
对于过期文件而言,他们共同标志是时间戳,根据不同的文件系统,可能是文件创建时间,访问时间,过期时间等不同的时间属性。由于过期文件大多 存在于归档系统上,这类文件的特点是数量巨大,对于大型系统而言,每天的过期文件数量都可能达到数十万甚至百万的数量级。对于如此规模的文件数量,扫描文 件系统,生成文件列表就需要大量的时间,所以文件清理性能是此类人物不得不考虑的问题。
对于垃圾文件而言,有可能会是存放在特定目录下的文件,也有可能是是以特殊后缀名结尾的文件,还有可能是因为系统错误产生的 0 尺寸或者超大尺寸的文件,对于这些文件而言,文件数量一般不大,但是种类比较繁多,情况比较复杂,需要根据系统管理员的经验,制定比较细致的文件查询条 件,定期扫描,生成文件列表,然后进行进一步处理。
相关 Linux 命令简介
常用的文件系统管理命令包括 `ls`,`rm`,`find` 等等。鉴于这些命令都是常见的系统管理命令,在此不做赘述,详细用法请参见命令帮助或者 Linux 使用手册。由于大规模文件系统一般都存储在专用的文件系统上,这些文件系统都提供了独有的命令进行文件系统管理。本文实践章节以 IBM 的 GPFS 文件系统举例,以下简要介绍 GPFS 的若干文件系统管理命令。
mmlsattr
此命令主要用于查看 GPFS 文件系统中文件的扩展属性,如存储池信息,过期时间等属性。
mmapplypolicy
GPFS 采用策略对文件进行管理,此命令可以根据用户定义的策略文件,对 GPFS 文件系统执行各种操作,具有非常高的效率。
大批量文件自动清理的难点
Linux 文件删除机制
Linux 是通过 link 的数量来控制文件删除,只有当一个文件不存在任何 link 的时候,这个文件才会被删除。每个文件都有 2 个 link 计数器—— i_count 和 i_nlink。i_count 的意义是当前使用者的数量,i_nlink 的意义是介质连接的数量;或者可以理解为 i_count 是内存引用计数器,i_nlink 是硬盘引用计数器。再换句话说,当文件被某个进程引用时,i_count 就会增加;当创建文件的软连接或者硬连接的时候,i_nlink 就会增加。
对于 rm 而言,就是减少 i_nlink。这里就出现一个问题,如果一个文件正在被某个进程调用,而用户却执行 rm 操作把文件删除了,会出现什么结果呢?当用户执行 rm 操作后,ls 或者其他文件管理命令不再能够找到这个文件,但是进程却依然在继续正常执行,依然能够从文件中正确的读取内容。这是因为,`rm` 操作只是将 i_nlink 置为 0 了;由于文件被进程饮用的缘故,i_count 不为 0,所以系统没有真正删除这个文件。i_nlink 是文件删除的充分条件,而 i_count 才是文件删除的必要条件。
对于单个文件删除而言,我们可能完全不需要关心这个机制,但是对于大批量文件删除,这却是一个非常重要的因素,请允许我在随后章节中详细阐述,此处请先记下 Linux 的文件删除机制。
生成待删除列表
当一个文件夹下面有 10 个文件的时候,`ls` 可以一目了然,甚至可以用 `ls – alt` 查看所有文件的详细属性;当文件变成 100 个的时候,`ls` 可能只能看一看文件名了;文件数量上涨到 1000,多翻几页可能还能接受;如果是 10,000 呢? `ls` 可能需要等上半天才能有结果;再扩展成 100,000 的时候,绝大多数系统可能都没有反应,或者“Argument list too long”了。不止是 `ls` 会遇到这样的问题,其它的常用 Linux 系统管理命令都会遇到类似的问题,Shell 有参数来限制命令的长度。就算我们可以通过修改 Shell 参数来扩展命令长度,但这并不能提高命令的执行效率。对一个超大规模的文件系统而言,等待 `ls` 和 `find` 等常用文件管理命令的返回的时间是不可接受的.
那么我们如何能够在更大数量级的文件系统上生成删除文件列表呢?一个高性能的文件系统索引是一个好方法,不过高性能的文件索引是少数人的专利 (这也解释了为什么 google 和 baidu 能这么赚钱)。好在如此规模的文件系统一般都只存在于高性能文件系统里面,这些文件系统都提供了非常强大的文件管理功能。譬如前面提到的 IBM 通用并行文件系统(GPFS)的 mmapplypolicy,通过直接扫描 inode 来快速扫描整个文件系统,并能够根据指定条件返回文件列表。下面演示如何根据时间戳和文件类型来获取文件列表
新文章:
- CentOS7下图形配置网络的方法
- CentOS 7如何添加删除用户
- 如何解决centos7双系统后丢失windows启动项
- CentOS单网卡如何批量添加不同IP段
- CentOS下iconv命令的介绍
- Centos7 SSH密钥登陆及密码密钥双重验证详解
- CentOS 7.1添加删除用户的方法
- CentOS查找/扫描局域网打印机IP讲解
- CentOS7使用hostapd实现无AP模式的详解
- su命令不能切换root的解决方法
- 解决VMware下CentOS7网络重启出错
- 解决Centos7双系统后丢失windows启动项
- CentOS下如何避免文件覆盖
- CentOS7和CentOS6系统有什么不同呢
- Centos 6.6默认iptable规则详解