dikiy_mujchina: (ubuntu)
[personal profile] dikiy_mujchina
Что имеем:
1. В https://bugs.launchpad.net/ubuntu/+source/linux/+bug/653524 описано как победить проблему сна на AO521. Kоманды s2ram --force (суспенд) и s2disk (хибернейт) работают! Hibernate работает лучше чем суспенд. Суспенд иногда глючит и не выходит из сна(с открытыми драйверами radeon).
2. При закрытии крышки статус таки сохраняется в /proc/...

Для более надежной работы hibernate создаем 2 swap раздела. Один собственно для сваппинга системы, второй для хибернейта(в моем примере - sda3). Сваппинг активируем, а хибернейтовский раздел - нет. Будем активировать только при хибернейте, чтоб ненароком туда не записалось что-то из сваппинга системы...

Решение:
1. Делаем такой скрипт lid.pl:

#!/usr/bin/perl

# Control LID state and hibernate for netbook Acer AO521
# (c) Mishchenko Alexander Stepanovych, 2011
# This software is free. It is licensed under GPL.

my $device='/dev/sda3'; # Device for hibernating
my $tmp='/tmp/acpi-lid-tmp'; # Temporary file for state of lid now.
my $old='/tmp/acpi-lid-state'; # Saved state of lid
my $state,$state_old;

sub readstate
{
 system ('cat /proc/acpi/button/lid/LID/state>'.$tmp);
 open(F,$tmp);
 $state=<F>;
 close(F);
}

sub hibernate
{
 system('swapon '.$device);
 system('s2disk');
 system('swapoff '.$device);
}

while()
{                                                                                                                                              
 readstate();                                                                                                                                  
 if (-e $old)                                                                                                                                  
 {                                                                                                                                             
  open(F,$old); #read saved state
  $state_old=<F>;
  close(F);
  if (($state=~/closed/) && ($state_old=~/open/)) #if state changed to closed
  {
   hibernate();
  }
 }
 else
 {
  open(F,'>'.$old);
  print F $state;
  close(F);
  $state_old=$state;
 }
 sleep(2); #Pause for 2 sec. Test state every 2 sec.
}

2. Даем права на запуск.
3. Вставляем запуск этого скрипта в rc.local и перезагружаемся...
4. Все ок.
5. Дополнительно: в цикле можно сделать проверку на то, что запущено какое-то приложение и не засыпать, если оно есть. Плюс другие варианты (играет плэйер, а не в паузе и т.д.).

Про мене

dikiy_mujchina: (Default)
dikiy_mujchina

December 2019

S M T W T F S
1234 567
891011121314
15161718192021
22232425262728
293031    

Мітки

За стиль дякую

Показати приховане

No cut tags
Page generated Jun. 25th, 2025 07:03 pm
Powered by Dreamwidth Studios