Table of Contents

Ubuntu - Boot - Speed up boot

Check startup time

Check how long it takes to boot:

systemd-analyze time

returns:

Startup finished in 16.619s (firmware) + 10.201s (loader) + 36.729s (kernel) + 41.034s (userspace) = 1min 44.586s
graphical.target reached after 23.396s in userspace

This shows how long it takes for the Linux kernel and base system services to load.

It shows you how much time is required, from the moment the kernel is loaded until you are dropped to the Linux console.

It doesn’t account for the time your graphical interface requires to boot up.


Check startup time for the graphical interface to initialize

You can also see the time required by the graphical interface to initialize with this command:

systemd-analyze critical-chain graphical.target

returns

The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.
 
graphical.target @23.396s
└─multi-user.target @23.396s
  └─libvirt-guests.service @23.378s +18ms
    └─libvirtd.service @3.189s +20.187s
      └─network.target @3.189s
        └─NetworkManager.service @2.333s +855ms
          └─dbus.service @2.223s
            └─basic.target @2.207s
              └─sockets.target @2.207s
                └─docker.socket @2.206s +965us
                  └─sysinit.target @2.203s
                    └─apparmor.service @1.458s +745ms
                      └─local-fs.target @1.457s
                        └─run-user-1000-gvfs.mount @15.641s
                          └─run-user-1000.mount @14.700s
                            └─swap.target @1.607s
                              └─dev-mapper-ubuntu\x2d\x2dvg\x2dswap_1.swap @1.565s +36ms
                                └─dev-mapper-ubuntu\x2d\x2dvg\x2dswap_1.device @1.565s

This shows that the graphical user interface loaded in 23.396 seconds.

This doesn’t account for the time required to load desktop utilities.

To enable/disable those, launch your desktop environment startup manager.


Check which services takes most time

Use the following command to check which service takes most of time

systemd-analyze blame

returns

         30.898s apt-daily.service
         20.417s rsyslog.service
         20.187s libvirtd.service
          5.774s systemd-networkd-wait-online.service
          3.654s docker.service
          1.841s apt-daily-upgrade.service
          1.820s snapd.service
          1.487s plymouth-quit-wait.service
           993ms dev-mapper-ubuntu\x2d\x2dvg\x2droot.device
           855ms NetworkManager.service
           768ms fwupd.service
           752ms udisks2.service
           745ms apparmor.service
           736ms networkd-dispatcher.service
           725ms snap-gnome\x2dcalculator-544.mount
           710ms networking.service
           697ms thermald.service
           680ms snap-netbeans-10.mount
           674ms snap-gnome\x2dlogs-81.mount
           661ms systemd-resolved.service
           643ms systemd-timesyncd.service
           642ms systemd-logind.service
           558ms ModemManager.service
           550ms apport.service
           544ms gpu-manager.service
           528ms motd-news.service
           502ms grub-common.service
...

You can navigate the list with your arrow keys or PAGE UP and PAGE DOWN.

Press q to quit.


Check the critical chain

Analyze each major process to determine how long it takes to run.

For example, to get further information on the AppArmor Service, to see if you can disable it or speed it up, use:

systemctl status apparmor.service

returns:

● apparmor.service - AppArmor initialization
   Loaded: loaded (/lib/systemd/system/apparmor.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2019-11-23 10:23:26 GMT; 2 days ago
     Docs: man:apparmor(7)
           http://wiki.apparmor.net/
  Process: 1181 ExecStart=/etc/init.d/apparmor start (code=exited, status=0/SUCCESS)
 Main PID: 1181 (code=exited, status=0/SUCCESS)

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

Also check the journal:

journalctl -u apparmor.service

returns:

-- Logs begin at Sun 2019-11-24 02:17:01 GMT, end at Mon 2019-11-25 21:05:42 GMT. --
-- No entries --

Disabling auto-start of services during boot

If you want to disable auto-starting of services during boot you can use the following command:

sudo systemctl disable some-time-eater-service.service --now

However, you might want to see which other services needs the service in question. To check use the following command

systemctl list-dependencies some-service.service --reverse

Note: Replace some-service.service with actual service name.

WARNING: Disabling a service doesn't make a service non-startable. If you reboot, you could notice the service (daemon) is still running. That’s because other dependencies may launch it, even if it’s disabled.

Try to see what those may be:

systemd-analyze blame | grep some-service

If you want to completely disable it, read the next section.


Disabling services completely

If you want to completely disable a service so that it can't be started, you should use mask instead of disable. Like this

sudo systemctl mask <SERVICE-NAME>

Replace the <SERVICE-NAME> with actual name of a service.

The difference between mask and disable is mask make a service completely disable, you can't start it. You must unmask to start it with systemd (you can still start with service). But disable simply disables auto-start of a service, you can start it later.

For example, after masking the some-service service, if you tried start it with systemctl the following message is shown

Failed to start some-service.service: Unit some-service.service is masked.


Re-enable a service

If you want to re-enable a service:

sudo systemctl unmask <SERVICE-NAME>
sudo systemctl enable <SERVICE-NAME>