我有一台 RHEL 7.9 服务器,用作文件服务器。它通过 NFS 公开 XFS 分区,供客户端挂载和使用。如果需要,我愿意使用与 XFS 不同的文件系统,但我无法避免使用 NFS。
我想强制使用回收站,以便恢复意外删除的文件。当我寻找如何在 NFS 下执行此操作时,我看到的大多数结果都是“你不能,使用 CIFS/Samba”。
我认为我可以用来inotifywait
拦截文件删除调用并在回收站目录中创建一个硬链接来“保存”文件免于删除,但似乎 inotifywait 在文件已经消失后运行。
答案1
模拟回收站最简单的方法是使用硬链接。只需创建一个目录并向 cron 添加一个命令即可。
在同一文件系统中但在导出的 nfs 目录之外创建“影子”目录。如果用户应该有权访问已删除的文件,请以只读方式导出它,
当文件从 nfs 目录中删除时,它会保留在磁盘上,因为它链接到影子目录中的文件名,您可以从那里“恢复”它。
有以下选项:
按计划或在 inotify 事件上创建硬链接-在创建新文件后
复制完整目录或单独硬链接每个新文件。
最简单的方法是使用 cp 或 rsync 按计划进行完整目录复制。
添加 cron 条目或添加 systemd 计时器和服务,例如
# -l means create hardlink instead of copy data
cp -al /path/to/nfs_share /path/to/shadow_dir
并且,影子目录中将拥有指向在 nfs 共享上创建的所有文件(名称)的硬链接(影子目录更新之前删除的新文件除外)。
当然,如果 nfs 共享上的新文件名与影子目录中的文件名匹配,它将重新链接到新数据。
它应该很快,因为文件数据根本没有复制,只是文件元数据。
通过inotify
创建事件,cp -al --backup=numbered
您将获得“版本化 bin”,它将存储具有相同文件名的不同版本文件。
答案2
我再说一遍:在 UNIX/Linux 文件操作中,没有“回收站”这样的东西。这是设计使然!
您可以创建目录并将文件移动到那里进行“删除”操作。或者重写 Linux 的文件功能。