Systemd setup with Pilvio

Managing Systemd en-GB services and units using Systemctl

Introduction

Systemd is a system manager and provisioning system that has become the new standard for Linux distributions. Familiarity with systemd is recommended due to their sophisticated adaptability, as it will substantially simplify server administration. Learning and utilizing the systemd tools and daemons managing can help you appreciate the advantages and flexibility it provides, or at the very least work with as few difficulties as possible.

We’ll go over managing services, checking status, changing system status, and working with configuration files.

While systemd has become the default provisioning system for many Linux distributions, it is not used in all of them. If your terminal displays the error bash: systemctl is not installed, it is likely that another provisioning system is installed on your machine.

 

Management of services

The provisioning system’s basic goal is to initialize the components that will be launched when the Linux kernel is booted (traditionally called userland components). The provisioning system is also used to handle server services and daemons at all times the system is operational. With this in mind, we’ll begin with a few fundamental procedures for managing services.

Most operations in systemd are directed at “modules,” which are resources that systemd understands how to handle. Modules are classified according to the type of resource they represent and are described by files called module files. The suffix at the end of the file indicates the kind of each module.

The target module for service management tasks will be service modules with module files ending in.service. However, you may not want to use the.service suffix for most service management tasks because systemd is smart enough to recognize that you may want to work with service when using service management commands.

 

Systemd setup and closure

Use the start command to start the systemd service according to the instructions in the service module file. If you are not a root user, you must use sudo because this affects the operating system state:

sudo systemctl start application.service

 

As previously stated, systemd will seek for *.service files when looking for service management commands, therefore the command can be readily input as follows.

sudo systemctl start application

 

Although the above style can be used for general administration, we will use the.service suffix for the rest of the commands to make it obvious what we are working on.

You can use the stop command to halt a currently operating service: 

sudo systemctl stop application.service

 

Service restarting and rebooting

Use the start command to start the systemd service according to the instructions in the service module file. If you are not a root user, you must use sudo because this affects the operating system state:

sudo systemctl restart application.service

 

As previously stated, systemd will seek for *.service files when looking for service management commands, therefore the command can be readily input as follows.

sudo systemctl reload application.service

 

Although the above style can be used for general administration, we will use the.service suffix for the rest of the commands to make it obvious what we are working on.

You can use the stop command to halt a currently operating service: 

sudo systemctl reload-or-restart application.service

 

Service activation and deactivation

The commands listed above are useful for launching and terminating services during the current session. These must be enabled in order for systemd to start services automatically at boot.

To start the service at boot time, use the enable command:

sudo systemctl enable application.service

 

This will build a symbolic link from a system copy of the service file (often in /lib/systemd/system or /etc/systemd/system) to the directory on disk where systemd looks for autorun files (typically /etc/systemd/system/some target.target.wants; we will look at target later in this manual).

To prevent the service from starting automatically, type:

sudo systemctl disable application.service

 

This will remove the symbolic link that indicates the service should not start automatically.

Keep in mind that allowing the service does not initiate it in the current session. If you want to start and activate the service at boot, you must issue both commands, start and enable.

 

Monitoring the status of services

You can use the status command to check the status of a service on your system: 

systemctl status application.service

 

This will offer you the service’s status, a control group hierarchy, and the first few lines of the logbook.

When checking the status of the Nginx server, for example, you may receive the following output:

Output
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2015-01-27 19:41:23 EST; 22h ago
 Main PID: 495 (nginx)
   CGroup: /system.slice/nginx.service
           ├─495 nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
           └─496 nginx: worker process
Jan 27 19:41:23 desktop systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 27 19:41:23 desktop systemd[1]: Started A high performance web server and a reverse proxy server.

 

This offers you a good overview of the application’s current status and tells you if there are any issues or if you need to take any action.

There are various methods for verifying specific statuses. To see if a module is currently active (in use), use the is-active command:

systemctl is-active application.service

 

This will return the module’s current status, which is generally active or inactive. If activated, the output code will be “0,” making the result easier to interpret into shell scripts.

To determine whether a module is enabled, use the is-enabled command:

