Kernel mode setting (Español)
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.
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
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:
-
amdgpu
para AMDGPU, oradeon
cuando se utiliza el controlador ATI heredado. -
i915
para gráficos Intel. -
nouveau
para el controlador Nouveau de código abierto. -
nvidia nvidia_modeset nvidia_uvm nvidia_drm
para los controladores que no están dentro del kernel nvidia y nvidia-open. Vea NVIDIA (Español)#DRM kernel mode setting para más detalles.
-
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
parastd
(qemu) yvga
/bochs
(libvirt), -
virtio-gpu
paravirtio
, -
qxl
paraqxl
, -
vmwgfx
paravmware
(qemu) yvmvga
(libvirt), -
cirrus
paracirrus
.
-
- 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 ...)
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
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"
).