配置系统以保留已删除的文件

tvc*_*tvc 17 linux filesystems partitioning

我正在构建一个安装了 Linux 的新系统,用于特定目的,涉及第三方与其交互。除了应用必要的防火墙规则将计算机与 Intranet 隔离,同时仍然允许访问 Internet 之外,我还需要该系统上的所有文件即使在发出时也能保留(即我能够稍后检索它们)rm,可能是root,或其他方式(程序进行系统调用来删除它)。我不仅仅想要文件系统操作的日志(我auditd相信可以通过 Tripwire 等工具检索),我还需要文件的内容。我想了几种方法来实现这一目标:

  • 别名rmmv some-where-else, 或
  • 修改rm二进制文件。虽然这两种方法可以在某种程度上起作用,但如果程序尝试删除文件,它就会错过,因为现在rm不会调用二进制文件。
  • 在内核中挂钩写入和删除函数,以便对 write 的调用将同时写入两个位置,而删除将仅删除“可见”副本。我认为这是另一种可行的方法,不确定它是否会造成任何破坏。这涉及编写一个小内核模块。虽然我在这方面没有太多专业知识,但如果有源代码,我可以并且将会构建一个。
  • 给予用户fakeroot。这可能行不通,因为他们坚持拥有 root 访问权限来安装程序并修改系统范围的配置(例如 in/etc和 swap 中的配置)。他们一尝试接触这些文件就会知道这一点。
  • 在其他地方保留目录的镜像 ,即在逻辑级别上镜像。据我所知,可以使用诸如rclone. 但是,这只有在创建文件的原始进程完成后才有效。我假设如果一个非常大的zip文件被复制到系统的其他地方,只是从中提取一个很小的文本文件,然后该zip文件被删除,那么它就会被丢失。
  • 选择支持此级别操作的文件系统或修改文件系统配置。因为我还没有创建系统,所以我可以决定使用什么文件系统。我总是选择ext4正常安装,但我没有任何经验,也不知道针对这种情况需要修改的任何配置。squashfs我之前用过一段时间overlayfs,它确实有一个我想要的功能。删除原文件后,overlayfs仅隐藏该文件。如果overlayfs删除分区,原始文件会重新出现。但是,我还想要新文件被删除之前的内容。
  • 主动监视和创建对文件的引用(软链接?),以便rm文件不会使其悬空并受到回收。理论上我觉得这个还不错,但是不知道有没有这样的工具。
  • 创建软件 RAID 1,但以某种方式禁用一个卷上的删除功能。我认为这是不可能的,因为 RAID 1 的运行级别低于逻辑文件系统。不过,如果需要,我可以创建更多卷。
  • 关闭虚拟机相关系统,并为其磁盘创建快照。向第三方提供虚拟机是可以接受的。但是,虚拟机对于存储在其中的逻辑文件系统来说仍然处于较低级别。我认为主机没有办法知道内部正在执行什么确切的文件系统操作。按时间间隔拍摄快照不是一个好主意,因为它会占用大量存储空间,并且还会丢失在快照窗口之间创建和删除的文件。

如果我的理解有什么错误,请指正。任何见解将不胜感激!

编辑:我想从用户的角度澄清这一点:

  • 我需要rm成功并且二进制文件可能会进行系统调用来删除文件,例如remove函数返回 0
  • ls文件被“删除”后不再显示。

但是,我仍然希望之后能够访问该文件。它可以存储在其他地方。

  • 如果可能,应保留原始目录和文件名,如果删除旧文件并写入同名新文件,则可以以任意方式更改文件名。
  • 如果需要,我可以向系统添加更多卷来实现此目标。

dod*_*drg 17

根据您的要求(连续快照、具有 root 访问权限的用户、对用户隐藏备份操作),正确选择文件系统应该是实现您的目标的最简单方法。

\n

您必须记住的一个关键字是“CoW” = “写入时复制”。\n此功能仅在更改时复制数据。复制文件仅创建指向数据的新指针,因此不会占用新空间(元数据除外)。

\n

操作系统级别,硬链接ln Path1/OrgFile Path2/OrgfileCopy将通过链接到相同的内容来实现类似的效果inode(以查看 inode 使用ls -i)。但是,如果软件写入同一个文件(inode 仍然存在),副本也会更改内容 \xe2\x80\x94这不是 CoW,也不会满足您的期望。

