Kernel mode setting (Español)

From ArchWiki
Esta traducción de Kernel mode setting fue revisada el 2024-02-29. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Kernel Mode Setting (KMS) es un método para configurar la resolución y profundidad de la pantalla en el espacio del kernel en lugar del espacio del usuario.

La implementación de KMS en el kernel de Linux permite la resolución nativa en el framebuffer y el cambio instantáneo de consola (tty). KMS también habilita tecnologías más recientes (como DRI2) que ayudarán a reducir los "artifacts" y aumentar el rendimiento 3D, incluso el ahorro de energía en el espacio del núcleo.

Note: El controlador propietario NVIDIA (desde 364.12) también implementa la configuración modesetting, pero no utiliza la implementación integrada del kernel y un controlador fbdev para la consola de alta resolución sólo está presente como una función experimental opcional (desde 545.29).

Información

Anteriormente, la configuración de la tarjeta de vídeo era tarea del servidor X. Debido a esto, no era fácilmente posible tener gráficos de alta calidad en consolas virtuales. Además, cada vez que se cambiaba de X a una consola virtual (Ctrl+Alt+F2), el servidor tenía que ceder el control de la tarjeta de vídeo al kernel, lo que era lento y provocaba parpadeos. El mismo "doloroso" proceso ocurría cuando se devolvía el control al servidor X (Alt+F7 cuando X se ejecuta en VT7).

Con Kernel Mode Setting (KMS), el kernel es ahora capaz de establecer el modo de la tarjeta de vídeo. Esto hace posible los gráficos de alta calidad durante el arranque, la consola virtual, poder cambiar rápidamente a X y entre otras cosas.

Instalación

Al principio, ten en cuenta que para cualquier método desees utilizar, deberías siempre deshabilitar:

  • Cualquier opción vga= en el cargador de arranque, ya que entrará en conflicto con la resolución nativa activada por KMS.
  • Cualquier línea video= que active un framebuffer que entre en conflicto con el controlador.
  • Cualquier otro controlador de framebuffer (como uvesafb).

Inicio tardío de KMS

Los controladores Intel, Nouveau, ATI y AMDGPU ya habilitan KMS automáticamente para todos los chipsets, por lo que no es necesario instalarlo manualmente.

El controlador propietario NVIDIA soporta KMS (desde la versión 364.12) y tiene que ser habilitado manualmente.

Inicio anticipado de KMS

Sugerencia: Si tienes problemas con la resolución, puedes comprobar si forzar el "modo" te ayuda.

KMS se inicializa normalmente después de la etapa initramfs. Sin embargo, es posible habilitar KMS durante la etapa initramfs. Añada el módulo necesario para el controlador de vídeo al fichero de configuración initramfs:

  • mgag200 para gráficos Matrox.
  • Dependiendo de los gráficos QEMU en uso (qemu opción -vga tipo} o libvirt <video><model type='type'>[1]):
    • bochs para std (qemu) y vga/bochs (libvirt),
    • virtio-gpu para virtio,
    • qxl para qxl,
    • vmwgfx para vmware (qemu) y vmvga (libvirt),
    • cirrus para cirrus.
  • Dependiendo del controlador gráfico de VirtualBox:
    • vmwgfx para VMSVGA,
    • vboxvideo para VBoxVGA o VBoxSVGA.

Las instrucciones de configuración para initramfs son ligeramente diferentes dependiendo del generador de initramfs que utilices.

mkinitcpio

Para módulos dentro del kernel, añada kms a la matriz HOOKS en /etc/mkinitcpio.conf.

Para los módulos fuera del kernel, coloque los nombres de los módulos en la matriz MODULES. Por ejemplo, para activar KMS anticipado para el controlador de gráficos NVIDIA:

/etc/mkinitcpio.conf
MODULES=(... nvidia nvidia_modeset nvidia_uvm nvidia_drm ...)
Nota: Si utilizas una Unidad de procesamiento gráfico (GPU) con una tarjeta grafica integrada Intel (IGP) como GPU principal y AMD como discreta usando PRIME, el modulo intel_agp puede dar problemas al reanudar desde la hibernación (el monitor no recibe señal). Consulte [2] para más detalles.

Si está utilizando el método #Forzar modos y EDID, debe incrustar el archivo personalizado en initramfs también:

/etc/mkinitcpio.conf
FILES=(/usr/lib/firmware/edid/your_edid.bin)

Luego regenera el initramfs.

Booster

Si utiliza Booster, puede cargar los módulos necesarios con este cambio de configuración:

/etc/booster.yaml
modules_force_load: i915

Si utiliza el método #Forzar modos y EDID, deberá incluir también el archivo personalizado en sus imágenes de Booster:

/etc/booster.yaml
extra_files: /usr/lib/firmware/edid/your_edid.bin

Luego regenera las imágenes de booster.

Solución de problemas

Mis fuentes son demasiado pequeñas

Vea Linux console (Español)#Tipografías para saber cómo cambiar la fuente de su consola a una fuente grande. La fuente Terminus (terminus-font) está disponible en muchos tamaños, como ter-132b que es más grande.

Alternativamente, desactivar modesetting puede cambiar a una resolución más baja y hacer que las fuentes parezcan más grandes.

Forzar modos y EDID

Si su resolución nativa no se configura automáticamente o no se detecta ninguna pantalla, entonces su monitor podría no enviar ningún o sólo un archivo EDID defectuoso. El kernel intentará detectar este caso y establecerá una de las resoluciones más típicas.

