- Nitro adalah supervisor proses dan sistem init superringkas yang dapat diterapkan pada embedded, server, desktop, dan container
- Menyimpan status sistem hanya di RAM sehingga dapat berjalan tanpa masalah bahkan pada file system read-only, serta menawarkan desain berbasis event yang cepat dan efisien
- Metode konfigurasinya berupa struktur direktori skrip yang sederhana, sehingga layanan dapat dikelola tanpa file konfigurasi yang rumit atau proses build tambahan
- Mendukung fitur yang dioptimalkan untuk container dan lingkungan embedded seperti layanan terparameterisasi, restart yang tangguh, dan logging andal per layanan
- Menjamin fleksibilitas dan kontrol yang tinggi, seperti kendali jarak jauh melalui alat nitroctl dan kontrol operasi berbasis sinyal
Ikhtisar
Nitro adalah supervisor proses superringkas yang juga dapat digunakan sebagai pid 1 di Linux
Bidang penggunaan utamanya adalah sebagai berikut
- init untuk mesin Linux dengan berbagai kegunaan seperti embedded, desktop, dan server
- init untuk Linux initramfs
- init untuk lingkungan container seperti Docker/Podman/LXC/Kubernetes
- daemon supervisi yang berjalan tanpa hak istimewa pada sistem POSIX
Konfigurasinya menggunakan struktur skrip berbasis direktori, dengan lokasi bawaan /etc/nitro
Persyaratan
- Memerlukan dukungan socket Unix pada kernel
- Memerlukan
tmpfsatau direktori/runyang dapat ditulisi
Kelebihan dibanding sistem lain
- Semua informasi status hanya disimpan di RAM sehingga dapat berjalan pada root file system read-only tanpa trik tambahan
- Mode operasi berbasis event tanpa polling memberikan efisiensi
- Tidak ada alokasi memori dinamis saat runtime
- File descriptor tidak akan terus-menerus terkuras tanpa batas
- Hanya memerlukan satu biner self-contained (opsional dengan biner kontrol tambahan)
- Tidak perlu konversi atau kompilasi file konfigurasi; layanan hanyalah direktori sederhana yang berisi skrip
- Mendukung rantai restart dan logging layanan
- Tetap berjalan normal meskipun jam sistem tidak akurat
- Dapat dijalankan melalui
/etc/ttysdi FreeBSD - Dengan musl libc, dimungkinkan membuat biner static yang sangat kecil
Manajemen layanan
-
Tiap direktori layanan (bawaannya di dalam
/etc/nitro) dapat berisi file berikutsetup: skrip (opsional) yang dijalankan sebelum layanan dimulai; layanan hanya dapat dimulai jika skrip selesai normal (0)run: skrip operasi layanan; selama belum berakhir, layanan dianggap hidup; jika tidak diimplementasikan, diperlakukan sebagai layanan one-shotfinish: skrip (opsional) yang dijalankan setelahrunberakhir; status keluar dan nilai sinyal diteruskan sebagai argumenlog: symbolic link yang menunjuk ke direktori layanan lain; outputrundipipe ke input layanan tersebut (dapat dimanfaatkan untuk rantai logging)down: jika file ini ada, nitro tidak akan menaikkan layanan ini secara default- Jika nama direktori diakhiri dengan '@', direktori itu diabaikan dan dapat digunakan sebagai layanan berparameter
- Nama layanan harus kurang dari 64 karakter, dan tidak boleh mengandung
/,,, atau karakter baris baru
-
Utilitas
chpstdari runit berguna saat menulis skriprun
Layanan khusus
LOG: layanan default untuk mencatat log semua layanan yang tidak memiliki linklogSYS:SYS/setupdijalankan sebelum semua layanan dimulai, sehingga dapat digunakan untuk mengimplementasikan urutan startup layananSYS/finish: dijalankan sebelum masuk ke tahap shutdown keseluruhanSYS/final: dijalankan setelah semua proses berakhirSYS/fatal: jika ada, dijalankan alih-alih keluar saat terjadi error fatalSYS/reincarnate: dijalankan sebagai pengganti shutdown, misalnya dapat dimanfaatkan untuk reimplementasi initramfs
Layanan terparameterisasi
- Direktori layanan yang diakhiri dengan '@' diabaikan oleh nitro, tetapi dapat ditentukan langsung melalui symbolic link atau perintah
nitroctl - Parameter setelah '@' diteruskan ke tiap skrip sebagai argumen pertama
- Contoh: jika ada symbolic link
agetty@/rundanagetty@tty1, maka yang dijalankan adalahagetty@/run tty1 - Saat memasukkan
nitroctl up agetty@tty2, dapat dijalankanagetty@/run tty2(terlepas dari ada atau tidaknya direktori)
- Contoh: jika ada symbolic link
Mode operasi
- Seluruh lifecycle terdiri dari tiga tahap: boot, menjalankan layanan (supervisi), dan shutdown
- Boot: jika layanan khusus
SYSada,setupdijalankan lebih dulu, lalu semua layanan non-down dijalankan - Jika layanan berhenti, layanan akan di-restart, tetapi jika restart sebelumnya terlalu cepat maka akan menunggu 2 detik
- Sinyal shutdown dapat dikirim melalui
nitroctl RebootatauShutdown- Dalam hal ini urutannya adalah
SYS/finish→ SIGTERM ke semua layanan (menunggu maksimal 7 detik) → SIGKILL →SYS/final→ urutan shutdown
- Dalam hal ini urutannya adalah
- Untuk supervisor bagi container atau tanpa hak istimewa, hanya proses yang akan dihentikan
- Boot: jika layanan khusus
Kontrol dengan nitroctl
- Alat CLI nitroctl dapat digunakan untuk mengendalikan nitro dari jarak jauh
Contoh perintah:
- list: menampilkan daftar layanan, status, PID, uptime, dan status keluar terakhir
- up/down/start/stop/restart: kontrol untuk memulai, menghentikan, dan me-restart layanan
- pengiriman sinyal: p(SIGSTOP), c(SIGCONT), h(SIGHUP), a(SIGALRM), i(SIGINT), q(SIGQUIT), 1(SIGUSR1), 2(SIGUSR2), t(SIGTERM), k(SIGKILL)
- pidof: menampilkan PID layanan yang ditentukan
- rescan: membaca ulang direktori layanan, menerapkan layanan yang ditambahkan atau dihapus
- Shutdown/Reboot: mematikan atau me-reboot seluruh sistem
Kontrol melalui sinyal
- Dapat dikendalikan dengan mengirim sinyal langsung ke proses nitro
- SIGHUP: pemindaian ulang layanan (rescan)
- SIGINT: reboot
- SIGTERM: shutdown (jika nitro bukan pid 1)
Nitro sebagai init di Linux
- Nitro adalah biner mandiri yang dapat langsung digunakan untuk boot sebagai pid 1 di Linux
- Akan me-mount
/devdan/runbila perlu, sedangkan operasi lainnya ditangani diSYS/setup - Event Ctrl-Alt-Del memicu reboot yang teratur
Menggunakan Nitro sebagai init di container Docker
- Nitro dapat dibangun secara statis sehingga mudah disertakan ke dalam container
- Agar jalur socket bawaan dapat digunakan,
/runharus ada di dalam container - Jika socket kontrol diproses sebagai bind mount, kontrol jarak jauh dari luar melalui nitroctl dapat dilakukan
Nitro di FreeBSD
- Nitro dapat disupervisi oleh FreeBSD init dengan menambahkan baris berikut ke
/etc/ttys/etc/nitro "/usr/local/sbin/nitro" "" on
Penulis
- Leah Neukirchen leah@vuxu.org
Ucapan terima kasih
- Dikembangkan di atas analisis mendetail terhadap sistem supervisi proses yang sudah ada seperti daemontools, freedt, runit, perp, dan s6
Lisensi
- Lisensi 0BSD (lihat file LICENSE untuk detail)
Belum ada komentar.