为什么在错误的“rm”后关闭机器可以保存我的文件?

为什么在错误的“rm”后关闭机器可以保存我的文件?

经典情况:我运行得很糟糕rm,然后立即意识到我删除了错误的文件。 (没什么重要的,而且我有最近的备份,但仍然很烦人。)

我知道如果我想使用extundelete此类工具恢复文件,进一步的磁盘活动是我的敌人,我立即以物理方式关闭机器电源(即使用电源按钮,而不是使用halt任何此类命令)。这是一台没有运行任何重要任务或打开任何东西的笔记本电脑,因此这是一个可以接受的操作。 (顺便说一下,从那时起我了解到,在这种情况下要做的第一件事是首先估计丢失的文件是否仍然可以被进程打开https://unix.stackexchange.com/a/101247-- 如果是,您应该以这种方式恢复它们,而不是关闭机器。)

尽管如此,一旦机器断电,我想了一会儿,并认为这些文件不值得投入时间来启动实时系统进行适当的取证。所以我重新启动了机器。然后我发现我的文件仍然位于磁盘上:rm在我关闭电源之前,这些文件还没有传播到磁盘上。我跳了一小段舞,感谢系统管理员之神出乎意料的宽恕。

我现在的问题是了解这是如何实现的,以及rm实际传播到磁盘之前的典型延迟是多少。我知道磁盘 IO 不会立即刷新,而是会在内存中保存一段时间,但我认为磁盘日志会快速确保挂起的操作不会完全丢失。https://unix.stackexchange.com/a/78766似乎暗示了一个单独的机制来刷新脏页和刷新日志操作,但没有提供有关日志如何参与 a 的足够详细信息rm,以及刷新操作之前的预期延迟。

更多详细信息:数据位于 LUKS 卷内的 ext4 分区中,当启动机器备份时,我在 中看到以下内容syslog

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

但我不确定这与rm.

另一个问题是是否有办法告诉内核不要执行任何挂起的磁盘操作(而是将它们转储到某个地方),而不是关闭机器电源。 (当然,不执行挂起的操作听起来很危险,但这就是关闭机器时会发生的情况,并且在某些情况下它可以拯救您。)当然,这会“更干净”,而且也很有趣例如,对于远程服务器来说,物理断电并不是一个简单的选择。

答案1

听起来你对发生的事情已经有了相当的了解。

是的,因为您在将更改提交到磁盘之前硬关闭了系统,所以当您重新启动时它们就在那里。

系统在将所有写入刷新到磁盘之前对其进行缓存。有几个选项可以控制此行为,全部位于/proc/sys/vm/dirty_* [内核文档]。除非应用程序通过[显式执行刷新fsync() 人2 fsync],当数据足够旧或写缓存已满时,数据就会被提交。
上面使用的“数据”的定义包括对目录条目的修改以删除文件。

现在,就期刊而言,这是对期刊用途的常见误解之一。日志的目的不是确保重播更改或数据不丢失。日志的目的是防止文件系统本身的损坏,而不是其中的文件的损坏。日志仅包含有关所做更改的信息,而不(通常)包含更改本身的完整数据。确切的细节取决于文件系统和日志模式。对于 ext3/4,请参阅data中的挂载选项man 8 mount


要回答您的补充问题:是否有办法在不重新启动的情况下防止挂起的写入:

通过快速阅读内核源代码,看起来您可以使用神奇的 sysrqu命令([维基百科],[内核文档])执行紧急重新安装只读操作。看来这将立即以只读方式重新安装所有卷没有同步操作。

要使用它,只需按Alt+ SysRq+即可u

答案2

从:https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit=nrsec (*) Ext4 可以被告知每隔“nrsec”秒同步其所有数据和元数据。默认值为 5 秒。这意味着,如果您断电,您将丢失最近 5 秒的工作(不过,由于日志功能,您的文件系统不会被损坏)。此默认值(或任何低值)会损害性能,但有利于数据安全。将其设置为 0 与保留默认值(5 秒)具有相同的效果。将其设置为非常大的值将提高性能。

另请参阅此处有关如何冲洗它们的信息:如何清空 Linux 系统上的缓冲区和缓存?

引用自上面的链接:

注意:清理内存中不必要的东西(Kernerl 2.6.16 或更高版本)。始终确保首先运行同步以将有用的内容刷新到磁盘!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

相关内容