Como Manejar Gráficos Intercambiables en GNU/Linux

Si dispones de un portátil de reciente adquisición que disponga de gráficos híbridos, y te planteas utilizar alguna distribución GNU/Linux en él, esta guía te puede venir bien. Un sistema de gráficos híbridos suele estar compuesto por GPU integrada, generalmente Intel, mas una GPU discreta o dedicada, de mayor potencia, y que suele ser AMD/ATI o NVIDIA. Las combinaciones pueden ser múltiples, y el modo de operar puede variar en función de la combinación que se presente.

Desde Windows, esto no suele suponer un problema, pues los drivers de la gráfica discreta ya se encargan de manejar el cambio de GPU en función de las preferencias del usuario, o de las necesidades momentáneas de rendimiento y ahorro energético. Además, la GPU que no se usa está apagada, hecho que en Linux no suele ocurrir.

Tabla de contenidos:

  1. Gestionar gráficos intercambiables en Linux con ‘vga_switcheroo’
  2. Comprobar si ‘vga_switcheroo’ esta habilitado
  3. Comprobar el estado de cada GPU
  4. Conmutar los gráficos
  5. Apagar la GPU que no da señal
  6. Script para automatizar la gestión de gráficos híbridos
  7. Conclusiones finales

Gestionar Gráficos Intercambiables en Linux con ‘vga_switcheroo’

En distribuciones GNU/Linux, sin embargo, la cosa puede ser más complicada, ya que normalmente el soporte oficial por parte del fabricante es mucho más limitado. Aún así, si que existen algunos mecanismos que nos permiten sacar más partido de aquellos portátiles que dispongan de gráficos híbridos.

Para este caso, voy a hacer uso de la herramienta ‘vga_switcheroo’, integrada por defecto en el kernel, y que nos permite manejar gráficos intercambiables en Linux. La idea es poder conmutar de gráficos en función de tus preferencias, y apagar la GPU que no da señal pero que por defecto sigue encendida.

El mecanismo viene integrado en el kernel Linux desde la versión 2.6.35. Es importante destacar que el método que expondré solo funciona cuando la GPU opera con los drivers open source integrados en el kernel, véase ‘radeon’ en el caso de gráficas AMD/ATI y ‘nouveau’ en el caso de NVIDIA.

Comprobar si ‘vga_switcheroo’ Está Habilitado

El primer paso es comprobar que el mecanismo esta habilitado. Para ello, el primer paso es loguearte como usuario administrador o root con el siguiente comando:

$ sudo su

A continuación, es conveniente verificar que el kernel está compilado con la opción ‘modeset=1’ en el arranque. Para ello, debes teclear la siguiente linea en la terminal:

 # grep -i switcheroo /boot/config-*

Finalmente, para saber si el mecanismo está habilitado, es recomendable comprobar que existe el fichero correspondiente con el siguiente comando:

# ls -l /sys/kernel/debug/vgaswitcheroo/switch

Si aparece el fichero, significa que, en principio, ya se puede emplear el mecanismo. Habiendo hecho esto, nada mejor que empezar comprobando el estado de las gráficas.

Comprobar el Estado de cada GPU

Para empezar, la siguiente linea te permitirá conocer el estado de los gráficos. Concretamente, muestra si la tarjeta gráfica está encendida o apagada (Pwr/Off), y si está activa o no (+/  ).

# cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Pwr:0000:01:00.0

En este caso, podrás ver que tanto la GPU integrada (IGD) como la discreta (DIS) están ambas encendidas. Sin embargo, pero la gráfica integrada es la que está dando señal, mientras que la discreta está inactiva.

Conmutar los Gráficos

Para realizar el conmuto de gráficos, es necesario que ambas tarjetas estén encendidas. En el caso que nos ocupa ya es así, pero en caso contrario, hace falta encender la tarjeta que no está dando señal.

# echo ON > /sys/kernel/debug/vgaswitcheroo/switch

