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:
- Gestionar gráficos intercambiables en Linux con ‘vga_switcheroo’
- Comprobar si ‘vga_switcheroo’ esta habilitado
- Comprobar el estado de cada GPU
- Conmutar los gráficos
- Apagar la GPU que no da señal
- Script para automatizar la gestión de gráficos híbridos
- 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+.

Replica a TATOS Cancelar la respuesta