Optimization of Boot Scrolling Font Display

The boot scrolling font mentioned here refers to the kernel log font during the system loading phase. The core solution for optimization is to lock the bootloader to a high resolution and configure a high-definition console font.

Taking Arch Linux as an example:

1. Configure the kernel resolution of systemd-boot

Edit the Arch boot configuration file by executing sudo vim /boot/loader/entries/arch.conf. Add the resolution parameter to the end of the options line, as shown in the example below:

1➜  ~ cat /boot/loader/entries/2025-12-09_09-04-59_linux.conf
2# Created by: archinstall
3# Created on: xxx
4title   Arch Linux (linux)
5linux   /vmlinuz-linux
6initrd  /initramfs-linux.img
7options root=PARTUUID=9443f4c6-b17e-4771-8ecf-987627f0551c zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs loglevel=3 rd.udev.log_priority=3 vt.global_cursor_default=0 video=2560x1440@100 amdgpu.runpm=0 amdgpu.gpu_recovery=1

Replace video=2560x1440@100 with your screen's native resolution.

If you don't know your screen resolution, you can get it from the output of the wlr-randr command. Similar commands exist for non-Wayland environments; please search for them.

 1➜  ~ wlr-randr
 2HDMI-A-1 "AOC Q27N3S2 1AQQ3HA009633 (HDMI-A-1)"
 3  Make: AOC
 4  Model: Q27N3S2
 5  Serial: 1AQQ3HA009633
 6  Physical size: 600x340 mm
 7  Enabled: yes
 8  Modes:
 9    2560x1440 px, 59.951000 Hz (preferred)
10    2560x1440 px, 100.000000 Hz (current)
11    2560x1440 px, 74.968002 Hz
12    1920x1080 px, 74.973000 Hz
13    1920x1080 px, 60.000000 Hz
14    1920x1080 px, 60.000000 Hz
15    1920x1080 px, 59.939999 Hz
16    .......

After saving and exiting, execute sudo bootctl update to update the configuration and ensure that the high resolution is maintained during the boot process.

2. Install and Configure High-Definition Console Fonts

First, install the clear Terminus font

1sudo pacman -S terminus-font

Font configuration example:

1➜  ~ cat /etc/vconsole.conf
2# Written by systemd-localed(8) or systemd-firstboot(1), read by systemd-localed
3# and systemd-vconsole-setup(8). Use localectl(1) to update this file.
4KEYMAP=us
5FONT=ter-v28n
6XKBLAYOUT=us
7XKBMODEL=pc105+inet
8XKBOPTIONS=terminate:ctrl_alt_bksp

ter-v28n is a clear version adapted for boot logs. 'v' indicates that the font contains the full character set, and 'b' indicates bold style. It can be found in /usr/share/kbd/consolefonts See the directory for more font options.

To preview the font effect, execute setfont ter-v28n to directly load the font. Switch to the TTY terminal to view the display effect. Once confirmed, restart to solidify the settings.

The TTY console supports a limited number of fonts; finding one that suits your taste is difficult 🤷‍♂️.

3. mkinitcpio Configuration

Let's look at a configuration example:

1➜ ~ grep -Ev "^#|^$" /etc/mkinitcpio.conf
2MODULES=(amdgpu)
3BINARIES=()
4FILES=()
5HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)
  • MODULES=(amdgpu) forces the loading of the open-source driver for the AMD GPU when generating the initramfs (initial memory disk).

  • HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck), defines the order of the "hooks" executed when mkinitcpio builds initramfs. Note that kms is placed relatively early. kms means enabling Kernel Mode Setting, used to enable the graphics card resolution early (in conjunction with the amdgpu module). This avoids screen flickering or low resolution at startup, meaning the fonts look clear and comfortable, greatly improving the display experience at startup.

Detailed explanation of HOOKS section:

HookFunction Description
baseProvides the most basic initramfs structure, must exist.
udevEnables udev device management (dynamic device nodes). Required for modern systems.
autodetectAutomatically detects and streamlines required modules and binaries (based on current hardware). Usually placed early.
microcodeLoads Intel/AMD microcode updates early in CPU initialization (improves stability and security).
modconfIncludes module configuration files from /etc/modprobe.d/ into initramfs.
kmsEnables kernel mode settings for early GPU resolution activation (in conjunction with the amdgpu module). This prevents screen flickering or low resolution at startup.
keyboardIncludes the keyboard driver, enabling keyboard input (e.g., entering the LUKS password) during the initramfs phase.
keymapLoads the specified keyboard layout (defined by /etc/vconsole.conf).
consolefontLoads the console font (also from /etc/vconsole.conf).
blockSupports block devices (hard drives, SSDs, etc.) and must precede filesystems.
filesystemsContains common file system modules (ext4, btrfs, xfs, etc.) for mounting the root file system.
fsckRuns fsck before mounting the root file system to check for disk errors.

