Mövzunu Açan
#0
Systemd Nedir ve Neden Önemlidir?
Systemd, modern Linux dağıtımlarında önyükleme ve sistem süreçlerini yönetmek için kullanılan temel bir bileşendir. Geleneksel init sistemlerinin yerini alarak, sistem başlangıç süreçlerini hızlandırmayı ve servis yönetimini daha esnek hale getirmeyi amaçlamıştır. Systemd, servislerin paralel olarak başlatılmasına olanak tanır, bu da sistemin çok daha hızlı açılmasını sağlar. Ek olarak, servisler arasındaki karmaşık bağımlılıkları etkili bir şekilde yönetebilir. Bu özellikler, sunuculardan masaüstü sistemlere kadar geniş bir yelpazedeki Linux ortamları için Systemd'yi vazgeçilmez kılar. Kısacası, Systemd sadece bir init sistemi değil, aynı zamanda loglama, zamanlama ve cihaz yönetimi gibi birçok farklı görevi de üstlenen kapsamlı bir yönetim aracıdır.
Unit Dosyalarının Yapısı ve Türleri
Systemd'nin kalbinde "unit dosyaları" bulunur. Bu dosyalar, Systemd'ye farklı sistem kaynaklarını ve servisleri nasıl yöneteceğini anlatan yapılandırma talimatlarını içerir. En yaygın unit türleri arasında `.service` (arka plan süreçleri), `.socket` (soket tabanlı aktivasyon), `.mount` (dosya sistemi bağlama noktaları), `.device` (çekirdek cihazlar) ve `.target` (sistem durumlarını gruplayan) bulunur. Her unit dosyası, `[Unit]`, `[Service]` (servisler için), `[Mount]` (bağlama noktaları için) ve `[Install]` gibi bölümlerden oluşur. Örneğin, `[Unit]` bölümünde servis açıklaması ve bağımlılıklar yer alırken, `[Service]` bölümü servisin nasıl başlatılacağını, durdurulacağını ve yeniden yükleneceğini belirten komutları barındırır. Bu yapı, Systemd'nin esnek ve modüler çalışmasının temelini oluşturur.
Servislerin Başlatılması, Durdurulması ve Yeniden Yüklenmesi
Systemd ile servisleri yönetmek için `systemctl` komutu kullanılır. Bir servisi başlatmak için `sudo systemctl start <servis_adı>`, durdurmak için `sudo systemctl stop <servis_adı>` komutları çalıştırılır. Eğer bir serviste yapılan değişikliklerin uygulanması gerekiyorsa, ancak servisin kesintiye uğramaması isteniyorsa `sudo systemctl reload <servis_adı>` komutu tercih edilir. Servisin tamamen yeniden başlatılması için ise `sudo systemctl restart <servis_adı>` kullanılır. Bu komutlar, anlık olarak servisin çalışma durumunu etkiler. Ek olarak, sistem açıldığında servisin otomatik olarak başlamasını sağlamak için `sudo systemctl enable <servis_adı>` komutunu kullanmak gerekirken, bu özelliği kapatmak için `sudo systemctl disable <servis_adı>` komutu yeterlidir. Bu sayede sistem yöneticileri servisler üzerinde tam kontrol sahibi olurlar.
Servis Durumlarının Kontrol Edilmesi
Systemd ile servislerin anlık durumunu ve çalışma bilgilerini görüntülemek oldukça basittir. `systemctl status <servis_adı>` komutu, belirtilen servisin etkin olup olmadığını, ne zaman başladığını, hangi PID ile çalıştığını ve son birkaç log kaydını detaylı bir şekilde gösterir. Bu komut, bir servisle ilgili sorunları teşhis etmek için kritik öneme sahiptir. Ayrıca, bir servisin sadece etkin olup olmadığını öğrenmek için `systemctl is-active <servis_adı>`, sistem başlangıcında otomatik başlatılıp başlatılmadığını kontrol etmek için ise `systemctl is-enabled <servis_adı>` komutları kullanılabilir. Başka bir deyişle, bu komutlar servislerin anlık sağlığını ve yapılandırma durumunu hızlıca anlamaya yardımcı olur. Tüm çalışan unit'leri listelemek için `systemctl list-units` komutu da oldukça faydalıdır.
Hedefler (Targets) ve Bağımlılık Yönetimi
Systemd'deki hedefler (`.target` unit'leri), birden fazla servisi veya diğer unit'leri gruplandıran ve sistemin belirli bir çalışma modunu temsil eden özel unit türleridir. Örneğin, `multi-user.target`, temel bir metin tabanlı Linux sistemini temsil ederken, `graphical.target` grafik arayüzü olan bir sistemi ifade eder. Systemd, servisler ve hedefler arasındaki bağımlılıkları yönetmek için `Wants`, `Requires`, `After`, `Before` gibi yönergeleri kullanır. `Wants`, zayıf bir bağımlılık belirtirken, `Requires` güçlü bir bağımlılık ifade eder. Başka bir deyişle, bir unit `Requires` ile bağlı olduğu bir unit başlamazsa kendisi de başlamaz. Bu bağımlılık mekanizması, Systemd'nin servisleri doğru sırada ve verimli bir şekilde başlatmasını sağlar, böylece sistemin tutarlı ve öngörülebilir bir şekilde çalışmasına katkıda bulunur.
Özel Unit Dosyaları Oluşturma
Kendi özel servislerinizi veya Systemd unit'lerinizi oluşturmak, özellikle özel uygulamaları veya betikleri sistem açılışında çalıştırmak istediğinizde oldukça faydalıdır. Yeni bir `.service` dosyası oluşturmak için `/etc/systemd/system/` dizinini kullanmak en iyi yöntemdir. Bu dizindeki dosyalar, Systemd tarafından okunur ve sistemin varsayılan yapılandırmasını geçersiz kılabilir veya yeni servisler ekleyebilir. Bir `my_custom_app.service` dosyası oluşturduktan sonra, içine `[Unit]`, `[Service]` ve `[Install]` bölümlerini ekleyerek gerekli komutları ve açıklamaları tanımlamak gerekir. Örneğin, `ExecStart` satırı servisi başlatan komutu içerir. Dosyayı kaydettikten sonra, Systemd'nin yeni yapılandırmayı fark etmesi için `sudo systemctl daemon-reload` komutunu çalıştırmak önemlidir. Sonuç olarak, bu işlem yeni servisi `systemctl start` ve `systemctl enable` ile yönetilebilir hale getirir.
Systemd Journal ile Log Yönetimi
Systemd, servislerin ve sistemin ürettiği logları merkezi bir şekilde yönetmek için `journald` servisini kullanır. Geleneksel `/var/log` dizinindeki metin dosyaları yerine, `journald` logları ikili (binary) bir formatta depolar, bu da log sorgulamayı çok daha hızlı ve esnek hale getirir. Logları görüntülemek için `journalctl` komutu kullanılır. Örneğin, belirli bir servisin loglarını görmek için `journalctl -u <servis_adı>` komutunu kullanmak yeterlidir. Ayrıca, `journalctl -f` ile gerçek zamanlı log akışını takip edebilirsiniz, bu da sorun giderme sırasında oldukça kullanışlıdır. Başka bir deyişle, Systemd Journal, farklı kaynaklardan gelen logları tek bir noktada toplayarak sistem yöneticilerine güçlü bir denetim ve hata ayıklama aracı sunar. Logları zamana veya öncelik seviyesine göre filtrelemek de mümkündür, bu nedenle detaylı incelemeler için geniş imkanlar sağlar.