Table of Contents
- What is systemd?
- Core Components of systemd
- Key Concepts: Units, Targets, and the Journal
- Basic
systemctlCommands - Advanced
systemctlOperations - Creating Custom Services with systemd
- systemd Timers: An Alternative to Cron
- Debugging and Troubleshooting systemd
- Advantages and Criticisms of systemd
- Conclusion
- References
What is systemd?
systemd (pronounced “system-dee”) is a system and service manager for Linux operating systems. It is designed to initialize the system, manage user sessions, and control background services (daemons) from boot to shutdown.
Key Roles:
- PID 1: systemd is the first process started by the Linux kernel (with Process ID 1), making it the parent of all other processes.
- Service Management: Starts, stops, restarts, and monitors system services (e.g.,
sshd,nginx). - Dependency Handling: Ensures services start in the correct order based on dependencies (e.g., a web server starts only after the network is up).
- Parallelization: Speeds up boot time by starting independent services simultaneously.
- Unified Tooling: Replaces scattered tools (e.g.,
sysvinit,cron,atd,syslog) with a single suite.
Adoption:
systemd is used by most major Linux distributions, including:
- Ubuntu (15.04+), Debian (8+), Fedora (15+), CentOS (7+), RHEL (7+), Arch Linux, and openSUSE.
Core Components of systemd
systemd is not a single tool but a collection of daemons, libraries, and utilities. Here are its most critical components:
| Component | Purpose |
|---|---|
systemd | The main init daemon (PID 1), responsible for system initialization. |
systemctl | Command-line tool to control systemd and manage services. |
journald | Collects and stores system logs in a binary format (replaces syslog). |
udev | Manages device detection and initialization (e.g., USB drives, printers). |
logind | Handles user sessions, login, and power management (e.g., suspend). |
networkd | Manages network interfaces and connections (alternative to NetworkManager). |
timedated | Synchronizes system time with NTP servers. |
systemd-analyze | Diagnoses system boot performance and unit file issues. |
Key Concepts: Units, Targets, and the Journal
To master systemd, you need to understand three foundational concepts: units, targets, and the journal.
Units: The Building Blocks
A unit is a configuration file that describes a system resource (service, socket, device, etc.). systemd uses units to manage and track resources.
Types of Units:
systemd supports 12 unit types (full list here), but the most common are:
.service: A background service (e.g.,nginx.service)..target: A group of units (similar to “runlevels” in SysVinit)..socket: A network or IPC socket (enables on-demand service activation)..timer: A schedule for triggering services (replacescronjobs)..mount/.automount: Controls filesystem mounting.
Unit File Locations:
Units are stored in these directories (searched in order):
/etc/systemd/system/: User-defined units (highest priority)./run/systemd/system/: Runtime-generated units./usr/lib/systemd/system/: Distribution-provided units (lowest priority).
Targets: Replacing Runlevels
Targets are special unit files that group other units to define system states (e.g., “multi-user mode” or “graphical mode”). They replace the legacy “runlevels” of SysVinit.
Common Targets vs. Runlevels:
| Runlevel (SysVinit) | Target (systemd) | Description |
|---|---|---|
| 0 | poweroff.target | Shutdown the system. |
| 1/S | rescue.target | Single-user mode (no networking). |
| 2 | multi-user.target | Multi-user mode (no GUI, default on servers). |
| 3 | multi-user.target | Same as runlevel 2 in systemd. |
| 4 | multi-user.target | Same as runlevel 2 in systemd. |
| 5 | graphical.target | Multi-user mode with GUI (default on desktops). |
| 6 | reboot.target | Reboot the system. |
To view the default target:
systemctl get-default
To set a new default target (e.g., multi-user.target):
sudo systemctl set-default multi-user.target
The Journal: Binary Logging
systemd uses journald to collect logs from the kernel, services, and applications. Unlike traditional text-based logs (stored in /var/log/), the journal is binary—optimized for speed, compression, and metadata (e.g., timestamps, service names).
Key journalctl Commands:
- View all logs (paginated):
journalctl - View logs for a specific service (e.g.,
nginx):journalctl -u nginx - View logs since a specific time (e.g., “today” or “2 hours ago”):
journalctl --since "today" -u sshd - View only error logs (priority 3 or higher):
journalctl -p err - Follow real-time logs (like
tail -f):journalctl -u nginx -f
Basic systemctl Commands
systemctl is the primary tool for interacting with systemd. Here are the most essential commands for managing services:
| Command | Purpose | Example |
|---|---|---|
systemctl start <service> | Start a service immediately. | sudo systemctl start nginx |
systemctl stop <service> | Stop a service immediately. | sudo systemctl stop nginx |
systemctl restart <service> | Stop and restart a service. | sudo systemctl restart nginx |
systemctl reload <service> | Reload configuration without stopping. | sudo systemctl reload nginx |
systemctl enable <service> | Start service automatically on boot. | sudo systemctl enable nginx |
systemctl disable <service> | Disable auto-start on boot. | sudo systemctl disable nginx |
systemctl status <service> | Check service status (running, failed, etc.). | systemctl status nginx |
Example output of systemctl status nginx:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2024-03-12 10:00:00 UTC; 5min ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 2 (limit: 4915)
Memory: 3.5M
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─1235 nginx: worker process
Advanced systemctl Operations
Beyond the basics, systemctl offers powerful tools for managing services:
Masking and Unmasking Services
- Mask: Prevent a service from starting (even manually). Creates a symlink to
/dev/nullin the unit file directory.sudo systemctl mask nginx - Unmask: Re-enable a masked service.
sudo systemctl unmask nginx
Editing Unit Files
To modify a service’s configuration, edit its unit file with:
sudo systemctl edit nginx
This creates an override file in /etc/systemd/system/nginx.service.d/override.conf, preserving the original unit file.
To edit the full unit file directly (use with caution!):
sudo systemctl edit --full nginx
Reloading systemd Daemon
After editing unit files, reload systemd to apply changes:
sudo systemctl daemon-reload
Checking Dependencies
List a service’s dependencies (units that must start before it):
systemctl list-dependencies nginx
Listing Units
- List all active units:
systemctl list-units - List all installed service units (including inactive):
systemctl list-unit-files --type=service
Creating Custom Services with systemd
One of systemd’s most powerful features is the ability to create custom service files for your applications. Let’s walk through building a service for a simple Python web server.
Step 1: Create the Application
Save this as ~/myapp.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello from systemd!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Step 2: Create the Service File
Create a unit file at /etc/systemd/system/myapp.service (requires sudo):
[Unit]
Description=My Custom Python Web App
After=network.target # Start after the network is ready
[Service]
User=ubuntu # Run as the "ubuntu" user
WorkingDirectory=/home/ubuntu # Where the app is stored
ExecStart=/usr/bin/python3 /home/ubuntu/myapp.py # Command to start the app
Restart=always # Restart if the app crashes
RestartSec=5 # Wait 5 seconds before restarting
[Install]
WantedBy=multi-user.target # Start when the system reaches multi-user mode
Step 3: Enable and Start the Service
sudo systemctl daemon-reload # Reload systemd to detect the new unit
sudo systemctl enable myapp # Auto-start on boot
sudo systemctl start myapp # Start immediately
Verify it’s running:
systemctl status myapp
curl http://localhost:5000 # Should return "Hello from systemd!"
systemd Timers: An Alternative to Cron
systemd timers are a flexible replacement for cron jobs. They trigger services at specific times or intervals, with better logging and dependency handling.
How Timers Work
A timer unit (.timer) works with a service unit (.service). When the timer elapses, it starts the associated service.
Example: Daily Backup Timer
Let’s create a timer to run a backup script daily at 3 AM.
Step 1: Create the Backup Script
Save as ~/backup.sh (make it executable with chmod +x backup.sh):
#!/bin/bash
rsync -av /home/ubuntu/documents /mnt/backup/
Step 2: Create the Service Unit
/etc/systemd/system/backup.service:
[Unit]
Description=Daily Backup Service
[Service]
User=ubuntu
ExecStart=/home/ubuntu/backup.sh
Step 3: Create the Timer Unit
/etc/systemd/system/backup.timer:
[Unit]
Description=Run backup daily at 3 AM
[Timer]
OnCalendar=*-*-* 03:00:00 # Run daily at 3:00 AM
Persistent=true # Run missed jobs if the system was off
Unit=backup.service # Service to trigger
[Install]
WantedBy=timers.target # Start timer on boot
Step 4: Enable and Start the Timer
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer # Enable and start immediately
Key Timer Commands:
- List all timers:
systemctl list-timers - Check timer status:
systemctl status backup.timer - View timer logs:
journalctl -u backup.timer -u backup.service
Debugging and Troubleshooting systemd
Even with systemd’s reliability, issues can arise. Here’s how to diagnose common problems:
1. Service Fails to Start
- Check the service status for errors:
systemctl status myapp - View detailed logs with
journalctl:journalctl -u myapp --since "10 minutes ago"
2. Unit File Syntax Errors
Validate a unit file’s syntax:
sudo systemd-analyze verify /etc/systemd/system/myapp.service
3. Slow Boot Time
Identify services delaying boot with systemd-analyze blame:
systemd-analyze blame
This lists units by startup time (e.g., 10.234s NetworkManager.service).
4. Missing Dependencies
Use systemctl list-dependencies --reverse <service> to see what depends on a service, or systemd-analyze plot > boot.svg to generate a boot timeline graph.
Advantages and Criticisms of systemd
Advantages:
- Faster Boot: Parallelizes service startup, reducing boot time.
- Unified Tooling: Replaces fragmented tools (cron, syslog, init) with a single suite.
- Dependency Management: Ensures services start in the correct order.
- On-Demand Activation: Sockets and timers start services only when needed (saves resources).
- Rich Logging: The journal provides structured, searchable logs with metadata.
Criticisms:
- Complexity: Critics argue systemd is bloated and overly complex for an init system.
- Binary Logs: Some dislike the binary journal, preferring human-readable text logs.
- Vendor Lock-in: Tight integration with systemd makes it hard to switch to alternative init systems.
- Learning Curve: New users must learn
systemctland unit files, unlike simpler SysVinit scripts.
Conclusion
systemd has revolutionized Linux service management, offering a powerful, unified framework for initializing systems, managing services, and handling logs. While it has its critics, its adoption across major distributions speaks to its effectiveness.
By mastering systemctl, unit files, targets, and the journal, you’ll gain fine-grained control over your Linux system. Whether you’re a developer running a small app or a sysadmin managing a fleet of servers, systemd is an essential tool in your toolkit.