Memahami dan mengelola systemd
Pelajari prinsip dasar sistem inisialisasi systemd: cara mengonfigurasinya dan menggunakannya untuk mengelola sistem.
Memahami systemd
Systemd adalah manajer sistem dan layanan untuk Linux, kompatibel dengan skrip inisialisasi SysV dan LSB. Systemd menyediakan:
-
Kemampuan paralelisasi yang agresif
-
Menggunakan socket dan aktivasi D-Bus untuk memulai layanan
-
Menyediakan pemulaan daemon sesuai permintaan (on-demand), memantau proses menggunakan Linux cgroups
-
Mendukung pencadangan (snapshotting) dan pemulihan keadaan sistem
-
Menjaga titik mount dan titik automount
-
Menerapkan logika kontrol layanan berbasis ketergantungan transaksional yang kompleks.
Perintah systemctl adalah alat utama untuk mengelola systemd. Perintah ini menggabungkan fungsi perintah service dan chkconfig dari SysVinit menjadi satu alat yang dapat Anda gunakan untuk mengaktifkan atau menonaktifkan layanan secara permanen atau hanya untuk sesi saat ini.
Systemd mengelola yang disebut units, yang merupakan representasi dari sumber daya sistem dan layanan. Daftar berikut ini menunjukkan jenis-jenis unit yang dapat dikelola oleh systemd:
- service
-
Sebuah layanan pada sistem, termasuk petunjuk untuk memulai, me-restart, dan menghentikan layanan tersebut.
- socket
-
Socket jaringan yang terkait dengan suatu layanan.
- device
-
Perangkat yang dikelola secara khusus menggunakan systemd.
- mount
-
Titik mount yang dikelola dengan systemd.
- automount
-
Titik mount yang secara otomatis dipasang saat boot.
- swap
-
Ruangan swap pada sistem.
- target
-
Titik sinkronisasi untuk unit lain. Biasanya digunakan untuk memulai layanan yang diaktifkan saat boot.
- path
-
Sebuah jalur untuk aktivasi berbasis jalur. Misalnya, Anda dapat memulai layanan berdasarkan keadaan suatu jalur, seperti apakah jalur tersebut ada atau tidak.
- timer
-
Pengatur waktu untuk menjadwalkan aktivasi unit lain.
- snapshot
-
Ringkasan keadaan saat ini dari systemd. Biasanya digunakan untuk mengembalikan ke keadaan semula setelah melakukan perubahan sementara pada systemd.
- slice
-
Pembatasan sumber daya melalui node Grup Kontrol Linux (cgroups).
- scope
-
Informasi dari antarmuka bus systemd. Biasanya digunakan untuk mengelola proses sistem eksternal.
Memulai, menghentikan, dan memeriksa layanan systemd
Anda dapat melakukan berbagai tugas manajemen untuk mengontrol layanan systemd menggunakan perintah systemctl. Berikut ini adalah contoh perintah untuk menunjukkan cara menggunakan systemctl dalam mengelola layanan systemd.
Persyaratan
Anda telah masuk sebagai pengguna dengan izin tingkat administrator.
Prosedur
Perintah berikut mengontrol layanan foo:
-
Aktifkan layanan segera:
# systemctl start foo
-
Nonaktifkan layanan secara langsung:
# systemctl stop foo
-
Mulai ulang layanan:
# systemctl restart foo
-
Tampilkan status layanan, termasuk apakah layanan tersebut sedang berjalan atau tidak:
# systemctl status foo
-
Aktifkan layanan agar dapat dijalankan saat sistem boot:
# systemctl enable foo
-
Nonaktifkan layanan agar tidak dimulai saat booting:
# systemctl disable foo
-
Mencegah layanan dimulai secara dinamis atau bahkan secara manual kecuali jika tidak disembunyikan:
# systemctl mask foo
-
Periksa apakah suatu layanan diaktifkan atau tidak:
# systemctl is-enabled foo
Informasi Terkait
-
Jalankan perintah
man systemctluntuk informasi lebih lanjut.
Mengubah layanan systemd yang sudah ada
Contoh ini menunjukkan cara memodifikasi layanan yang sudah ada. Perubahan pada layanan disimpan di dalam /etc/systemd/system, dalam satu berkas atau dalam subdirektori yang dinamai sesuai dengan nama layanan. Misalnya, prosedur ini memodifikasi layanan httpd.
Persyaratan
-
Anda telah masuk sebagai pengguna dengan izin tingkat administrator.
-
Anda memiliki server
httpdyang telah dikonfigurasi dan berjalan melalui systemd.
Prosedur
-
Layanan Systemd dapat dimodifikasi menggunakan perintah
systemctl edit.# systemctl edit httpd.service
Ini akan membuat file override
/etc/systemd/system/httpd.service.d/override.confdan membukanya di editor teks Anda. Segala sesuatu yang Anda masukkan ke dalam file ini akan ditambahkan ke file layanan yang sudah ada. -
Tambahkan konfigurasi kustom Anda. Misalnya:
[Service] Restart=always RestartSec=30
Untuk mengganti opsi yang dapat diatur berulang kali, opsi tersebut harus dihapus terlebih dahulu. Jika tidak, berkas penggantian akan menambahkan opsi tersebut untuk kedua kalinya.
[Service] ExecStart= ExecStart=<new command>
-
Simpan berkas. Systemd secara otomatis memuat konfigurasi layanan baru.
-
Mulai ulang layanan
httpd:# systemctl restart httpd
Untuk mengganti sepenuhnya (bukan hanya menambahkan/mengubah) berkas layanan yang sudah ada, gunakan systemctl edit --full, misalnya systemctl edit --full httpd.service. Ini akan membuat berkas /etc/systemctl/system/httpd.service, yang akan digunakan menggantikan berkas layanan yang sudah ada.
Informasi Terkait
-
Lihat tautan:#common-service-parameters[Parameter Layanan Umum] untuk informasi lebih lanjut tentang parameter yang digunakan dalam prosedur ini.
Membuat layanan systemd baru
Contoh ini menunjukkan cara membuat berkas unit untuk layanan kustom. Berkas unit kustom disimpan di direktori /etc/systemd/system/ dan memiliki ekstensi .service. Misalnya, layanan kustom foo menggunakan berkas unit /etc/systemd/system/foo.service.
Persyaratan
-
Anda telah masuk sebagai pengguna dengan izin tingkat administrator.
Prosedur
Prosedur ini membuat berkas konfigurasi dasar untuk mengontrol layanan foo.
-
Buat dan edit berkas konfigurasi baru:
# nano /etc/systemd/system/foo.service
-
Langkah-langkah berikut ini menjelaskan setiap bagian beserta parameternya yang perlu ditambahkan ke berkas:
-
Bagian
[Unit]menyediakan informasi dasar tentang layanan. Layananfoomenggunakan parameter-parameter berikut:Description-
Sebuah string yang menggambarkan unit. Systemd menampilkan deskripsi ini di samping nama unit dalam antarmuka pengguna.
After-
Menentukan hubungan dengan unit kedua. Jika Anda mengaktifkan unit tersebut, systemd akan mengaktifkannya hanya setelah unit kedua. Misalnya, layanan
foomungkin memerlukan koneksi jaringan, yang berarti layananfoomenentukannetwork.targetsebagai kondisiAfter=.Bagian
[Unit]yang dihasilkan terlihat seperti ini:[Unit] Description=My custom service After=network.target
-
Bagian
[Service]memberikan petunjuk tentang cara mengontrol layanan. Layananfoomenggunakan parameter-parameter berikut:Type-
Menentukan jenis layanan systemd. Dalam contoh ini, layanan
fooadalah layanansimple, yang memulai layanan tanpa pertimbangan khusus. ExecStart-
Perintah yang harus dijalankan untuk memulai layanan. Ini mencakup jalur lengkap ke perintah dan argumen untuk mengubah layanan.
Bagian
[Service]yang dihasilkan terlihat seperti ini:[Service] Type=simple ExecStart=/usr/bin/sleep infinity
-
Bagian
[Install]memberikan petunjuk tentang cara systemd menginstal layanan. Layananfoomenggunakan parameter-parameter berikut:WantedBy-
Menentukan layanan mana yang memicu layanan kustom jika diaktifkan dengan
systemctl enable. Ini umumnya digunakan untuk memulai layanan kustom saat boot. Dalam contoh ini,foo.servicemenggunakanmulti-user.target, yang memulaifoo.servicesaat systemd memuatmulti-user.targetpada saat boot.
-
-
Berkas
foo.servicelengkap berisi konten berikut:[Unit] Description=My custom service After=network.target [Service] Type=simple ExecStart=/usr/bin/sleep infinity [Install] WantedBy=multi-user.target
Simpan file.
-
Untuk membuat systemd mengenali layanan baru, muat ulang berkas layanannya
# systemctl daemon-reload
-
Mulai layanan kustom
foo:# systemctl start foo
-
Periksa status layanan untuk memastikan layanan tersebut sedang berjalan:
$ systemctl status foo ● foo.service - My custom service Loaded: loaded (/etc/systemd/system/foo.service; static; vendor preset: disabled) Active: active (running) since Thu 2017-12-14 14:09:12 AEST; 6s ago Main PID: 31837 (sleep) Tasks: 1 (limit: 4915) CGroup: /system.slice/foo.service └─31837 /usr/bin/sleep infinity Dec 14 14:09:12 dansmachine systemd[1]: Started My custom service.
Informasi Terkait
-
Lihat tautan:#common-service-parameters[Parameter Layanan Umum] untuk informasi lebih lanjut tentang parameter yang digunakan dalam prosedur ini.
Mengonversi layanan SysVinit ke systemd
Versi lama Fedora menggunakan skrip SysVinit untuk mengelola layanan. Bagian ini memberikan beberapa panduan tentang cara mengonversi skrip SysVinit menjadi setara systemd.
Persyaratan
-
Anda telah masuk sebagai pengguna dengan izin tingkat administrator.
-
Anda memiliki skrip SysVinit kustom yang perlu dikonversi menjadi konfigurasi systemd.
Prosedur
-
Identifikasi runlevel dalam skrip SysVinit Anda. Hal ini biasanya didefinisikan dengan perintah
chkconfigdi bagian yang dikomentari di awal skrip. Misalnya, baris berikut menunjukkan bahwa layanan menggunakan tingkat menjalankan 3, 4, dan 5:# chkconfig: 235 20 80
systemd menggunakan target alih-alih runlevel. Gunakan tabel dalam [converting-sysvinit-services] untuk memetakan runlevel ke target. Dalam contoh ini, runlevel 2, 3, dan 5 semuanya adalah runlevel multi-pengguna, sehingga layanan systemd dapat menggunakan yang berikut:
[Install] WantedBy=multi-user.target
Jika Anda mengaktifkan layanan systemd kustom untuk dimulai saat boot (
systemctl enable foo.service), systemd akan memuat layanan tersebut saat memuatmulti-user.targetpada saat boot. -
Identifikasi layanan dan target yang bergantung. Misalnya, jika layanan kustom memerlukan konektivitas jaringan, tentukan
network.targetsebagai dependensi:[Unit] Description=My custom service After=network.target
-
Identifikasi perintah yang digunakan untuk memulai layanan dalam skrip SysVinit dan ubah ini menjadi setara dengan systemd. Misalnya, skrip tersebut mungkin mengandung fungsi
startdalam format berikut:start() { echo "Starting My Custom Service..." /usr/bin/myservice -D }Dalam contoh ini, perintah
/usr/bin/myserviceadalah perintah layanan kustom yang diatur untuk dijalankan sebagai daemon dengan opsi-D. Atur parameterExecStartuntuk menggunakan perintah ini:[Service] ExecStart=/usr/bin/myservice -D
-
Periksa skrip SysVinit untuk melihat apakah layanan tersebut menggunakan perintah khusus untuk me-restart layanan. Misalnya, skrip tersebut mungkin mengandung fungsi
rebootyang memuat ulang layanan:reboot() { echo "Reloading My Custom Service..." /usr/bin/myservice reload }Dalam contoh ini, perintah
/usr/bin/myserviceadalah perintah layanan kustom dan memuat ulang layanan menggunakan subperintahreload. Atur parameterExecReloaduntuk menggunakan perintah ini:[Service] ExecReload=/usr/bin/myservice reload
Sebagai alternatif, Anda dapat menghilangkan
ExecReloaddan menggunakan perilaku default, yang akan menghentikan layanan dan memulainya kembali. -
Periksa skrip SysVinit untuk melihat apakah layanan tersebut menggunakan perintah khusus untuk menghentikan layanan. Misalnya, skrip tersebut mungkin mengandung fungsi
stopyang memuat ulang layanan:reboot() { echo "Stopping My Custom Service..." /usr/bin/myservice shutdown }Dalam contoh ini, perintah
/usr/bin/myserviceadalah perintah layanan kustom dan menghentikan layanan secara teratur menggunakan subperintahshutdown. Atur parameterExecStopuntuk menggunakan perintah ini:[Service] ExecStop=/usr/bin/myservice shutdown
Sebagai alternatif, Anda dapat menghilangkan
ExecStopdan menggunakan perilaku default, yang akan menghentikan layanan. -
Periksa skrip SysVinit dan identifikasi parameter atau fungsi tambahan yang ada. Gunakan parameter systemd untuk mereplikasi fungsi SysVinit yang diidentifikasi dan relevan dengan layanan Anda.
Informasi Terkait
-
Lihat tautan:#common-service-parameters[Parameter Layanan Umum] untuk informasi lebih lanjut tentang parameter yang digunakan dalam prosedur ini.
Parameter layanan umum
Parameter Unit
Bagian ini berisi parameter yang dapat Anda gunakan di bagian [Unit] dari sebuah layanan. Parameter-parameter ini juga berlaku untuk unit-unit systemd lainnya.
Daftar ini adalah versi ringkasan. Untuk daftar lengkap parameter-parameter ini dan deskripsinya, jalankan perintah man systemd.unit.
- Deskripsi
-
String bebas yang menggambarkan layanan.
- Dokumentasi
-
Daftar URI yang dipisahkan oleh spasi yang merujuk pada dokumentasi untuk layanan ini atau konfigurasinya. Hanya URI dari jenis berikut yang diterima:
http://,https://,file:,info:,man:. - Requires
-
Mengonfigurasi ketergantungan persyaratan pada layanan lain. Jika layanan ini diaktifkan, unit-unit yang tercantum di sini juga akan diaktifkan. Jika salah satu layanan yang bergantung gagal diaktifkan, systemd tidak akan memulai layanan ini. Opsi ini dapat ditentukan lebih dari sekali atau Anda dapat menentukan beberapa unit yang dipisahkan dengan spasi.
- Wants
-
Mirip dengan
Requires, kecuali unit yang gagal tidak memiliki pengaruh apa pun terhadap layanan. - BindsTo
-
Mirip dengan
Requires, kecuali menghentikan unit yang bergantung juga menghentikan layanan. - PartOf
-
Mirip dengan
Requires, kecuali bahwa menghentikan dan memulai ulang unit-unit yang bergantung juga akan menghentikan dan memulai ulang layanan tersebut. - Conflicts
-
Daftar nama unit yang dipisahkan oleh spasi, yang jika sedang berjalan, menyebabkan layanan tidak dapat berjalan.
- Before, After
-
Daftar nama unit yang dipisahkan oleh spasi yang menentukan urutan ketergantungan antara layanan.
- OnFailure
-
Daftar nama unit yang dipisahkan oleh spasi yang diaktifkan ketika layanan ini masuk ke keadaan gagal.
Parameter Install
Bagian ini berisi parameter yang dapat Anda gunakan di bagian [Install] dari sebuah layanan. Parameter-parameter ini juga berlaku untuk unit-unit systemd lainnya.
Daftar ini adalah versi ringkasan. Untuk daftar lengkap parameter-parameter ini dan deskripsinya, jalankan perintah man systemd.unit.
- Alias
-
Daftar nama tambahan yang dipisahkan oleh spasi di mana layanan ini akan diinstal. Nama-nama yang tercantum di sini harus memiliki sufiks (yaitu jenis) yang sama dengan nama file layanan.
- RequiredBy, WantedBy
-
Menentukan layanan sebagai bergantung pada layanan lain. Hal ini biasanya menentukan target untuk memicu layanan yang diaktifkan agar berjalan. Opsi-opsi ini serupa dengan
RequiresdanWantsdi bagian[Units]. - Juga
-
Unit tambahan yang perlu diinstal atau dihapus saat layanan ini diinstal atau dihapus.
Parameter Service
Bagian ini berisi parameter yang dapat Anda gunakan di bagian [Service] dari unit layanan. Parameter-parameter ini hanya berlaku untuk unit layanan systemd.
Daftar ini adalah versi ringkasan. Untuk daftar lengkap parameter-parameter ini dan deskripsinya, jalankan perintah man systemd.unit.
- Type
-
Menentukan jenis startup proses untuk layanan ini:
-
simple- Layanan dimulai sebagai proses utama. Ini adalah pengaturan default. -
forking- Layanan memanggil proses yang difork dan dijalankan sebagai bagian dari daemon utama. -
oneshot- Mirip dengansimple, kecuali proses harus keluar sebelum systemd memulai layanan lanjutan. -
dbus- Mirip dengansimple, kecuali daemon tersebut menggunakan nama dari D-Bus bus. -
notify- Mirip dengansimple, kecuali daemon mengirim pesan notifikasi menggunakansd_notifyatau panggilan setara setelah dimulai. -
idle- Mirip dengansimple, kecuali eksekusi layanan ditunda hingga semua tugas aktif telah dikirimkan.
-
- RemainAfterExit
-
Nilai boolean yang menentukan apakah layanan akan dianggap aktif meskipun semua prosesnya telah berakhir. Defaultnya adalah tidak.
- GuessMainPID
-
Nilai boolean yang menentukan apakah systemd harus menebak PID utama suatu layanan jika PID tersebut tidak dapat ditentukan dengan pasti. Opsi ini diabaikan kecuali
Type=forkingdiatur danPIDFiletidak diatur. Defaultnya adalah ya. - PIDFile
-
Nama file absolut yang mengarah ke file PID daemon ini. Penggunaan opsi ini disarankan untuk layanan dengan
Type=forking. Systemd membaca PID proses utama daemon setelah layanan dimulai. Systemd tidak menulis ke file yang dikonfigurasi di sini, meskipun menghapus file tersebut setelah layanan dimatikan. - BusName
-
Nama bus D-Bus untuk mengakses layanan ini. Opsi ini wajib untuk layanan yang memiliki
Type=dbus. - ExecStart
-
Perintah dan argumen yang dieksekusi saat layanan dimulai.
- ExecStartPre, ExecStartPost
-
Perintah tambahan yang dieksekusi sebelum atau setelah perintah dalam
ExecStart. - ExecReload
-
Perintah dan argumen yang akan dieksekusi saat layanan dimuat ulang.
- ExecStop
-
Perintah dan argumen yang akan dieksekusi saat layanan berhenti.
- ExecStopPost
-
Perintah tambahan yang akan dieksekusi setelah layanan berhenti.
- RestartSec
-
Waktu dalam detik yang diperlukan untuk menunggu sebelum memulai ulang layanan.
- TimeoutStartSec
-
Waktu dalam detik yang diperlukan untuk menunggu layanan dimulai.
- TimeoutStopSec
-
Waktu dalam detik yang diperlukan untuk menunggu layanan berhenti.
- TimeoutSec
-
Singkatan untuk mengonfigurasi
TimeoutStartSecdanTimeoutStopSecsecara bersamaan. - RuntimeMaxSec
-
Waktu maksimum dalam detik untuk layanan berjalan. Berikan
infinity(default) untuk mengonfigurasi tanpa batasan waktu eksekusi. - Restart
-
Menentukan apakah layanan akan di-restart ketika proses layanan berakhir, dihentikan, atau mencapai batas waktu:
-
no- Layanan tidak akan di-restart. Ini adalah pengaturan default. -
on-success- Restart hanya jika proses layanan berakhir dengan bersih (kode keluar 0). -
on-failure- Restart hanya jika proses layanan tidak berakhir dengan bersih (kode keluar node-zero). -
on-abnormal- Restart jika proses berakhir dengan sinyal atau saat terjadi timeout. -
on-abort- Mulai ulang jika proses berakhir karena sinyal yang tidak tertangkap dan tidak ditentukan sebagai status keluar yang bersih. -
selalu- Selalu restart.
-
Pemetaan runlevel ke tujuan
Systemd targets memiliki fungsi serupa dengan runlevel SysVinit, tetapi beroperasi sedikit berbeda. Setiap target memiliki nama alih-alih nomor, dan masing-masing memiliki tujuan spesifik. Systemd mengimplementasikan beberapa target dengan mewarisi semua layanan dari target lain dan menambahkan layanan tambahan ke dalamnya. Beberapa target systemd meniru level runtime SysVinit yang umum, artinya Anda dapat beralih target menggunakan perintah telinit RUNLEVEL yang familiar. Runlevel yang memiliki tujuan spesifik pada instalasi Fedora standar (0, 1, 3, 5, dan 6) memiliki pemetaan 1:1 dengan target systemd tertentu.
Namun, hal ini tidak berlaku untuk runlevel yang didefinisikan pengguna, yaitu runlevel 2 dan 4. Untuk menggunakan level runtime tersebut, buatlah target systemd baru dengan nama seperti /etc/systemd/system/$YOURTARGET yang menggunakan salah satu level runtime yang sudah ada sebagai dasar, buatlah direktori /etc/systemd/system/$YOURTARGET.wants, dan kemudian buat tautan simbolis untuk layanan tambahan yang ingin diaktifkan ke dalam direktori tersebut.
Berikut ini adalah pemetaan runlevel SysVinit ke target systemd.
| Sysvinit Runlevel | systemd Target | Catatan |
|---|---|---|
0 |
runlevel0.target, poweroff.target |
Matikan sistem. |
1, s, single |
runlevel1.target, rescue.target |
Mode pengguna tunggal. |
2, 4 |
runlevel2.target, runlevel4.target, multi-user.target |
Runlevel yang ditetapkan oleh pengguna/spesifik situs. Secara default, sama dengan 3. |
3 |
runlevel3.target, multi-user.target |
Multi-pengguna, non-grafis. Pengguna biasanya dapat masuk melalui beberapa konsol atau melalui jaringan. |
5 |
runlevel5.target, graphical.target |
Multi-pengguna, grafis. Biasanya memiliki semua layanan dari runlevel 3 ditambah login grafis. |
6 |
runlevel6.target, reboot.target |
Reboot |
emergency |
emergency.target |
Shell darurat |
Perintah layanan pemetaan
Tabel berikut menunjukkan padanan systemd dari perintah SysVinit.
Semua versi terbaru dari systemctl secara otomatis menambahkan sufiks .service jika nama layanan tidak disertai sufiks tersebut. Misalnya, perintah systemctl start frobozz.service sama dengan systemctl start frobozz.
|
| Perintah Sysvinit | Perintah systemd | Catatan |
|---|---|---|
|
|
Digunakan untuk memulai layanan (tidak bertahan setelah reboot) |
|
|
Digunakan untuk menghentikan layanan (tidak bertahan setelah reboot) |
|
|
Digunakan untuk menghentikan dan kemudian memulai kembali layanan |
|
|
Ketika didukung, memuat ulang berkas konfigurasi tanpa mengganggu operasi yang sedang berjalan. |
|
|
Mulai ulang jika layanan sudah berjalan. |
|
|
Menunjukkan apakah suatu layanan saat ini sedang berjalan. |
|
|
Digunakan untuk menampilkan daftar layanan yang dapat dimulai atau dihentikan |
|
|
Aktifkan layanan ini agar dimulai pada booting berikutnya atau pemicu lainnya. |
|
|
Matikan layanan ini untuk reboot berikutnya, atau pemicu lainnya. |
|
|
Digunakan untuk memeriksa apakah suatu layanan telah dikonfigurasi untuk dimulai atau tidak di lingkungan saat ini. |
|
|
Cetak tabel layanan yang mencantumkan runlevel mana yang diaktifkan atau dinonaktifkan untuk masing-masing layanan |
|
|
Cetak daftar layanan yang akan dijalankan saat booting ke mode grafis. |
|
|
Digunakan untuk mencantumkan level mana layanan ini diaktifkan atau dinonaktifkan. |
|
|
Digunakan saat Anda membuat berkas layanan baru atau mengubah konfigurasi apa pun |
Semua perintah /sbin/service dan /sbin/chkconfig yang tercantum dalam tabel tetap berfungsi pada sistem berbasis systemd dan diterjemahkan ke dalam ekivalen asli sesuai kebutuhan. Satu-satunya pengecualian adalah chkconfig --list.
|
Sumber daya tambahan
-
Blog Lennart Poettering dengan banyak informasi tentang systemd. Lennart adalah pengembang utama systemd
Want to help? Learn how to contribute to Fedora Docs ›