Thread Starter
#0
Systemd Nedir ve Neden Önemlidir?
Systemd, Linux işletim sistemlerinde init sisteminin yerini alan modern bir servis yöneticisidir. Sistem açılış sürecini hızlandırmak, servis yönetimini standartlaştırmak ve bağımlılıkları daha etkin bir şekilde yönetmek amacıyla geliştirilmiştir. Geleneksel SysVinit'e kıyasla Systemd, paralel servis başlatma özelliği sayesinde boot süresini önemli ölçüde kısaltır. Ayrıca, servisleri, soketleri, cihazları ve bağlama noktalarını birimler (units) olarak tanımlayarak sistem üzerinde daha granular bir kontrol sağlar. Bu nedenle, günümüzün modern Linux dağıtımlarının çoğunda varsayılan init sistemi olarak kullanılmaktadır. Systemd, sadece servisleri yönetmekle kalmaz, aynı zamanda sistem günlüğü (journal), ağ yapılandırması ve kullanıcı oturumları gibi birçok başka sistem görevini de üstlenir, böylece entegre bir yönetim çözümü sunar.
Servis Birimlerinin Yapısı ve Oluşturulması
Systemd'de yönetilen her servis, `.service` uzantılı bir birim dosyası ile tanımlanır. Bu dosyalar, servisin nasıl başlatılacağını, durdurulacağını, hangi kullanıcı altında çalışacağını ve hangi bağımlılıklara sahip olduğunu belirtir. Genellikle `/etc/systemd/system/` dizininde bulunur ve basit bir INI benzeri yapıya sahiptirler. Bir servis birimi üç ana bölümden oluşur: `[Unit]`, `[Service]` ve `[Install]`. `[Unit]` bölümü servisin açıklamasını, bağımlılıklarını (`Requires`, `After`, `Before`) ve çatışmalarını tanımlar. `[Service]` bölümü, servisin çalıştırılmasıyla ilgili komutları (`ExecStart`, `ExecStop`, `ExecReload`), çalışma dizinini ve çevresel değişkenleri içerir. Son olarak, `[Install]` bölümü servisin sistem başlangıcında nasıl etkinleştirileceğini (`WantedBy`) belirler. Başka bir deyişle, bu yapılandırma dosyaları, Systemd'nin bir servisi nasıl yöneteceği konusunda kapsamlı bir yol haritası sunar.
Servisleri Başlatma, Durdurma ve Yeniden Yükleme
Systemd ile servis yönetimi oldukça basittir ve genellikle `systemctl` komutu aracılığıyla yapılır. Bir servisi başlatmak için `sudo systemctl start <servis_adı>.service` komutunu kullanırız. Örneğin, Apache web sunucusunu başlatmak isterseniz `sudo systemctl start apache2.service` yazmanız yeterlidir. Servisi durdurmak için `sudo systemctl stop <servis_adı>.service` komutu, çalışan bir servisi yeniden başlatmak için `sudo systemctl restart <servis_adı>.service` komutu kullanılır. Eğer servisin sadece yapılandırma dosyalarını okuyarak güncellenmesini istiyorsanız, ancak servisi tamamen durdurup yeniden başlatmak istemiyorsanız, `sudo systemctl reload <servis_adı>.service` komutunu kullanabilirsiniz. Bu komutlar, servislerin anlık durumlarını değiştirmek için temel ve vazgeçilmez yöntemlerdir.
Servis Durumunu Sorgulama ve Logları İnceleme
Bir servisin mevcut durumunu öğrenmek ve olası sorunları gidermek için `systemctl status` komutu çok etkilidir. Örneğin, `systemctl status nginx.service` komutu, Nginx servisinin aktif olup olmadığını, en son ne zaman başladığını, hangi ana işlemin kimliğiyle çalıştığını ve son birkaç satır log çıktısını gösterir. Bu, bir servisin neden çalışmadığını veya beklendiği gibi davranmadığını hızlıca anlamanıza yardımcı olur. Daha detaylı log bilgileri için `journalctl` komutunu kullanırız. `journalctl -u <servis_adı>.service` komutu, belirtilen servise ait tüm günlük girdilerini listeler. Başka bir deyişle, bu iki komut, Systemd ile servislerin izlenmesi ve sorun giderilmesi için güçlü araçlar sunar. Bu nedenle, Systemd tabanlı bir sistemde çalışırken bu komutları sıklıkla kullanmak gereklidir.
Servisleri Etkinleştirme ve Devre Dışı Bırakma
Systemd servislerinin sistem açılışıyla birlikte otomatik olarak başlamasını sağlamak veya bu davranışı engellemek için etkinleştirme ve devre dışı bırakma komutlarını kullanırız. Bir servisi sistemin her açılışında otomatik olarak başlayacak şekilde ayarlamak için `sudo systemctl enable <servis_adı>.service` komutunu çalıştırırız. Bu komut, ilgili `.service` dosyasına `/etc/systemd/system/multi-user.target.wants/` dizininde bir sembolik bağlantı oluşturur. Tam tersi, bir servisin sistem açılışında otomatik olarak başlamasını engellemek için `sudo systemctl disable <servis_adı>.service` komutunu kullanırız. Bu işlem, oluşturulan sembolik bağlantıyı kaldırır. Ek olarak, bir servisin etkinleştirilmiş olup olmadığını kontrol etmek için `systemctl is-enabled <servis_adı>.service` komutundan faydalanabiliriz. Bu yöntemler, sunucu kaynaklarının verimli kullanılması ve gereksiz servislerin çalışmasını engellemek için kritik öneme sahiptir.
Zamanlanmış Görevler için Timer Birimlerinin Kullanımı
Systemd, geleneksel `cron` sistemine bir alternatif olarak zamanlanmış görevleri yönetmek için `.timer` birimlerini sunar. Timer birimleri, bir `.service` biriminin belirli aralıklarla veya belirli bir zamanda otomatik olarak çalışmasını sağlar. Bu yöntem, servislerin periyodik olarak çalıştırılması gereken durumlar için idealdir. Bir timer birimi genellikle iki dosyadan oluşur: bir `.timer` dosyası ve onun tetikleyeceği bir `.service` dosyası. `.timer` dosyasında `[Timer]` bölümü bulunur ve burada görevin ne zaman çalıştırılacağı (`OnCalendar`, `OnBootSec`, `OnUnitActiveSec` gibi seçeneklerle) belirtilir. Örneğin, `OnCalendar=*-*-* 03:00` komutu, servisi her gün saat 03:00'te çalıştırır. `.service` dosyası ise timer tarafından tetiklendiğinde hangi komutların çalıştırılacağını içerir. Timer birimleri, cron'a göre daha entegre, daha güvenilir ve daha detaylı loglama imkanları sunar.
Target Birimleri ve Sistem Başlangıç Akışı
Systemd, sistem başlangıç sürecini ve çalışma seviyelerini yönetmek için `.target` birimlerini kullanır. Target birimleri, belirli bir sistem durumunu veya işlevselliğini temsil eden bir grup birimi (servisler, soketler vb.) koleksiyonudur. Örneğin, `multi-user.target`, ağ ve çok kullanıcılı erişim gibi temel işlevselliklerin etkin olduğu bir çalışma seviyesini tanımlar; bu, genellikle komut satırı arayüzü olan sistemler için varsayılan hedef olur. `graphical.target` ise grafiksel bir kullanıcı arayüzü gerektiren sistemler için ek olarak grafiksel ortamı başlatan servisleri içerir. Sistem açılışında, Systemd bir dizi target birimini etkinleştirir ve bu target'lara bağımlı olan tüm servisleri başlatır. Varsayılan target'ı `systemctl get-default` komutuyla görebilir, `systemctl set-default <target_adı>.target` ile değiştirebilirsiniz. Bu yapılar, sistemin tutarlı ve kontrollü bir şekilde farklı çalışma durumlarına geçmesini sağlar.