31.6 C
Tuesday, September 21, 2021

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

Must read

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 5 minutes

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

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                                      
  [email protected]_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 

Want to go back to the text mode:

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

sudo ln -s -f -v 

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

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

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 init


Source link

- Advertisement -

More articles


Please enter your comment!
Please enter your name here

- Advertisement -

Latest article