Linux: Компьютер не выходит из ждущего (suspend) режима
Начнём без предисловия, сразу "с места в карьер". Есть вот такой "пациент":
inxi -CDSM
----------
System:
Host: hp Kernel: 6.2.7-060207-generic x86_64 bits: 64
Desktop: Cinnamon 5.6.7 Distro: Linux Mint 21.1 Vera
Machine:
Type: Laptop System: HP product: HP Laptop 15s-eq2xxx v: N/A
serial: <superuser required>
Mobo: HP model: 887A v: 59.21 serial: <superuser required> UEFI: AMI
v: F.27 date: 10/20/2022
CPU:
Info: quad core model: AMD Ryzen 3 5300U with Radeon Graphics bits: 64
type: MT MCP cache: L2: 2 MiB
Speed (MHz): avg: 1431 min/max: 1400/3900 cores: 1: 1398 2: 1400 3: 1400
4: 1400 5: 1452 6: 1400 7: 1602 8: 1397
Drives:
Local Storage: total: 238.47 GiB used: 56.55 GiB (23.7%)
ID-1: /dev/nvme0n1 vendor: Toshiba model: KBG40ZNV256G KIOXIA
size: 238.47 GiB
Вполне себе свежий ПК, с последней версией BIOS и со свежайшим ядром Linux. Установлена чистая система, без каких-либо кастомных настроек ядра Linux.
Так вот, имеем на такой конфигурации ПК следующую проблему: при переходе в ждущий (suspend) режим компьютера, когда все возможные компоненты устройства отключаются и ПК ждёт пока вы не нажмёте какую-либо клавишу, чтобы проснуться, на самом деле он больше не просыпается. Вернее, происходит следующее: появляется экранная заставка с вводом пароля и компьютер ни на что не реагирует. Бывает, что с трудом можно добраться до TTY на экране которого проскакаивают ошибки о сбойной работе дисковой подсистемы.
Можно ли исправить такое сбойное поведение? Можно, запустив ядро нашей ОС с опцией отключающей использование IOMMU.
Шаг 1: открываем в любом редакторе файл настроек конфигурации GRUB
sudo mcedit /etc/default/grub
(В примере используется редактор mcedit)
Шаг 2: находим/исправляем в настройках параметр GRUB_CMDLINE_LINUX_DEFAULT
Добавлем в него опцию
amd_iommu=off
В качестве примера:
Было:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Стало:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=off"
Сохраняем изменения и выходим из редактора.
Шаг 3: применяем настройки GRUB
sudo update-grub
После того, как всё будет done, перезагружаем ПК и проверяем работоспособность ждущего (suspend) режима.
Удостовериться, что IOMMU выключен в текущей сессии работы, можно выполнив:
dmesg | grep IOMMU
-------
AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.
Правильно ли я поступаю работая с выключенным IOMMU? Думаю, что нет, т.к. стараюсь руководствоваться принципом не трогать того, чего не понимаю, и так как IOMMU по умолчанию включен, его принудительное выключение как минимум некорректно. Однако, именно это действие приводит к тому, что устраняет проблему ждущего режима и за многие сотни часов работы на ПК с выключенным IOMMU я не испытывал никаких проблем с системой.
Если всё-таки кому то интересно более глубоко копнуть тему IOMMU, вот есть ссылка на туториал IOMMU: Virtualizing IO through IO Memory Management Unit