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:
| Hook | Function Description |
|---|---|
base | Provides the most basic initramfs structure, must exist. |
udev | Enables udev device management (dynamic device nodes). Required for modern systems. |
autodetect | Automatically detects and streamlines required modules and binaries (based on current hardware). Usually placed early. |
microcode | Loads Intel/AMD microcode updates early in CPU initialization (improves stability and security). |
modconf | Includes module configuration files from /etc/modprobe.d/ into initramfs. |
kms | Enables kernel mode settings for early GPU resolution activation (in conjunction with the amdgpu module). This prevents screen flickering or low resolution at startup. |
keyboard | Includes the keyboard driver, enabling keyboard input (e.g., entering the LUKS password) during the initramfs phase. |
keymap | Loads the specified keyboard layout (defined by /etc/vconsole.conf). |
consolefont | Loads the console font (also from /etc/vconsole.conf). |
block | Supports block devices (hard drives, SSDs, etc.) and must precede filesystems. |
filesystems | Contains common file system modules (ext4, btrfs, xfs, etc.) for mounting the root file system. |
fsck | Runs 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]
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.
Copyright statement:
- All content that is not sourced is original., please do not reprint without authorization (because the typesetting is often disordered after reprinting, the content is uncontrollable, and cannot be continuously updated, etc.);
- For non-profit purposes, to deduce any content of this blog, please give the relevant webpage address of this site in the form of 'source of original text' or 'reference link' (for the convenience of readers).
See Also:
- Deploying Vaultwarden on Raspberry Pi
- Real-time Analysis of Caddy Logs Using goaccess
- Personal Website Monitoring
- Hugo's Complete AVIF Conversion Guide
- Trying to Develop a Small Game Using Godot on Linux
- Arch linux dae Transparent Proxy
- Airflow Takes Over Gallery-DL Download Tasks
- How to Batch Download Images Using gallery-dl
- How to play Dota2 and CS2 happily under Arch core display
- Arch/labwc Environment Network Related Settings