禁止将转储文件写入 efivars

禁止将转储文件写入 efivars

最近我注意到一个问题,我的两台机器(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 具有讽刺意味的是,由于调试机制过于努力地保存内核转储,过时的内核模块中的一些非关键错误可能会变得致命。

相关内容