Nitro: küçük ve esnek bir init sistemi ile süreç süpervizörü
(git.vuxu.org)- Nitro, gömülü sistemler, sunucular, masaüstü sistemler ve konteynerlerde kullanılabilen çok küçük bir süreç süpervizörü ve init sistemidir
- Sistem durumunu yalnızca RAM'de saklar; bu sayede salt okunur dosya sistemlerinde de sorunsuz çalışır ve hızlı, verimli bir olay tabanlı tasarım sunar
- Yapılandırma yöntemi basit bir betik dizini yapısıdır; karmaşık yapılandırma dosyaları veya ek derleme süreçleri olmadan servis yönetimi sağlar
- Parametreli servisler, sağlam yeniden başlatma, her servis için güvenilir günlükleme gibi konteyner ve gömülü ortamlara optimize edilmiş özellikler sunar
- nitroctl aracıyla uzaktan kontrol, sinyal tabanlı davranış kontrolü gibi yüksek esneklik ve denetim sağlar
Genel bakış
Nitro, Linux'ta pid 1 olarak da kullanılabilen çok küçük bir süreç süpervizörüdür
Başlıca kullanım alanları şunlardır
- gömülü, masaüstü, sunucu gibi farklı amaçlı Linux makineleri için init
- Linux initramfs'in init'i
- Docker/Podman/LXC/Kubernetes gibi konteyner ortamlarının init'i
- POSIX sistemlerde yetki gerektirmeden çalışan bir süpervizyon daemon'u
Yapılandırma, dizin tabanlı bir betik yapısı kullanır ve varsayılan konum /etc/nitro'dur
Gereksinimler
- çekirdeğin Unix socket desteği gerekli
tmpfsveya yazılabilir bir/rundizini gerekli
Diğer sistemlere göre avantajları
- tüm durum bilgileri yalnızca RAM'de tutulur; bu yüzden salt okunur kök dosya sistemlerinde ek hilelere gerek kalmadan çalışır
- olay tabanlı, polling yapmayan çalışma biçimi ile verimlilik sağlar
- çalışma sırasında dinamik bellek tahsisi yoktur
- dosya tanımlayıcıları sınırsız biçimde tüketilmez
- yalnızca tek bir self-contained ikili dosya gerekir (isteğe bağlı olarak ek bir kontrol ikilisiyle)
- yapılandırma dosyası dönüştürme ve derleme gerekmez; servisler sadece betik içeren basit dizinlerdir
- servis yeniden başlatma ve günlükleme zinciri desteği sunar
- sistem saati doğru olmasa bile düzgün çalışır
- FreeBSD'de
/etc/ttysüzerinden çalıştırılabilir - musl libc ile çok küçük bir statik ikili üretilebilir
Servis yönetimi
-
her servis dizini (varsayılan olarak
/etc/nitroaltında) şu dosyaları içerebilirsetup: servis başlamadan önce çalıştırılan isteğe bağlı betik; servis yalnızca normal çıkışta (0) başlatılırrun: servis çalışma betiği; sonlanmadığı sürece servis ayakta kabul edilir, yoksa one-shot servis olarak işlenirfinish:runsona erdikten sonra çalışan isteğe bağlı betik; çıkış durumu ve sinyal değeri argüman olarak verilirlog: başka bir servis dizinine işaret eden sembolik bağ;runçıktısı o servisin girdisine pipe edilir (günlükleme zinciri için kullanılabilir)down: bu dosya varsa nitro bu servisi varsayılan olarak ayağa kaldırmaz- dizin adı
@ile bitiyorsa yok sayılır ve parametreli servis olarak kullanılabilir - servis adı 64 karakterden kısa olmalı ve
/,,, satır sonu karakteri içeremez
-
runit'in
chpstyardımcı aracı,runbetikleri yazarken kullanışlıdır
Özel servisler
LOG:logbağlantısı olmayan tüm servislerin günlükleri için varsayılan servisSYS:SYS/setup, tüm servisler başlamadan önce çalışır; sıralı servis başlatma uygulanabilirSYS/finish: genel kapanış aşamasına girilmeden önce çalışırSYS/final: tüm süreçler sonlandıktan sonra çalışırSYS/fatal: ölümcül hata oluşursa çıkış yerine çalışır (varsa)SYS/reincarnate: shutdown yerine çalışır; örneğin initramfs'in yeniden uygulanması için kullanılabilir
Parametreli servisler
@ile biten servis dizinleri nitro tarafından yok sayılır, ancak sembolik bağ veyanitroctlkomutuyla doğrudan belirtilebilir@sonrasındaki parametre, her betiğe ilk argüman olarak aktarılır- örnek:
agetty@/runveagetty@tty1sembolik bağı varsaagetty@/run tty1çalıştırılır nitroctl up agetty@tty2girildiğindeagetty@/run tty2çalıştırılabilir (dizinin var olup olmaması önemli değildir)
- örnek:
Çalışma modları
- tüm yaşam döngüsü önyükleme, servis çalıştırma (süpervizyon), kapanış olmak üzere üç aşamadan oluşur
- önyükleme: özel servis
SYSvarsasetupile başlar, ardındandownolmayan tüm servisler başlatılır - bir servis sonlanırsa yeniden başlatılır; ancak son yeniden başlatma çok yeniyse 2 saniye beklenir
nitroctl RebootveyaShutdownile kapanış sinyali gönderilebilir- bu durumda
SYS/finish→ tüm servislere SIGTERM (en fazla 7 saniye beklenir) → SIGKILL →SYS/final→ kapanış sırası uygulanır
- bu durumda
- konteyner veya yetkisiz süpervizör kullanımında yalnızca süreçler sonlandırılır
- önyükleme: özel servis
nitroctl ile kontrol
- nitroctl CLI aracıyla nitro uzaktan kontrol edilebilir
Komut örnekleri:
- list: servis listesi, durum, PID, uptime, son çıkış durumu çıktılanır
- up/down/start/stop/restart: servis başlatma, durdurma, yeniden başlatma gibi işlemler
- sinyal gönderme: p(SIGSTOP), c(SIGCONT), h(SIGHUP), a(SIGALRM), i(SIGINT), q(SIGQUIT), 1(SIGUSR1), 2(SIGUSR2), t(SIGTERM), k(SIGKILL)
- pidof: belirtilen servisin PID'sini çıktılar
- rescan: servis dizinlerini yeniden okur, eklenen/kaldırılan servisleri yansıtır
- Shutdown/Reboot: tüm sistemi kapatma veya yeniden başlatma
Sinyallerle kontrol
- nitro sürecine doğrudan sinyal göndererek kontrol sağlanabilir
- SIGHUP: servisleri yeniden tara (
rescan) - SIGINT: yeniden başlat
- SIGTERM: kapat (nitro pid 1 değilse)
- SIGHUP: servisleri yeniden tara (
Linux'ta init olarak nitro
- Nitro, self-contained bir ikili olarak Linux'ta doğrudan pid 1 şeklinde önyüklenebilir
- gerekirse
/devve/runbağlanır; diğer işlemlerSYS/setupiçinde yapılır - Ctrl-Alt-Del olayı, düzenli bir yeniden başlatma sürecini tetikler
Docker konteynerinde init olarak Nitro kullanımı
- Nitro statik olarak derlenebilir ve konteynere kolayca eklenebilir
- varsayılan socket yolunun kullanılabilmesi için konteynerde
/runbulunmalıdır - kontrol socket'i bind mount edilirse dışarıdan
nitroctlile uzaktan kontrol sağlanabilir
FreeBSD'de Nitro
- FreeBSD init'in nitro'yu süpervize etmesi için
/etc/ttysdosyasına aşağıdaki satır eklenebilir/etc/nitro "/usr/local/sbin/nitro" "" on
Yazar
- Leah Neukirchen leah@vuxu.org
Teşekkürler
- daemontools, freedt, runit, perp, s6 gibi mevcut süreç süpervizyon sistemlerinin ayrıntılı analizi temel alınarak geliştirilmiştir
Lisans
- 0BSD lisansı (ayrıntılar için LICENSE dosyasına bakın)
Henüz yorum yok.