如何调试/审核哪些设备缓存写入?

如何调试/审核哪些设备缓存写入?

我将文档存储在基于稀疏 dm-crypt 设备的 btrfs 分区上,该设备位于物理硬盘上的 ext4 主分区上。

当内核崩溃时(这在我的装有 3.6 内核的 ASUS P53E 上每天都会发生 :-( )),我会丢失最近修改的文件(文件的内容总是被零替换)。

防止文件损坏的一种方法是禁用写入缓存。

为此,我需要禁用 btrfs 分区、支持该分区的 dm-crypt 设备以及 dm-crypt 设备所在的稀疏文件的写入缓存。

  1. 如何检查驱动器的缓存写入状态?
  2. 我怎样才能禁用它?

我使用 Mint 13 Maya 和 3.6.8 主线内核。

答案1

我不确定磁盘驱动器写入缓存是否会为您解决问题,因为听起来您正在使用循环设备。因此,Btrfs 文件系统和实际磁盘之间仍然存在页面缓存/文件。日志文件系统也存在相同类型的问题此处详细介绍了循环 AES。因此,当数据同步到循环设备时,它可能不在真实磁盘上,而只是在缓存中等待重新排序和写出。

ext4 不支持syncext2/3 用来禁用缓存的挂载选项。由于中间的层数,我什至不确定这是否能让您有效康复。不幸的是,我对内部结构了解不够,至少可以将更多数据写入光盘。

以同样的方式你也许能够限制通过调整页面缓存来解决这个问题,以便系统更频繁地写入磁盘。 Linux 页面缓存报告其值/proc/meminfo如下

"Dirty" - for pages that are currently dirty
"Writeback" - for dirty pages that are being written out to disk.

有文件在/proc/sys/vm/报告状态并控制将数据写回磁盘的刷新线程。

您可以在其中输入一个较小的值(大于 8096 或 2 页)/proc/sys/vm/dirty_background_bytes使后台 pdflush 进程更活跃地运行或/proc/sys/vm/dirty_bytes使进程触发器更积极地刷新(为了性能损失,或者至少总体上更多的磁盘写入)。

我认为硬件写入缓存不太可能是您的主要问题所在。如果您只是通过 dm-crypt 直接访问设备,那么我会先查看那里。在任何情况下,IDE 和 SATA 写入缓存都可以通过 禁用hdparm -W0 /dev/xdx

此外,当您以比大多数情况更边缘的方式使用技术上的实验性文件系统时,您可能会更幸运地使用更成熟的文件系统,人们已经偶然发现了这些问题。如果您需要 Btrfs,最好的选择是对物理分区进行加密。

答案2

到目前为止,我已经找到了一种为物理分区设置写入缓存行为的方法(/dev/sda6在我的例子中):

sudo hdparm -W /dev/sda6用于检查写入行为并sudo hdparm -W0 /dev/sda6禁用写入缓存。

但在我的情况下,这有点过分了;我只想禁用支持 dm-crypt 的文件的写入缓存,而不是整个分区。

相关内容