Готовим Linux на Asus U31SD/P31SD и подобных


После приобретения обновки в виде Asus P31SD и последующей установки на него Linux было очень обидно увидеть всего 6 часов автономной работы вместо желаемых 10-12. На Windows обратно вернуться не удалось (тут даже cywgin не помог), поэтому было решено запастись кофе и занять ближайшие выходные решением этих проблем.

Рассматриваем решение на примере Ubuntu 11.10.

P.S. В теории гайд подходит для всех ноутбуков с Sandybridge и Nvidia Optimus.

Важная, для нас, часть конфигурации ноутбука:
Процессор: Intel Core i3-2310M (Sandybridge)
Видеоадаптер: Nvidia Geforce 520M (Nvidia Optimus)

Итак, сразу после установки Linux мы видим следующие проблемы:
  1. Сумасшедшая яркость.
  2. Повышенное потребление энергии — наша основная цель.
  3. Не работает режим сна — для облегчения жизни заставим его работать

Яркость


Симптом: подсветкой пытаются одновременно управлять хардварный модуль и программный модуль из DE в результате чего случаются скачки в случайном направлении.

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

Открываем /etc/default/grub и вписываем параметр в GRUB_CMDLINE_LINUX, получится:
GRUB_CMDLINE_LINUX="acpi_backlight=vendor"

Сохраняем, обновляем конфигурацию grub (sudo update-grub), перезагружаемся и радуемся адекватному поведению подсветки.

Режим сна


Симптом: при отправке ноутбука в сон устройство яростно сопротивляется и, в конечном итоге, зависает.

После недолгих поисков находим виновников: плохо-засыпающие USB-хабы. И рядом находим решение, хук для pm-utils:
/etc/pm/sleep.d/20_custom-asus-u31sd:

#!/bin/sh
 
BUSES="0000:00:1a.0 0000:00:1d.0"
 
case "${1}" in
    hibernate|suspend)
    # Switch USB buses off
    for bus in $BUSES; do
        echo -n $bus | tee /sys/bus/pci/drivers/ehci_hcd/unbind
    done
    ;;
    resume|thaw)
    # Switch USB buses back on
    for bus in $BUSES; do
        echo -n $bus | tee /sys/bus/pci/drivers/ehci_hcd/bind
    done
    ;;
esac

Сохраняем, делаем исполняемым (sudo chmod +x /etc/pm/sleep.d/20_custom-asus-u31sd), проверяем.
Работает? Почти. После выходи из сна яркость дисплея падает до минимума… Поправить оплошность можно в этом же хуке. Достать значение яркости можно где-то из /sys. Большинство драйверов называют параметры банально поэтому просто поищем там backlight:

$ find /sys -name backlight
/sys/devices/platform/asus-nb-wmi/backlight

Нашлось! После изучения внутренностей значение яркости оказалось в /sys/devices/platform/asus-nb-wmi/backlight/asus-nb-wmi/brightness. Допишем в предыдущий хук его сохранение и восстановление:

#!/bin/sh
 
BUSES="0000:00:1a.0 0000:00:1d.0"
 
case "${1}" in
    hibernate|suspend)
    # Switch USB buses off
    for bus in $BUSES; do
        echo -n $bus | tee /sys/bus/pci/drivers/ehci_hcd/unbind
    done
    # Saving brightness to /tmp/br
    cat /sys/devices/platform/asus-nb-wmi/backlight/asus-nb-wmi/brightness > /tmp/br
    ;;
    resume|thaw)
    # Switch USB buses back on
    for bus in $BUSES; do
        echo -n $bus | tee /sys/bus/pci/drivers/ehci_hcd/bind
    done
    # Restoring brightness from /tmp/br
    cat /tmp/br > /sys/devices/platform/asus-nb-wmi/backlight/asus-nb-wmi/brightness
    ;;
esac

Снова проверяем и… работает! Теперь приступим к основному противнику, энергопотреблению.

Повышенное потребление энергии


Сбивать аппетиты Linux будем аж в 3 этапа.

1. Дискретная графика


Ноутбук оборудован двумя видеоадаптерами: интегрированной (Intel) и дискретной (Nvidia). Но не простой Nvidia, а работающей по технологии Nvidia Optimus. Той самой Optimus, поддержки которой в обозримом будущем в Linux не предвидится.