A continuación, si lo que deseas es obtener un mayor rendimiento, te interesará establecer que la GPU discreta sea la encargada de dar la señal en pantalla. Para ello, puedes hacer uso de este comando:

# echo IGD > /sys/kernel/debug/vgaswitcheroo/switch

Por el contrario, si el portátil funciona con batería y lo que persigues es ahorrar energía, lo que te interesa es que sea la GPU integrada la encargada de dar señal por pantalla. En este caso, puedes utilizar la siguiente orden:

# echo DIS > /sys/kernel/debug/vgaswitcheroo/switch

Jugando con esos comandos, podrás conmutar de GPU fácilmente según tus preferencias. Paralelamente, siempre puede ser conveniente comprobar el estado de los gráficos para asegurarte que el resultado final es el esperado.

Apagar la GPU que No da Señal

Tanto si has podido realizar el conmuto de gráficos de manera exitosa como si no, siempre es preferible que la GPU que no esta dando señal esté apagada. Esto repercutirá en una mayor eficiencia energética y en un menor calentamiento del hardware, lo cual siempre es positivo de cara a preservar la durabilidad de los componentes.

En Linux, a diferencia de lo que he observado que ocurre en Windows, es posible que tanto la GPU que da señal como la que no, estén ambas encendidas, por lo que es sumamente importante hacer la comprobación del estado de las gráficas, nada mas encender el equipo.

Para ello utilizaremos el siguiente comando ya conocido, el cual nos permitirá saber si las dos gráficas se encuentran encendidas, y cual de ellas es la que esta en funcionamiento.

# cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Pwr:0000:01:00.0

Si las dos gráficas se encuentran encendidas, podemos usar la orden que muestro a continuación, que servirá para apagar la gráfica que no esta dando señal, y que por lo tanto, esta consumiendo energía y generando calor en vano.

# echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

Habiendo hecho esto, es importante volver a comprobar el estado de las gráficas. De este modo, podrás verificar si el proceso ha sido exitoso y la gráfica que no daba señal se encuentra ahora apagada.

# cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD:+:Pwr:0000:00:02.2
1:DIS: :Off:0000:01:00.0

En algunos casos, como por ejemplo tras reactivar el PC tras una suspensión, el comando cat /sys/kernel/debug/vgaswitcheroo/switch muestra un estado de las gráficas desactualizado. Para ello, una manera mucho más fiable de comprobar que gráficas están activas, es usando el siguiente comando:

# lshw -c video

Con estos sencillos pasos podrás ser capaz tanto de realizar el conmuto de gráficos, como, más importante aún, de apagar la GPU que no se encuentra dando señal, consiguiendo un menor calentamiento del hardware y una mayor duración de la batería.

Script para Automatizar la Gestión de Gráficos

La única desventaja del método expuesto es que se debe realizar manualmente cada vez que queremos cambiar de gráfica, pues el sistema se inicia siempre con los parámetros establecidos por defecto. Por este motivo, creo interesante mencionarte un script que te permitirá automatizar el proceso, de modo que puedas iniciar el sistema con los parámetros que desees.

El script en cuestión lo encontré en Ubuntu community help, y según cuentan en la web, permite realizar el conmuto de gráficos deseado y apagar la GPU desconectada, en el mismo arranque del sistema y de manera automática. El script en cuestión es el que se muestra a continuación.

#
# Standard initramfs preamble
#
prereqs()
{
:
}

case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac

# source for log_*_msg() functions, see LP: #272301
. /scripts/functions

#
# Helper functions
#
message()
{
        if [ -x /bin/plymouth ] && plymouth --ping; then
                plymouth message --text="$@"
        elif [ -p /dev/.initramfs/usplash_outfifo ] && [ -x /sbin/usplash_write ]; then
                usplash_write "TEXT-URGENT $@"
        else
                echo "$@" >&2
        fi
        return 0
}

run_switcheroo()
{
        local hybridopts
        hybridopts="$1"

        if [ -z "$hybridopts" ]; then
                return 1
        fi

        local IFS=" ,"
        for x in $hybridopts; do
                message "Switching hybrid graphics to $x"
                echo $x > /sys/kernel/debug/vgaswitcheroo/switch
        done
        return 0
}

