Усыпляю эти ваши Линуксы, недорого

Aug 11, 2015 20:51

Надо же где-то написать… пусть тут будет. ;)


У меня ноут не уходил в спячку. То есть, уходил и тут же возвращался. «Кто-то его будит» - подумал я. В логах написали, что это usb-контроллер и его побрякушки. Далее разбираться не стал, надо резать всё к чёртовой матери, все эти usb|uhc|ehc|xhc. Резать будем в файле /proc/acpi/wakeup - там прямо расписание, кому можно будить, а кому - нет. Для выключения, например, USB из списка активных просто делаем так:

echo USB2 > /proc/acpi/wakeup

Работает, как триггер: повтор echo меняет состояние не противоположное.

Так, теперь куда сунуть всё это хозяйство, чтоб перед отправкой ко сну оно срабатывало? Если система использует pm-utils, можно просто создать файлик в /usr/lib64/pm-utils/sleep.d/ (ну или где оно там может быть):

#!/bin/bash

ACPI_WAKEUP=/proc/acpi/wakeup

case $1 in
hibernate)
echo "Going to suspend to disk!"
;;
suspend)
echo "Fixing some usb/(u|e|x)hc acpi settings."
for item in `cat $ACPI_WAKEUP | egrep "(USB|UCH|EHC|XHC)" | cut -f1`;
do
state=`cat /proc/acpi/wakeup | grep $item | cut -f3 | cut -d' ' -f1 | tr -d '*'`
#echo "device = $item, current state = $state"
if [ "x$state" == "xenabled" ]
then
echo "state is enabled, try to disable it"
echo $item > $ACPI_WAKEUP
fi
done
echo "Suspending to RAM."
;;
resume)
echo "We are now resuming."
;;
esac

А если система современна и использует для засыпания возможности systemd (ага, он и это делает!), то формируем нужный хук в /usr/lib/systemd/system-sleep/. Там аргументы чуть по-другому приходят, но в целом это всё так же примитивно:

#!/bin/bash

ACPI_WAKEUP=/proc/acpi/wakeup

case $1 in
pre)
echo "Going to..."
case $2 in
hibernate)
echo " ...suspend to disk!"
;;
suspend)
echo " ...suspend to RAM!"

echo "Fixing some usb/(u|e|x)hc acpi settings."
for item in `cat $ACPI_WAKEUP | egrep "(USB|UCH|EHC|XHC)" | cut -f1`;
do
state=`cat /proc/acpi/wakeup | grep $item | cut -f3 | cut -d' ' -f1 | tr -d '*'`
echo "device = $item, current state = $state"

if [ "x$state" == "xenabled" ]
then
echo "state is enabled, try to disable it"
echo $item > $ACPI_WAKEUP
fi
done
;;
esac
;;
post)
echo "Waking up from..."
case $2 in
hibernate)
echo " ...suspending to disk!"
;;
suspend)
echo " ...suspending to RAM!"
;;
esac
;;
esac

По аналогии можно вырубать иные неугодные элементы. УМВР! ;)

А, заодно: если вдруг не установлен обычный *syslogd, по-модному зырить логи надо там:

journalctl -b -u systemd-suspend

программирование, linux, система, system, ноутбук, компьютер, программа, электроника

Previous post Next post
Up