Monday, May 18, 2026

Как я чинила спящий режим на hp probook 430-G3: виды режимов сна и управление suspend через интерфейс ядра линукс

 Я уже писала про этот ноут ― там была проблема со спящим режимом на slackware 15.0. После перехода в S2RAM он сразу просыпался, а если выбрать s2ide, то, наоборот, невозможно было его разбудить. Я особо не дёргалась по этому поводу, потому в простое он нагревается где-то до 30-34 градусов, вся периферия уходит в сон, особенно после настройки через powertop, ну и я, честно говоря, была почти уверена, что проблема в прошивке - типа кривых таблиц acpi, - потому что не работает Fn и кнопки отключения wifi и звука. Но всё равно меня подбешивало, поэтому как-то на досуге я решила выяснить, в чем на самом деле проблема. В итоге я выяснила, но спойлерить не буду, а то получится не так захватывающе, как это было для меня.

    1. ВИДЫ РЕЖИМОВ СНА В БОЛЕЕ-МЕНЕЕ СОВРЕМЕННЫХ НОУТБУКАХ

 
S0 (connected suspend/modern suspend/s2idle) ― это как в планшетах и смартфонах: поддерживается wi-fi соединение, фоновые обновления почты и приложений даже при закрытой крышке.

S1 (standby/power on suspend) ― состояние сна в acpi, когда CPU прекращает выполнять команды, останавливает тактовые генераторы и сбрасывает кэши, но питание на компоненты, включая RAM, подаётся.

S2 (standby/shallow) ― промежуточный, встречается редко. Напряжение может подаваться на некоторые компоненты материнской платы.

S3 (suspend to RAM) - все компоненты обесточены, кроме RAM, где сохраняется состояние системы.

S4 ― гибернация.

    2. ИНТЕРФЕЙС ЯДРА ДЛЯ УПРАВЛЕНИЯ СПЯЩИМ РЕЖИМОМ ИЗ ПРОСТРАНСТВА ПОЛЬЗОВАТЕЛЯ
    оригинал:    https://www.kernel.org/doc/html/v4.18/admin-guide/pm/sleep-states.html 


Это каталог /sys/power

    ■ Значение файлов и настройка:


state ― содержит поддерживаемые ядром состояния сна. У меня это были disk (гибернация) и freeze (s2idle). Третье значение mem интерпретируется в зависимости от содержания файла mem_sleep.

mem_sleep ― содержит доступные режимы сна и позволяет выбрать вариант, который будет ассоциирован с параметром mem из файла /sys/power/state. Ассоциированный параметр будет взят в квадратные скобки. Если ядро не поддерживает сон, этого файла не будет. У меня там было два варианта: deep (s2RAM) и s2idle. На некоторых ACPI-based системах, которые берут информацию из таблиц ACPI, по умолчанию стоит s2idle, даже если поддерживается s2RAM, но обычно последний стоит по умолчанию. Чтобы выставить параметр по умолчанию, можно либо либо использовать 'echo deep > /sys/power/mem_sleep', либо сделать это через параметр ядра "mem_sleep_default", передав его загрузчику.

    ■ Два способа перевести машину в  S2idle


I   echo freeze|sudo tee /sys/power/state

II  echo s2idle|sudo tee /sys/power/mem_sleep
    echo mem|sudo tee /sys/power/state

    ■ Единственный способ перевести в S2RAM 

     echo deep|sudo tee /sys/power/mem_sleep
     echo mem|sudo tee /sys/power/state


Собственно, теперь я так и перевожу ноут в сон.

    3. ПОЧЕМУ НОУБУК САМОПРОИЗВОЛЬНО ВЫХОДИТ ИЗ СНА

Первое, что выдаст вам гугл по этому поводу, файл /proc/acpi/wakeup. Типа надо убрать оттуда лишнее, тогда всё заработает. Надо смотреть на enabled. Это если не смотреть специфичные для слаки решения. На LQ я нашла совет поменять elilo на grub и поставить новое ядро. Короче, теперь у меня grub и ядро 6.12.82, но проблему это не решило. 

