回收站
JuiceFS 支持回收站功能,所有被删除的文件将会在其中保存一段时间(这些文件仍参与计费!他们的数据也会被保留在对象存储)。
用户可以登录 JuiceFS Web 控制台,在文件系统的「回收站」标签页删除或恢复其中的文件。但如果你已经在宿主机挂载了 JuiceFS,那么只需要在挂载点根路径下运行 ls .trash
,就可以看到回收站中的文件。需要注意:.trash
是一个虚拟目录,必须完整输入,不支持自动补全。即便运行 ls -alh
,输出结果中也不会展示。
通过命令行的方式可以方便地恢复误删的文件,详见「从回收站恢复数据」。但如果希望清空回收站、尽快释放容量和减少存储费用,出于安全考虑,用户必须登录控制台操作,详见「清空回收站」。
回收站的作用不仅仅是保护误删的文件,事实上,所有的数据修改都受到回收站的保护,包括文件的覆盖写。阅读回收站和文件碎片了解更多。
用户创建文件系统时,回收站功能默认开启。保存时限免费版为 1 天,专业版为 7 天。用户可以登录 JuiceFS 控制台,在设置标签页修改过期时间。
将文件移入回收站
在 shell 里执行 rm
命令,目标文件就会被移入回收站。但如果要删除大量文件,我们推荐使用 juicefs rmr
,该命令直接从元数据服务操纵元数据,绕过 POSIX API,速度更快。
移入回收站后,文件不再被原目录所包含,但文件内容仍然保存在对象存储中。如果被删除的文件与回收站中已有的项目路径相同,则会在回收站中同时保存多个版本。
注意以下几种情况不在上述范围内:
- 回收站只对文件有效,目录会被立即删除。恢复文件的时候会连带恢复原始目录结构,但无法保持先前的目录属性。特别的,如果被删除的是空目录将无法恢复;
- 如果使用
juicefs snapshot -d <path>
删除快照,目标将被立即删除,不会进入回收站。但执行rm <path>
时,快照会进入回收站,请根据你的需求选择合适的删除方式; - 回收站对
juicefs import
创建的目标无效,被导入的对象对应的 元数据将立即被删除,用户对象存储中的内容不受影响。
清空回收站
回收站的文件仍参与 JuiceFS 以及你所使用的对象存储的计费,如果担心这部分费用,可以操作清空回收站。清空回收站必须通过控制台来完成,无法在命令行进入挂载点的 .trash
目录强行删除。 请登录控制台,在回收站标签页中将回收站中的文件彻底删除。
从回收站删除文件后,元数据会从元数据服务上标记删除,从而不再参与 JuiceFS 计费。但请注意,对象存储上的文件块,永远会按照删除文件时刻的回收站保留时间来安排删除,不会因为清空回收站而受影响。即便你在清空回收站以后,再去修改回收站保留时长,也并不影响先前删除的文件在对象存储上的清理计划。
在私有部署中,回收站的行为可以进行更全面的定制,有专门的手段来紧急清空回收站、释放对象存储空间,详询 Juicedata 团队。
彻底删除以后,对象存储数据块并不会严格按照过期时间来删除,而是以「后台任务」的形式分发给各个客户端执行,因此对象存储数据未必会及时清理。为了确保回收站功能正常运行,文件系统必须保持至少一个 JuiceFS 客户端挂载(并且不能禁用后台任务)。无论是 FUSE,还是 Hadoop Java SDK,亦或是 S3 网关,这些客户端在该方面均以类似的机制工作,如果你的文件系统完全没有任何客户端挂载运行,那么回收站中的文件将无法正确过期和释放。
从回收站恢复数据
通过控制台恢复数据
用户可以登录 JuiceFS 控制台,将回收站中的文件恢复到原路径:
- 切换标签页到回收站;
- 选择需要恢复的文件;
- 点击「恢复」按钮,或者如果是需要恢复所有文件,则直接点击「恢复所有」。
通过命令行恢复数据
如果误删了大目录,待恢复的文件数太多,控制台操作不便,你也可以在挂载点根目录下的 .trash
虚拟目录中直接操作。假设 JuiceFS 挂载点为 /jfs
,参考下方示范。
在回收站下 ls
,会注意到输出格式与普通目录不同,格式类似:
'66637676|dir1|dir2|file.txt'
起首的数字是 inode,而后续的管道符号 |
也仅仅是一种展示优化,代表目录结构,用下方示范的 mv
进行恢复操作以后,将会保持原本的路径和文件名。
也正是由于管道符号的存在,操作回收站里的文件时,需要加上单引号,否则管道符号会被 shell 进行错误解读,让命令无法正确执行。
# 进入 JuiceFS 文件系统的挂载点根路径
# 注意:必须是文件系统的根路径,子目录挂载点无法访问 .trash 虚拟目录
cd /jfs
# 请完整输入命令,不要依赖 shell 的自动补全
# .trash 目录不会出现在 ls 输出中,因此也不支持自动补全
ls .trash
# 从回收站的所有文件中找出完整路径包含 xxx 的所有文件
ls '.trash/xxx'
# 从回收站中恢复所有路径包含 xxx 的文件
# 注意恢复目的地必须是挂载点的根,不能改写为其他路径
mv '.trash/xxx' .
# 恢复包含 tar.gz 的所有文件
mv '.trash/tar.gz' .
按照上方的示范执行恢复操作,可能会遭遇以下情形或困惑:
mv
命令的目的地必须是挂载点根路径,这是因为 JuiceFS 也只支持将文件恢复到原始路径,因此以上边的示范为例,目的地必须是.
或者/jfs
,不能改写为其他路径;- 如果遇到
cannot move '.trash/xxx' to a subdirectory of itself
错误,则需要考虑换一种方式执行:- 通过控制台操作数据恢复,绕过 FUSE 挂载点;
- 使用下方基于
find
的示范,对需要恢复的文件进行单独处理,也可绕开该问题。
如果需要根据更复杂的规则进行过滤恢复,可以使用 find
命令:
# 回收站内文件,ctime(change time)代表删除 时间,因此可以根据删除时间范围来筛选。
# 以下命令表示恢复所有 ctime 大于 2023-12-12 17:30:00 及小于 2023-12-13 23:00:00 的文件
find .trash -newerct "2023-12-12 17:30:00" ! -newerct "2023-12-13 23:00:00" -exec mv {} . \;
# 恢复所有 tar.gz 文件
find .trash -name '*.tar.gz' -exec mv {} . \;
# 恢复 mydir 下所有的 tar.gz 文件
find .trash -name '*|mydir|*.tar.gz' -exec mv {} . \;
# 恢复所有名为 mydir 的目录
find .trash -wholename '*|mydir|*' -exec mv {} . \;
# 恢复 mydir/text.txt
find .trash -wholename '*|mydir|text.txt' -exec mv {} . \;
需要注意:
- 使用命令行恢复大量文件时(超过 10 万),可能会遗漏部分文件,建议优先使用控制台进行恢复操作。 如果必须使用命令行进行大量文件恢复操作,需要将过滤条件写好以后(如上方命令示范),反复执行,来确保没有遗漏。
- 如果文件所在的目录不存在, 将会以
root
用户身份自动逐级创建(类似于sudo mkdir -p
的效果)。请注意自动创建的目录的所有者和访问权限可能会与原目录不一致,需手动调整。 - 如果文件系统中已存在相同路径的文件或目录,那么恢复的文件名后会加一个整数序号消除冲突,比如
/a/b/c.txt
会恢复成/a/b/c.txt-1
。 - 如果在回收站中同时选中多个文件,将会按列表顺序依次尝试恢复,路径冲突的项目会被跳过。