Пользователь
0,2
рейтинг
20 мая 2010 в 02:36

Администрирование → Ноутбук + 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-видео и не тратить питание на интеловскую карту. А можно переключиться обратно и тратить еще меньше энергии на полноценную видеокарту, экономя батарейку. Долгих ей лет.
Всеволод @torkve
карма
216,7
рейтинг 0,2
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (62)

  • +1
    и так можно
  • 0
    Странно у меня на ASUS k40ab две видеокарты, одна ATI HD4570 вторая HD3200, и на убунте про HD3200 ни слухом, ни духом )
    • 0
      Возможно, у вас одна не включена в биосе. Я знаю, что в биосе на Lenovo можно вроде бы выбрать какую-то одну видеокарту, либо режим Switchable. На моём HP просто такого перключателя нет и видеокарты в режиме switchable работают всегда.
    • 0
      У меня этот же ноут. Если я включаю режим двух видеокарт в биосе, то работает только HD3200, причём серый цвет на экране выглядит просто ужасно. Какой-то дизеринг неправильный по-моему. Так что живу в режиме dGPU. Жрёт много энергии, к сожалению… Может что-то посоветуете?
      • 0
        Да, посоветуйте ему что-то ) А я послушаю )))
  • +1
    Очень полезно, так же для Acer TimelineX и Asus UL30VT и остальный с VT
  • +4
    Сразу скажу, немедленное переключение у меня никакого немедленного эффекта не даёт.

    Это, видимо, сделали на будущее. Пока что для переключения нужно перезапускать иксы.
    • 0
      Ну собственно для этого я про «завершить сеанс» и писал.
    • 0
      Все верно, в последнем ядре появилась возможность переключения видеокарт на лету, а в иксах её пока ещё не добавили. Надеюсь не станут затягивать.
  • 0
    Графические средства, насколько я понимаю, и не нужны. Необходимо, что систему кто-нибудь научил переключаться между видеокартами в зависимости от нагрузки/задачи, ну и без рестарта X-сервера конечно же.
    • –2
      Надо было просто ставить нормальное видео из серии ATI HD5xxx — там в простое и потребление падает значительно (в сравнении с 4ххх серией), и сделать по более мелкому тех процессу все.

      (Офф топик: не нужно переусердствовать, вон интел со своими i5-6xx сделали 32нм, а в результате по показателям памяти сливает тому-же i5-7xxx. А все потому-что два кристалла под одной ТРП крышкой...)
  • 0
    Меня тоже мучал этот вопрос:) Спасибо автору.
  • –3
    В ядре 2.6.34 есть встроенная поддержка переключения видеокарт
    • +2
      Так автор же вроде про это и пишет…
  • 0
    А powertop как-нибудь фиксирует наличие двух запитанных видеокарт и что-нибудь предлагает? Он на это дело горазд обычно, но вот в этом случае — не знаю, нет у меня двух видеокарт…
    • 0
      Молчит, как партизан. Но при отключенной через vga_switcheroo второй видеокарте у меня ноутбук (при максимальной яркости и включенном вайфае) вместо 3 часов работает полных 4. Что, имхо, немаленький прирост.
    • 0
      А он разве не только «просыпания» процессора ради каких-то процессов показывает? :) Железо, имхо, он отследить не в состоянии
  • –1
    Ставить что-то нерепозиторное — потенциально заработать в будущем основательный геморрой. Может, проще немного подождать? У меня в проприетарном нвидиевском драйвере это все есть в утилите управления. Думаю, еще год-два — и АТИ тоже такое сделает ;)
    • 0
      Я вот пробовал это ядрышко ставить, так nvidia dkms модуль для него не собирается :(
      • 0
        fglrx атишный для него тоже не ставится — не допилили ещё и проверку на версию ядра тоже не сделали. radeon работает нормально.
  • 0
    Одному мне кажется, что это уже было?
    • 0
      Поиск по слову vga_switcheroo на хабрахабре ничего не дал.
  • +1
    А что мешает сделать мощную видеокарту с разными режимами работы, в зависимости от требуемой мощности? Почему это решается двумя видеокартами?
    • 0
      Покопался немного в интернете, нашел что интегрированные используют центральный процессор для работы. В принципе, дискретной видюха тоже могла бы в экономном режиме использовать процессор, наверно.
      • +5
        Пока нашел вот такой ответ:
        «Переключение режимов работы связано со значительным увеличением сложности микросхемы (для более-менее эффективного энергосбережения надо полностью отключать отдельные блоки чипа, видео память и т.д., значительно изменять частоту тактирования этих блоков), что приведет к удорожанию самого чипа и еще большему увеличению энергопотребления.
        Пока наличие двух отдельных видео-чипов обходится дешевле, плюс больше вариантов компоновки в итоге.»

        Тихо сам с собою я веду беседу.
  • 0
    Я задам самый не по теме вопрос. Но может кто объяснить, откуда пошла фраза про убеждения пересмешника? Кто такой пересмешник я знаю. А вот зачем его убеждать? :)
  • 0
    мучает вопрос. А что будет если интегрированную видеокарту отключить в диспетчере устройств? Экран просто погаснет или будет эффект?
  • 0
    Ты крут. А я все не решался купить себе такой ноут.
    • 0
      отличный ноут, тоже пользуюсь несколько месяцев уже.
      Брал через hp.com через штаты, дешевле чем в России.
      Это продолжение линейки тачскрин-ноутов от HP, только теперь с мультитачем и на Intel вместо AMD…
      учли большинство недостатков предыдущих моделей линейки.
      На батарее ~6 часов теперь вытягивает на интегрированной видеокарте.
      Ноут HP tx1240 который был у меня до этого жил от батареи намного меньше, приходилось везде носить блок питания…
  • 0
    Теперь можно без страха брать ноут с 2 видяхами. В избранное
  • 0
    тоже использую vga_switcheroo на таком же ноуте, все почти нормально работает ))
    жаль по дефолту эта опция пока что отключена в конфиге ядра, приходится перекомпиливать
    HDMI выход у меня кстати работает только с дискретной видеокартой.
    • 0
      Ага, и на убунтофоруме мы отписывались в одной теме.
      А мультитач на тачпаде Вам удалось включить? Если удалось, расскажите, как это по-человечески сделать?
      • 0
        скролл двумя пальцами работает сейчас, больше ничего не настраивал…
        ну и правый клик двумя пальцами.
        • 0
          Эээ, а как? synaptics-драйвера родные? У меня в настройках мыши пункт двухпальцевого скроллинга вообще нельзя выбрать, а в Pointing Device (gpointing-device-settings) всё включено, но не работает.
          • +1
            дрова родные, только настройка для двухпальцевого скрола сбрасывается после ребута, даже если в /etc/X11/xorg.conf.d/ прописать… остальные настройки сохраняются…
            после ребута через synclient выставляю — нормально работает. можно в скрипт прописать )
            synclient TapButton2=3 HorizTwoFingerScroll=1 VertTwoFingerScroll=1 EmulateTwoFingerMinZ=29 EmulateTwoFingerMinW=5 JumpyCursorThreshold=200
            Перешел на Maverick уже кстати ;)
            • 0
              Вааау, оно работает, данке большое :)
              Видимо, если прописывать в xorg.conf, сессия при запуске локальными настройками перекрывает как-то.
              На маверик я пока не рискую.
              • 0
                на сайте Synaptic что то про какой-то новый SDK кстати было написано под линух для их тачпадов… с поддержкой разных мультитач-жестов…
                в ChromeOS вроде точно будет в комплекте идти… отдельно пока не понятно можно ли где взять.
                • 0
                  Я писал по поводу этого SGS-L в техподдержку HP и сэйлз Synaptic'а. Техподдержка HP невменяемая, что российская, что родная, только российская шлёт в пень повторяющейся даже в пределах одного письма копипастой про «не поддерживаем не предустановленные ОС», а англоязычная постоянно извиняется, говорит, что не может разобравться в моём вопросе и «мы переадресовали вопрос вашей региональной техподдержке, они вам ответят как можно скорее», но они в свою очередь молчат :)
                  Сэйлз синаптика меня тупо проигнорировал.
          • 0
            и вот что через конфиг xorg я пытался выставить:

            anton@Anton-HP:~$ cat /etc/X11/xorg.conf.d/99-my.conf

            Section «InputClass»
            Identifier «Wacom Pen class»
            MatchProduct «Wacom ISDv4 E3 Pen»
            Driver «wacom»
            Option «Button2» «3»
            Option «TPCButton» «0»
            EndSection

            Section «InputClass»
            Identifier «HP tm2 quirks»
            #MatchTag «HP TouchSmart tm2»
            MatchIsTouchpad «on»
            Driver «synaptics»
            Option «JumpyCursorThreshold» «200»
            Option «PalmDetect» «1»
            Option «SHMConfig» «true»
            Option «CircularScrolling» «0»
            Option «CircularPad» «0»
            #Option «CircScrollTrigger» «8»
            #Option «CircScrollDelta» «0.1»

            Option «HorizTwoFingerScroll» «true»
            Option «VertTwoFingerScroll» «true»
            Option «TapButton2» «3»
            Option «EmulateTwoFingerMinZ» «29»
            Option «EmulateTwoFingerMinW» «5»
            Option «VertTwoFingerScroll» «1»

            EndSection
  • 0
    Хм, мжт кто подскажет в чем проблема, но у меня в /sys/kernel/debug/ нет vgaswitcheroo

    Asus UL30Vt — intel + nvidia
    Gentoo, 2.6.34, вконфиге ядра точно все прописано CONFIG_VGA_SWITCHEROO=y

    lspci:
    00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
    01:00.0 VGA compatible controller: nVidia Corporation Device 0a74 (rev a2)

    Буду благодарен даже за направление 'кудакопать'
    • 0
      А какая точная версия ядра? VGA_SWITCHEROO включали через make menuconfix/xconfig/etc. или руками правили файл конфига?
      Просто есть подозрение, что у вас старая версия 2.6.34, в которой vga_switcheroo еще и не было.
      • 0
        через make menuconfig

        linux-2.6.34-gentoo
        • 0
          К сожалению, мне это мало говорит о реальной версии :)
          vga_switcheroo было добавлено в ядро где-то в начале марта, возможно вам стоить обновить портедж (или как в генте это сейчас устроено, я уже очень плохо помню).
          • 0
            ну, в самом ядре оно какбэ есть.
            в порты это ядро попало в начале мая, других версий пока нет
            • 0
              А вообще в /sys/kernel/debug/ что-нибудь есть?
              Если нет, должно помочь «mount -t debugfs none /sys/kernel/debug» от рута.
              Еще вот здесь как раз пользователь генту пишет решение аналогичной проблемы.
              • 0
                debugfs маунтится, с ним все в порядке

                CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y

                хз, будем искать что за грабли где
                • 0
                  под мою карту g210m нет nouveau, а с бинарными дровами nvidia эта хрень не работает.
                  под nouveau тоже не все работают, как я понял.

                  вообще не нашел ни одного случая с моей картой, где бы работал vgaswitcheroo
                  • 0
                    Возможно, пока нормальную поддержку впилили только для ати и интела…
              • 0
                Для того, чтобы появился файл /sys/kernel/debug/vgaswitcheroo/switch должны быть загружены модули ядра для обоих видеокарт. К сожалению, из-за ядерного DRM невозможно использование проприетарных драйверов ATI.
    • 0
      Если у вас Intel + NVIDIA, то скорее всего использована технология Optimus. И в этом случае лучше копать связку bumblebee + bbswitch + проприетарные драйверы. Мне понадобилась Wiki ArchLinux и 10 минут, чтобы все это хозяйство завести. И что здорово, не требуется перезапуска X сервера.
  • 0
    Выложите пожалуйста уже собранное ядро для i386. У меня оно собиралось всю ночь — 10 часов — и прервалось на ошибке
    make: *** [install-tools] Ошибка 2
    dpkg-buildpackage: ошибка: fakeroot debian/rules binary возвратил код ошибки 2
    debuild: fatal error at line 1340:
    dpkg-buildpackage -rfakeroot -D -us -uc failed
    

    Буду очень благодарен.
    • +1
      Сейчас дефолтные убунту-ядра уже давно идут с включенным vga_switcheroo. Например, вот: https://launchpad.net/ubuntu/+source/linux
      • 0
        Спасибо)
  • 0
    у меня задача нахрен вырубить дискретную видеокарту, так как время работы ноута в автономном режиме для меня критично.

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

    $ 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

    какой-то гемор.
    • 0
      Первый вариант: у Вас, как я вижу, не HP, поэтому никаких гарантий вообще быть не может. Кроме того какая-то явная проблема с исходниками судя по ворнингам, плюс отсутствует необходимый для сборки пакет debhelper.

      Второй вариант: надо не перезагружать ноут, а перезапускать логин-сессию/иксы. Чтобы не делать это каждый раз, пропишите «echo OFF > /sys/kernel/debug/vgaswitcheroo/switch» в /etc/rc.local
      • 0
        по второму варианту:

        $ 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

        на интегрированую карту не переключился.

        а echo OFF > /sys/kernel/debug/vgaswitcheroo/switch смысла нет делать, пока я не переключусь на интегрированную карту.
        • 0
          a 00:02.0, совершенно случайно — это не интегрированное видео? Что пишет lspci?
          • 0
            вы правы я ошибся, 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)

            после добавления строки «echo OFF > /sys/kernel/debug/vgaswitcheroo/switch» в /etc/rc.local после перезагрузки выключилась атишная карта и мне настало щастье… настало ли? нужно подождать, посмотреть сколько он проработает без провода.
            в любом случае благодарю, это то, что я искал.
  • 0
    Проблема на самом-то деле актуальна до сих пор. Я мучился целый месяц, ни один из подобных способов не помогал. Карта Nvidia и Ubuntu 64x.
    Сегодня наконец победил, еще один способ отключения описан здесь — blog.loquens.org/?p=282
    Энергопотребение падает, ноут стал работать примерно в 1,5-2 раза дольше.

    Единственное, cat /sys/kernel/debug/vgaswitcheroo/switch почему-то показывает, что обе карты включены.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.