使用 rEFInd 覆盖 DSDT(在 ACPI 中启用 S3)

使用 rEFInd 覆盖 DSDT(在 ACPI 中启用 S3)

我有一台新的戴尔 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。(如果此文件不存在,则可以使用mkrlconfrEFInd 附带的脚本创建它。它可能已经安装并位于您的路径中,具体取决于您安装 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 风格的正斜杠 ( /))来分隔目录元素。

相关内容