在海光3490平台(x86_64架构)的Debian 11系统上启用pstore,核心是配置 `ramoops` 模块。它会在内存中预留一块“自留地”,用来在系统崩溃时保存“临终遗言”。
下面是具体的操作步骤:
### 📝 第一步:检查内核支持
在开始前,先确认当前内核已经编译了必要的pstore模块。
```bash
# 检查关键的内核配置选项
cat /boot/config-$(uname -r) | grep -E "CONFIG_PSTORE|CONFIG_RAMOOPS"
```
正常情况下,你应该看到以下输出,这表明基础支持已经就绪:
```
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_RAM=y
CONFIG_RAMOOPS=y
```
**如果这些选项是 `=m`**,说明是作为模块编译的,你需要用 `modprobe pstore ramoops` 命令来加载它们。
Debian 11的官方内核通常已包含这些选项,如果你的输出缺少某些项,则可能需要重新编译内核。
### ⚙️ 第二步:配置 `ramoops` 内存区域
这是最关键的一步,需要告诉内核预留哪块内存给pstore使用。有两种方法:
#### **方法一:通过内核启动参数配置 (推荐)**
这种方式最灵活,无需重启进入BIOS。你需要编辑GRUB配置文件,在`GRUB_CMDLINE_LINUX`中添加参数。
1. **编辑GRUB配置**:
```bash
sudo vi /etc/default/grub
```
找到 `GRUB_CMDLINE_LINUX` 这一行,在引号内添加如下参数:
```
ramoops.mem_address=0x30000000 ramoops.mem_size=0x200000
```
* `ramoops.mem_address=0x30000000`:指定预留内存的**起始物理地址**(例如从 `0x30000000` 开始)。你需要根据海光平台的实际内存映射来选择一个空闲地址。
* `ramoops.mem_size=0x200000`:指定预留内存的**大小**(此处为十六进制,`0x200000` = 2MB)。2MB是一个不错的起始值,你可以根据需求调整。
2. **更新GRUB配置**:
```bash
sudo update-grub
```
#### **方法二:通过BIOS设置**
如果你的海光平台服务器BIOS提供了相关选项,也可以在那里进行配置。这通常需要在开机时进入BIOS设置界面,找到类似“Memory Reservation”或“RAMOOPS”的选项,然后设置起始地址和大小。这个方法因不同服务器厂商的BIOS而异。
### 💾 第三步:挂载 pstore 文件系统
pstore文件系统通常挂载在 `/sys/fs/pstore`,系统通常会自动挂载。你可以用以下命令检查:
```bash
mount | grep pstore
```
如果没有输出,说明未挂载,需要手动挂载:
```bash
sudo mount -t pstore pstore /sys/fs/pstore
```
为了方便,可以将挂载命令添加到 `/etc/fstab` 以实现开机自动挂载:
```
pstore /sys/fs/pstore pstore defaults 0 0
```
### 🚀 第四步:加载模块 (如果内核选项为 `=m`)
如果你之前检查时发现 `CONFIG_PSTORE_RAM=y` 或 `CONFIG_RAMOOPS=y` 是 `=m`,则需要手动加载模块:
```bash
sudo modprobe pstore
sudo modprobe ramoops
```
### ✅ 第五步:验证和测试
完成以上配置后,**重启系统**让配置生效。
1. **检查目录**:重启后,查看 `/sys/fs/pstore/` 目录。
```bash
ls -l /sys/fs/pstore/
```
正常情况下,应该看到 `console-ramoops` 或 `dmesg-ramoops-0` 等文件。
2. **模拟崩溃测试 (可选)**:
**请务必在测试或非生产环境下进行!**
你可以通过触发一个内核恐慌来测试pstore是否工作:
```bash
sudo echo c > /proc/sysrq-trigger
```
系统会立即崩溃重启。重启后,再次检查 `/sys/fs/pstore/` 目录,应该会有新的日志文件生成。
### 📖 第六步:读取和分析日志
当系统发生异常重启后,你可以通过以下命令来查看保存的日志:
```bash
# 查看控制台日志
cat /sys/fs/pstore/console-ramoops
# 查看内核日志
cat /sys/fs/pstore/dmesg-ramoops-0
```
### ⚠️ 注意事项
* **内存地址**:`ramoops.mem_address` 必须是一个有效的、未被系统使用的物理内存地址。如果设置不当,可能导致系统无法启动。你可以通过 `dmesg | grep "e820"` 查看内核发现的内存映射来选择一个合适的地址。
* **内存大小**:`ramoops.mem_size` 不宜过大,通常几MB就足够,以免浪费宝贵的内存资源。
* **断电丢失**:`ramoops` 基于RAM,系统**完全断电**后日志会丢失。它主要应对的是系统崩溃后**立即重启**(如看门狗复位)的场景。
* **权限问题**:查看日志可能需要 `root` 权限。