![如何调试/审核哪些设备缓存写入?](https://linux22.com/image/43664/%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95%2F%E5%AE%A1%E6%A0%B8%E5%93%AA%E4%BA%9B%E8%AE%BE%E5%A4%87%E7%BC%93%E5%AD%98%E5%86%99%E5%85%A5%EF%BC%9F.png)
我将文档存储在基于稀疏 dm-crypt 设备的 btrfs 分区上,该设备位于物理硬盘上的 ext4 主分区上。
当内核崩溃时(这在我的装有 3.6 内核的 ASUS P53E 上每天都会发生 :-( )),我会丢失最近修改的文件(文件的内容总是被零替换)。
防止文件损坏的一种方法是禁用写入缓存。
为此,我需要禁用 btrfs 分区、支持该分区的 dm-crypt 设备以及 dm-crypt 设备所在的稀疏文件的写入缓存。
- 如何检查驱动器的缓存写入状态?
- 我怎样才能禁用它?
我使用 Mint 13 Maya 和 3.6.8 主线内核。
答案1
我不确定磁盘驱动器写入缓存是否会为您解决问题,因为听起来您正在使用循环设备。因此,Btrfs 文件系统和实际磁盘之间仍然存在页面缓存/文件。日志文件系统也存在相同类型的问题此处详细介绍了循环 AES。因此,当数据同步到循环设备时,它可能不在真实磁盘上,而只是在缓存中等待重新排序和写出。
ext4 不支持sync
ext2/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 的文件的写入缓存,而不是整个分区。