Skip to main content

回收站

注意

此特性需要使用 1.0.0 及以上版本的 JuiceFS

对存储系统来说,数据的安全性至关重要。因此 JuiceFS 默认开启回收站功能,会自动将用户删除的文件移动到 JuiceFS 根目录下的 .trash 目录内,保留指定时间后才将数据真正清理。

可想而知,在回收站开启情况下,如果应用需要经常删除文件或者频繁覆盖写文件,会导致对象存储使用量远大于文件系统用量。这是因为回收站里包含了以下文件:

  1. 被删除的文件,可以在 .trash 目录中直接查看和操作
  2. 频繁覆盖写时会产生垃圾数据块(详见 FAQ),同样被保留在回收站中,但用户无法直接查看和操作,且默认不支持强制删除,详见「恢复/清理」

配置

用户在初始化(即执行 format 命令)文件系统时,可以通过 --trash-days 参数来设置文件在回收站内保留的时间。在此时间段内,应用删除的文件数据不会被真正清理,因此通过 df 命令看到的文件系统使用量并不会减少,对象存储中的对象也会依然存在。

  • 此参数默认值为 1,意味着回收站内文件会在一天后被自动清理。
  • 将此参数值设为 0 即可禁用回收站功能,系统会在短时间内清空回收站,并使得后续应用删除的文件能被立即清理。
  • 旧版本 JuiceFS 欲使用回收站,需要在升级所有挂载点后通过 config 命令手动将 --trash-days 改为需要的正整数值。

如果是已完成初始化的文件系统,可以继续通过 config 命令更新回收站保留时间,例如:

juicefs config META-URL --trash-days 7

然后通过 status 命令验证配置更新成功:

$ juicefs status META-URL

{
"Setting": {
...
"TrashDays": 7
}
}

使用

在 JuiceFS 根目录下会自动创建一个名为 .trash 的目录,假设挂载点为 /jfs,你可以这样使用回收站:

cd /jfs

# 从回收站彻底删除文件
find .trash -name '*.tmp' | xargs rm -f

# 从回收站恢复文件
# 注意,原目录结构信息已丢失,仅在文件名保留 inode 信息,继续阅读下方说明
mv .trash/[parent inode]-[file inode]-[file name] .

挂载子目录时,将无法进入回收站目录。

组织形式

回收站内固定只有两级深度。第一级为根据时间以 年-月-日-小时 格式命名的目录(如 2021-11-30-10),系统会自动创建它,并将在这个小时内删除的所有文件都放在此目录下。第二级即为平铺的用户文件和空目录(通常的 rm -r <dir> 命令实际会先逐个删除目标目录下文件,再删除空目录)。回收站内不再保留原文件的目录树结构,为了能在不影响正常操作性能的前提下,尽可能提供恢复原树型结构的信息,回收站内的文件被自动重命名成 {父目录 inode}-{文件 inode}-{原始文件名} 格式。其中 inode 是文件系统内部的管理信息(可以通过 juicefs info 命令查看文件 inode),如果用户并不需求文件原始路径,则直接关注最后的原始文件名即可。

注意

第一级目录的命名取自 UTC 时间,与中国北京时间相差 8 个小时。

访问权限

所有用户均有权限浏览回收站,可以看到所有被删除的文件。然而,由于回收站内的文件依然保留了其原来的权限属性,因此用户仅能读取其原本就有权限读取的文件。当文件系统使用子目录挂载模式(挂载时指定了 --subdir)时,回收站将会被隐藏。

回收站内不允许用户自行创建新的文件,并且只有 root 用户才能删除或移动其中的文件。

恢复/清理

只有 root 用户具有回收站目录的写权限,在 root 用户下,可以用 mv 的命令将文件移出回收站来恢复删掉的文件,或者用 rm 将文件从回收站彻底删除。普通用户则没有回收站的写权限,无法方便地使用 mvrm 等命令,如果要从回收站恢复文件,只能读取(有访问权限的)文件,再写入到新文件。

回收站的清理由 JuiceFS 客户端定期运行后台任务执行(默认每小时清理一次),因此需要至少有 1 个在线的挂载点(不能开启 --no-bgjob)。如果你希望尽快释放对象存储空间,也可以手动强制清理,以 root 身份在 .trash 目录执行 rm 命令即可。

值得一提,覆写产生的文件碎片由于对用户不可见,所以无法轻易强制删除。如果你确实想要主动清理它们,可以临时禁用回收站(设置 --trash-days 0),再通过 juicefs gc 命令将这些数据块标为泄漏并删除。操作完成以后,记得重新开启回收站。