How to switch boot target to text or GUI in systemd Linux nixCraft

See all systemd related Howtos/Tutorials

Most modern Linux distro uses systemd as init replacement. It is a suite of basic building blocks for Linux distros such as RHEL/CentOS & co, OpenSUSE/SUSE, Fedora, Arch, Debian, Ubuntu, and more. By default, most distro boot into GUI, but you can change to text or vice versa.

The older version of the Linux distros came with SysV init or Upstart. Such init provided a set of runlevels for text, muli user, and GUI system. However, systemd uses the concept of targets instead of runlevels. This page explains procedures to implement runlevel like config when working with systemd targets. In other words, you will learn how to switch between text or GUI mode using systemd instead of init levels on modern Linux distros.

Tutorial details
Difficulty level Easy
Root privileges Yes
Requirements Linux systemd
Est. reading time 6 minutes
ADVERTISEMENT

Switching boot target to text

The procedure is as follows to change into a text mode runlevel under systemd:

  1. Open the terminal application.
  2. For remote Linux servers, use the ssh command.
  3. Find which target unit is used by default:
    systemctl get-default
  4. To change boot target to the text mode:
    sudo systemctl set-default multi-user.target
  5. Reboot the system using the reboot command:
    sudo systemctl reboot

How to switch boot target to text or GUI in systemd Linux

How to switch boot target to GUI (graphical UI)

Want to revert change boot to GUI instead of console/text mode? Try:

  1. Open the Linux terminal application.
  2. Again, for remote Linux servers, use the ssh command.
  3. Find which target unit is used by default:
    systemctl get-default
  4. To change boot target to the GUI mode:
    sudo systemctl set-default graphical.target
  5. Make sure you reboot the Linux box using the reboot command:
    sudo reboot

Changing Systemd Boot Target in Linux To GUI

Understanding boot targets under systemd

The default target is set by /etc/systemd/system/default.target. Run the following ls command to verify it using the symbolic link:
ls -l /etc/systemd/system/default.target
Of course, we can use the systemctl command itself too:
systemctl get-default

Listing all systemd targets

Execute the following command:
systemctl list-units --type target
# list all loaded units in any state #
systemctl list-units --type target --all

Here is a list of all currently loaded target units on Ubuntu Linux 20.04 LTS desktop:

 UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System blockdev@dev-mapper-md1_crypt.target loaded active active Block Device Preparation for /dev/mapper/md1_crypt bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Local Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems machines.target loaded active active Containers multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization time-set.target loaded active active System Time Set time-sync.target loaded active active System Time Synchronized timers.target loaded active active Timers virt-guest-shutdown.target loaded active active Libvirt guests shutdown LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type. 26 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'. 

Sysv runleves vs systemd targets

Let us understand older Sysv runlevels and their equivalents under systemd.

Table 1
Systemd target Runlevel Description Old command New command
runlevel0.target, poweroff.target 0 Power off the Linux box. init 0 systemctl isolate poweroff.target
runlevel1.target, rescue.target 1 Boot into emergency rescue mode (single user mode). init 1 systemctl isolate rescue.target
runlevel2.target, multi-user.target 2 Text based multi-user system that does not configure network interfaces and does not export networks services. init 2 systemctl isolate runlevel2.target
runlevel3.target, multi-user.target 3 Starts the system normally in multi-user text mode for the Linux server usage. init 3 systemctl isolate runlevel3.target
runlevel4.target, multi-user.target 4 For special purposes text mode. init 4 systemctl isolate runlevel4.target
runlevel5.target, graphical.target 5 Same as runlevel 3 and boot into GUI display manager. init 5 systemctl isolate graphical.target
runlevel6.target, reboot.target 6 Reboot the Linux desktop or laptop. init 5 systemctl isolate reboot.target

How to change the default systemd target using symbolic link

Earlier I explained how to use the systemctl command. But one can use other commands. Therefore, use the ln command as follows to switch to the GUI mode:

sudo ln -s -f -v \
/lib/systemd/system/graphical.target \
/etc/systemd/system/default.target

Patreon supporters only guides 🤓

  • No ads and tracking
  • In-depth guides for developers and sysadmins at Opensourceflare
  • Join my Patreon to support independent content creators and start reading latest guides:

Join Patreon

Want to go back to the text mode:

sudo ln -s -f -v \
/lib/systemd/system/multi-user.target \
/etc/systemd/system/default.target

Verify it using the ls command
ls -l /etc/systemd/system/default.target

Changing the default systemd target using symbolic link under Linux

Learn how to change the default target by creating a symlink to the systemd target (click to enlarge)

See how create soft link with under Linux or Unix using the ln command for more info.

How to boot in to rescue mode

Run the following systemctl command
$ sudo systemctl rescue
We can change to a different systemd target unit in the current log in session using the CLI as follows:
sudo systemctl isolate multi-user.target
# OR #
sudo systemctl isolate graphical.target

What would get started if I booted into a specific target?

The systemd can calculate the “initial” transaction it would execute on boot, try something like this to see what services and stuff loaded in the graphical.target:
systemd --test --system --unit=graphical.target
The --test option is used to determine the initial start-up transaction, dump it, and exit without actually executing any of the determined jobs. How cool is that?

Summing up

You learned about systemd targets and older runlevels used by SysV init system. Further, I explained how to use the systemctl command to switch between text and GUI mode from the CLI. There is more than one way to achieve results in Linux. Hence, this page also described how to modify the default target using the symbolic link method too. Debian Linux project maintains a good systemd specific page and strongly endorses you to visit the wiki page. However, you can read documentation locally using the man command in an emergency where the internet is not available:
man systemctl
man init
man upstart ini
man systemd

ADVERTISEMENT

Leave a Reply

Your email address will not be published. Required fields are marked *