2025-07-05
Genre: Reports
-` scientiac@einstein
.o+` ------------------
`ooo/ OS: Arch Linux x86_64
`+oooo: Host: ASUS Zenbook 14 UM3406HA_UM3406HA (1.0)
`+oooooo: Kernel: Linux 6.15.4-arch2-1
-+oooooo+: Uptime: 31 mins
`/:-:++oooo+: Packages: 997 (pacman)
`/++++/+++++++: Shell: zsh 5.9
`/++++++++++++++: Display (SDC419D): 2880x1800 @ 60 Hz (as 1440x900) in 14" [Built-in]
`/+++ooooooooooooo/` WM: niri (Wayland)
./ooosssso++osssssso+` Cursor: Adwaita (24px)
.oossssso-````/ossssss+` Terminal: ghostty 1.1.3-arch1
-osssssso. :ssssssso. Terminal Font: FantasqueSansM Nerd Font Mono (11pt)
:osssssss/ osssso+++. CPU: AMD Ryzen 7 8840HS (16) @ 5.13 GHz
/ossssssss/ +ssssooo/- GPU: AMD Radeon 780M Graphics [Integrated]
`/ossssso+/:- -:/+osssso+- Memory: 2.51 GiB / 14.91 GiB (17%)
`+sso+:-` `.-/+oso: Swap: 0 B / 4.00 GiB (0%)
`++:. `-/+/ Disk (/): 20.95 GiB / 475.94 GiB (4%) - btrfs
.` `/ Local IP (wlan0): 192.168.1.71/24
Battery (ASUS Battery): 52% [Discharging]
Locale: en_US.UTF-8
My friend challenged me to achieve flicker free boot on my laptop like someone achieved it many-many years ago, and said if fedora can do it by default why can't we?
Technically he didn't challenge me, he only mentioned that it was possible. And, I took it as a challenge. Because I know that linux can be as smooth and polished looking as other commercial OS offerings. And I want my laptop to be as smooth as possible and as clean looking as possible.
So, I tried.
The only thing I didn't really want to do was reinstall my OS again. But, I had to. I had never used the Unified Kernel Image (UKI) and I was using systemd-boot
as my bootloader. So, the bootloader had to go and UKI had to be installed.
Note
1. When installing Arch Linux, use
UKI
Unified Kernel Image and instead of using a bootloader, useEFIstub
(EFI Boot Stub)
I used archinstall
and it had both of these options. It was very easy. I picked all other configurations as I used to do and just installed the system.
I had to change the kernel parameters, to make all those text go away. So, I tried using efibootmgr
and failed again and again. I couldn't for science's sake use it properly. Once, I tried using the script recommended by the arch-wiki
, the boot process flickered more than It had ever flickered. Luckily it hadn't removed the original entry and efibootmgr
had a way to remove the broken entries, so I brought everything back to normal and tried it a countless times, failing each time.
I gave up on efibootmgr
, from previous experiences with booting with a splash screen, I knew plymouth
was a thing. So, I installed it. And went searching for ways to put kernel-parameters during boot. Plymouth needed quiet splash
to work.
Then, I found /etc/kernel/cmdline
. I added quiet splash
to the end of the line and then rebooted. It showed no changes. I found out that I had to rebuild the initial ramdisk environment. In other words I had to run:
# To (re-)generate initramfs images based on all existing presets, the -P/--allpresets switch is used.
sudo mkinitcpio -P
Note
2. To add kernel parameters, you need to append the text on
/etc/kernel/cmdline
and then, rebuild the initramfs image usingsudo mkinitcpio -P
.
My /etc/kernel/cmdline
looks like this:
root=PARTUUID=4638cd24-77e4-4ed3-bb8a-9478d9c2d2db zswap.enabled=0 rw rootfstype=btrfs quiet loglevel=3 udev.log-priority=3 systemd.show_status=false splash
The part until rootfstyps=btrfs
was autogenerated during installation and I added the rest afterwards.
Now, It Worked! But, it was the same(somewhat). The splash animation for ASUS ran, then it showed me a big Arch Linux logo, then the screen went black and then the splash screen reappeared and it dropped me to my login manager. This was the behavior it used to show before I installed arch without doing anything I previously did. Basically, I was back to how it was before I reinstalled my OS. All that copying and configuring for nothing.
So, I started putting different kernel params to check if one of it worked and if any of it removed blackout before showing me the splash screen again. The wiki for silent boot suggested I put loglevel=3 systemd.show_status=auto rd.udev.log_level=3
in the kernel parameters.
It also said:
If you also want to stop systemd from printing its version number when booting, you should also append udev.log_level=3 to your kernel parameters. If systemd is used in an initramfs, append rd.udev.log_level=3 instead.
Since, I wasn't using systemd
in the initramfs, I used udev.log_level=3
instead. Then I rebuilt the initramfs and rebooted. It was the same.
Note
3. Append
quiet loglevel=3 udev.log-priority=3 systemd.show_status=false splash
in/etc/kernel/cmdline
to enable splash and quiet out the logs.
Then I became desperate and started looking everywhere; forums, wikis, even YouTube comment section. And, you know what? YouTube comments helped for once.
This comment is from the YouTube video I have linked above.
I finally realised, plymouth
was the culprit. The kernel had to hand over the process to plymouth and it caused the delay after the big Arch Linux logo.
I also found out that kernel itself can render the logo without plymouth, that was how the Arch Linux Logo was being rendered even before plymouth had started. If only, I had read the silent boot wiki entry properly:
To prevent the kernel from blanking the vendor logo, Linux 4.19 introduced a new configuration option
FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
that retains the contents of the framebuffer until text needs to be printed on the framebuffer console. Since version 4.19.arch1, the official Arch Linux kernels are compiled withCONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y
.
Thanks to arch I didn't have to recompile the kernel to get that.
Tip
There is no need to use
plymouth
because the Linux kernel can show splash images by itself and enabling both only makes the process less smoother.
I didn't want the Arch Linux logo, I wanted my vendor logo to be continued, like it was still booting until my login screen appeared. If only I can replace the "Arch Linux" logo with bgrt
(The vendor's splash logo). So, I went looking where I could change that.
The Boot Graphics Record Table (BGRT) is an optional ACPI table which contains a pointer to the image that has been drawn during boot.
I found /etc/mkinitcpio.d/linux.preset
to be the exact thing I was looking for. And from the name itself I knew I needed to rebuild the initramfs again for the changes to be reflected.
I had to change the following line in linux.preset
:
default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"
My first instinct was to go to /usr/share/systemd/bootctl/
and rm splash-arch.bmp
. I did that and rebooted, Now, It showed black screen until the login manager showed up. It was progress.
Then I found my bgrt
image in /sys/firmware/acpi/bgrt/
it was named image
with no file extension.
So, I changed the above line to:
default_options="--splash /sys/firmware/acpi/bgrt/image"
Then I rebuilt the initramfs and rebooted. To be greeted with a smooth boot. Like I wanted it to be. Showing bgrt until the login manager showed up.
Note
4. Change the
default_options=
configuration to/sys/firmware/acpi/bgrt/image
in/etc/mkinitcpio.d/linux.preset
then rebuild the initramfs by doingsudo mkinitcpio -P
.
The booting process was good and how I wanted it to be, but when it came to rebooting it showed:
[ 54.796241] watchdog: watchdog0: watchdog did not stop!
[ 54.918590] watchdog: watchdog0: watchdog did not stop!
[ 55.597358] reboot: Restarting system
I didn't want that to show up and with a bit of research, I came to a conclusion that disabling watchdog was fine so I did. I edited /etc/modprobe.d/blacklist.conf
and added blacklist sp5100_tco
. Intel users are supposed to blacklist iTCO_wdt
or the watchdog that their system used.
Now my /etc/modprobe.d/blacklist.conf
has:
# Do not load the watchdog module on boot.
blacklist sp5100_tco
Note
5. Blacklist your watchdog so you don't get watchdog messages when rebooting and powering off by editing
/etc/modprobe.d/blacklist.conf
.
What I did above is enough to get flicker free boot/smooth boot or whatever you call it, but I wanted more, I want plymouth
to work without flicker. Spoiler: I couldn't.
Anyway, I switched to systemd
instead of udev
so my /etc/mkinitcpio.conf
has the following hooks now:
HOOKS=(base systemd modconf autodetect kms keyboard sd-vconsole block filesystems fsck plymouth)
I reinstalled plymouth, and I like it when it smoothly transitions to GDM instead of flashing me to GDM. It was a tradeoff between GDM flash or just flicker when loading spalash screen.
I added more kernel parameters to mitigate the flashing but I couldn't do it.
root=PARTUUID=4638cd24-77e4-4ed3-bb8a-9478d9c2d2db zswap.enabled=0 rw rootfstype=btrfs amdgpu.modeset=1 amdgpu.dc=1 video=efifb:keep plymouth.use-simpledrm quiet vt.global_cursor_default=0 loglevel=3 rd.udev.log_level=3 systemd.show_status=auto splash
plymouth.use-simpledrm
does start plymouth immediately but when the amdgpu
driver is ready it mode-switches to it and the black screen appears. I can technically use nomodeset
and achieve true flicker free boot with plymouth and everything but then I lose out on my graphics driver setting dpi scaling and brightness and more for me on boot.
I even tried setting /etc/plymouth/plymouthd.conf
to delay it's starting but it still doesn't stop flickering. It either flickers or it skips and I get the UKI splash screen until the login manager.
[Daemon]
ShowDelay=0
DeviceTimeout=30
I think I will just remove the plymouth configuration since it isn't helping anything. Or maybe I'll just leave it there because it is not doing anything.
To remove the logo from GDM I quickly installed gdm-settings
and there was a toggle which I turned off.
I didn't like the logo shown by plymouth during boot either, so I just removed the image watermark.png
from the spinner theme in /usr/share/plymouth/themes/spinner/
. I also removed all animation and throbber images just to make everything clean.
I did eventually come back to "not so smooth boot" but I am one sudo pacman -R plymouth
away from it. Furthermore, I can boast about having 3 splash screens that look the same transitioning seamlessly*, even 4 if you count the UEFI animation.
It goes as follows:
UEFI
animation starts and ends.UKI Splash Screen
starts and ends.simpledrm
backed plymouth
bgrt theme starts and screen goes blank.amdgpu
backed plymouth screen gradually appears and transitions to GDM.But, if I remove plymouth:
UEFI
animation starts and ends.UKI Splash Screen
starts and drops me to GDM.A Computer Engineering student who loves FOSS and is learning about privacy, the Internet and languages writing about the things he does.