En caso de que disponga del archivo EDID de su monitor, basta con aplicarlo explícitamente (vea más abajo). Sin embargo, la mayoría de las veces no se tiene acceso directo a un archivo limpio haciendo necesario extraer uno existente y arreglarlo o generar uno nuevo.

Generar nuevos binarios EDID para varias resoluciones y configuraciones es posible durante la compilación del kernel siguiendo la documentación de upstream (vea también esto para una breve guía). Otras soluciones se describen en detalle en este artículo. Extraer uno existente es más fácil en la mayoría de los casos, por ejemplo, si tu monitor funciona bien en Windows, puede que tengas suerte extrayendo el EDID del controlador correspondiente, o si funciona un monitor similar que tenga la misma configuración, puedes usar get-edid del paquete read-edid. También puedes probar a buscar dentro de /sys/class/drm/*/edid.

Después de haber preparado tu archivo EDID, colócalo en un directorio, por ejemplo llamado edid dentro de /usr/lib/firmware y copia tu archivo EDID en él.

Para cargarlo en el arranque, especifique lo siguiente en la línea de comandos del kernel:

drm.edid_firmware=edid/your_edid.bin

Para kernels anteriores a 4.13, utilice esta línea en su lugar:

drm_kms_helper.edid_firmware=edid/your_edid.bin

Para aplicarlo sólo a un conector específico, utilice:

drm.edid_firmware=VGA-1:edid/your_edid.bin

Si desea configurar varios archivos edid, utilice:

drm.edid_firmware=VGA-1:edid/your_edid.bin,VGA-2:edid/your_other_edid.bin

Para las resoluciones incorporadas, consulte la siguiente tabla. La columna Nombre especifica el nombre que se debe utilizar para imponer su uso.

Resolución Nombre
800x600 edid/800x600.bin
1024x768 edid/1024x768.bin
1280x1024 edid/1280x1024.bin
1600x1200 (kernel 3.10 o superior) edid/1600x1200.bin
1680x1050 edid/1680x1050.bin
1920x1080 edid/1920x1080.bin

Si estás utilizando el #Inicio anticipado de KMS, debes incluir el archivo EDID personalizado en el initramfs, de lo contrario tendrá problemas.

El valor del parámetro drm.edid_firmware también puede modificarse después del arranque escribiendo en /sys/module/drm/parameters/edid_firmware:

# echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware

Esto sólo afectará a las pantallas recién conectadas, las pantallas ya conectadas seguirán utilizando su configuración EDID existente. Sin embargo, para las pantallas externas, basta con volver a conectarlas para que surta efecto.

Desde el kernel 3.15, para cargar un EDID después del arranque, puede utilizar debugfs en lugar de un parámetro de línea de comandos del kernel si éste no está en con la restricción de acceso al kernel. Esto es muy útil si intercambias los monitores en un conector o simplemente para hacer pruebas. Una vez que tengas un archivo EDID como el anterior, ejecuta:

# cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override

Y para desactivar:

# echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override

Si su monitor admite conexión en caliente, también puede hacer una conexión en caliente para que el monitor utilice el nuevo EDID que acaba de cargar (por ejemplo, en edid_override), de modo que no tenga que volver a conectar físicamente el monitor ni reiniciarlo:

# echo 1 > /sys/kernel/debug/dri/0/HDMI-A-2/trigger_hotplug

Forzar modos

Advertencia: El método descrito a continuación es en cierto modo incompleto porque, por ejemplo, Xorg no tiene en cuenta la resolución especificada, por lo que se recomienda a los usuarios que utilicen el método descrito anteriormente. Sin embargo, especificar la resolución con video= línea de comandos puede ser útil en algunos escenarios.

De la wiki de Nouveau:

Se puede forzar un modo usando la línea de comandos del kernel. Desafortunadamente, la opción de línea de comandos video está my poco documentada en el caso DRM. Fragmentos de cómo usarlo se pueden encontrar en

El formato es:

video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
  • <conn>: Conector, por ejemplo DVI-I-1, vea /sys/class/drm/ para los conectores disponibles.
  • <xres> x <yres>: resolución
  • M: ¿calcular un modo CVT?
  • R: ¿blanqueo reducido?
  • -<bpp>: profundidad de color
  • @<refresh>: frecuencia de actualización
  • i: entrelazado (modo no-CVT)
  • m: ¿márgenes?
  • e: salida forzada habilitada
  • d: salida forzada deshabilitada
  • D: salida digital forzada habilitada (p.ej. conector DVI-I)

Puedes anular los modos de varias salidas utilizando video= varias veces, por ejemplo, para forzar DVI a 1024x768 a 85 Hz y TV-out desactivado:

video=DVI-I-1:1024x768@85 video=TV-1:d

Para obtener el nombre y el estado actual de los conectores, puede utilizar el siguiente script de una linea:

$ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
DVI-I-1: connected
HDMI-A-1: disconnected
VGA-1: disconnected

Desactivar modesetting

Es posible que desee desactivar KMS por varias razones. Para desactivar KMS, añada nomodeset como parámetro del kernel. Vea parametros del kernel para más información.

Junto con el parámetro del kernel nomodeset, para una tarjeta gráfica Intel, necesitaras añadir i915.modeset=0, y para una tarjeta gráfica Nvidia, necesitaras añadir nouveau.modeset=0. Para un sistema gráfico dual NVIDIA Optimus, necesitaras añadir los tres parámetros del kernel (es decir, "nomodeset i915.modeset=0 nouveau.modeset=0").

Nota: Algunos controladores Xorg no funcionarán con KMS desactivado. Consulte la página wiki de su controlador específico para más detalles.