Sysrq+J“解冻冻结的文件系统”是什么以及它为什么会失败?

Sysrq+J“解冻冻结的文件系统”是什么以及它为什么会失败?

是否需要解冻由于文件系统问题(NFS、FUSE、bug)而处于不间断睡眠状态的进程?

如果我在 Linux 上按下 Sysrq+J,系统会暂停并无限循环打印“Emergency Thaw on sda”,不允许任何其他 SysRq?只有硬重启才有用。

答案1

答案2

这是内核的一个错误,它仍然存在于内核 3.13 amd64(来自 Ubuntu Trusty)中。

作为_Vi在他的虚拟机中测试了VBoxManage controlvm <vm_name> keyboardputscancode 1d 38 54 24 a4 d4 b8 9d以下结果:

3.3.6-pf-vi+  : Reproducible
3.2.0-zen-vi+ : Reproducible
3.0.4-zen-vi+ : Reproducible
2.6.37.5-zen-... : Reproducible
2.6.33-zen2-... : Reproducible
2.6.32-zen1-... : Reproducible
2.6.31-zen11-... : Not reproducible
2.6.30-zen2-... : Not reproducible

从 Dave Chinner 的书中我们可以看到:

通过 sysrq-j 解冻文件系统会无限循环,因为它会错误地将解冻的文件系统检测为冻结,并反复尝试解冻。这是由 4504230a71566785a05d3e6b53fa1ee071b864eb(“freeze_bdev:获取对冻结超级块的活动引用”)引起的回归,因为它不再为未冻结的超级块返回 -EINVAL。

进一步检查后发现了更深层次的问题 - 使用 freeze_super() 冻结的文件系统无法通过 thaw_bdev() 解冻,因此紧急解冻对任何手动冻结的内容都不起作用,并且由于超级块在紧急解冻中被迭代并且已经被保持读取,因此 sb->s_umount 上会发生死锁。

无论我们在哪里冻结或解冻,我们都已经有了一个超级块,或者可以轻松获得一个超级块,因此可以直接调用 freeze_super()。因此,我们可以终止 bdev 级别的操作,并将所有嵌套基础设施移至超级块级别,这样我们就有了一个一致的接口。

来源:回复:2.6.34 echo j > /proc/sysrq-trigger 导致 inifniteunfreeze/Thaw 事件在 linux-kernel 邮件列表存档

相关内容