Но слава open-sourc'у мир полон энтузиастов. Борьбой (а иногда и дружбой) с Optimus занимается Bumblebee. Они достигли хорошего прогресса:
  • Bumblebee умеет включать/отключать дискретную карту в зависимости от потребностей
  • Bumblebee умеет заставлять приложения использовать дискретную карту

Естественно проект полон костылей, но это все же лучше чем ничего.
Займемся установкой:

$ sudo add-apt-repository ppa:bumblebee/stable
$ sudo apt-get update
$ sudo apt-get install bumblebee

К сожалению практически на каждом ноутбуке разная ACPI-команда включения/отключения видеокарты (большая таблица собрана здесь), поэтому управление питанием в Bumblebee по умолчанию выключено. Из таблицы выше берем команды и записываем их в /etc/bumblebee/cardoff и /etc/bumblebee/cardon соответственно:
/etc/bumblebee/cardoff:
\_SB.PCI0.PEG0.GFX0.DOFF

/etc/bumblebee/cardon:
\_SB.PCI0.PEG0.GFX0.DON

Затем в /etc/bumblebee/bumblebee.conf включаем управление питанием:
ENABLE_POWER_MANAGEMENT=Y

и заставляем сервис завершаться (и соответственно выключать дискретную видеокарту) если его никто не использует:
STOP_SERVICE_ON_EXIT=Y

Сохраняем, перезагружаемся, смотрим на потребление энергии — ощутимо уменьшилось.
Прежде чем пойти дальше починим снова ждущий режим: дело в том, что при переходе в сон активный видеодрайвер (nvidia или nouveau) будет пытаться подготовить карту, но карта то у нас выключена. Решим просто и «в лоб»: в выше использованный хук добавим 2 команды:
  • Будем включать карту перед засыпанием.
  • Будем выключать карту после просыпания.

Хук примет следующий вид:

#!/bin/sh
 
BUSES="0000:00:1a.0 0000:00:1d.0"
 
case "${1}" in
    hibernate|suspend)
    # Switch USB buses off
    for bus in $BUSES; do
        echo -n $bus | tee /sys/bus/pci/drivers/ehci_hcd/unbind
    done
    cat /sys/devices/platform/asus-nb-wmi/backlight/asus-nb-wmi/brightness > /tmp/br
    # Switch optimus back on before going to sleep, avoids the "constant on"
    # bug that occurs after 2 suspend/resume cycles (thanks kos888)
    echo `cat /etc/bumblebee/cardon` | tee /proc/acpi/call
    ;;
    resume|thaw)
    # Switch USB buses back on
    for bus in $BUSES; do
        echo -n $bus | tee /sys/bus/pci/drivers/ehci_hcd/bind
    done
    cat /tmp/br > /sys/devices/platform/asus-nb-wmi/backlight/asus-nb-wmi/brightness
    # Switch optimus off before resuming, avoids unneccessary power draw
    echo `cat /etc/bumblebee/cardoff` | tee /proc/acpi/call
    ;;
esac


2. Интегрированная видеокарта


Игравшись с разными версиями ядер я случайно заметил уменьшенное энергопотребление на версиях до 2.6.39 включительно. Бросившись в поиск по этим параметрам я в своей догадке не ошибся.
Проблема была обнаружена: виноват патч принятый в драйвер i915 в 3.0 ядре. Но, к счастью, его можно обойти без последствий.
В уже известный /etc/default/grub дописываем параметр i915.i915_enable_rc6=1. Строка расширится до:

GRUB_CMDLINE_LINUX="acpi_backlight=vendor i915.i915_enable_rc6=1"

Обновляем конфигурацию grub, перезагружаемся и смотрим на показания батареи. Теперь можно жить. А можно уменьшить еще!

3. Дополнительные мелкие твики


Запустив powertop и применив все рекомендованные твики можно выжать еще 0,5-1 Wh, что на данном железе может дополнительно дать до часа автономной работы. Но не играться же каждый раз с powertop? Автоматизируем все это дело через pm-utils. У нас получиться 4 отдельных скрипта:

1. Один из главных твиков, по неизвестным причинам не включенный в стандартную поставку. Меняем режим управления частотой процессора:
/etc/pm/power.d/cpu-governor
#!/bin/bash

cpu_powersave() {
    for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
        echo $1 > $i && echo Done. || echo Failed.
    done

}

case $1 in
    true) cpu_powersave "ondemand" ;;
    false) cpu_powersave "performance" ;;
    *) exit $NA
esac

exit 0

2. Меняем режим управления питанием USB-устройств:
/etc/pm/power.d/usb-autosuspend
#!/usr/bin/env python