systemctl is-enabled application.service

 

This will output if the service is enabled or disabled and, based on the command question, will set the output code to “0” or “1.”

The third check is to see if the module has failed. This indicates that there was an issue that caused the module in question to be activated:

systemctl is-active application.service

 

This will return active if everything is well, or failed if an error occurred. If the module was halted on purpose, it may return unknown or inactive. An output status of “0” denotes a failure, while an output status of “1” indicates another status.

 

Overview of the system’s status

So far, the commands have been useful for managing individual services, but not for knowing the present condition of the system. This information is provided by a number of systemctl commands.

 

Current Modules List

You can use the list-units command to see a list of all active modules that systemd is aware of: 

ystemctl list-units

 

This will display a list of all the modules that are currently active on the system. The end result will look like this:

Output
UNIT                                      LOAD   ACTIVE SUB     DESCRIPTION
atd.service                               loaded active running ATD daemon
avahi-daemon.service                      loaded active running Avahi mDNS/DNS-SD Stack
dbus.service                              loaded active running D-Bus System Message Bus
dcron.service                             loaded active running Periodic Command Scheduler
dkms.service                              loaded active exited  Dynamic Kernel Modules System
getty@tty1.service                        loaded active running Getty on tty1

 

 

The following columns appear in the output:

 

UNIT: name of a systemd module

LOAD: shows if the module configuration was parsed by systemd. The loaded modules’ configuration is saved in memory.

ACTIVE: a summary of the module’s activity. This is a fairly standard approach of determining whether or not a module is running.

SUB: a lower level state indicating more detailed information about the module. It frequently depends on the module’s type, status, and actual mode of operation.

DESCRIPTION: a brief written explanation of what the module is and what it does.

Because the list-units command by default only displays active modules, all of the entries above will show loaded in the LOAD column and active in the ACTIVE column. This is the default behavior of the systemctl when invoked without any additional commands, therefore you will see the same thing as when you invoke the systemctl without any arguments:

systemctl

 

By passing additional flags to systemctl, we can output various information. For example, we can use the flag —all to list all the modules that systemd has loaded (or attempted to load), regardless of their present activity:

systemctl list-units --all

 

This will show all modules that systemd has loaded or attempted to load, independent of the system’s current state. After work, certain modules become dormant, and some modules that systemd attempted to load may not be found on disk.

Other flags can be used to filter these results. For example, we can use the —state= parameter to specify whether we want to observe the LOAD, ACTIVE, or SUB state. You must keep the —all flag set in order for systemctl to display inactive modules:

systemctl list-units --all --state=inactive

 

The —-type= filter is another frequent filter. We can tell systemctl to only show modules of the type we want. To display only active service modules, use:

systemctl list-units --type=service

All module files

The list-units command only lists the modules that systemd attempted to parse or load into memory. Because systemd will only read the modules it deems required, this will not necessarily be all modules accessible on the system. You can use the list-unit-files command to see all accessible module files in the systemd paths, including those that systemd has attempted to load:

systemctl list-unit-files

 

Modules are representations of resources that systemd is aware of. Because systemd does not always read all of the module definitions in this view, it just displays information on the files themselves. The output includes two columns: the module file and the status.

Output
UNIT FILE                                  STATE   
proc-sys-fs-binfmt_misc.automount          static  
dev-hugepages.mount                        static  
dev-mqueue.mount                           static  
proc-fs-nfsd.mount                         static  
proc-sys-fs-binfmt_misc.mount              static  
sys-fs-fuse-connections.mount              static  
sys-kernel-config.mount                    static  
sys-kernel-debug.mount                     static  
tmp.mount                                  static  
var-lib-nfs-rpc_pipefs.mount               static  
org.cups.cupsd.path                        enabled
. . .

 

In most cases, the status will be enabled, disabled, static, or disguised. In this context, static means that the module file lacks an install section that is needed to enable the module. These modules cannot be enabled as is. Typically, this signifies that the module is only used as a dependency on another module and should not operate on its own.

 

Module administration in Systemd

