Недавно я стал обладателем этого недорого ноутбука, который, как я
полагал, продается без опреационной системы. Однако, я обнаружил на нем
Windows Vista Basic, который при включении ноутбука, активизировался и
самораспаковывался из загрузочной области. Так что я раздобыл
установочный диск Slackware12 и стал бороться с этим вирусом, который
однако оказался довольно хитрым, и мои попытки отформатировать диск с
помощью cfdisk были тщетными. Пришлось прибегнуть к более надежному
средству - fdisk. Таким образом вирус был побежден и на моем компьютере
оказалась провренная временем операционная система Slackware.
Единственная сложность при установке системы, с которой я столкнулся,
состояла в настройке hibernate.
Может быть эта информация будет полезна и владельцам других ноутбуков.
В нулевом приближении suspend-to-ram делается простой записью команды
mem в файл /sys/power/state. Последующие нажатие кнопки Power приводит к
восстановлению работы. Однако, вяснилось, что для моего ноутбука этого
мало, поскольку экран после этого не включается. Т.е. остается очень
темным, хотя при желании там можно что-то разглядеть. Как показал поиск
в интернете, дело в том, что Х-серверу (а точнее его видео-драйверу, в
моем случае i810) нужно ещё подать POST сигнал. Это можно сделать с
помощью пакета vbetool (http://www.codon.org.uk/~mjg59/vbetool/), а
можно использовать пакет suspend
(http://sourceforge.net/projects/suspend), где имеется утилита s2ram,
которая одновременно усыпляет ноутбук и при восстановлении посылает нужные команды
видеокарте. Однако, для низкоуровнего доступа к карте ей ещё необходима
библиотека libx86 (http://www.codon.org.uk/~mjg59/libx86/).
Так что в первом приближении, я усыпляю свой ноутбук командой (всё
делается из-под root естественно):
/usr/sbin/s2ram --force --vbe_post
Ноутбук долже потухнуть и на передней панели будет медленно мигать
оранжекая лампочка. После короткого нажатия кнопки Power ноутбук должен
вернуться к нормальной работе.
Теперь осталось привязать эту команду к кнопке Lid, которая срабатывает
при закрытии крышки ноутбука.
В Slackware для перехвата такого рода действий имеется демон acpid
(запускается командой /etc/rc.d/rc.acpid start). Он сконфигурирован на
перехват всех событий из файла /proc/acpi/event с помощью правила
/etc/acpi/default, которое при возникновении любого события acpi
вызывает скрипт /etc/acpi/acpi_default.sh. Так что вместо того чтобы
плодить новые правила, можно просто отредактировать этот скрипт, так
чтобы он фильтровал нужные нам события (кнопку lid) и производил нужные
нам действия (впадал в спячку). Тут стоит только предупредить, что в
скором будущем разработчики Линукса собираются отказаться от интерфейса
/proc/acpi/event ( в ядре 2.6.25.5 он помечен как deprecated). а
вместо него будет использоваться файл /dev/input/eventX, который
является интерфейсом к драйверу evdev.
Так что скрипт будет выглядеть таким образом:
#!/bin/sh
# Default acpi script that takes an entry for all actions
IFS=${IFS}/
set $@
case "$1" in
button)
case "$2" in
power)
init 0
;;
#Я добавил обработку события button/lid
lid)
/usr/sbin/s2ram --force --vbe_post
;;
*) logger "ACPI action $2 is not defined"
;;
esac
;;
*)
logger "ACPI group $1 / action $2 is not defined"
;;
esac
Однако, это ещё не конец. Оказалось, что этот скрипт - одноразовый,
псоле первого цикла засыпание-подъём, ноутбук перестает реагировать на
закрытие крышки. Виноват в этом глючный драйвер asus_acpi (ни за что бы
не догадался, ага), обслуживающий кнопку lid, который не может выйти из
спячки. В таком случае нам нужно будет ещё немного доработать скрипт
acpi_default.sh, с тем, чтобы после подъема скрипт выгружал, а потом
заново загружал этот драйвер. Это действительно помогает. Так что в
итоге скрипт выглядит таким образом:
#!/bin/sh
# Default acpi script that takes an entry for all actions
IFS=${IFS}/
set $@
case "$1" in
button)
case "$2" in
power)
init 0
;;
lid)
/usr/sbin/s2ram --force --vbe_post
/sbin/rmmod asus_acpi
/sbin/modprobe asus_acpi
;;
*) logger "ACPI action $2 is not defined"
;;
esac
;;
*)
logger "ACPI group $1 / action $2 is not defined"
;;
esac
В заключение приведу ещё список опция ядра имеющих отношение к acpi,
которые были использованы мной:
#
# Power management options
#
CONFIG_PM=y
# CONFIG_PM_LEGACY is not set
# CONFIG_PM_DEBUG is not set
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
CONFIG_ACPI_PROCFS_POWER=y
CONFIG_ACPI_SYSFS_POWER=y
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=m
CONFIG_ACPI_BATTERY=m
CONFIG_ACPI_BUTTON=m
CONFIG_ACPI_FAN=m
CONFIG_ACPI_DOCK=y
# CONFIG_ACPI_BAY is not set
CONFIG_ACPI_PROCESSOR=m
CONFIG_ACPI_THERMAL=m
# CONFIG_ACPI_WMI is not set
CONFIG_ACPI_ASUS=m
CONFIG_ACPI_TOSHIBA=m
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_SYSTEM=y
CONFIG_X86_PM_TIMER=y
# CONFIG_ACPI_CONTAINER is not set
# CONFIG_ACPI_SBS is not set
# CONFIG_APM is not set