geekkoo - Усыпление ноутбука Toshiba Satellite 40L [entries|archive|friends|userinfo]
geekkoo

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Усыпление ноутбука Toshiba Satellite 40L [Jun. 21st, 2008|01:18 am]
Previous Entry Add to Memories Tell A Friend Next Entry
Недавно я стал обладателем этого недорого ноутбука, который, как я полагал, продается без опреационной системы. Однако, я обнаружил на нем опасный вирус, который при включении ноутбука активизировался и самораспаковывался из загрузочной области. Я из естествоиспытательского интереса даже решил посмотреть, чем это закончиться. Закончилось банально - вирус выдал мне диалоговое окно, в которые я должен был ввести свои личные данные, предварительно подключив ноутбук к сети. Т.е. на такие дешевые разводки уже не всякая секретарша купиться, не говоря уже об опытном админе. Так что я раздобыл установочный диск Slackware12 и стал бороться с этим вирусом, который однако оказался довольно хитрым, и мои попытки отформатировать диск с помощью cfdisk были тщетными. Пришлось прибегнуть к более надежному средству - fdisk. Таким образом вирус был побежден и на моем компьютере оказалась провренная временем операционная система Slackware.

Осталось только посетовать, что наши продавцы компьютерной техники так наплевательски относятся к покупателям, продавая им инфицированное оборудование. В моем случае, правда, продавцы наклеили на корпус стикер, который предупреждают покупателя о вирусном содержимом компьютера. Вообщем, хочется, тоже присоединиться и напомнить - люди, будьте бдительны если вам попадется ноутбук со стикером WindowsVista basic!

Единственная сложность при установке системы, с которой я столкнулся, состояла в настройке 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 и button/sleep (или Fn+F3)
(lid|sleep)
/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|sleep)
/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
LinkLeave a comment