Chapter sebelumnya kita menata urutan hidup-mati antar service dengan Wants, Requires, dan After. Pertanyaan yang belum terjawab: siapa yang memutuskan service mana yang dinyalakan ketika komputer boot, dan pada level apa sistem berjalan? Pada zaman SysV init jawabannya adalah runlevel — angka 0 sampai 6 yang menandai mode operasi mesin. systemd mewarisinya lewat target: unit yang tidak menjalankan program apa pun, melainkan mengumpulkan unit lain seperti service, mount, dan socket ke dalam satu titik temu. Chapter ini membedah cara kerja target, memetakan runlevel klasik kepadanya, lalu menunjukkan cara membaca dan mengubah target bawaan sistem.
Target: Keranjang yang Mengumpulkan Unit #
Sebuah target adalah unit dengan akhiran .target yang berperan sebagai milestone: ketika graphical.target aktif, kita tahu seluruh service yang dikumpulkannya — display manager, network, logger — telah siap. File target tidak berisi ExecStart, karena target tidak menjalankan apa pun. Isinya adalah metadata dan relasi terhadap unit lain. Kita bisa membacanya langsung dari file milik distribusi:
grep -E '^(Description|Requires|Wants|After)' /lib/systemd/system/graphical.targetOutput yang Dihasilkan:
Description=Graphical Interface
Requires=multi-user.target
Wants=display-manager.service
After=multi-user.target rescue.service rescue.target display-manager.serviceBaris komentar lisensi yang panjang tersaring keluar oleh grep, sehingga hanya directive inti yang tampil. Mari kita bedah keempat barisnya:
Description=Graphical Interface: nama target yang muncul di outputsystemctl statusdansystemctl list-units— teks ini ditujukan untuk manusia, bukan mesin.Requires=multi-user.target: mode grafis menuntut mode multi-user aktif lebih dulu. Saat systemd mengaktifkangraphical.target, systemd otomatis menarik seluruh graf dependensimulti-user.target.Wants=display-manager.service: layar login grafis seperti GDM atau LightDM ditarik lewatWants— bila gagal dinyalakan, target tetap dianggap berhasil. HubunganWantsversusRequireskita bahas tuntas di Chapter Service Dependencies .After=multi-user.target rescue.service ...: urutan — semua unit di daftar ini harus selesai dinyalakan sebelumgraphical.targetsendiri dinyatakan aktif.
Selain relasi di file, ada mekanisme kedua yang bekerja lewat nama folder: direktori <nama-target>.wants/. Setiap symlink di dalamnya dihitung sebagai relasi Wants. Dua contohnya nyata di sistem Debian:
ls /etc/systemd/system/getty.target.wants/ /etc/systemd/system/multi-user.target.wants/Output yang Dihasilkan:
/etc/systemd/system/getty.target.wants/:
[email protected]
/etc/systemd/system/multi-user.target.wants/:
remote-fs.targetIsi folder ini berbeda-beda antar mesin sesuai paket yang terpasang, tetapi polanya sama:
getty.target.wants/[email protected]: prompt login di console pertama. Unit template[email protected]dibuat instance-nya per terminal — mekanisme template ini kita bedah di Chapter systemd Units .multi-user.target.wants/remote-fs.target: target filesystem jauh (NFS dan sejenisnya) ditarik masuk mode multi-user secara bawaan.- Pola umumnya: ketika kita menjalankan
systemctl enable nama.service, yang sebenarnya terjadi adalah pembuatan symlink di folder.wantsmilik target yang tertulis di section[Install]unit tersebut.
Untuk melihat target mana yang sedang aktif, perintahnya satu baris. Berikut contoh tampilan hasilnya di sesi desktop yang normal:
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
getty.target loaded active active Login Prompts
graphical.target loaded active active Graphical Interface
multi-user.target loaded active active Multi-User System
sockets.target loaded active active Sockets
timers.target loaded active active Timers
6 loaded units listed. Pass --all to see loaded but inactive units, too.Perhatikan bahwa keenam target aktif bersamaan. Inilah perbedahan konseptual terbesar dari runlevel: runlevel bersifat eksklusif — satu angka pada satu waktu — sedangkan target hanyalah kumpulan unit, jadi banyak target boleh aktif serentak. timers.target dan sockets.target tidak saling menggantikan multi-user.target; semuanya hidup berdampingan.
Peta Runlevel Klasik ke Target #
Distribusi lama mengenal runlevel 0-6 dengan makna baku, dan admin senior masih menyebutnya sampai sekarang — perintah who -r pun masih melaporkannya. systemd tidak membuang konsep tersebut, melainkan menyediakan nama alias berupa symlink runlevelN.target. Karena symlink, pemetaannya bisa kita baca langsung dari disk:
for r in 0 1 2 3 4 5 6; do
printf 'runlevel%s.target -> %s\n' "$r" "$(readlink /lib/systemd/system/runlevel$r.target)"
doneOutput yang Dihasilkan:
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.targetMari kita bedah pemetaannya:
runlevel0.target -> poweroff.target: sistem berhenti total dan daya dimatikan.runlevel1.target -> rescue.target: mode darurat satu user — filesystem lokal terpasang, jaringan mati, dan kita diminta password root. Untuk kondisi lebih parah lagi (/hanya terbaca dan berupa read-only) adaemergency.targetyang bahkan lebih dini daripada rescue.runlevel2/3/4.target -> multi-user.target: ketiganya kini menunjuk target yang sama — multi-user penuh tanpa antarmuka grafis, dengan service jaringan dangettydi setiap console.runlevel5.target -> graphical.target: multi-user ditambah display manager.runlevel6.target -> reboot.target: sistem dihentikan lalu direstart.
default.target: Titik Awal Sistem #
Setelah systemd menjadi PID 1, target pertama yang diaktifkan adalah default.target — yang sebenarnya hanyalah symlink ke target lain. Distribusi menyetel pilihan bawaannya di /lib/systemd/system/, sedangkan admin dapat menggantinya lewat symlink di /etc/systemd/system/ yang selalu menang. Kita baca tujuan symlink bawaan tersebut:
readlink /lib/systemd/system/default.targetOutput yang Dihasilkan:
graphical.targetHasilnya graphical.target karena mesin tempat blok ini diverifikasi adalah desktop Debian; instalasi server umumnya menunjuk multi-user.target karena tidak ada GUI yang perlu dinyalakan. Untuk mengubah titik awal boot di sistem nyata, perintahnya adalah systemctl set-default:
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.systemctl membuat symlink baru di /etc — persis mekanisme yang kita lihat pada folder .wants sebelumnya, hanya kali ini untuk target. Untuk sekadar memeriksa nilai saat ini tanpa mengubah apa pun, jalankan systemctl get-default.
Berpindah Target dengan isolate #
Target juga bisa diganti saat sistem sedang hidup dengan systemctl isolate nama.target. Perintah ini mengaktifkan target baru sekaligus menghentikan semua unit yang tidak masuk graf target tersebut — misalnya turun dari mode grafis ke multi-user.target untuk menutup GUI saat menguji konfigurasi server. Ada juga systemctl rescue yang merupakan isolate ke rescue.target dan mengeluarkan kita dari semua sesi ke shell darurat di console.
Dua perintah yang kita pakai tiap hari juga sebenarnya perpindahan target: systemctl poweroff mengaktifkan poweroff.target dan systemctl reboot mengaktifkan reboot.target. Alur penuh menuju target-target itu — dari tombol power sampai layar login — adalah kisah Chapter Startup dan Shutdown
. Sebelum ke sana, kita pelajari dulu alat yang merekam semua kejadian di antara target-target itu: journalctl.
Daftar directive lengkap target beserta target spesial lainnya didokumentasikan di systemd.target(5)
, opsi isolate dan set-default di systemctl(1)
, dan rangkuman praktis penggunaannya di wiki Arch tentang systemd
.