Dasar

systemd: apa itu, cara kerjanya, dan cara mengelola layanan di Linux

Diperbarui: · Skillaria.Top

systemd adalah sistem inisialisasi dan pengelola layanan Linux: kernel menjalankannya sebagai proses pertama (PID 1), lalu ia menyalakan layanan lain sesuai urutan dan mengawasinya. Semua yang dikelola systemd dideskripsikan dalam bentuk unit — layanan, timer, titik mount — dan dikelola dengan systemctl, sedangkan journalctl menampilkan log-nya.

systemd adalah sistem inisialisasi dan pengelola layanan yang dipakai di sebagian besar distribusi Linux modern: Debian, Ubuntu, Fedora, RHEL, dan turunannya. Setelah boot, kernel menjalankan systemd sebagai proses pertama dengan PID 1, lalu systemd menyalakan jaringan, memasang disk, menjalankan web server, basis data, dan semua layanan lain. Jika dijawab singkat, systemd adalah "pengatur" yang tahu layanan apa yang harus berjalan, dalam urutan apa dinyalakan, dan apa yang harus dilakukan jika sebuah layanan jatuh.

Memastikan bahwa sistem Anda memakai systemd cukup mudah:

$ ps -p 1 -o comm=
systemd

Mengapa systemd diciptakan

Dulu Linux memakai SysV init: kumpulan skrip shell di /etc/init.d/ yang dijalankan satu per satu. Cara ini mudah dipahami tetapi lambat dan rapuh. Setiap skrip menulis berkas PID sendiri, memutuskan sendiri cara memeriksa apakah proses masih hidup, dan memulai ulang layanan yang jatuh harus dibuat secara terpisah.

systemd menyelesaikan masalah-masalah ini secara terpusat:

  • Peluncuran paralel. Layanan dinyalakan bersamaan selama tidak ada ketergantungan di antaranya, sehingga boot lebih cepat.
  • Ketergantungan dan urutan. Deskripsi layanan menyatakan secara eksplisit apa yang dibutuhkannya (misalnya jaringan) dan setelah apa ia harus dijalankan.
  • Pengawasan. systemd mengenali semua proses layanan melalui cgroups dan dapat memulai ulangnya saat terjadi kegagalan.
  • Satu jurnal. Keluaran semua layanan dikumpulkan oleh journald dan dibaca dengan satu perintah.
  • Antarmuka yang seragam. Setiap layanan dikelola dengan cara yang sama: systemctl start|stop|restart|status.

Selain pengelola layanan, proyek systemd mencakup beberapa komponen: journald (log), logind (sesi pengguna), timesyncd (sinkronisasi waktu), resolved (DNS), dan networkd (jaringan). Tidak semua distribusi memakai semuanya, tetapi systemd sebagai PID 1 dan journald hampir selalu ada.

Unit: komponen systemd

Semua yang dikelola systemd dideskripsikan oleh unit. Unit adalah berkas teks berformat INI, dan jenisnya ditentukan oleh ekstensinya.

JenisEkstensiYang dideskripsikan
service.servicelayanan — proses daemon atau tugas sekali jalan
timer.timermenjalankan unit lain sesuai jadwal (pengganti cron)
socket.socketsocket yang menyalakan layanan saat diakses
target.targetkelompok unit, yaitu "keadaan sistem" (misalnya multi-user.target)
mount.mounttitik pemasangan (mount point)
path.pathpemantauan berkas atau direktori

Lokasi berkas unit

Berkas unit disimpan di beberapa direktori, dan masing-masing memiliki prioritas:

  • /usr/lib/systemd/system/ (di Debian dan Ubuntu juga /lib/systemd/system/) — unit yang dipasang oleh paket. Jangan diedit langsung: pembaruan paket akan menimpa perubahan Anda.
  • /etc/systemd/system/ — unit dan penimpaan dari administrator. Prioritasnya paling tinggi.
  • /run/systemd/system/ — unit sementara yang dibuat saat sistem berjalan.

Untuk melihat isi unit beserta semua penimpaannya, gunakan systemctl cat nginx.service.

Target sebagai pengganti runlevel

Runlevel lama digantikan oleh target. multi-user.target adalah mode server biasa tanpa grafis, graphical.target dengan antarmuka grafis, dan rescue.target adalah mode pemulihan single-user. Target default ditampilkan dengan systemctl get-default dan diubah dengan systemctl set-default multi-user.target.

systemctl: mengelola layanan

systemctl adalah alat utama untuk bekerja dengan systemd. Sebagian besar perintahnya mengubah keadaan sistem dan membutuhkan sudo.

