Bir Linux sunucusu açıldığında çekirdek yüklenir ve ardından tek bir kullanıcı süreci başlatır: PID 1. Bu süreç, geri kalan her şeyi ayağa kaldırmaktan sorumludur. Çoğu dağıtımda o süreç systemd’dir.
Neden eskisinin yerini aldı
Eski başlatma sistemleri servisleri sırayla başlatırdı: her betik bitene kadar sonraki beklerdi. Açılış süresi, en yavaş halkanın toplamıydı.
systemd bunu iki fikirle değiştirdi. Birincisi paralellik: bağımlılığı olmayan servisler aynı anda başlatılır. İkincisi soket etkinleştirme: bir servisin dinleyeceği soket önceden açılır, ona bağlanmak isteyen istemci beklerken servis arka planda başlar.
Sonuç, açılış süresinin belirgin biçimde kısalmasıdır. Ama asıl değişiklik kapsamdadır — systemd yalnızca servis başlatmaz; günlükleme, zamanlanmış görev, oturum ve aygıt yönetimini de üstlenir. Tartışmaların kaynağı da budur.
Unit: her şey bir birimdir
systemd’nin yönettiği her şey bir unit olarak tanımlanır ve uzantısı türünü söyler.
.service bir arka plan sürecidir. .socket bir dinleme noktasıdır. .timer zamanlanmış bir iştir. .mount bir bağlama noktasıdır. .target ise diğerlerini gruplayan bir toplama noktasıdır.
Bu tekdüzelik pratik bir kazanç sağlar: aynı komutlarla hepsini yönetirsiniz. Durum sorgulamak, başlatmak, durdurmak ve açılışta etkinleştirmek her tür için aynıdır.
Kendi servisinizi yazarken yapılan tipik hatalar systemd servisini doğru yazmak rehberinde ele alınıyor.
Hedefler: çalışma düzeylerinin yerine
Eski sistemlerdeki sayısal çalışma düzeylerinin yerini hedefler aldı.
multi-user.target grafik arayüzsüz, ağa bağlı normal sunucu durumudur. graphical.target masaüstü ortamını da kapsar. rescue.target tek kullanıcılı kurtarma kipidir.
Hedefler birbirini kapsayabilir; grafik hedefi çok kullanıcılı hedefi içerir. Sistemin hangi hedefe ulaşmaya çalıştığı, hangi servislerin başlatılacağını belirler.
Bağımlılık ve sıra ayrı şeylerdir
Bu ayrım en çok karışan noktadır ve yanlış anlaşıldığında açılışta çözülemeyen sorunlar üretir.
After= yalnızca sıra belirtir: her ikisi de başlatılacaksa önce diğeri başlar. Ama diğeri hiç başlatılmayacaksa sizinki yine de başlar.
Requires= ve Wants= ise bağımlılık kurar: diğerinin de başlatılmasını ister. Requires= katıdır — bağımlılık başarısız olursa sizinki de durdurulur. Wants= gevşektir.
Pratikte ikisi birlikte yazılır. Yalnızca Requires= yazmak, bağımlılığın başlatılmasını ister ama bitmesini beklemez; klasik bir yarış koşulu kaynağıdır.
Ağ hazır mı, ağ yönetimi hazır mı
Aynı ailede ikinci bir tuzak vardır. network.target, ağ yönetiminin başladığını söyler — bir IP adresi alındığını değil.
Açılışta bir veritabanına bağlanmaya çalışan servis network.target beklerse bağlantı reddedilebilir. Gerçekten adres beklemek için network-online.target gerekir; o da ilgili bekleme servisinin etkin olmasına bağlıdır.
Belirti tanıdıktır: servis elle başlatınca çalışır, makine yeniden başlayınca çalışmaz.
Günlükler: journald
systemd kendi günlük sistemini getirir. Çıktılar metin dosyalarına değil, yapılandırılmış bir günlüğe yazılır; her satır hangi birimden, hangi süreçten ve hangi öncelikle geldiği bilgisini taşır.
Bu, metin aramaktan daha güçlü sorgulamayı mümkün kılar — birime, önceliğe, zamana ya da süreç kimliğine göre süzebilirsiniz.
Kritik bir öntanımlı ayar vardır: /var/log/journal dizini yoksa günlükler bellekte tutulur ve yeniden başlatmada silinir. Sunucu neden yeniden başladığını anlatacak kayıt, yeniden başlarken kaybolur. Kalıcılığın nasıl açılacağı ve arıza arama sırası journalctl ile arıza bulmak rehberinde.
Timer: cron’un yerine
Zamanlanmış işler için .timer birimleri kullanılabilir ve cron’a göre üç kazanç sağlar.
Çıktı journald’ye gider — kaybolmaz. İş bir servis olduğu için durumu normal komutlarla sorgulanır. Ve makine kapalıyken kaçırılan çalışma, açılışta telafi edilebilir.
Ayrıca rastgele gecikme tanımlanabilir; onlarca makinenin aynı saniyede aynı sunucuya yüklenmesini engeller.
Yalıtım: az bilinen güçlü taraf
systemd, bir servisi çekirdek düzeyinde kısıtlayabilir. Dosya sistemini salt okunur yapmak, geçici dizini yalıtmak, yetki yükseltmeyi engellemek ve kullanılabilecek ağ ailelerini sınırlamak birkaç satırla mümkündür.
Bu, çoğu serviste dokunmadan eklenebilir ve ele geçirilen bir sürecin yapabileceklerini belirgin biçimde daraltır. Sıkılığı ölçmek için yerleşik bir güvenlik analizi komutu vardır ve eksik ayarları satır satır listeler.
Aynı disiplinin yapılandırma tarafındaki karşılığı yapılandırma yönetiminde idempotans yazısında.
Kısaca
systemd, PID 1 olarak çalışan ve sistemin tamamını birim kavramı üzerinden yöneten bir başlatma ve hizmet yöneticisidir.
Öğrenilmesi gereken üç şey vardır: unit dosyasının nasıl yazıldığı, sıra ile bağımlılığın farkı, ve günlüklerin kalıcı olup olmadığı. Üçü bilindiğinde geri kalanı komut ezberinden ibarettir.