Ноутбук не засыпает при закрытой крышке: внешний монитор в Ubuntu
Ноутбук с Ubuntu 24.04 засыпает, если закрыть крышку. Однажды вечером к нему по HDMI подключили внешний монитор, крышку на ночь закрыли, а утром выяснилось, что ноутбук всю ночь проработал.
На этой странице причина найдена в системном журнале и показано, что с ней можно сделать. Проверено на Ubuntu 24.04.5 LTS с GNOME Shell 46.0 на X11, на ноутбуке Lenovo V510-14IKB. Вывод сокращён, названия месяцев показаны по-английски. Используются: systemctl, grep, xrandr, man.
Коротко. Пока подключён внешний монитор, GNOME блокирует крышку, и в GNOME 46 нет настройки, которая это отключает. Отключите монитор, прежде чем закрыть крышку, или сначала усыпите ноутбук, а потом закройте крышку: см. Что делать.
1. Уснул ли ноутбук
За крышкой следит systemd-logind, и именно эта служба усыпляет ноутбук. Её строки о крышке и сне в текущей загрузке; шаблон uspend находит и Suspending, и suspend:
journalctl -b --no-hostname -u systemd-logind -g 'Lid|uspend' | tail -10
Nov 02 13:29:54 systemd-logind[1107]: Lid closed. Nov 02 13:29:54 systemd-logind[1107]: Suspending... Nov 02 13:32:52 systemd-logind[1107]: Lid opened. Nov 02 13:32:54 systemd-logind[1107]: Operation 'suspend' finished. Nov 02 17:07:51 systemd-logind[1107]: Lid closed. Nov 02 17:07:51 systemd-logind[1107]: Suspending... Nov 02 20:57:39 systemd-logind[1107]: Lid opened. Nov 02 20:57:43 systemd-logind[1107]: Operation 'suspend' finished. Nov 02 23:46:58 systemd-logind[1107]: Lid closed. Nov 03 08:33:36 systemd-logind[1107]: Lid opened.
За первыми двумя закрытиями следует Suspending.... После третьего, в 23:46:58, нет ничего до утра, когда крышку открыли: logind даже не пытался усыпить ноутбук. Ядро пишет PM: suspend entry каждый раз, когда ноутбук действительно засыпает:
journalctl -b -k --no-hostname -g 'PM: suspend'
Nov 02 13:29:57 kernel: PM: suspend entry (deep) Nov 02 13:32:52 kernel: PM: suspend exit Nov 02 17:07:56 kernel: PM: suspend entry (deep) Nov 02 20:57:41 kernel: PM: suspend exit
Два сна, оба закончились до 21:00. С 23:46 до 08:33 ноутбук работал с закрытой крышкой.
2. Что изменилось: второй монитор
В X11 X-сервер пишет строку каждый раз, когда меняется размер рабочего стола, например когда подключают монитор или выключают экран:
journalctl -b --no-hostname -g 'Allocate new frame buffer'
Nov 02 20:58:19 /usr/libexec/gdm-x-session[2203]: (II) modeset(0): Allocate new frame buffer 3840x1200 stride Nov 02 23:46:58 /usr/libexec/gdm-x-session[2203]: (II) modeset(0): Allocate new frame buffer 1920x1200 stride Nov 03 08:33:36 /usr/libexec/gdm-x-session[2203]: (II) modeset(0): Allocate new frame buffer 3840x1200 stride
В 20:58:19, через полминуты после пробуждения ноутбука, рабочий стол вырос до 3840x1200: экран ноутбука 1920x1080 и монитор 1920x1200 рядом. В 23:46:58, в ту же секунду, когда закрылась крышка, он сжался до 1920x1200: GNOME выключил экран ноутбука и оставил рабочий стол на внешнем мониторе. В 08:33:36 крышку открыли, и экран ноутбука вернулся. Мониторы сейчас:
xrandr --listmonitors
Monitors: 2 0: +*eDP-1 1920/309x1080/173+0+0 eDP-1 1: +HDMI-1 1920/518x1200/324+1920+0 HDMI-1
eDP-1 — экран ноутбука, HDMI-1 — внешний монитор. Оба сна из шага 1 были до 20:58, без монитора.
3. Кто держит крышку: gsd-power
Программа может сообщить logind, что сама обрабатывает клавишу или крышку. Для этого она берёт блокировку, которую systemd называет inhibitor. Блокировки крышки:
systemd-inhibit --list | grep -E 'WHO|lid'
WHO UID USER PID COMM WHAT WHY MODE andrei 1000 andrei 2568 gsd-power handle-lid-switch External monitor attached or configuration changed recently block
gsd-power, служба GNOME для настроек питания, держит блокировку handle-lid-switch в режиме block, и причина, которую она указывает, — внешний монитор. Пока такая блокировка есть, logind ничего не делает при закрытии крышки; man logind.conf говорит, что его настройки Handle*= тогда не имеют значения.
GNOME делает это намеренно: с подключённым монитором закрытая крышка нужна, чтобы работать на внешнем экране. gsd-power снимает блокировку, только когда внешних мониторов нет или сеанс не активен, как говорит её собственное отладочное сообщение:
strings /usr/libexec/gsd-power | grep 'uninhibiting lid'
no external monitors or session inactive for a while; uninhibiting lid close
4. logind: в доке крышка игнорируется
У logind есть своё правило для того же случая. Он считает ноутбук стоящим в доке, когда тот вставлен в док-станцию или когда подключено больше одного дисплея, и тогда вместо HandleLidSwitch действует HandleLidSwitchDocked. Значения, которые logind использует сейчас:
busctl get-property org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager Docked HandleLidSwitch HandleLidSwitchDocked
b true s "suspend" s "ignore"
Docked равно true из-за HDMI-1, а HandleLidSwitchDocked по умолчанию равно ignore. Если поставить suspend в файле в папке /etc/systemd/logind.conf.d/, в сеансе GNOME это не поможет: блокировка gsd-power из шага 3 действует раньше, и logind вообще не смотрит на свои настройки Handle. Эта настройка важна только там, где блокировку никто не держит, например на ноутбуке, который работает сервером без рабочего стола.
5. Ключ GNOME, который ничего не делает
В GNOME есть настройка, которая обещает ровно то, что здесь нужно:
gsettings describe org.gnome.settings-daemon.plugins.power lid-close-suspend-with-external-monitor
With no external monitors plugged in, closing a laptop's lid will suspend the machine (as set by the lid-close-battery-action and lid-close-ac-action keys). By default, however, closing the lid when an external monitor is present will not suspend the machine, so that one can keep working on that monitor (e.g. for docking stations or media viewers). Set this key to False to keep the default behavior, or to True to suspend the laptop whenever the lid is closed and regardless of external monitors.
Но в GNOME 46 этот ключ не читает ни одна программа. Программа запрашивает настройку по имени, значит, имя должно быть в файле программы. В gsd-power его нет:
grep -c lid-close-suspend-with-external-monitor /usr/libexec/gsd-power
0
Нет его и в остальных 20 службах gsd в /usr/libexec, в GNOME Shell и в приложении «Настройки»: ключ остался только в схеме, которая его описывает. То же с lid-close-ac-action и lid-close-battery-action. Какой из них ни меняй, в Ubuntu 24.04 ничего не изменится.
6. Что делать
Переключателя для этого в GNOME 46 нет, поэтому выберите подходящий способ:
- Работаете на внешнем мониторе с закрытой крышкой: оставьте всё как есть, для этого блокировка и нужна.
- Уходите на ночь: отключите монитор, прежде чем закрыть крышку. Без внешнего монитора gsd-power вскоре снимает блокировку, и крышка снова усыпляет ноутбук, как в 13:29 и 17:07 в шаге 1.
- Монитор остаётся подключённым: сначала усыпите ноутбук, потом закройте крышку. Усыпить можно через меню питания в правом верхнем углу экрана или командой ниже.
systemctl suspend
Чеклист
- Ноутбук всю ночь работал с закрытой крышкой: ищите Suspending... после Lid closed. в выводе journalctl -b -u systemd-logind -g 'Lid|uspend'
- Посчитайте мониторы: xrandr --listmonitors показывает не только экран ноутбука.
- Кто держит крышку, покажет systemd-inhibit --list | grep lid
- gsd-power с External monitor attached — это GNOME, который намеренно работает с закрытой крышкой.
- Ни HandleLidSwitchDocked, ни ключи GNOME lid-close-* в GNOME 46 этого не меняют.
- Сначала отключите монитор или усыпите ноутбук, потом закрывайте крышку.
- Ноутбук засыпает, но после открытия крышки экран остаётся чёрным: это другая проблема, см. Чёрный экран после закрытия крышки в Ubuntu 24.04.
Автор статьи: Клавдия Кондакова