#
# Begin real processing
#

# Do we have any kernel boot arguments?
for opt in $(cat /proc/cmdline); do
        case $opt in
        hybridopts=*)
                run_switcheroo "${opt#hybridopts=}"
                ;;
        esac
done

exit 0

Tal como se indica en el artículo original de Ubuntu community help, para poder iniciar el script en el arranque del sistema, debes copiar el contenido en tu editor de texto favorito, y nombrar el archivo como ‘hybrid_boot_options. En mi caso, lo he copiado en el editor gedit, y lo he guardado en la carpeta Escritorio.

Posteriormente, es necesario mover el archivo en el directorio ‘/etc/initramfs-tools/scripts/local-top/’. Por ello, necesitarás permisos de superusuario, por lo que el proceso debe realizarse mediante la terminal. En el link que sigue, tienes información sobre como manejar ficheros y carpetas desde la consola. En este caso concreto, el primer paso es loguearte como usuario administrador o root.

$ sudo su

A continuación, hay que mover el archivo ‘hybrid_boot_options’ al directorio mencionado anteriormente. Para ello utilizaremos el siguiente comando.

# mv Escritorio/hybrid_boot_options /etc/initramfs-tools/script/local-top

Por defecto, el archivo solo posee permisos de lectura y escritura. Para nuestro propósito, el script se debe poder ejecutar en el arranque del sistema, por lo que hace falta dar permisos de ejecución al archivo.

# chmod +x /etc/initramfs-tools/scripts/local-top/hybrid_boot_options

A continuación, es necesario usar el siguiente comando para crear archivos initramfs.

# update-initramfs -c -k all

Finalmente, lo único que falta es añadir una linea de código en el archivo de configuración del cargador de arranque GRUB. Para ello, debes abrir el archivo ‘/etc/default/grub’ con el siguiente comando:

# gedit /etc/default/grub

Una vez hecho esto, falta añadir la linea de código mostrada a continuación. En este caso utilizaremos la opción de habilitar las dos tarjetas gráficas, conmutar a la GPU integrada, y apagar la GPU discreta.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash modeset=1 hybridopts=ON,IGD,OFF"

El último paso es aplicar los cambios en el GRUB para que tengan efecto en el siguiente inicio del sistema. Para ello, puedes hacerlo mediante:

# update-grub

Con esto, lo único que falta es reiniciar el equipo y verificar los cambios. Para comprobar la GPU que se encuentra encendida, puedes utilizar el siguiente comando:

$ sudo lshw -c video

Hay que tener en cuenta que puede que no funcione en todos los casos. En mi caso no me ha dado resultado, ya que la configuración de inicio de los gráficos seguía siendo la que viene predeterminada, por lo que he tenido que apagar la GPU manualmente. Igualmente, es posible que en tu caso funcione, por lo que tampoco pierdes nada en probarlo.

Conclusiones Finales

Este proceso puedo constatar que me ha funcionado perfectamente en Ubuntu, concretamente en la versión 12.04 LTS, pero debería funcionar igualmente en cualquier otra distribución, mientras tenga habilitado vgaswitcheroo en el kernel (en Debian por ejemplo, no ocurre así).

En el caso de Debian, también lo probé….y funciona, pero no es tan fácil. En mi caso, tuve que hacer unos pasos adicionales al principio. Si te encuentras en el mismo caso, en este post cuento lo que hice para trabajar con gráficos intercambiables en Debian Wheezy.

Al ser algo que puede no funcionar en todos las distribuciones, o para todas las combinaciones de hardware, es de gran ayuda contar con la experiencia de otras personas que lo hayan probado.

En las versiones más recientes de Ubuntu (concretamente me ha pasado en la 13.10 y la 14.04), el hecho de disponer de un sistema de gráficos híbridos es posible que origine un mal comportamiento del cursor, que se muestra constantemente parpadeante y muy impreciso.