Adjust the relevant fields and regenerate initramfs

1sudo mkinitcpio -p linux

After these operations, a unified resolution is achieved, the boot process remains unchanged, and the fonts are clear; high-resolution output is supported, adapting to high-definition screens.

4. Further Optimize TTY Font Display

This part requires installing kmscon, a simple terminal emulator based on Linux kernel mode setting (KMS). It is an attempt to replace the in-kernel VT implementation with a userspace console. See kmscon(1) man-page for usage information.

Simply put, when you log in without a graphical interface, or log in by pressing Ctrl + alt + F1~F6 (generally, display managers such as GMD, LightDM, and ly will bind to one of tty1~tty6, and systemctl enable ly@tty2.service will occupy it), tty2 is used to boot into the graphical interface; the rest are for non-graphical login.

That ancient interface, while pristine, is very unfriendly to East Asian users due to its plain text VT (Virtual Terminal) architecture, as it doesn't support CJK. Virtual terminals (VT) use kernel-built-in bitmap fonts, typically 8x16 or similar sizes. These fonts only contain ASCII characters (English, numbers, symbols) and some extended Latin characters, not Chinese character sets (such as GBK or UTF-8 characters). Even if the system locale is set to Chinese, the kernel VT cannot render Chinese characters.

Due to these limitations, we need to switch to kmscon, which solves the problem much better.

1sudo pacman -S kmscon
2sudo systemctl enable kmsconvt@tty1.service

sudo systemctl enable kmsconvt@tty1.service means taking over tty1. You can verify the effect after logging in with Ctrl + Alt + F1.

KMScon is quite strange. For a time, it was relegated to the AUR repository and didn't update for several years. But recently, it's been on fire, updating rapidly, and code commits have become much more active. You can check the repository at https://github.com/kmscon/kmscon to see the related records.

It has no graphics server dependency: it doesn't depend on X.org/Wayland, making it suitable for pure terminal environments.

So, what is the purpose of KMScon?

  • A complete VT220 to VT510 implementation, directly replacing agetty/getty without modifying existing terminal programs.
  • Full internationalization support; KMScon supports printing all Unicode characters, including Chinese, Japanese, and Korean.
  • Hardware-accelerated rendering.
  • Multi-seat support.

In simpler terms, I can freely change the font, display emojis and CJK characters—the experience is worlds apart.

Let's look at the configuration directly:

1[mephisto@minipc ~]$ grep -Ev "^#|^$" /etc/kmscon/kmscon.conf
2gpus=all
3hwaccel
4font-engine=pango
5font-size=18
6font-name=Hack Nerd Font,WenQuanYi Micro Hei Mono
7font-dpi=96
8mouse

As you can see, I've enabled hardware acceleration, the font engine is pango, the font is Hack Nerd Font,WenQuanYi Micro Hei Mono, and the dpi can also be set. Mouse is supported. In a pure VT environment, there's no mouse cursor, so you can't use the middle mouse button to select or copy.

When your desktop environment, such as Gnome or KDE, crashes, you can switch to a non-graphical interface. At this point, you can kill resource-intensive processes, maintaining a relatively good terminal experience, at least for East Asian users.

Or perhaps you're developing an embedded system and need to consider the terminal experience...

Many years ago, I saw a colleague switch to a pure VT environment specifically to prevent interference...

Finally, you can look at the differences between different ttys, pay attention to the TTY column.

``shell

➜ ~ w xx:xx:01 up 1:30, 3 users, load average: 0.37, 0.75, 1.04 USER TTY LOGIN@ IDLE JCPU PCPU WHAT mephisto tty2 xx:08 1:30m 3:56 0.95s Xwayland :0 -rootless -core -terminate 10 -listenfd 31 -listenfd 32 -displayfd 78 -wm 75 # Graphic, labwc mephisto tty4 xx:14 1:45 0.06s ? [atuin] # vt mephisto pts/2 xx:35 37.00s 0.26s ? [atuin] # kmscon

1
2In short, after the above steps, the font display after booting should meet your needs quite well. Of course, if you are a pure graphical enthusiast, you won't even see scrolling text when Plymouth is enabled. I enabled kernel scrolling log output mainly to easily check for errors.
Lastmod: Friday, February 6, 2026

See Also:

Translations: