Topik ini meletakkan dasar kerja dengan systemd, yaitu init system yang mengatur urutan proses pada hampir semua distro Linux modern. Pembahasannya mencakup posisi systemd sebagai proses pertama, unit sebagai satuan kerja yang dikelolanya, serta target sebagai titik pengelompokan unit. Setelah membacanya, istilah unit dan target pada perintah pengelolaan layanan dapat dibaca dengan makna yang tepat.
Init dan posisi PID 1#
Sistem init (init system) adalah program pertama yang dijalankan kernel setelah urutan menyalakan perangkat selesai, dan program itu memegang PID 1. Tugasnya menyusun sisa sistem, yaitu memasang sistem berkas, menjalankan layanan, dan menyiapkan lingkungan kerja bagi pengguna. Program ini juga mengadopsi proses yang induknya berakhir lebih dahulu, sehingga tidak ada proses yang tak bertuan. Karena kedudukannya, init tidak boleh berhenti selama sistem hidup, dan kegagalan init berarti kegagalan boot secara keseluruhan.
Ubuntu dan Debian menempatkan systemd pada kedudukan tersebut. Nama lama program init adalah /sbin/init, dan kini systemd yang mengisi peran itu, sehingga kedua istilah sering dipakai secara bergantian. Pada lingkungan latihan jalur ini, proses pertama justru tini, yaitu program penjaga container, karena container tidak menjalankan proses boot yang lengkap:
# nama program yang memegang PID 1 pada lingkungan latihan ini
ps -p 1 -o comm=tiniPada mesin Ubuntu atau Debian yang dinyalakan secara penuh, perintah yang sama menampilkan systemd. Seluruh perkakas pada modul ini, yaitu systemctl dan journalctl, serta penjadwalan dengan timer mengasumsikan systemd berjalan sebagai proses pertama. Karena itu, latihannya dilakukan pada mesin virtual atau mesin fisik, bukan di dalam container tanpa systemd.
Unit sebagai satuan kerja#
Unit adalah satuan kerja yang dikelola systemd, dan setiap unit didefinisikan oleh sebuah berkas teks berformat INI. Nama unit sama dengan nama berkasnya, misalnya ssh.service atau arsip-cadangan.timer, sehingga menulis berkas berarti mendefinisikan unit. systemctl mengoperasikan unit melalui namanya, baik untuk menjalankan, menghentikan, maupun membaca keadaannya. systemd tidak hanya mengelola layanan, karena jenis unit mencakup banyak objek sistem lain, sebagaimana tabel berikut.
| Jenis unit | Tugasnya |
|---|---|
.service | menjalankan program layanan (daemon) atau tugas sekali jalan |
.timer | memicu unit lain menurut jadwal waktu |
.socket | mendengarkan port atau soket, lalu memicu layanan saat permintaan datang |
.mount | memasang sistem berkas pada titik kaitnya |
.target | mengelompokkan unit lain sebagai titik sinkronisasi |
Jenis .service paling sering ditemui, sedangkan jenis .timer dibahas khusus pada topik timer di modul ini. Jenis .socket memperlihatkan ciri systemd yang khas, yaitu layanan baru dijalankan ketika permintaan pertama tiba, sehingga program yang jarang dipakai tidak menempati memori saat menganggur. Daftar unit yang sedang dimuat dapat dilihat dengan systemctl list-units, dan opsi --type=service membatasinya pada layanan saja:
# tidak-dijalankan
# systemd tidak berjalan pada sandbox container, sehingga perintah ini gagal di sana
systemctl list-units --type=servicePada mesin dengan systemd, keluarannya berupa tabel dengan kolom UNIT, LOAD, ACTIVE, dan DESCRIPTION untuk setiap unit, sehingga keadaan seluruh layanan terbaca dalam satu layar.
Nama unit tersusun atas nama dasar dan akhiran jenis, misalnya arsip-cadangan.service yang terdiri atas arsip-cadangan dan .service. Dua unit dengan nama dasar sama dapat hidup berdampingan selama jenisnya berbeda, dan pola inilah yang dipakai oleh pasangan layanan dan timer. Letak berkasnya juga terbagi dua, yaitu /usr/lib/systemd/system untuk unit bawaan distro dan /etc/systemd/system untuk unit buatan pengelola, dan systemd menggabungkan keduanya saat dimuat.
Target sebagai pengganti runlevel#
Target adalah jenis unit yang berfungsi mengelompokkan unit lain dan menjadi titik sinkronisasi proses boot. Konsep ini menggantikan runlevel pada sistem init lama. Runlevel adalah tingkat keadaan sistem, seperti mode perbaikan satu pengguna atau mode penuh. Sebuah target dinyatakan tercapai apabila seluruh unit anggotanya sudah aktif, sehingga unit lain dapat menunggu target tersebut sebelum dijalankan. Target yang dicapai saat boot ditentukan oleh default.target, yang biasanya menunjuk graphical.target pada mesin desktop dan multi-user.target pada server.
| Runlevel lama | Target penggantinya | Kondisi sistem |
|---|---|---|
| 0 | poweroff.target | sistem dimatikan |
| 1 | rescue.target | mode perbaikan satu pengguna |
| 3 | multi-user.target | penuh, tanpa antarmuka grafis |
| 5 | graphical.target | penuh dengan antarmuka grafis |
| 6 | reboot.target | sistem dimulai ulang |
Sebagian besar pekerjaan administrasi tidak menyentuh target secara langsung, tetapi namanya muncul di banyak tempat, misalnya pada bagian [Install] berkas unit dan pada keluaran systemctl list-units --type=target:
# tidak-dijalankan
# systemd tidak berjalan pada sandbox container, sehingga perintah ini gagal di sana
systemctl list-units --type=targetTarget bawaan dapat dilihat dengan systemctl get-default dan diubah dengan systemctl set-default, misalnya systemctl set-default multi-user.target untuk menjadikan server boot tanpa antarmuka grafis. Nilai default.target sendiri berupa tautan simbolik ke salah satu target, sehingga mengubah tautan itu berarti mengubah wujud sistem setelah boot. Server tanpa kebutuhan grafis lazim diarahkan ke multi-user.target agar sumber dayanya tidak habis untuk antarmuka grafis yang tidak digunakan.
Alur boot dari kernel sampai layanan#
Diagram berikut merangkum posisi systemd sejak awal proses menyala. Kernel memulai systemd sebagai proses pertama, systemd membaca target bawaannya, dan target menarik unit-unit layanan yang menjadi anggotanya.
Urutan pengerjaan unit diatur dengan dua mekanisme yang saling melengkapi. Direktif After= menetapkan urutan, misalnya layanan web diberi After=network.target agar jaringan siap lebih dahulu. Direktif Wants= atau Requires= menetapkan tarikan, yaitu unit mana yang ikut diaktifkan. Dari dua informasi itu, systemd menjalankan unit yang tidak berhubungan secara paralel, sehingga proses boot jauh lebih cepat daripada eksekusi berurutan pada skrip init lama.
Selama unit hidup, systemd terus mengawasinya. Layanan yang berhenti mendadak tercatat, dan layanan yang dikonfigurasi dengan Restart=on-failure dijalankan ulang secara otomatis. Peristiwa setiap unit juga dikumpulkan oleh systemd-journald, layanan pencatat log yang pengkueriannya dibahas pada topik journalctl.
Kesalahan umum#
- Menyamakan systemd dengan systemctl. systemd adalah proses manajernya, sedangkan systemctl adalah klien baris perintah untuk berbicara dengannya, sehingga systemctl gagal pada sistem yang tidak menjalankan systemd.
- Mengira target adalah program yang berjalan. Target hanyalah pengelompok unit dan titik sinkronisasi, bukan proses dengan PID sendiri.
- Menganggap PID 1 selalu systemd. Container menjalankan program apa pun sebagai proses pertamanya, dan contoh pada lingkungan latihan ini adalah
tini. - Menghilangkan akhiran jenis pada nama unit. systemctl menganggap nama tanpa akhiran berarti
.service, sehinggasystemctl status arsip-cadangantidak pernah menunjukarsip-cadangan.timer. Tulis akhirannya secara eksplisit untuk jenis selain layanan.
Ringkasan#
- systemd adalah init system yang berjalan dengan PID 1. Tugasnya mencakup : memulai layanan sistem, mengawasi proses yang berjalan, serta mengadopsi proses yang tidak lagi memiliki proses induk.
- Unit adalah satuan kerja yang didefinisikan berkas teks berformat INI, dengan
.servicedan.timersebagai jenis yang paling sering dipakai. - Target mengelompokkan unit dan menggantikan runlevel, dengan
multi-user.targetdangraphical.targetsebagai tujuan boot yang lazim. - Dependensi antarunit diatur dengan
After=untuk urutan sertaWants=danRequires=untuk tarikan, sehingga unit yang bebas dependensi dijalankan paralel.
Referensi#
- systemd(1) — freedesktop.org — Dokumentasi resmi systemd sebagai init system beserta tugas-tugasnya saat boot.
- bootup(7) — freedesktop.org — Urutan proses boot systemd dari firmware sampai target tercapai.
- systemd.unit(5) — freedesktop.org — Format berkas unit umum dan daftar jenis unit yang dikenal systemd.