使用冻结的文件系统刷新文件系统缓存

使用冻结的文件系统刷新文件系统缓存

我的印象是通过 sysctl 删除缓存vm.drop_caches会删除全部缓存,但是当我冻结文件系统并删除页面缓存时,我仍然可以读取该目录:

# fgrep ' /mnt ' /proc/mounts
/dev/mapper/test /mnt ext2 rw,noatime 0 0
# ls /mnt
lost+found
# fsfreeze --freeze /mnt
# echo 3 > /proc/sys/vm/drop_caches
# ls /mnt
lost+found

即使在同步之后,我也可以读取文件:

# echo "hello world" > /mnt/foo
# sync
# fsfreeze --freeze /mnt
# echo 3 > /proc/sys/vm/drop_caches
# cat /mnt/foo
hello world

我想放弃全部的文件系统缓存,以便后续读取(文件和目录项)被阻止,直到文件系统使用fsfreeze --unfreeze /mnt.我该怎么做呢?

为什么不vm.drop_caches这样做呢?它不会删除预读缓存之类的东西吗?

答案1

解决方案是另外刷新块设备缓冲区并挂起设备映射器目标,而不是手动冻结文件系统(因为dmsetup suspend也会冻结文件系统):

# ls /mnt
lost+found
# echo 3 > /proc/sys/vm/drop_caches
# blockdev --flushbufs /dev/mapper/test
# dmsetup suspend test
# ls /mnt

该命令现在会阻塞,并且只有在运行ls时才会解除阻塞。dmsetup resume test

相关内容