среда, 18 июня 2014 г.

Ноутбук + 2 видеокарты — как жить?

Ноутбук + 2 видеокарты — как жить?
Убунтариум*
Последнее время у производителей появилась тенденция ставить на ноутбуки две видеокарты — одна какая-нибудь простенькая интеловская для экономии электроэнергии, а другая — навороченная для игр и видео. Насколько я знаю, таким точно грешит Lenovo, и под эту же тенденцию попал и я со своим HP TouchSmart tm2-1080er. Если на предустановленной Windows 7 Home x64 возможность переключаться между картами, разумеется, имелась, то Windows 7 Professional x32 вторую видеокарту включать уже не захотел. Не лучше обстояла ситуацию и в Ubuntu — видеокарты определяются-то обе, а вот использоваться предпочитает только дефолтная интеловская. И питание жрут, разумеется, обе — как результат, ноутбук работает намного меньше, чем должен. Как мы будем с этим бороться?
Итак, у нас есть две видеокарты:
$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
01:00.0 VGA compatible controller: ATI Technologies Inc M93 [Mobility Radeon HD 4500 Series] (rev ff)

Наша задача — либо научиться переключаться между двумя видеокартами, либо хотя бы отключить питание второй видеокарты.

Способ первый. Убить пересмешника.

Первый способ простой. Мы возьмём готовый модуль, написанный для ноутбуков Lenovo (для нашего замечательного HP он тоже подходит) и заставим его прикручиваться к нашему ядру. Для этого мы воспользуемся deb-пакетами и системой динамического прикручивания модулей — DKMS.
Модуль я обозвал незатейливо — hp_acpi_kill.

Берём исходный код модуля и сохраняем его под именем hp_acpi_kill.c
Теперь кладём рядом Makefile.
Это наш необходимый модуль, написанный неизвестным энтузиастом для OpenSUSE.

Теперь нам надо написать конфиг для DKMS, чтобы не пересобирать модуль под каждую новую версию ядра. К счастью, DKMS устроен очень просто, и конфиг получается короткий. Скачиваем и сохраняем под именем dkms.conf. В этом файле мы указываем имя компилируемого модуля, его версию, а также как компилировать и ставить наш модуль. Казалось бы на этом можно и остановиться — добавить модуль в DKMS, собрать и установить — но мы всё-таки пользователи удобного дистрибутива, а не не пойми чего. Поэтому мы завернём наш модуль в пакет.
Углубляться в подробности сборки пакета я не буду, посколько на хабре писал об этом уже много, скажу лишь, что помимо обычного набора файлов нам потребуются файлы *.postinst,*.postrm, *.prerm — чтобы наш модуль регистрировался и компилировался в DKMS при установке пакета, а также вычищался при удалении. Скачать архив со всеми необходимыми файлами можно тут.

Собираем пакет командой debuild или dpkg-buildpackage на выбор, устанавливаем и добавляем в /etc/modules название модуля hp_acpi_kill — теперь при загрузке системы дискретная видеокарта будет отключаться и энергопотребление резко падать.
Посмотрев список устройств, мы обнаружим, что наша видеокарта системе видна, но не определяется:
$ lshw
...
*-generic:0
product: Illegal Vendor ID
vendor: Illegal Vendor ID
physical id: 0
bus info: pci@0000:01:00.0
version: ff
width: 32 bits
clock: 66MHz
capabilities: bus_master vga_palette cap_list rom
configuration: driver=radeon latency=255 maxlatency=255 mingnt=255
resources: irq:31 memory:c0000000-cfffffff ioport:3000(size=256) memory:e4400000-e440ffff memory:e4420000-e443ffff


Способ второй. vga_switcheroo

Способ второй потребует от нас немножко трафика и капельку времени. Дело в том, что не так давно вышла версия 2.6.34 ядра, в которую включен новый интересный модуль — vga_switcheroo, который как раз и призван переключать видеокарты. На Launchpad и kernel.ubuntu.com даже можно найти пакеты с этим ядром, но в дефолтном конфиге модуль выключен — вероятно потому, что удобных графических средств для переключения видеокарт пока не придумали.

Поэтому для начала скачаем исходный пакет с ланчпада (он предназначен для Maverick Meerkat, но и у нас отлично заработает):
$ wget launchpad.net/ubuntu/+archive/primary/+files/linux_2.6.34-2.9.dsc
$ wget launchpad.net/ubuntu/+archive/primary/+files/linux_2.6.34-2.9.tar.gz

Распакуем его:
$ dpkg-source -x linux_2.6.34-2.9.dsc

Теперь зайдём в каталог linux-2.6.34 и откроем файл debian.master/config/config.common.ubuntu любым любимым редактором. Найдём строку "# CONFIG_VGA_SWITCHEROO is not set" и заменим её на «CONFIG_VGA_SWITCHEROO=y» (кавычки не нужны).
На всякий случай откроем ещё файл debian/config/enforce и допишем в нём строку «value CONFIG_VGA_SWITCHEROO y» — это поможет при сборке убедиться, что ни одна зараза не испортила выставленный параметр.
Собираем командой debuild (собираться будет долго, потому что при сборке пакета собирается ВСЁ) и устанавливаем:
$ sudo dpkg -i linux-headers-2.6.34-2_2.6.34-2.9_all.deb linux-headers-2.6.34-2-generic_2.6.34-2.9_i386.deb linux-image-2.6.34-2-generic_2.6.34-2.9_i386.deb
Если у вас 64-битная система, вместо i386 в имени файла будет, разумеется, amd64.

