2 poin oleh GN⁺ 2025-08-24 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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 tmpfs atau direktori /run yang 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/ttys di FreeBSD
  • Dengan musl libc, dimungkinkan membuat biner static yang sangat kecil

Manajemen layanan

  • Tiap direktori layanan (bawaannya di dalam /etc/nitro) dapat berisi file berikut

    • setup: 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-shot
    • finish: skrip (opsional) yang dijalankan setelah run berakhir; status keluar dan nilai sinyal diteruskan sebagai argumen
    • log: symbolic link yang menunjuk ke direktori layanan lain; output run dipipe 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 chpst dari runit berguna saat menulis skrip run

Layanan khusus

  • LOG: layanan default untuk mencatat log semua layanan yang tidak memiliki link log
  • SYS: SYS/setup dijalankan sebelum semua layanan dimulai, sehingga dapat digunakan untuk mengimplementasikan urutan startup layanan
    • SYS/finish: dijalankan sebelum masuk ke tahap shutdown keseluruhan
    • SYS/final: dijalankan setelah semua proses berakhir
    • SYS/fatal: jika ada, dijalankan alih-alih keluar saat terjadi error fatal
    • SYS/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@/run dan agetty@tty1, maka yang dijalankan adalah agetty@/run tty1
    • Saat memasukkan nitroctl up agetty@tty2, dapat dijalankan agetty@/run tty2 (terlepas dari ada atau tidaknya direktori)

Mode operasi

  • Seluruh lifecycle terdiri dari tiga tahap: boot, menjalankan layanan (supervisi), dan shutdown
    • Boot: jika layanan khusus SYS ada, setup dijalankan 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 Reboot atau Shutdown
      • Dalam hal ini urutannya adalah SYS/finish → SIGTERM ke semua layanan (menunggu maksimal 7 detik) → SIGKILL → SYS/final → urutan shutdown
    • Untuk supervisor bagi container atau tanpa hak istimewa, hanya proses yang akan dihentikan

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 /dev dan /run bila perlu, sedangkan operasi lainnya ditangani di SYS/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, /run harus 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

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.

Belum ada komentar.