Усыпление ноутбука Toshiba Satellite 40L |
[Jun. 21st, 2008|01:18 am] |
Недавно я стал обладателем этого недорого ноутбука, который, как я полагал, продается без опреационной системы. Однако, я обнаружил на нем опасный вирус, который при включении ноутбука активизировался и самораспаковывался из загрузочной области. Я из естествоиспытательского интереса даже решил посмотреть, чем это закончиться. Закончилось банально - вирус выдал мне диалоговое окно, в которые я должен был ввести свои личные данные, предварительно подключив ноутбук к сети. Т.е. на такие дешевые разводки уже не всякая секретарша купиться, не говоря уже об опытном админе. Так что я раздобыл установочный диск 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 |
|
|