Как нам после перезагрузки в новое ядро переключить видеокарту? Посмотрим на сводку советского информбюро:
$ cat /sys/kernel/debug/vgaswitcheroo/switch
0:+:Pwr:0000:00:02.0
1: :Off:0000:01:00.0

Плюсик показывает нам активную видеокарту, пометка Pwr — что видеокарта включена, Off — что выключена. Что можно изменить? Есть замечательный список команд, которые можно передать vga_switcheroo:
DIS — немедленное переключение на дискретную видеокарту
IGD — немедленное переключение на интегрированную видеокарту
DDIS — отложенное переключение на дискретную видеокарту
DIGD — отложенное переключение на интегрированную видеокарту
ON — включить неиспользуемую видеокарту
OFF — выключить неиспользуемую видеокарту

Сразу скажу, немедленное переключение у меня никакого немедленного эффекта не даёт.
Поэтому скомандуем:
# echo ON > /sys/kernel/debug/vgaswitcheroo/switch # включим дискретную видеокарту
# echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch # попросим при случае переключить на дискретную видеокарту

Теперь нажимаем в системе «завершить сеанс», логинимся заново и выключаем интегрированную видеокарту:
# echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

Смотрим на результат:
$ $ cat /sys/kernel/debug/vgaswitcheroo/switch
0: :Off:0000:00:02.0
1:+:Pwr:0000:01:00.0

Теперь можно поиграть в игры, посмотреть HD-видео и не тратить питание на интеловскую карту. А можно переключиться обратно и тратить еще меньше энергии на полноценную видеокарту, экономя батарейку. Долгих ей лет.
ubuntu, ноутбуки, vga_switcheroo, dkms, deb-пакеты
+71 71889
113torkve 103,7
которые изменят
ваш е-commerceПодробнее
Комментарии (62)

+1 sam_reaper,20 мая 2010 в 02:56#
и так можно
0 metrofun,20 мая 2010 в 02:58#
Странно у меня на ASUS k40ab две видеокарты, одна ATI HD4570 вторая HD3200, и на убунте про HD3200 ни слухом, ни духом )
0 torkve,20 мая 2010 в 03:08#↵↑
Возможно, у вас одна не включена в биосе. Я знаю, что в биосе на Lenovo можно вроде бы выбрать какую-то одну видеокарту, либо режим Switchable. На моём HP просто такого перключателя нет и видеокарты в режиме switchable работают всегда.
0 Sartor,20 мая 2010 в 11:20#↵↑
У меня этот же ноут. Если я включаю режим двух видеокарт в биосе, то работает только HD3200, причём серый цвет на экране выглядит просто ужасно. Какой-то дизеринг неправильный по-моему. Так что живу в режиме dGPU. Жрёт много энергии, к сожалению… Может что-то посоветуете?
0 metrofun,22 мая 2010 в 04:10#↵↑
Да, посоветуйте ему что-то ) А я послушаю )))
+1 mgyk,20 мая 2010 в 03:53#
Очень полезно, так же для Acer TimelineX и Asus UL30VT и остальный с VT
+4 braintorch,20 мая 2010 в 04:20#
Сразу скажу, немедленное переключение у меня никакого немедленного эффекта не даёт.




ru.wikipedia.org/wiki/↵↑



пробую первый вариант, неудача:

$ debuild
dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor):
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor): -Wl,-Bsymbolic-functions
dpkg-buildpackage: source package acer-acpi-kill
dpkg-buildpackage: source version 1.0
dpkg-buildpackage: source changed by Vsevolod Velichko <torkvemada@nigma.ru>
dpkg-buildpackage: warning: debian/rules is not executable: fixing that.
dpkg-source --before-build acer_acpi_kill
dpkg-buildpackage: host architecture amd64
dpkg-source: warning: unknown information field 'Package' in input data in general section of control info file
dpkg-source: warning: unknown information field 'Architecture' in input data in general section of control info file
dpkg-source: warning: unknown information field 'Depends' in input data in general section of control info file
dpkg-source: warning: unknown information field 'Description' in input data in general section of control info file
dpkg-checkbuilddeps: Unmet build dependencies: debhelper (>= 7)
dpkg-buildpackage: warning: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: warning: (Use -d flag to override.)
debuild: fatal error at line 1337:
dpkg-buildpackage -rfakeroot -D -us -uc failed

второй вариант:
штатное ядро:

$ uname -a
Linux ap-acer 2.6.35-22-generic #35-Ubuntu SMP Sat Oct 16 20:45:36 UTC 2010 x86_64 GNU/Linux

в нем должно быть заинейблено CONFIG_VGA_SWITCHEROO:

$ cat /sys/kernel/debug/vgaswitcheroo/switch
0: :Pwr:0000:02:00.0
1:+:Pwr:0000:00:02.0
$ sudo su
# echo IGD > /sys/kernel/debug/vgaswitcheroo/switch
# echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch

перезагружаю ноут, все равно:
$ cat /sys/kernel/debug/vgaswitcheroo/switch
0: :Pwr:0000:02:00.0
1:+:Pwr:0000:00:02.0


$ sudo su
# echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch

логаут — логин, проверяю:

$ cat /sys/kernel/debug/vgaswitcheroo/switch
0: :Pwr:0000:02:00.0
1:+:Pwr:0000:00:02.0


$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 18)
02:00.0 VGA compatible controller: ATI Technologies Inc Redwood [Radeon HD 5600 Series] (rev ff)

.

Комментариев нет:

Отправить комментарий