So far, we’ve worked with services to provide information about modules and module files known to systemd. However, by using some additional commands, we may obtain more particular information about the modules.

 

The module file is being displayed.

The cat command can be used to see the module file that systemd has loaded on your system (it was added in systemd version 209). For example, to view the module file of the atd scheduler daemon, type :

systemctl cat atd.service

 

Output
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target

 

Gives out he module file known to the currently running systemd process.  This is useful if you have recently edited the module files or if you override specific options in a module file fragment (we’ll go over this later).

 

Systemd display of Dependency

The list-dependents command can be used to view a module’s dependencies tree: 

systemctl list-dependencies sshd.service

 

This will show a hierarchical scheme of dependencies that must be dealt with in order for the module of interest to run. Dependencies in this sense refer to modules that are either required or desired by the modules mentioned above.

Output
sshd.service
├─system.slice
└─basic.target
  ├─microcode.service
  ├─rhel-autorelabel-mark.service
  ├─rhel-autorelabel.service
  ├─rhel-configure.service
  ├─rhel-dmesg.service
  ├─rhel-loadmodules.service
  ├─paths.target
  ├─slices.target
. . .

 

Only .target modules that define system state have recursive dependencies displayed. Add the —all flag , to recursively list all dependents.

You can use the —reverse flag to reveal reverse dependencies (modules that depend on the specified module). Other relevant flags are —before and —after, which can be used to display modules that are dependent on the specified module before and after.

 

Examining module attributes in systemd

The show command can be used to view the properties of a lower-level module. This will provide a list of the attributes declared for the selected module in the key=value format:

systemctl show sshd.service
 

 

Output
Id=sshd.service
Names=sshd.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target
After=syslog.target network.target auditd.service systemd-journald.socket basic.target system.slice
Description=OpenSSH server daemon
. . .

 

If you just want to display a single property, use the -p flag along with the property name. For example, to view the conflicts in the sshd.service module, type the following:

systemctl show sshd.service -p Conflicts

 

Output
Conflicts=shutdown.target

 

Systemd modules for masking and unmasking

We learnt how to halt or deactivate a service in the services management section, but systemd also has the ability to mark a module as fully unrunable, either automatically or manually, by associating it with /dev/null. This is known as module masking, and it is possible with the mask command:

sudo systemctl mask nginx.service

 

While the Nginx service is hidden, it cannot be started automatically or manually.

If you look in list-unit-files, you’ll notice that the service is now marked as masked:

systemctl list-unit-files

 

Output
. . .
kmod-static-nodes.service              static  
ldconfig.service                       static  
mandb.service                          static  
messagebus.service                     static  
nginx.service                          masked
quotaon.service                        static  
rc-local.service                       static  
rdisc.service                          disabled
rescue.service                         static
. . .

 

If you attempt to launch the service, you will receive the following message:

sudo systemctl start nginx.service

 

Output
Failed to start nginx.service: Unit nginx.service is masked.

 

Use the unmask command to unmask a module and make it available for use again:

sudo systemctl unmask nginx.service

 

This restores the module’s prior state, allowing it to be started or switched on.

 

Module file editing in systemd

Although the format of module files is beyond the scope of this document, systemctl includes tools for editing and updating module files when changes are required.  Systemd version 218 now has this capability.

The edit command by default will open the module file fragment for the module of interest:

sudo systemctl edit nginx.service

 

This file will be empty and can be used to override or add directives to the module specification. In /etc/systemd/system, a directory with the module name and.d appended will be created. For example, nginx.service will generate a directory called nginx.service.d.

In this directory, a file called override.conf will be produced. Systemd will link the override fragment to the whole module file in memory when the module is loaded. The directives in the sample will override those in the original module file.

You can use the —full flag to change the entire module file rather than just a fragment: 

sudo systemctl edit --full nginx.service

 

This will open the current module file in the editor for editing. After you exit the editor, the updated file will be written to /etc/systemd/system, where it will take precedence over the system module definition (which is ordinarily found in /lib/systemd/system).

To remove any changes, delete the.d module configuration directory or the changed service file from /etc/systemd/system. To delete a fragment, use the following command: 