PerintahFungsi
systemctl status nginxstatus layanan, PID, memori, beberapa baris log terakhir
systemctl start nginxmenjalankan sekarang
systemctl stop nginxmenghentikan
systemctl restart nginxmemulai ulang (stop + start)
systemctl reload nginxmemuat ulang konfigurasi tanpa berhenti (jika layanan mendukungnya)
systemctl enable nginxmengaktifkan autostart
systemctl disable nginxmenonaktifkan autostart
systemctl enable --now nginxmengaktifkan autostart dan langsung menjalankan
systemctl is-active nginxmenampilkan active/inactive — praktis di dalam skrip
systemctl list-units --type=servicelayanan yang sudah dimuat
systemctl --failedunit yang gagal
systemctl daemon-reloadmembaca ulang berkas unit setelah diedit

Cara membaca systemctl status

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-10-12 09:14:03 UTC; 2h 5min ago
       Docs: man:nginx(8)
   Main PID: 812 (nginx)
      Tasks: 3 (limit: 2307)
     Memory: 6.1M
        CPU: 154ms
     CGroup: /system.slice/nginx.service
             ├─812 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─813 "nginx: worker process"
             └─814 "nginx: worker process"

Baris Loaded menunjukkan dari mana unit diambil dan apakah autostart aktif (enabled). Baris Active adalah keadaan saat ini: active (running), inactive (dead), atau failed. Blok CGroup memperlihatkan semua proses layanan — begitulah systemd mengetahui proses mana yang menjadi miliknya.

Beda enable dan start

Ini sering membingungkan. start menjalankan layanan sekarang, tetapi setelah reboot layanan tidak ikut naik. enable membuat tautan simbolik di direktori target (misalnya /etc/systemd/system/multi-user.target.wants/), sehingga layanan naik saat boot, tetapi tidak dijalankan sekarang. Biasanya Anda membutuhkan keduanya — gunakan enable --now.

Ada juga keadaan ketiga, yaitu mask. systemctl mask service menghubungkan unit ke /dev/null, sehingga unit tidak bisa dijalankan, baik manual maupun sebagai dependensi. Berguna ketika sebuah layanan harus benar-benar dimatikan.

journalctl: log layanan

Semua yang ditulis layanan ke stdout dan stderr ditangkap oleh systemd-journald dan disimpan dalam jurnal biner bersama metadatanya: nama unit, PID, prioritas, dan waktu. Jurnal dibaca dengan journalctl.

journalctl -u nginx              # log satu layanan
journalctl -u nginx -f           # memantau real-time, seperti tail -f
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -n 50        # 50 baris terakhir
journalctl -b                    # sejak boot saat ini
journalctl -b -1                 # boot sebelumnya
journalctl -p err -b             # hanya error dan yang lebih berat
journalctl -k                    # pesan kernel
journalctl --disk-usage          # ruang yang dipakai jurnal

Opsi -p menyaring menurut prioritas syslog: emerg, alert, crit, err, warning, notice, info, debug. Level yang ditentukan ikut menampilkan semua yang lebih berat darinya.

Jurnal setelah reboot

Jika direktori /var/log/journal tidak ada dan di /etc/systemd/journald.conf tertulis Storage=auto, jurnal hanya disimpan di memori (/run/log/journal) dan hilang saat reboot. Agar permanen, atur Storage=persistent atau buat direktorinya lalu restart journald. Ukurannya dibatasi oleh SystemMaxUse=, dan data lama dibersihkan dengan journalctl --vacuum-time=2weeks atau --vacuum-size=500M.

journald sering dipasangkan dengan rsyslog: journal meneruskan pesan ke rsyslog, yang menulis berkas teks klasik di /var/log/ dan dapat mengirim log ke server pusat.

Autostart layanan sendiri: contoh unit file

Misalkan Anda punya aplikasi — skrip atau binari — yang harus terus berjalan, naik saat boot, dan dimulai ulang jika jatuh. Buat berkas /etc/systemd/system/myapp.service:

[Unit]
Description=My web application
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp/env
ExecStart=/opt/myapp/bin/server --port 8080
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Mari kita bahas bagian-bagiannya:

  • [Unit] — deskripsi dan ketergantungan. After= hanya menentukan urutan, Wants= adalah ketergantungan lunak (ikut dinyalakan, tetapi tidak gagal jika unit itu tidak naik). Ketergantungan keras adalah Requires=.
  • [Service] — cara menjalankan. Type=simple berarti proses dari ExecStart adalah layanan itu sendiri dan tidak berpindah ke latar belakang. User= menjalankan layanan dengan pengguna tanpa hak istimewa. Restart=on-failure memulai ulang layanan jika berakhir dengan error, setelah RestartSec detik.
  • [Install] — apa yang dilakukan enable. WantedBy=multi-user.target berarti "jalankan pada boot biasa".