Ну вот мой вывод:

bash-5.1# cat /proc/acpi/wakeup |grep en

XHC      S0    *enabled   pci:0000:00:14.0
RP05      S4    *enabled   pci:0000:00:1c.0
PXSX      S4    *enabled   pci:0000:01:00.0
RP06      S4    *enabled   pci:0000:00:1c.5
RP09      S4    *enabled   pci:0000:00:1d.0

Как видите, S3 здесь вообще не фигурирует, а для S0 стоит XHC, это extensible host controller, который управляет usb 3.0/3.1. Между тем ноут просыпается из обоих режимов только по кнопке питания, дёрганье мыши, нажатия на тачпад или встроенную клаву на него не действуют.

Параметр wakeonlan у меня отключен в прошивке, /sys/class/net/wlan0/device/power/wakeup показывает "disable". Тем не менее, я пыталась отключать сеть и ноут действительно переходил в S3, но только один раз. В следующий раз он опять мигал индикатором батареи и просыпался примерно через минуту. Ну и, собственно, в S3 он, похоже, не переходил: экран гас, но кнопки продолжали светиться как обычно, тогда как в s3 кнопка вайфай становится оранжевой, а power начинает мигать.

В качестве GUI у меня fluxbox и windowmaker, то есть никаких своих менеджеров питания, которые сбрасывали бы настройки elogind, нет. В сон я переходила командой loginctl suspend

    4. ФОКУСЫ ПИДОРСКОГО elogind

Этот шлак был у меня сконфигурирован вроде правильно в файле /etc/elogind/logind.cong, но оказалось, что у него есть один нюанс - ингибиторы. Это программы, которые не дают машине перейти в сон, пока что-то там не завершат. Вот команда для просмотра ингибиторов, если у вас нет systemd: 

bash-5.1# dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.ListInhibitors

А вот её вывод в первый раз: 

      struct {
         string "sleep"
         string "NetworkManager"
         string "NetworkManager needs to turn off networks"
         string "delay"
         uint32 0
         uint32 1129
      }
      struct {
         string "sleep"
         string "ModemManager"
         string "ModemManager needs to reset devices"
         string "delay"
         uint32 0
         uint32 1216
      }

Я остановила NM, и ноут заснул. Но сделав это во второй раз, получила хрен на блюде. Посмотрев ингибиторы, я увидела, что там добавился ещё Upower. Если убить его командой kill, то ноут опять засыпал,  но в третий раз опять что-то вылезало. Короче, мне надоело это блядство и я просто отключила нахрен elogind, сняв бит x с его скрипта в /etc/rc.d. Кроме того, он влияет на pam ― у меня после одного из обновлений это стало проявляться тормозами при авторизации пользователей как в консоли, так и в терминале GUI. Я обнаружила его, когда смотрела лог авторизации (в слаке это /var/log/secure). Короче, надо ещё сделать так:

bash-5.1# grep elogin /etc/pam.d/*

и закомментировать строчки, содержащие elogind, в файлах, которые вы используете.
Также я установила nologind из репозитория Salix OS, ну типа чтобы нормально работал powerkit, хотя я не уверена, что он был нужен, но мне надоело видеть ошибки и возиться лишний раз. Seatd я ставить не стала, потому что нахрен он нужен, когда в системе два пользователя, и оба ― ты сам.

    ЭПИЛОГ: теперь я выключаю и перезагружаю ноут командой shutdown, а в сон перевожу через описанный выше интерфейс ядра. У меня ничего не тормозит и всё работает, но я опять покосилась в сторону freebsd ― скорее рефлекторно, ведь там со спящим режимом всё ещё хуже и, кроме того, обороты вентилятора хрен настроишь, если модуль wmi не поддерживает твоё железо. Но знаете, я обнаружила, что утилиту ataidle, которая останавливала парковку головок hdd, похоронили, добавив этот функционал в стандартный camcontrol. В общем, если они разберутся с вентиляторами и саспендом и я на тот момент ещё буду жива, то с удовольствием пошлю линукс на три буквы. 



No comments:

Post a Comment