我有一个新的 Dell 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) ]---
- 我尝试将覆盖和 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
})
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
识别内核版本号)。最终配置如下所示:\
此外,请注意在 initrd 文件的路径规范中使用了反斜杠 ( );它是用于加载 initrd 文件的EFI,并且 EFI 使用反斜杠而不是 Linux 风格的正斜杠 (/
) 来分隔目录元素。