Вопрос или проблема
У меня новый 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 может привести к ошибкам, как в вашем случае.
Применение
-
Настройка конфигурации rEFInd:
По всей вероятности, ошибка, с которой вы столкнулись (
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
), может быть связана с неправильной структурой конфигурации. Например, rEFInd не поддерживает указание нескольких initrd файлов через одну строкуinitrd
в конфигурации boot stanza. Вместо этого необходимо разделять их и указывать через командные параметрыoptions
. -
Изменение
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.
-
Проверка и тестирование:
Создайте резервные копии всех существующих конфигурационных файлов перед внесением изменений. После настройки загрузитесь через rEFInd и проверьте, работают ли изменения. Если ошибки продолжат появляться, попробуйте провести отладку путем анализа логов и проверок версии ядра для совместимости.
Эти шаги должны помочь интегрировать изменения DSDT в вашу систему с помощью rEFInd. Если задачи с выполнением все еще остаются, возможно стоит подтвердить, что используемые вами версии ПО поддерживаются вашим железом. В заключение, изучение сообщества и доступ к актуальной документации могут оказать поддержку в любых дальнейших трудностях.