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.