Booting Arch Linux Smoothly

2025-07-05Genre: Reports

My Device


                  -`                     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

Firstly...

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.

How did you start?

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, use EFIstub (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.

After Installation

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 using sudo 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.

Why you should not give up

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.

Youtube Comment 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 with CONFIG_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.

It still wasn't "smooth"

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 doing sudo mkinitcpio -P.

It was not as "smooth" as plymouth

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.

I don't like having nice things

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.

Conclusion

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:

  1. UEFI animation starts and ends.
  2. UKI Splash Screen starts and ends.
  3. simpledrm backed plymouth bgrt theme starts and screen goes blank.
  4. amdgpu backed plymouth screen gradually appears and transitions to GDM.

But, if I remove plymouth:

  1. UEFI animation starts and ends.
  2. UKI Splash Screen starts and drops me to GDM.

Webmentions

Have you written a response to this? Let me know the URL, Or, you can send your response via mail:iac@scientiac.space