Переопределение DSDT с помощью rEFInd (включение S3 в ACPI)

Вопрос или проблема

У меня новый Dell Inspiron 5505 (AMD Ryzen 4500), и, конечно, S3 sleep state отключен, и нет опции в BIOS для его включения (даже после обновления BIOS).

После нескольких недель разочарований я научился (успешно) редактировать DSDT и переопределять его через GRUB. Теперь мой ноутбук засыпает, как котенок!

Однако я не знаю, как переопределить DSDT с помощью rEFInd. Кто-нибудь знает, как это сделать?

Моя конфигурация 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 sleep.
  • Если загружаюсь обычно через автообнаруженную запись 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"
}
  • Есть идеи, что я делаю неправильно, или, возможно, не делаю?
  • Кто-нибудь успешно переопределял DSDT с помощью rEFInd?

ПРИМЕЧАНИЕ:

Для любопытных, я удалил “If” выражения, окружающие состояние S3 в файле DSDT, что решило проблему сна.

Из этого:

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. Если нет, вы можете извлечь его из файла .zip rEFInd.) Вы можете добавить свои дополнительные параметры командной строки ядра таким образом; однако, я не уверен насчет файла /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; это EFI, который используется для загрузки файлов initrd, и EFI использует обратные косые черты, а не прямые наклонные черты в стиле Linux (/), для разделения элементов директории.

Переход на FreeBSD

(этот хорошо задокументированный вопрос и ответ становятся популярными в результатах поиска для этой проблемы, связанной с производителем, независимо от ОС, поэтому я отклоняюсь от Ubuntu, чтобы помочь централизовать информацию в одном месте)

На FreeBSD 14, где sysctl hw.acpi | grep 'S[0-9]' показывает только S4 и S5 на Inspirons (3535 здесь), исправление .aml включает в себя (от имени root):

acpidump -dt > /tmp/inspirons3.asl
vi /tmp/inspirons3.asl # Удалите оба `if`, которые условно включают состояние S3.
iasl -f -p /boot/inspirons3.aml /tmp/inspirons3.asl

Затем в /boot/loader.conf добавьте (как хорошо задокументировано в Руководстве):

acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/inspirons3.aml"

/!\ Это просто делает S3 видимым, но на данный момент он не пригоден для использования: некоторые драйверы не пробуждаются (в частности, DRM для дисплея и WiFi, что является серьезным препятствием)

Ответ или решение

Проблема переписывания DSDT с помощью rEFInd для реализации S3 состоянии сна на вашем Dell Inspiron 5505 с процессором AMD Ryzen 4500 — это достаточно распространенная задача для пользователей, которые работают с аппаратными ограничениями, особенно когда BIOS не предоставляет возможности изменения этих настроек. Прежде чем приступить к решению задачи через rEFInd, давайте разберем, почему это важно и как это влияет на вашу систему.

Теория

ACPI (Advanced Configuration and Power Interface) — это стандарт интерфейса для аппаратно-программного управления устройствами и режимами энергосбережения в компьютерных системах. Один из наиболее востребованных режимов — S3 (также известный как "sleep" или "suspend-to-RAM"), который позволяет компьютеру перейти в состояние пониженного энергопотребления, сохраняя оперативную память активной, что обеспечивает быстрое пробуждение.

Ваш Dell Inspiron 5505 изначально не поддерживает S3 из-за ограничений в прошивке BIOS. Обход этого ограничения возможен через редактирование DSDT (Differentiated System Description Table) — таблицы, определяющей конфигурации ACPI для вашего устройства. Поскольку вы уже добились успеха с помощью GRUB, то следующим шагом стоит пересмотреть возможности rEFInd.

Пример

В ваших удачных конфигурациях с GRUB вы используете строку GRUB_EARLY_INITRD_LINUX_CUSTOM для задания файла acpi_override, который содержит исправленный DSDT. При загрузке через GRUB система корректно определяет S3 состояние сна, так как в конфигурации заданы необходимые параметры загрузки и initrd.

Ваши попытки реализовать это через rEFInd не были столь успешны из-за некоторых ограничений и особенностей конфигурации rEFInd. Дело в том, что rEFInd, в отличие от GRUB, требует использования отдельных строк для каждого initrd файла, а использование нескольких файлов initrd может привести к ошибкам, как в вашем случае.

Применение

  1. Настройка конфигурации rEFInd:

    По всей вероятности, ошибка, с которой вы столкнулись (Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)), может быть связана с неправильной структурой конфигурации. Например, rEFInd не поддерживает указание нескольких initrd файлов через одну строку initrd в конфигурации boot stanza. Вместо этого необходимо разделять их и указывать через командные параметры options.

  2. Изменение refind_linux.conf:

    Вместо трудоемкой манипуляции с ручной конфигурацией, более стабильное решение — изменить файл refind_linux.conf, который устанавливает параметры загрузки Linux автоматически при обнаружении загрузочных файлов. Убедитесь, что у вас установлены все необходимые параметры и файлы.

    "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"

    Обратите внимание на использование обратных слэшей () вместо прямых (/), что важно для правильной интерпретации путей в контексте EFI.

  3. Проверка и тестирование:

    Создайте резервные копии всех существующих конфигурационных файлов перед внесением изменений. После настройки загрузитесь через rEFInd и проверьте, работают ли изменения. Если ошибки продолжат появляться, попробуйте провести отладку путем анализа логов и проверок версии ядра для совместимости.

Эти шаги должны помочь интегрировать изменения DSDT в вашу систему с помощью rEFInd. Если задачи с выполнением все еще остаются, возможно стоит подтвердить, что используемые вами версии ПО поддерживаются вашим железом. В заключение, изучение сообщества и доступ к актуальной документации могут оказать поддержку в любых дальнейших трудностях.

Оцените материал
Добавить комментарий

Капча загружается...