\n

CoW 感知文件系统上,副本会创建一个新的 inode,并且新 inode 的指针引用原始文件的数据块。当文件更改时,CoW 功能将在写入新版本的块之前将旧数据块复制到新位置。这样,只有更改的块才会保留新的空间。\xe2\x80\x93 CoW 是任何快照的核心思想,因此真正的快照在创建时不会重复数据(占用新空间)

\n

此时,使用btrfs可能是一种选择,特别是因为快照可以传输到其他位置,甚至可以通过 ssh(请参阅btrfs sendbtrfs receive)。

\n

由于您偏好的是连续但不按时间安排的备份类型,因此btrfs可能不是第一选择,因为这是按时间安排的,您可能会丢失一些短暂的生命文件。

\n

就快照而言,与 btrfs 类似的是ZFS 。ZFS 的快照也代表时间上的状态,但不是变化状态的连续描述。ZFS 的优势体现在其他功能上,即超大容量或本机加密支持,使其成为 NAS 系统的最爱。(尽管在存储上进行了加密,但您必须使用该选项-w将加密的快照发送到其目的地zfs send -w ...:)

\n

另一个解决方案是NILFS(更好的 NILFS2)。

\n

"NILFS" = "日志结构文件系统的新实现" \xe2\x80\x94 整个文件系统的组织方式就像日志文件一样!

\n

因此,在到达文件系统末尾之前,不会覆盖任何数据。由于其组织遵循环形缓冲区的逻辑,垃圾收集器将找到最旧的删除,以便为新数据释放空间。

\n

只要您没有通过连续写入/删除垃圾数据(或使用“擦除磁盘”工具)用新数据或新创建和检测的数据填充整个磁盘大小,您就可以重建删除和更改。对于几秒钟前某人用不同的数据多次写入相同的感兴趣的索引节点的数据来说也是如此。

\n

可以列出“检查点”,然后lscp创建快照mkcp -s(保护此状态在一段时间内不被垃圾收集器破坏)并安装快照,即使当前卷处于活动状态也是如此。\xe2\x80\x94 可以同步快照,即通过rsync将感兴趣的状态存档到其他卷上。

\n

另请参阅:
\n https://www.kernel.org/doc/Documentation/filesystems/nilfs2.txt

\n
\n

注解:

\n

NILFS 的开发已由 Linux 内核团队接管,目前仍在维护中(尽管在搜索互联网时可能有第一印象)。

\n

“Ryusuke Konishi”(NILFS 创始人/几乎不活跃)的原始存储库
\n Linux 内核的 NILFS2 文件系统分支(从 Linus Torvalds 分叉/维护)
\n NILFS 的真实主页:https://nilfs.sourceforge.io \xe2\ x80\x94\n (小心 nilfs.org \xe2\x80\x93 那是假的!)

\n


小智 10

你研究过GitFS吗?看起来您的文件系统需要完整的审核功能,这是版本控制系统的一个特征。GitFS 是一个 FUSE 文件系统,它将提交每个更改并将其推送到远程。

现在对整个文件系统进行版本控制可能有点过头了,但您可以仅挂载该第三方感兴趣的目录。

附带说明:如果您与上述第三方存在信任问题,则技术解决方案可能不适合这种特定情况。

  • 独自投票支持最后一句话。在某种程度上,信任问题超出了(合理的)技术解决方案的能力。那时,您需要问自己在纯技术解决方案(用于初始设置和未来可维护性)上投入的时间/精力是否值得。 (2认同)
  • @tvc 如果您自己在另一台计算机上管理远程,那么大文件应该不是问题。无需在在线服务上拥有底层存储库。 (2认同)

Lin*_*000 5

我最初的想法是尝试 Syncthing 在其他地方提供目标文件夹的单向(只读)副本,并启用版本控制。

作为一种解决方案,它避免了低级智能的需要,但如果没有尝试,我不确定它将如何处理您的 zip 文件场景。

https://syncthing.net/


Fré*_*yer 4

你的rm别名不起作用。仍然可以/bin/rm绕过别名进行键入rm

改变rm也行不通。touch dummy; mv dummy file_to_erase将用空文件替换您的文件。perl -e 'unlink file也会很方便。

如果出现问题确实想返回,请使用备份/克隆、快照或覆盖文件系统。