![禁止将转储文件写入 efivars](https://linux22.com/image/201959/%E7%A6%81%E6%AD%A2%E5%B0%86%E8%BD%AC%E5%82%A8%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%20efivars.png)
最近我注意到一个问题,我的两台机器(ThinkPad X230 和 W530)独立地开始耗尽存储 UEFI 启动变量的 NVRAM。这会阻止它们启动。幸运的是,我在切换到传统启动模式后成功启动了操作系统(两者都是 Ubuntu 20.04.1),但这并不能解决问题。
经过进一步检查,发现每次启动后,都会在/sys/firmware/efi/efivars
.虽然显示“正常”变量的内容时使用cat
清楚地显示了一些内容(当然是乱码,因为这是二进制数据),但变量cat
-tingdump
没有显示任何内容 - 它们看起来完全是空的,但占用了大量空间。这些转储变量通常具有很长的名称,例如dump-type0-11-1-1643821377-C-cfc8fc79-be2e-4ddc-97f0-9f98bfe298a0
.
我开始进一步挖掘并在journalctl 中搜索这些变量名称的部分内容。我发现这些是由 pstore 写入 efivars 的,由如下日志证明:
Feb 03 10:37:35 slazien-thinkpad-x230 systemd-pstore[1367]: PStore dmesg-efi-164382137702001 moved to /var/lib/systemd/pstore/164382137/dmesg-efi-164382137702001
据我了解,它是 systemd-pstore 负责将内核转储从 移动到/sys/fs/pstore
到/sys/firmware/efi/efivars
(如果我错了,请纠正我)。因此我尝试通过设置禁用 pstore 处理Storage=none
因此我尝试通过设置来pstore.conf(5)。虽然这消除了前面提到的journalctl日志,但(空?)转储文件仍在写入。
作为参考,systemd-pstore 运行良好:
systemctl status systemd-pstore.service
● systemd-pstore.service - Platform Persistent Storage Archival
Loaded: loaded (/lib/systemd/system/systemd-pstore.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2022-02-03 11:03:13 EST; 2h 13min ago
Docs: man:systemd-pstore(8)
Main PID: 1287 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 18853)
Memory: 0B
CGroup: /system.slice/systemd-pstore.service
Feb 03 11:03:13 slazien-thinkpad-x230 systemd[1]: Starting Platform Persistent Storage Archival...
Feb 03 11:03:13 slazien-thinkpad-x230 systemd[1]: Finished Platform Persistent Storage Archival.
目前,我只想dump
在排除根本原因时禁用这些 efivar 的写入。我怎样才能做到这一点?
答案1
为了防止pstore
使用 EFI 存储后端,请尝试添加内核启动选项efi_pstore.pstore_disable=1
(尽管我目前无法自己检查)。
NVRAM 溢出似乎是一个罕见的问题,仅影响某些笔记本电脑型号(包括 ThinkPads xx30),但不影响其他型号。如果我理解正确的话,某些系统的 EFI 固件要么实施得不好,要么 NVRAM 空间过于有限,这与pstore
行为结合起来可能会导致溢出。
可以找到该问题的早期提及这里。更多(但仍然稀缺)信息:这里和这里。尽管如此,还需要更多的挖掘才能揭示整个情况。
PS 具有讽刺意味的是,由于调试机制过于努力地保存内核转储,过时的内核模块中的一些非关键错误可能会变得致命。