from os import listdir, path
from sys import argv

status = argv[1]
USB_PATH = '/sys/bus/usb/devices/'

def powersave(status):
    devices = listdir(USB_PATH)
    devices = filter(lambda x: ':' not in x, devices)

    for device in devices:
        b = listdir(path.join(USB_PATH, device))
        b = filter(lambda x: ':' in x, b)
        is_mouse = False
        for i in b:
            if open(path.join(USB_PATH, device, i, 'bInterfaceProtocol')).read().strip() == '02':
                is_mouse = True
                break

        if not is_mouse:
            open(path.join(USB_PATH, device, 'power/control'), 'w').write(status)

if status == 'true':
    powersave('auto')
elif status == 'false':
    powersave('on')

Скрипт умеет определять мыши и гасить их не будет.

3, 4. Меняем режим управления питанием у остальных устройств:
/etc/pm/power.d/scsi_host-link_power_management
#!/bin/bash

powersave() {
    for i in /sys/class/scsi_host/host?/link_power_management_policy; do
        echo $1 > $i && echo Done. || echo Failed.
    done

}

case $1 in
    true) powersave "min_power" ;;
    false) powersave "max_performance" ;;
    *) exit $NA
esac

exit 0

/etc/pm/power.d/pci-power-control
#!/bin/bash