Menerapkannya:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp
journalctl -u myapp -f

Kesalahan umum di unit file

  • Path relatif di ExecStart. Path ke program harus absolut. systemd tidak mencari perintah di PATH pengguna seperti shell.
  • Lupa daemon-reload. Setelah berkas diedit, systemd masih memakai versi lama dan memperingatkannya di status.
  • Daemon berpindah ke latar belakang. Jika program melakukan fork sendiri tetapi ditulis Type=simple, systemd menganggap layanan sudah selesai. Jalankan program dalam mode foreground, atau gunakan Type=forking dengan PIDFile=.
  • Variabel lingkungan dari profil. Layanan tidak membaca ~/.bashrc dan /etc/profile. Variabel diatur lewat Environment= atau EnvironmentFile=.

Penimpaan tanpa mengubah unit dari paket

Untuk mengubah parameter layanan dari paket tanpa menyentuh berkasnya, gunakan drop-in:

sudo systemctl edit nginx

Editor akan terbuka, dan perubahan disimpan di /etc/systemd/system/nginx.service.d/override.conf. Misalnya, Anda bisa menambahkan [Service] dan Restart=always. Setelah editor ditutup, systemd memuat ulang konfigurasinya secara otomatis.

Timer systemd sebagai pengganti cron

Timer adalah unit yang menjalankan layanan dengan nama yang sama sesuai jadwal. Kelebihannya dibanding cron: log tugas tersimpan di journal, ada ketergantungan, dan jalannya yang terlewat bisa dikejar (Persistent=true). Contoh cadangan harian:

# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers

Ekspresi OnCalendar bisa diuji dengan systemd-analyze calendar "*-*-* 03:00:00", yang akan menampilkan waktu eksekusi berikutnya.

Diagnostik boot

systemd menyimpan waktu mulai setiap unit, sehingga boot yang lambat mudah dianalisis:

systemd-analyze                  # total waktu boot
systemd-analyze blame            # unit diurutkan menurut waktu mulai
systemd-analyze critical-chain   # rantai yang menunda boot
systemd-analyze verify /etc/systemd/system/myapp.service   # memeriksa unit file

Kesimpulan

systemd adalah PID 1 dan pengelola layanan di Linux modern. Ia mendeskripsikan segalanya dengan unit, dikendalikan dengan systemctl, mengumpulkan log ke dalam jurnal yang dibaca dengan journalctl, dan dapat menjalankan tugas dengan timer sebagai pengganti cron. Untuk memakainya dengan percaya diri, cukup kuasai status, enable --now, journalctl -u, dan kemampuan menulis unit file sederhana dengan Restart=on-failure. systemd, journald, dan pencatatan log dibahas dengan praktik dalam kursus Linux.

Pertanyaan umum

Bagaimana cara memastikan sistem saya memakai systemd?

Jalankan ps -p 1 -o comm= — jika keluarannya systemd, sistem berjalan dengan systemd. Direktori /run/systemd/system juga hanya ada jika sistem di-boot dengan systemd.

Apa bedanya systemctl restart dan reload?

restart menghentikan lalu menjalankan ulang layanan sepenuhnya, sehingga koneksi terputus. reload meminta layanan memuat ulang konfigurasinya tanpa berhenti, tetapi hanya berfungsi jika unit memiliki ExecReload.

Bisakah layanan systemd dijalankan tanpa sudo oleh pengguna biasa?

Bisa, systemd memiliki instance pengguna: unit diletakkan di ~/.config/systemd/user/ dan dikelola dengan systemctl --user. Agar tetap berjalan tanpa sesi aktif, aktifkan loginctl enable-linger untuk pengguna tersebut.

Mengapa layanan berstatus failed dan bagaimana mereset statusnya?

Cari penyebabnya di journalctl -u nama -b dan di baris Active pada status. Setelah masalah diperbaiki, jalankan layanan lagi; penanda failed dihapus dengan systemctl reset-failed.

Di mana log systemd disimpan di disk?

Jika penyimpanan permanen aktif, di /var/log/journal/ dalam format biner; jika tidak, di /run/log/journal/ di memori. Bacalah lewat journalctl, bukan dengan utilitas teks.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.

Ke kursus