sudo rm -r /etc/systemd/system/nginx.service.d

 

In order to erase the entire altered module file:

sudo rm /etc/systemd/system/nginx.service

 

After removing a file or directory, restart the systemd process so that it no longer attempts to refer to these files and instead uses system copies. Enter the following command to accomplish this:

sudo systemctl daemon-reload

 

Using targets to change the system state (trigger level)

Targets are special module files that describe the current state of the system or a synchronisation point. Files that define targets, like other modules, can be identified by a suffix, which in this case is.target. Targets have little meaning on their own, but they are used to combine other modules together.

They can be utilized in the same manner that other initialisation systems use trigger levels to get the system into various states. When particular functions are available, they are utilized as a reference, allowing you to describe a desired state rather than needing to employ different modules to retrieve that state.

Swap.target, for example, is used to indicate that a switch is ready for use. Modules in this process can synchronize for this purpose by specifying WantedBy= or RequiredBy= swap.target in their configuration. Modules that require the ability to switch can express this state by indicating the nature of their relationship with the requirements Wants=, Requires=, and After=.

 

Identifying and configuring a default target

When the system boots, the systemd process uses a default target. Satisfying a series of dependencies on this single goal will result in the system reaching the desired state. Type systemctl get-default to get your system’s default target.

systemctl get-default
Output
multi-user.target

 

If you want to change the default target, use set-default. For instance, if you have a graphical desktop installed and want the system to boot into that by default, you can alter the default target with following sudo command:

sudo systemctl set-default graphical.target

 

Targets that are currently available in systemd

Enter systemctl list-unit-files —type=target to get a list of available targets on your system:

systemctl list-unit-files --type=target

 

Multiple targets can be active at the same time, unlike initial levels. An active target indicates that systemd attempted to start all modules attached to the target but did not succeed. Type this to see all active targets:

systemctl list-units --type=target

 

Identifying and isolating targets

All modules associated with a target can be started, and all modules that are not part of the dependency tree can be stopped. The command necessary to accomplish this is appropriately named isolate. Changing the startup level in other initialisation systems is analogous.

If you are working in a graphical environment and have graphical.target active, you can terminate the graphical system and switch to a multi-user command line state by isolating multi-user.target. All graphical modules will be terminated since graphical.target is dependent on multi-user.target and not vice versa.

Before doing this method, you should examine the target dependencies you are isolating to ensure that critical services are not disrupted:

systemctl list-dependencies multi-user.target

 

If you are happy with the modules that will be kept active, you can isolate the target by running:

sudo systemctl isolate multi-user.target

 

For crucial events, use the rapid input combination.

Important events, such as shutdown or reboot, have targets configured. There are, however, a number of rapid input combinations for systemctl that provide additional functionality.

For example, instead of isolate rescue, you may use the rescue command to place the system into rescue mode (one user):

sudo systemctl rescue

 

This will provide an extra function to notify all connected users of the event.

You can use the halt command to stop the system:

sudo systemctl halt

 

To force a complete shutdown, use the poweroff command:

sudo systemctl poweroff

 

The reboot command can be used to initiate a restart:

sudo systemctl reboot

 

All of this will notify connected users that an event is taking place; something that simply executes or isolates the target will not function. It should be noted that in order for these actions to operate effectively with systemd, most machines will bind shorter, more typical instructions.

For example, to restart the system, typically enter the following:

sudo reboot

 

If you are happy with the modules that will be kept active, you can isolate the target by running:

sudo systemctl isolate multi-user.target

 

Conclusion

You should be familiar with some of the basic functions of the systemctl command, which allows you to interface with and control a systemd instance, at this point. The systemctl utility will serve as the primary interface for managing services and system status.

Although systemctl is primarily responsible for the primary systemd process, various components of the systemd ecosystem are managed by other tools. Log management and user sessions, for example, are handled by different daemons and management programs (journald/journalctl and logind/loginctl, respectively). Understanding these other tools and daemons will help with management.

 

Share on facebook
Share on linkedin
Share on twitter
Share on pinterest
Share on email

Related News