我有一台新的戴尔 Inspiron 5505(AMD Ryzen 4500),果然,S3 睡眠状态被禁用,并且没有 BIOS 选项可以启用它(即使在 BIOS 更新之后)。
经过几周的挫折,我学会了如何(成功)编辑 DSDT 并通过 GRUB 覆盖它。现在我的笔记本电脑像小猫一样进入睡眠状态!
但是,我不知道如何使用 rEFInd 覆盖 DSDT。有人知道怎么做吗?
我的 GRUB 配置(有效):
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mem_sleep_default=deep"
GRUB_EARLY_INITRD_LINUX_CUSTOM="microcode.cpio acpi_override"
另外,在 grub.cfg 中(有效):
linux /boot/vmlinuz-5.4.0-47-generic root=UUID=febd7fdb-b56d-482d-bcdf-5b6d472fa950 ro quiet splash mem_sleep_default=deep
initrd /boot/acpi_override /boot/initrd.img-5.4.0-47-generic
我的(尝试过的) rEFInd 配置(不起作用):
menuentry Ubuntu {
icon /EFI/refind/themes/tux-refind-theme/icons/os_ubuntu.png
volume "Ubuntu Linux"
loader /boot/vmlinuz-5.4.0-47-generic
initrd /boot/acpi_override /boot/initrd.img-5.4.0-47-generic
options "ro root=UUID=febd7fdb-b56d-482d-bcdf-5b6d472fa950 quiet splash mem_sleep_default=deep $vt_handoff"
}
- 如果我通过 GRUB 加载,则覆盖有效,并且我可以让计算机进入 S3 睡眠状态。
- 如果我通过 rEFInd 的自动检测条目正常加载,Linux 会启动,但它不知道要覆盖 DSDT,并且我的笔记本电脑不会进入睡眠状态。
- 如果我尝试通过手动 rEFInd 输入进行加载,我会收到此错误:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.4.0-47-generic #51-Ubuntu
Hardware name: Dell Inc. Inspiron 5505/0MJ6CM, BIOS 1.2.1 07/15/2020
Call Trace:
dump_stack+0x6d/0x9a
panic+0x101/0x2e3
mount_block_root+0x23f/0x2e8
mount_root+0x38/0x3a
prepare_namespace+0x13f/0x194
kernel_init_freeable+0x231/0x255
? rest_init+0xb0/0xb0
kernel_init+0xe/0x100
ret_from_fork+0x22/0x40
Kernel Offset: 0x1b800000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
- 我尝试将 override 和 initrd.img 行分开。Linux 确实可以无错误地启动,但完全忽略了 ACPI (DSDT) 覆盖:
menuentry Ubuntu {
icon /EFI/refind/themes/tux-refind-theme/icons/os_ubuntu.png
volume "Ubuntu Linux"
loader /boot/vmlinuz-5.4.0-47-generic
initrd /boot/acpi_override
initrd /boot/initrd.img-5.4.0-47-generic
options "root=UUID=febd7fdb-b56d-482d-bcdf-5b6d472fa950 ro quiet splash mem_sleep_default=deep $vt_handoff"
}
- 知道我做错了什么或者没有做什么吗?
- 有人成功使用 rEFInd 覆盖 DSDT 吗?
边注:
出于好奇,我删除了 DSDT 文件中围绕 S3 状态的“If”语句,从而解决了睡眠问题。
由此:
If (LEqual (CNSB, Zero))
{
If (LEqual (DAS3, One))
{
Name (_S3, Package (0x04) // _S3_: S3 System State
{
0x03,
0x03,
Zero,
Zero
})
}
}
更改为:
Name (_S3, Package (0x04) // _S3_: S3 System State
{
0x03,
0x03,
Zero,
Zero
})
答案1
rEFInd 手动启动节给许多人带来了问题——这种配置曾经很常见,早在 GRUB Classic 和 LILO 时代,但如今它基本上是一门被遗忘的艺术,所以我看到很多人尝试这种配置,但由于拼写错误或误解了他们所需的繁琐细节而失败。在您展示的示例中,一个问题是您只能在 的手动启动节定义initrd
中的行上指定一个 initrd 文件refind.conf
。如果您需要指定多个 initrd 文件,则必须在行上列出它们options
。可能还有其他我遗漏的问题。
相反,我建议您删除自定义启动节配置并编辑/boot/refind_linux.conf
。(如果此文件不存在,则可以使用mkrlconf
rEFInd 附带的脚本创建它。它可能已经安装并位于您的路径中,具体取决于您安装 rEFInd 的方式。如果没有,您可以从 rEFInd.zip
文件中提取它。)您可以通过这种方式添加其他内核命令行参数;然而,我不确定/boot/acpi_override
你的 GRUB 配置中的文件。它看起来像是一个额外的自定义 initrd 文件,在这种情况下你应该能够将其添加为额外的内核命令行选项 ( initrd=/boot/acpi_override
);然而,完成此操作后,您还需要明确添加标准 initrd 文件(可能用于%v
识别内核版本号)。最终配置将如下所示:
"Boot with ACPI override" "root=UUID=febd7fdb-b56d-482d-bcdf-5b6d472fa950 ro quiet splash mem_sleep_default=deep initrd=\boot\acpi_override initrd=\boot\initrd.img-%v-generic"
另外,请注意 initrd 文件的路径规范中使用了反斜杠 ( \
);它是电喷用于加载 initrd 文件,EFI 使用反斜杠(而不是 Linux 风格的正斜杠 ( /
))来分隔目录元素。