The Linux console and framebuffer today: KMS, fonts, resolution
The Linux text console (the screens you reach with Ctrl+Alt+F3 and similar) still runs on a framebuffer, but the framebuffer now comes from the kernel's DRM graphics drivers instead of the old vesafb-style drivers. You set the console resolution with the video= kernel parameter, the font with setfont and /etc/vconsole.conf (or console-setup on Debian and Ubuntu), and you rarely need fbset at all.
What a framebuffer is
A framebuffer is a block of memory that holds the picture on the screen, one value per pixel. The kernel exposes it as /dev/fb0, and the framebuffer console driver (fbcon) draws text into it with bitmap fonts. That is what gives you a high-resolution console, the boot logo and the graphical boot splash.
Then and now
Around 2000, each graphics card family had its own fbdev driver (vesafb, matroxfb, atyfb and many more), and you picked a VESA mode number at boot with vga=. That subsystem has been deprecated for more than a decade. Today:
- The firmware (UEFI or BIOS) sets up a basic screen before Linux starts.
- Early in boot, the simpledrm driver (added in Linux 5.14) takes over that firmware framebuffer so you see messages straight away. Distributions such as Fedora replaced the older efifb, vesafb and simplefb drivers with it.
- When the real GPU driver loads (amdgpu, i915/xe, nouveau, nvidia-drm, virtio-gpu and others), it sets the monitor's native mode through kernel mode setting (KMS) and takes over the screen.
- DRM drivers provide fbdev emulation, so
/dev/fb0and fbcon keep working on top of them.
The result: on most machines the console is already at the panel's native resolution, and you never configure the framebuffer.
See what you are running
cat /proc/fb
ls /dev/fb* /dev/dri/
sudo journalctl -k -b | grep -i -E 'fbcon|simpledrm|drm'
/proc/fb shows one line per framebuffer, such as 0 amdgpudrmfb; a name ending in drmfb means DRM fbdev emulation. If the only entry after boot is the simpledrm one, the real GPU driver did not load. For details of the current mode:
sudo fbset -i
Set the console resolution
Use the video= kernel parameter with the connector name from ls /sys/class/drm/ (the part after card0- or card1-, for example card1-HDMI-A-1 gives HDMI-A-1):
video=HDMI-A-1:1920x1080@60
video=eDP-1:1280x800
A lower console resolution makes the text larger on a big screen. With no connector name, video=1920x1080@60 applies to all outputs. See the display HOWTO for the full syntax and the kernel command-line HOWTO for making a parameter permanent in GRUB or systemd-boot.
vga= is legacy. vga= is a boot-loader setting for the old x86 BIOS boot path and does nothing useful with KMS drivers or UEFI. Use video=.
nomodeset
The nomodeset parameter stops DRM and fbdev drivers from loading if they would replace the firmware's display. You get only the firmware framebuffer: one fixed resolution, no mode changes, no 3D acceleration. It is a rescue tool for a black screen after the GPU driver loads (common with a new GPU on an old kernel, or a missing proprietary driver). Boot once with it, install or fix the driver, then remove it.
Console fonts
fbcon uses bitmap PSF fonts, not the fonts your desktop uses. On a 4K panel the default 8×16 font is tiny. Change the font of the current console (no root needed on your own console):
showconsolefont # show the current font's characters
setfont ter-132b # Terminus 16x32 bold, if installed
setfont -d # double the current default font
setfont # back to the default font
-d doubles each pixel, which works for fonts up to 16×16. To see which fonts you have:
find /usr/share /usr/lib -path '*consolefonts*' -name '*.psf*' | head -40
Fonts are in /usr/share/kbd/consolefonts on Arch, /usr/lib/kbd/consolefonts on Fedora and /usr/share/consolefonts on Debian. On Arch the Terminus console fonts are in the terminus-font package; on other systemd distributions search your package manager for "terminus". Debian and Ubuntu ship Terminus faces with console-setup.
Make it permanent: systemd distributions
Fedora, Arch, openSUSE and RHEL read /etc/vconsole.conf at boot:
KEYMAP=us
FONT=ter-132b
Apply it without rebooting:
sudo systemctl restart systemd-vconsole-setup.service
You can also override it for one boot with vconsole.font=ter-132b on the kernel command line. systemd 262 and later (Fedora 45 ships 262; Debian 13 has 257, as of November 2026) also accepts FONT_SCALE=200% to double the font at boot; check yours with systemctl --version. If the font is right at first but resets when the graphics driver loads, the driver is loading after the font was set; on Arch, the sd-vconsole hook in the default mkinitcpio HOOKS line (or consolefont in a busybox-based initramfs) puts the font into the initramfs so it is applied early; regenerate with sudo mkinitcpio -P after changing /etc/vconsole.conf.
Make it permanent: Debian and Ubuntu
Debian and Ubuntu use console-setup. Edit /etc/default/console-setup:
CODESET="guess"
FONTFACE="Terminus"
FONTSIZE="16x32"
Valid Terminus sizes include 8x14, 8x16, 10x20, 12x24, 14x28 and 16x32; TerminusBold and VGA are other faces. Apply with:
sudo setupcon
The keyboard and console HOWTO covers the keymap side of both files.
A font before userspace starts
The kernel has a few fonts built in, and fbcon=font:TER16x32 on the kernel command line selects the large Terminus one for the very first boot messages (if your kernel was built with it). Other built-in names include VGA8x16, SUN12x22 and 10x18.
Rotate the console
For a monitor mounted in portrait, or a tablet whose panel is mounted sideways, rotate fbcon at boot with fbcon=rotate:1 (0 = normal, 1 = 90° clockwise, 2 = upside down, 3 = 90° counter-clockwise). At run time, as root:
echo 1 | sudo tee /sys/class/graphics/fbcon/rotate_all
This rotates only the text console, and only if the kernel has framebuffer console rotation built in. For the graphical session, rotate in your desktop settings, or use the rotate= or panel_orientation= options of video=.
fbset: mostly legacy
fbset shows and changes framebuffer settings and keeps a mode database in /etc/fb.modes. With the old fbdev drivers, fbset 1024x768-60 or fbset -g 1024 768 1024 768 32 changed the console mode. With DRM fbdev emulation the mode is set by KMS, and fbset generally cannot change it, so treat fbset as an information tool (fbset -i, fbset -s) and set resolution with video=. It is still useful on embedded boards that use a real fbdev driver, and gtf ... -f prints timings in fbset format for those.
Programs that draw on the framebuffer
Programs can still draw directly on /dev/fb0 (image viewers, kiosk tools, small embedded user interfaces), but new software should use the DRM/KMS interface in /dev/dri/ instead. To give a user access to /dev/fb0 without root, check which group owns it with ls -l /dev/fb0 (usually video) and add the user to that group. With several graphics cards, fbcon's fbcon=map: option chooses which framebuffer each console uses; with KMS there is usually one framebuffer per card, shown on all its connected outputs.
Troubleshooting
- Black screen when the GPU driver loads
- Boot with
nomodeset, checkjournalctl -k -b -1for the previous boot's driver errors, install the missing firmware or driver (see Hardware HOWTO), then removenomodeset. - Console stuck at a low resolution
- Check
/proc/fb. If only simpledrm is listed, the GPU driver is not loading; if the driver is loaded, the monitor's EDID may be wrong (see the display HOWTO). - Tiny text on a HiDPI panel
- Use a 16×32 font,
setfont -d, or a lowervideo=resolution. - Boxes instead of accented letters
- The font lacks those characters or has no Unicode map; pick a font that covers your language, or set
CODESETcorrectly on Debian.
The classic Framebuffer HOWTO, which documents the old per-card fbdev drivers, is kept by the Linux Documentation Project at tldp.org.
Sources
- The frame buffer device and The framebuffer console, Linux kernel documentation
- modedb default video mode support and kernel command-line parameters, Linux kernel documentation
- Kernel mode setting (KMS), Linux kernel documentation
- Replace the fbdev drivers with simpledrm and the DRM fbdev emulation layer, Fedora Project
- setfont(8), fbset(1) and console-setup(5), Debian manual pages
- vconsole.conf(5), systemd
- Linux console, ArchWiki
- mkinitcpio default HOOKS (meson.build) and Arch mkinitcpio package build (systemd hooks enabled), Arch Linux GitLab