This blog post is a throwback to “Booting Debian in 14 seconds” from debian-administration.org, where the author went through some fairly advanced steps to get his low-spec Debian laptop to boot quickly. Debian was version 4.0 at the time, and I recall it taking around 40 seconds to boot on a default desktop install.
In a rare exception to Wirth’s law, waiting for a computer to boot is no longer “a thing”. A default desktop install of Debian includes systemd, and uses a multi-core CPU and SSD quite efficiently. Also, sleep/wake works more reliably than it used to, so boot speed is not as important as it used to be.
On a modern desktop PC, booting Debian 9 (default desktop install) takes me 14 seconds with no extra configuration, so that’s our new low water mark.
Mainly to illustrate how far open source operating systems have come, I’m going to step through a boot process speed-up, the way it looks in 2018.
Summary
Out
You will read about some of these older tricks if you search for Linux Boot speed, and they are all quite irrelevant in 2018, in my humble opinion-
- Swapping the /bin/sh shell to dash (already the default, also, init scripts are no longer used).
- Using readahead (gains are tiny unless you have a HDD).
- “noatime” setting on mounts (“relatime” is a default mount option since Linux 2.6).
In
New things that you wont find in pre-systemd guides:
- systemd-analyze to instrument the boot
- systemctl to exclude processes from boot
Still relevant
- bootchart is still useful for drawing pretty graphs
- Configure GRUB & UEFI not to prompt for input
- Don’t enable services you don’t need
Process
Remove bootloader delay
Between UEFI and the OS, you will get the bootloader, which will wait for 5 seconds by default to see if you want to select a different item. Start by switching the grub timeout from 5 seconds to 0.
sudo nano /etc/default/grub
Set GRUB_TIMEOUT=0.
Run:
sudo update-grub2
Look at systemd
Use the tool systemd-analyze to draw a picture:
systemd-analyze plot > plot.svg
In my case, it was clear that 9 seconds of the boot was an optional “waiting for network” step.
So, (thank you askubuntu), I disabled that service and rebooted:
$ sudo systemctl disable NetworkManager-wait-online.service
Removed /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
systemd-analyze plot > plot2.svg
The boot was still taking 4.4 seconds, so, more analysis was in order:
The systemd-timesyncd service was holding things up.
This service runs early in the boot process, reads an old time from a file, and tries to update time over the network. Since I have a working RTC, this is all unnecessary for me, so I removed it and replaced it with chronyd, which is happy to operate in the background.
sudo systemctl disable systemd-timesyncd.service
sudo apt-get install chronyd
sudo systemctl enable chrony
After another reboot:
systemd-analyze plot > plot4.svg
There we go, down to 4.096 seconds with a few minutes of effort. I think that’s acceptable.
The systemd developers are quite certain that you can boot in under 2 seconds, but I wasn’t willing to customise my system to that extent.
Thanks for sharing.
I ‘ve got a Dell Inspiron laptop from 2011 with an hdd running lmde4. Anyway to tweak systemd to significantly reduce grub to login and/or login to desktop? Right now it takes about 50 to 70 secs from grub to login and about 20 to 30 secs from login to desktop. More info about my system here:
https://forums.linuxmint.com/viewtopic.php?f=246&t=370051
Hello!
I’m running Debian 12 Bookworm and for some reason the linux kernel takes almost 7 seconds to boot up. In your picture your kernel booted up in less than 3 seconds.
Here is a screenshot of my systemctl-analyze: https://i.imgur.com/IpquAzx.png
And yes, I’m running Debian off an NVME SSD with 3.5 GB/s read and write speeds.
Here is a screenshot of my lsblk: https://i.imgur.com/XpjM3SL.png