Asus U35JC и Ubuntu 10.04: проблемы гибридизации (часть 2)

По материалам ubuntuforums.org

Симбиоз двух видеокарт в Linux напоминает симбиоз двух сиамских близнецов, когда один является паразитом на теле второго. Так и здесь: видеокарта NVidia не работая, потребляет энергию. Однако эту ситуацию можно исправить. Для этого воспользуемся наработками проекта Linux Hybrid Graphics. Клонируем себе git-репозиторий с исходными кодами модуля acpi_call, и соберем его:

$ git clone http://github.com/mkottman/acpi_call.git
$ cd acpi_call
$ make

В результате будет собран модуль acpi_call.ko. Проверить, дейстительно ли он работает, можно следующим образом: узнаем текущее энергопотребление, после этого загрузим модуль в ядро и активируем, после этого еще раз посмотрим на энергопотребление. Итак, команды ниже:

$ grep rate /proc/acpi/battery/BAT0/state
present rate:            20085 mW
$ sudo insmod acpi_call.ko
[sudo] password for loquens:
$ sudo echo '\_SB.PCI0.PEG1.GFX0._OFF' > /proc/acpi/call
$ grep rate /proc/acpi/battery/BAT0/state
present rate:            14625 mW

Впечатляет, не правда ли?

Осталось сделать, чтобы вся эта прелесть не исчезла после полуночи перезагрузки. Для этого скопируем модуль в директорию модулей текущего ядра:

$ sudo cp acpi_call.ko /lib/modules/`uname -r`/kernel/drivers/acpi/
$ sudo depmod

И добавим его в список автоматически загружаемых модулей. Для этого нужно добавить его имя в файл  /etc/modules:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

lp
rtc
acpi_call

Также нужно запретить загрузку модулей nvidia и nouveau (первый раз я этого не сделал, и при использовании ядра 2.6.35 система висла при загрузке). Создаем файл /etc/modules.d/blacklist-nvidia.conf со следующим содержимым:

blacklist nouveau
blacklist nvidia

И перегенерируем initramfs-образ текущей системы:

$ sudo update-initramfs -u

Теперь нужно написать (скопипастить) скрипт /etc/init.d/switch-dg-off, который бы деактивировал видеокарту:

#! /bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=switch-dg-off
SCRIPTNAME=/etc/init.d/$NAME

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    echo '\_SB.PCI0.PEG1.GFX0._OFF' > /proc/acpi/call
    return 0
}

#
# Function that stops the daemon/service
#
do_stop()
{
    return 0
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload()
{
    return 0
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
	exit 3
	;;
esac

После чего сделать файл скрипта исполняемым и добавить в автозагрузку:

$ sudo chmod +x /etc/init.d/switch-dg-off
$ sudo update-rc.d switch-dg-off defaults

На этом все.

UPD 1: Да, забыл написать, что при таком подходе придется при каждом обновлении ядра пересобирать модуль, копировать его в директорию модулей ядра и выполнять команду depmod.

UPD 2: Обновился до ядра 2.6.35.22 — модуль при загрузке  стал вешать систему. На стоковом ядре 2.6.32-24 все работает нормально. Буду следить за развитием ситуации.

UPD3: Для того, чтобы система не висла при загрузке, нужно обновить заблеклистить модули nvidia и nouveau. См. выше по тексту.

  • Roman

    Добрый вечер. Хотел пообщаться с вами по поводу одного вопроса, к сожалению на сайте никаких контактных данных не нашел, не могли бы вы дать какой-нибудь контакт, будь то аська или скайп

    • Аноним

      Можно отписать в личку на форуме 4pda.ru

  • T0rchochek

    Для авто-компиляции модуля под новое ядро используйте DKMS.

    • Аноним

      Спасибо за совет! С момента опубликования поста я тоже нашел для себя DKMS

  • Q7u5

    у меня вывело:
    present rate: 1 mW(вместо Ваших 14625 mW 20085 mW)

    lspci | grep VGA
    00:02.0 VGA compatible controller: Intel Corporation Ivy Bridge Graphics Controller (rev 09)
    01:00.0 VGA compatible controller: NVIDIA Corporation Device 0fd1 (rev a1)

    Ubuntu 12.04 x64
    Linux xubuntu 3.2.0-29-generic #46-Ubuntu
    (дрова Nvidia с ихнего сайта не ставил, ставить их наверное не надо?)

    это может говорить а том что nvidia не используется??
    Спасибо!

    • loquens

      Как-то сомнительно. Скорее всего, какие-то проблемы с определением текущего уровня потребления. Ноутбук в данный момент к сети подключен? Какие показатели энергопотребления были до установки модуля?

      • Q7u5

        изменений не наблюдал до установки и после

        видяха NVIDIA GeForce GT 650M, 2 ГБ Dell Inspiron 7720 (DI7720I321081000ALB)я загрузился с life cd, не монтировал жесткий диск, автономная работа увеличилась на ~44-65% (на 50-60минут). Думал, что если отключу видяху, то еще на 60 минут увеличиться автономная работа 🙂

        • Q7u5

           ура получилось, для этой видяхи и для этого ноута «_SB.PCI0.PEG0.PEGP._PS3» — это ключевая строка 🙂

          echo ‘_SB.PCI0.PEG0.PEGP._PS3’ > /proc/acpi/call

          • loquens

            Поздравляю! 🙂

        • loquens

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

      • Q7u5

        как определить что мне писать вместо
        » _SB.PCI0.PEG1.GFX0._OFF’ » ??для Dell Inspiron 7720, это не подходит? 🙂

        • loquens

          Либо перебором, либо попробовать поискать в списке рассылки на https://lists.launchpad.net/hybrid-graphics-linux/ 

      • Q7u5

         нашел список http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls

        но понять не могу

  • Q7u5

    это может говорить, о том что видео карта nvidia не используется??  так как present rate: 1 mW ?

  • Q7u5

    подскажите, пожалуйста, видяха не испортиться от того что я ввел данные для GeForce GT 555M, а на самом деле у меня GeForce GT 650M ??
    возможно, это жестко засаживает к минимому работу микросхем? или нет? 

    • loquens

      Испортить что-то — маловероятно. Хотя, как всегда с экспериментальным ПО, никто не застрахован.