powersave() {
    for i in /sys/bus/pci/devices/*/power/control; do
        echo $1 > $i && echo Done. || echo Failed.
    done

}

case $1 in
    true) powersave "auto" ;;
    false) powersave "on" ;;
    *) exit $NA
esac

exit 0

Делаем данные файлы исполняемыми и применяем одним махом: sudo pm-powersave true.

Настройка окончена. Официальный пруф:
image
И результаты диаграммой:
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 59

    –30
    Вот пока будут такие простыни из конфигов чтобы просто заработал режим сна, у этого поделия так и будет 1%.
      +1
      А чем они вам мешаются? Не читайте =)
      Хотя да, собрать это в пакет было бы правильнее.
        –9
        Мне лично ничем, я этим поделием не пользуюсь. Просто после таких постов всегда приходишь в удивление как ЭТО можно рекомендовать к повсеместному использованию.
          +1
          Да ты что чувак. Мы ещё бабушке/дедушке/отцу/матери/сестре/жене забыли дописать, что это ставили.

          Упс, косяк… Проболтался… в общем знаете куда минусы ставить.
            +1
            Не факт что виндовс изх коробки без установки драйверов будет экономно работать.
            Если бы железо-издатели потрудились и написали хотя бы скриптик который это всё настраивал, то было бы не труднее чем в винде: просто запустить «инсталятор» и всё само настроится.

            Т.е. да, линукс в этом плане как бы плетётся где-то там и неюзабельный, но исключительно потому, что на диске к ноуту нет нужных файликов.
            0
            инквизитор, Это ты писал про сборку пакетов с конфигами на дебиан.про ??
          +15
          Тыркаться в виндовом реестре не менее увлекательное занятие :)
            +11
            Нифига себе! Система, которую разработчик вылизывал и тестировал на свойм железе, в которую надо ставить специальные драйвера разработчика даёт энергопотребление хуже, чем другая система о которой вендор вообще ничего не слышал и которая написана независимыми от него людьми. Причём это достигается только правильной настройкой, а не установкой специальных библиотек. Это как раз крайне удивительно, что всё так просто решается!
              0
              @seleko
              Он отлично документирован. И туда обычно не лезут чтобы настраивать сон.

              @ivlis
              Эти значения входят в погрешность измерения. Или вы хотите сказать что у автора в обоих ОС используется одно и тоже ПО, стоят одни и теже настройки и он одинаково ими пользовался?
            +4
            А у меня главный твик — это rmclock в Windows и снижение с помощью него напряжения процессора до 0.975. При этом процессор снижает свою температуру на 10 градусов!!! и батарея живет на ~ 1 час больше. Поэтому и не могу перейти на Linux (Kubuntu — очень нравится), так как не устраивает температура и шум в нем. Пробовал устанавливать какие то твики в ядро Linux c целью снижения напряжения, но это явно не для обычного user задача
              +5
              intel-phc меняет параметры питания процессора. Пробовали?
                +1
                ДА, толко чтобы его собрать и установить, нужно явно уровень выше USER, как я и написал. Да и для 11.10 так и не появилось собранного ядра. Хотя я умудрился собрать ядро, но там еще нужно собирать и настраивать демона. Неделю потратил, но так и не осилил. На windows просто запустил RMclock, 3 минуты настроил и все…
                  +3
                  Я под арчем просто поставил пакет из аура. Ввел 2 команды. Подгрузил модуль. И у меня в samsung-tools активировалась кнопка.
                0
                launchpad.net/~eugenesan/+archive/ppa не пробовали?
                +7
                Есть у меня несбыточная мечта, собрать репозиторий из вот таких рецептов, чтобы было пользователи могли сделать sudo apt-get install laptop-tweaks-<vendor-model> и наслаждаться жизнью. Не судьба, видимо.
                  0
                  слишком завязано на хардваре же
                    0
                    В смысле? Что мешает заточить отдельный метапакет для каждой поддерживаемой модели? Какие-то характерные для конкретной линейки ноутбуков твики можно выносить в отдельные пакеты и подтягивать зависимостями. Не вижу ничего невозможного.
                      +1
                      Сделать что то вроде winetricks только набор скриптов для каждого ноута.
                        0
                        Позвольте, но чтобы собрать рецепты для каждой _линейки_ ноутов Вам будет необходимо немаленькое такое сообщество из тех, кто будет допиливать все эти твики (прошу извинить за тавтологию) и тестировать на каждой (почти?) конкретной модели, чтобы быть уверенным в отсутствии багов именно на ней.
                        Иначе — фейл и/или вечная бета.
                        Или я не прав?
                        Возможно, я просто слишком серьёзен и не понимаю шутки.
                        З.Ы. С юмором и оптимизмом тут хорошо у inkvizitor68sl, но он тоже сразу снимает с себя работу с общественностью, ыть.
                          0
                          Да, сообщество большое понадобится. Но если преодолеть психологическую планку в 100 моделей — то люди потянутся.
                          0
                          И каждого дистра ;)
                        0
                        Почему несбыточная? Нас уже двое. У меня есть ресурсы и все необходимые знания =)
                        Если вы займетесь общественной деятельностью в этом направлении и собиранием скриптов в папочки — то давайте начнем. А там уже и люди потянутся.
                          0
                          Я с вами, ребята! Было бы очень классно сделать такой репозиторий!
                            0
                            Ок, попробуем организоваться. Вечером будет время — создам минимальную стартовую инфраструктуру и отпишусь.
                        0
                        (большая таблица собрана Здесь) — поправьте пожалуйста
                        По теме — напильник спасет мир. Сам с Sony VAIO ковыряю все детально, чтобы выжать максимум.
                          +1
                          Поправил, спасибо.
                          0
                          Теги: ubuntu, mint

                          Debian уж добавьте тогда.
                            0
                            Сохраняем, перезагружаемся, смотрим на оставшееся время автономной работы — ощутимо уменьшилось.
                            кхе кхе.
                              0
                              Ой :)
                              fixed.
                              0
                              Насколько это применимо к другим ноутбукам?
                                0
                                К asus u36sd — чуть более, чем полностью. К thinkpad x220 — тоже (ну кроме скрипта для «поспать»).
                                inkvizitor68sl@inkvizitor68sl:~$ cat /etc/default/grub | grep «LINUX_DEFAULT»
                                GRUB_CMDLINE_LINUX_DEFAULT=«elevator=noop pcie_aspm=force i915.i915_enable_rc6=1 i915.lvds_downclock=1 i915.semaphores=1 clocksource=hpet»
                                powertop актуален для всех ноутов. Строчки в грабе — для новых ядер с SB (ну и может быть предпоследними интелячими чипсетами).
                                  0
                                  А есть какой-то действенный вариант побороть сдвиги кадра при воспроизведении динамичных сцен видео? На интегрированной intel hd3000. Периодическое интенсивное гугление плодов не даёт…
                                    0
                                    Есть, добавьте CLUTTER_PAINT=disable-clipped-redraws:disable-culling в /etc/environment
                                  0
                                  К Asus K50AB применимо в плане регулировки яркости. Спасибо автору топика! Давно раздражжали скачки яркости.
                                  0
                                  Ну и да — вы забыли самое важное :)
                                  Снижение частоты ЦПУ. В natty у дефолтного гномо-переключателя частоты появилась поддержка sandy bridge. Добавляем его на панель и легким движением руки добавляем Х часов (в моём случае — аж 3 часа на i7-2620M). Я не стал вникать, почему последние ветки дистрибутивов перестали корректно управлять частотой — мне хватает того, что при подключении док-станции она всегда становится максимальной.
                                    0
                                    Не забыл :)
                                    В скрипте /etc/acpi/power-u31sd.sh есть перевод процессора в режим ondemand, который умеет понижать частоту.
                                    А перестали адекватно управлять как-раз потому что в дефолтных ядрах по-умолчанию режим perfomance (всегда максимальная частота) стоит.
                                    0
                                    Bumblebee, и ее форк Ironhide — прекрасное решение не только для Asus U31SD но и для Asus U30JC, да и вообще для большинства линуксовых дистрибутивов и железа с Nvidia Optimus. С помощью ее я только после полугода запустил Nvidia на Asus U30JC.
                                      0
                                      В простыне дважды sata_link конфигурится, один раз в цикле, второй раз простынёй.
                                        0
                                        И то правда, как-то переусердствовал.
                                        Я перед публикацией подумывал простыню снова в цикл переделать, остатки дебага.
                                        +2
                                        Asus n53sv

                                        Bublebee у меня не работает, пользуюсь Ironhide — он умеет выключать nvidia сразу при старте. Sleep работает из коробки, вроде без проблем (редко пользуюсь), регулировка яркости тоже.

                                        В ваших мелких твиках я бы посоветовал убрать автозасыпание пользователям usb мышей.

                                        Итого получается:
                                        14817 mW при максимальной яркости
                                        10758 mW при минимальной
                                          0
                                          Настроил Ironhide. Единственный вопрос — индикатор работы видеокарты. Он так и должен гореть белым, даже при отключённой дискретной графике? Видно, что потреблять стало меньше почти в два раза, однако индикатор меня смущает.
                                            +1
                                            Да, у меня индикатор также не работает. Ориентируюсь на звук и теплоту выхлопа.

                                            Вообще, проверять видеокарту можно командой
                                            lspci | grep VGA

                                            у nvidia должно быть (rev ff)
                                              0
                                              Спасибо. Да, стоит rev ff.
                                              И, кстати, только сейчас заметил, что видеокарта опознана неверно — стоит 555М вместо 540М. Впрочем, чипы эти из одного семейства, так что фиг с ним.
                                          0
                                          Автору спасибо, подарил дополнительные 2 часа жизни.
                                            0
                                            Поставил Ironhide, Bumblebee не завелась вообще (а не перекочевалась ли разработка только в первый?).
                                            Asus N53SV, купил сдругу, не посмотрев что там оптимус.
                                              0
                                              IronHide продолжает разрабатывать автор первого Bumblebee, в то время как как текущим Bumblebee занимаются уже другие люди. Оба проекта развиваются.
                                            • UFO just landed and posted this here
                                                0
                                                А в логах что?
                                                • UFO just landed and posted this here
                                                0
                                                bumblebee — это та самая софтина, которая удаляет /usr?
                                                  0
                                                  уже нет :)
                                                  0
                                                  Что-то я наверное не доделал, но на U41SV винда дает 9, линух после всех твиков 6.30 (было 2.40 на свежеустановленном дебиане), попробую еще intel-phc.
                                                    0
                                                    > Если вы используете USB-мышу то usb-autosuspend вам только добавит неудобств, поэтому второй цикл лучше удалить.

                                                    Как выяснилось, при использовании USB радиомышки пришлось убрать ещё и последний цикл (/sys/bus/usb/devices/*/power/level), иначе, при оставлении мыши без дижения примерно на 5 сек, возникали какие-то странные лаги в начальный момент движения.
                                                      0
                                                      Завтра обновлю последний пункт. Сделал скрипт более адекватным (теперь работает с pm-powersave, который и выполняет перевод железа в энергосберегающий режим и обратно), и добавил в него исключение для usb-устройств типа Mouse.
                                                      0
                                                      Обновлен пункт «Дополнительные мелкие твики».
                                                        0
                                                        Вопрос — как и где вы храните все свои конфиги разбросанные по /etc, ~/.config и т.д. (т.е. после форматирования как вы сможете быстро все настроить обратно)?
                                                          0
                                                          сохраняйте весь /home и /etc перед «форматированием»

                                                          ЗЫ: невольно возникает вопрос о том зачем нужно «форматирование» и как часто оно у вас происходит…
                                                            0
                                                            Линух такой, линух другой :)

                                                        Only users with full accounts can post comments. Log in, please.