Esto se debe a que el sistema detecta dos monitores, aun cuando físicamente solo hay uno. El problema se puede solucionar fácilmente deshabilitando el segundo monitor. Lo tienes explicado todo con más detalle en este post.

Finalmente, si deseas compartir tu experiencia de uso, o quieres mejorar algún punto de lo que he escrito, no dudes en comentar. Y si te ha parecido útil la guía, me será de gran ayuda si lo compartes en Twitter o Google+.

Categorías LinuxEtiquetas ,

23 comentarios en “Como Manejar Gráficos Intercambiables en GNU/Linux

  1. ola, realmente agradezco este aporte, ya que es muy dificil encontrar ayuda sobre esto por ahi en la web, sobre todo en español; sin embargo no he podido hacerlo funcionar, los comandos:

    grep -i switcheroo /boot/config-*
    CONFIG_VGA_SWITCHEROO=y

    sudo ls -l /sys/kernel/debug/vgaswitcheroo/switch
    -rw-r–r– 1 root root 0 jun 8 05:20 /sys/kernel/debug/vgaswitcheroo/switch

    sudo cat /sys/kernel/debug/vgaswitcheroo/switch
    0:IGD:+:Pwr:0000:00:01.0
    1:DIS: :DynPwr:0000:01:00.0

    me devuelven esos resultados, que creo estan bien, pero cuando intento :

    # echo ON > /sys/kernel/debug/vgaswitcheroo/switch
    # echo IGD > /sys/kernel/debug/vgaswitcheroo/switch
    # echo DIS > /sys/kernel/debug/vgaswitcheroo/switch

    o el más importante:
    # echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

    sudo echo OFF > /sys/kernel/debug/vgaswitcheroo/switchbash: /sys/kernel/debug/vgaswitcheroo/switch: Permiso denegado

    todos esos me dicen permiso denegado, agradeceria mucho to ayuda, porque este probelmita, me tiene hecho un lio,
    estoy usando Elementary OS Loki, basado en ubuntu Xenial 16.04 kernel 4.8 de linux y mis dos tarjetas graficas son AMD una R5 integrada y una R7 m260 dedicada, gracias de antemano

    Me gusta

  2. José Jácome 29 Ago 2013 — 16:59

    El mismo kernel de Windows va a tener soporte para apagar dinámicamente «GPU’s secundarios»

    http://www.phoronix.com/scan.php?page=news_item&px=MTQ0ODM

    Me gusta

  3. Cesar Villacorta 27 Jul 2013 — 02:09

    Excelente aporte.

    Muchas gracias ya estaba loco con este problemita.

    Me gusta

    1. De nada, y gracias por comentar

      Me gusta

  4. Que tal amigo. Primero quiero agradecerte porque a mi me funcionó perfectamente en mi sony vaio con intel/ati. Pero tengo un problema, lo que pasa esq tengo q volver a hacer los pasos:
    echo DIS > /sys/kernel/debug/vgaswitcheroo/switch
    echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
    cat /sys/kernel/debug/vgaswitcheroo/switch

    cada vez que enciendo la compu xq la ATI se vuelve a encender (on)…
    quisiera saber si esto sera asi siempre o puedo hacer algo para que la ATI se mantenga en OFF.

    De antemano Gracias……

    Me gusta

    1. Hola,
      Gracias, me alegro de que te funcionara.
      Si, el problema de este método es que cuando vuelves a iniciar el sistema, se carga con la configuración por defecto, que es con las dos gráficas encendidas.
      Hace tiempo vi un script que servia para que en el inicio te guardase la configuración anterior, pero no se si sigue funcionando. Yo lo probé, y a mi no me funcionó, pero quizá en tu hardware si que funciona.
      Te paso el enlace con la explicación por si quieres probarlo:

      https://computernewage.com/guias/como-automatizar-el-manejo-de-graficos-intercambiables-en-linux/

      Gracias por el comentario, y saludos.

      Me gusta

  5. No me funciono. :(
    Gracias por la ayuda.

    Me gusta

    1. Hola,
      Perdona que haya tardado tanto en contestar, he estado fuera unos días y no he podido estar mucho por el blog.
      Siento que no te haya funcionado.
      ¿Tus gráficos son AMD/Intel?
      Si es así, puedes probar de usar la solución basada en gráficos propietarios de la web de AMD. En los comentarios, José Jacóme comentó una solución que le funciono bien. La explicación se encuentra en este link:

      http://askubuntu.com/questions/205112/how-do-i-get-amd-intel-hybrid-graphics-drivers-to-work

      Personalmente aún no lo he probado, pero tan pronto como lo haga lo comentaré.

      Saludos, y disculpa la tardanza.

      Me gusta

  6. Hola amigo de nuevo aqui, recibe un saludo.
    Tengo ubuntu, si puedo apagar la targeta discreta. Pero no puedo activarla para que funcione con la ATi.
    Ago los siguientes pasos.
    Mato las x /// killall Xorg
    termino el servicio de gdm /// service lightdm stop
    con las dos gpu encendidas activo la ati y se me apaga la pantalla por completo.
    pero si regreso a la integrada, me regresa la senial, de la pantalla.

    Me gusta

    1. Hola Abimael,
      a mi me pasa lo mismo con Ubuntu, y tampoco he podido llegar a activar la GPU discreta.
      Igualmente, puedes probar de dar permisos de ejecución al archivo de configuración de vgaswitcheroo mediante los siguientes comandos:

      # chown -R nombredeusuario:nombredeusuario /sys/kernel/debug
      # chown nombredeusuario:nombredeusuario /sys/kernel/debug/vgaswitcheroo/switch

      Y después de reiniciar el pc, volver a utilizar los comandos habituales:

      # echo ON > /sys/kernel/debug/vgaswitcheroo/switch
      # echo DIS > /sys/kernel/debug/vgaswitcheroo/switch

      Puedes probar a ver si con esto te funciona, si no dime algo.

      Saludos

      Me gusta

  7. José Jácome 4 May 2013 — 03:12

    Creo que la verdadera solución es unirnos todos los que tenemos problemas con los gráficos Hibridos mediante este grupo de launchpad.net https://launchpad.net/~hybrid-graphics-linux , ojalá que con la ayuda de todos las empresas se fijen en nosotros y podamos disfrutar del mejor sistema operativo del mundo!!!

    Me gusta

    1. Hola, vaya pues no conocía este grupo. Le he hecho una mirada y parece interesante. Esta noche me lo miraré bien y haré el registro. Por poco que sea, cuantas mas voces mas fácil será despertar el interés de las empresas.
      Gracias por compartirlo!;)

      Me gusta

  8. Hola: ¿Qué pasa si tenes en la línea de comandos del grub nomodeset=1 , pero no encuentra el fichero «switc» ¿Existe una forma de crearlo?

    Me gusta

    1. Hola, que tal,
      Si no se encuentra el fichero creo que no te dejará configurar los gráficos, y los comandos no te servirán.
      Manualmente, no sé si hay forma de crearlo, pero en todo caso, ¿que distribución utilizas? porqué si usas Debian puede ser que el problema sea que faltan unos paquetes del kernel que no vienen instalados por defecto.
      Por otra parte, si instalaste los drivers privativos antes, también puede ser que tengas algún rastro de ellos, y te hayan eliminado el fichero de configuración necesario para usar el mecanismo vgaswitcheroo (el cual solo se puede usar utilizando los driver libres que vienen en el kernel).
      ¿Que gráficos usas en tu pc?

      Me gusta

  9. Hola soy el de muylinux de la entrada de debian wheezy, en mi caso en este comando me da el error de que falta el archivo del comando:

    ls -l /sys/kernel/debug/vgaswitcheroo/switch

    El primer comando si me da una respuesta que es la siguiente:

    CONFIG_VGA_SWITCHEROO=y

    Saludos

    Me gusta

    1. Hola, si ya te recuerdo, gracias por comentar!
      ¿Has probado estos comandos desde Debian Wheezy o desde Ubuntu?
      Porque hoy he estado mirando lo del caso de Debian que comentabas, y creo que para poder utilizar vgaswitcheroo desde Debian hay que instalar el paquete firmware-linux-nonfree.
      Si lo has hecho desde Debian, puede que te diga que falta el archivo por culpa de este paquete.
      Saludos;)

      Me gusta

      1. Buenas, yo también tengo el mismo problema:

        ls -l /sys/kernel/debug/vgaswitcheroo/switch
        ls: cannot access /sys/kernel/debug/vgaswitcheroo/switch: No such file or directory

        Y yo ya tengo instalado el paquete que mencionan:

        firmware-linux-nonfree is already the newest version.

        y al tirar el comando:

        grep -i switcheroo /boot/config-*
        /boot/config-3.2.0-4-amd64:CONFIG_VGA_SWITCHEROO=y
        /boot/config-3.9-1-amd64:CONFIG_VGA_SWITCHEROO=y

        ¿Cómo puedo hacer para crear el vgaswitcheroo/switch? ¿Cómo activo «modeset=1»?

        Me gusta

        1. Hola, lo siento mucho que no apareciese tu comentario antes. Muchas veces se cuelan comentarios en la bandeja de spam, y como estoy pasando unos dias fuera no tengo mucho tiempo para entrar en el blog.

          Por la respuesta que te ha dado el comando ‘grep -i switcheroo/boot/config-*’ creo que ya tienes activado la opción ‘modeset=1’, el problema veo que es que el sistema no te detecta la carpeta necesaria.

          Que distro tienes instalada? Estas corriendo sobre Debian? Lo digo porqué normalmente en Debian es necesario montar el directorio debugfs para que te detecte la carpeta. Para hacerlo, puedes usar este comando:

          $ su
          # mountpoint -q /sys/kernel/debug || mount -t debugfs none /sys/kernel/debug

          Si te sigue sin funcionar dime algo por aqui, y siento no haberte podido responder antes.

          Saludos.

          Me gusta

  10. José Jácome 14 Abr 2013 — 05:08

    Gracias!!! Ya había perdido las esperanzas…
    Una pregunta este método sirve para siempre o toca hacerlo al iniciar Linux???
    Y el brillo se baja o no se baja con este método???

    Me gusta

    1. Hola, me alegro de que te haya servido. Pues en principio tienes que hacerlo cada vez que inicias, pero creo que hay algún script que te permite automatizarlo. Yo no lo he probado aún, pero tengo intención de hacerlo y comentar si me funciona.
      Respecto a lo del brillo, yo no noté diferencia.
      Para comprobar que sólo está encendido la gráfica activa, también puedes usar el comando ‘sudo lshw -c video’.
      Saludos;)

      Me gusta

    2. José Jácome 14 Abr 2013 — 17:20

      Posteas si sirve el Script por favor porque estos drivers son un dolor de cabeza!!!
      Mi laptop posee una Radeon HD 6770 y Intel 3000, ya había perdido la esperanza la verdad había usado Fedora, OpenSuse y ahora Ubuntu pero creo que esta es la única solución… Lo del brillo como te comentaba esta siempre al 100%(incluso al solo usar la gráfica Integrada), ese es el único problema que tengo, es casi una hora menos de batería pero espero alguna vez espero solucionarlo.
      Saludos!!! Gracias por todo…

      Me gusta

      1. Comandos de linux interesantes ???

        Me gusta

      2. Hola, pues tan pronto como lo haya probado lo postearé por aquí (hoy o mañana).
        Lo del brillo, a mi me ha funcionado con algunas distros si, y otras no. Con Ubuntu 12.04, por ejemplo, lo puedo variar, pero el rango de luz es más pequeño que desde Windows 7. Puede ser que con alguna nueva versión ya te funcione.
        Gracias por comentar;)

        Me gusta

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.