![Sysrq+J“解冻冻结的文件系统”是什么以及它为什么会失败?](https://linux22.com/image/1296443/Sysrq%2BJ%E2%80%9C%E8%A7%A3%E5%86%BB%E5%86%BB%E7%BB%93%E7%9A%84%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E2%80%9D%E6%98%AF%E4%BB%80%E4%B9%88%E4%BB%A5%E5%8F%8A%E5%AE%83%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
是否需要解冻由于文件系统问题(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 邮件列表存档