Энергосбережение

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел железо

Во время настройки ноутбука мне потребовалось решить следующие задачи:

   * При отключение от электросети ноутбук должен потреблять меньше энергии, при подключение обратно должен работать с наибольшей производительностью.
   * При малом заряде аккумулятора ноутбук должен выключиться правильным образом.
   * При закрытие крышки экран должен отключиться и запереться.

Пробовал kpowersave, powersave, но в итоге решил использовать средства acpid. Для решения вышеперечисленных задач достаточно поставить несколько пакетов и подправить /etc/acpi/default.sh:

Файл: /etc/acpi/default.sh

#!/bin/sh
# /etc/acpi/default.sh
# ACPI script v1.2 for laptops, author Nikoli nikoli@jabber.org nikoli.selfip.org
# Before using: install sys-power/acpid sys-power/hibernate-script sys-power/acpitool x11-apps/xset x11-misc/slock and run
# /etc/init.d/acpid start;rc-update add acpid default

set $*

group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4

log_unhandled() {
        logger "ACPI event unhandled: $*"
}

rlock() {
        if ps -C X>/dev/null;then
                # su $(ps -C xinit -o user=) -c "DISPLAY=":0" XAUTHORITY=$(ps -C X -o args=|awk '{print $7}') /usr/bin/slock &" # without DM
                /usr/kde/3.5/bin/dcop --all-users --all-sessions kdesktop KScreensaverIface lock # KDM
        else
                exit 1
        fi
}

case "$group" in
        button)
                case "$action" in
                        power)
                                rlock
                                rmmod -f acpi-cpufreq;/usr/sbin/hibernate -f;modprobe acpi-cpufreq
                                ;;

                        lid)
                                if grep -qv open /proc/acpi/button/lid/LID/state;then
                                        sleep 1 && DISPLAY=":0" XAUTHORITY=$(ps -C X -o args=|awk '{print $7}') /usr/bin/xset -display :0.0 dpms force off && rlock
                                fi
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        ac_adapter)
                case "$value" in
                        # Add code here to handle when the system is unplugged
                        # (maybe change cpu scaling to powersave mode).  For
                        # multicore systems, make sure you set powersave mode
                        # for each core!
                        *0)
                                echo conservative > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
                                echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
                                for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo min_power > $i; done
                                hdparm -B 128 -S 12 /dev/sda
                                echo 5 > /proc/sys/vm/laptop_mode
                                echo 40 > /proc/sys/vm/dirty_ratio
                                echo 10 > /proc/sys/vm/dirty_background_ratio
                                echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
                                ;;

                        # Add code here to handle when the system is plugged in
                        # (maybe change cpu scaling to performance mode).  For
                        # multicore systems, make sure you set performance mode
                        # for each core!
                        *1)
                                echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
                                echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
                                for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo max_performance > $i; done
                                hdparm -B 255 -S 240 /dev/sda
                                echo 0 > /proc/sys/vm/laptop_mode
                                echo 10 > /proc/sys/vm/dirty_ratio
                                echo 5 > /proc/sys/vm/dirty_background_ratio
                                echo 500 > /proc/sys/vm/dirty_writeback_centisecs
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        battery)
                if (( "$(/usr/bin/acpitool -b| awk '{ print $5}'|awk -F'.' '{ print $1}')" < "2" ));then
                        /sbin/init 0
                fi
                ;;

        *)      log_unhandled $* ;;
esac

Для запуска иксов использую startx, но с *dm тоже должно работать после некоторых правок.

Советую воспользоваться sys-power/powertop для выяснения главных потребителей энергии. Для наблюдения за состоянием батарей удобен sys-power/acpitool, повесил на горячие клавиши такой скрипт:

Файл: batStat.sh
#!/bin/bash
# batStat.sh
osd_cat -P $(/usr/bin/acpitool -b| awk '{ print $5}') -T "$(acpitool -b)" -p middle -A center -b percentage -o 50 -c orange

osd_cat входит в x11-libs/xosd

Для более тихой и продолжительном работы ноутбуку полезно сократить общение с жёстким диском, в этом поможет добавление в /etc/sysctl.conf:

Файл: /etc/sysctl.conf
vm.swappiness = 10

[править] Источник

[править] Ссылки

Личные инструменты