Ana Sayfa » *nix » systemd ile Sistem ve Servis Yönetimi
4 Temmuz 2015 tarihinde Çağrı Ersen tarafından yayınlandı. | | Translate to English
Oracle, SuSe, Debian gibi major bir çok linux dağıtımı eski SystemV init sistemi yerine default olarak systemd kullanmaya başladılar. systemd’nin sadece açılışlarda servislerin inşaasını üstlenen init sistemine oranla daha komplike olması, servisler için paralelizasyon, mount ve automount, journal, ve system state snapshot desteği gibi bir dizin özellik barındırmasından dolayı kimilerince Unix filozofisine aykırı olduğu gerekçesi ile (“do one thing and do it well”) hoş karşılanmasa da yukarıda ismi zikredilen dağıtımlar tarafından default olarak kullanılmaya başlaması nedeniyle sıkça karşılaşılan ve dinamiklerinin bilinmesinde fayda olan bir sistem.
Biz Linux Akademi olarak eğitimlerimizde genelde init sistemi üzerinde duruyoruz ancak müfredat da systemd’yi de içerecek şekilde güncelleniyor. Bu anlamda, blog sayfamızda da systemd ile servis yönetimine değinen bir makale hazırlamak istedik.
Temel olarak eski init sistemini replace etmeyi amaçlayan ve geliştiricileri tarafından “basic building block” olarak nitelendirilen systemd, init sisteminin yetersiz kaldığı paralelizm, on-demand aktivasyon vs. gibi bir çok yeni özellik barındıran bir sistem ve servis manager’dır veSystemV init scriptileri uyumlu olarak çalışabilmekte, dolayısı ile eski tip init scriptlerinizi de kullanmanıza olanak sağlamakadır.
systemd, unit file denilen ve systemd üzerinden yönetilebilecek her bir sistem unit’i için yönetim direktiflerinin tanımlandığı dosyalar aracılığı ile yapılandırılmaktadır. RHEL tabanlı sistemlerde, paket yöneticisi üzerinden kurulan uygulamalara ait unit file’lar“/usr/lib/systemd/system/” dizini altında bulunmaktadır. Bu ana dizine ek olarak run time’da oluşturulan unit fileların tutulduğu “/run/systemd/system/” ve sistem kurulumu sırasında default olarak gelen ya da sistem yöneticisi tarafından oluşturulan unit file’ların tutulduğu“/etc/systemd/system/” dizin bulunmaktadır.
Bu dizinlere göz attığınız zaman birbirinden farklı uzantılara sahip bir çok dosya olduğunu görebilirsiniz. Bu dosyaların uzantılarından farketmiş olacağınız üzere her bir uzantı farklı bir unit tipini belirtmektedir. Örnek olarak .service olarak geçen dosyalara servislere ait unit dosyalarıyken, .target dosyaları ise birden çok service unit’inin gruplanmış halini ifade etmektedir. Uzantısı .mount olan dosyalar sisteme mount edilmesi istenen disk bölümleri için tanımlanmış configleri, ya da .swap uzantılı olan unitler ise swap alanları ya da swap dosyaları için yapılandırma direktiflerini içermektedir. Unitlerin çeşitleri ile ilgili olarak “Available systemd Unit Types” sayfasına bakabilirsiniz.
Servislerin systemd ile Yönetilmesi
init ya da upstart kullanan sistemlerde bildiğiniz gibi start / stop scripti diye de adlandırılan ve /etc/init.d/ altında bulunan init scriptleri, systemd’de service unit olarak adlandırılan ve yukarıda girizgahını yaptığımız konsept ile yer değiştirmiş bulunuyor. .service uzantılı unit dosyaları üzerinden yapılandırılan ve systemctl komutu üzerinden yönetilen bu unitler, init sisteminde service vechkconfig komutları üzerinden yapıldığına benzer benzer bir şekilde sistem servislerini başlatmak, durdurmak, startup’a eklemek (enable) ya da startup’dan çıkarmak (disable) üzere kullanılmaktadır.
systemctl Söz Dizimi
systemctl komutunun örnek syntax’ı şu şekildedir:
Örnek olarak sshd servisini restart etmek için şu komut kullanılabilir:
Not: systemctl üzerinden servisleri yönetirken unitlerin extension’larını yazmanıza gerek yoktur. Herhangi bir extension belirtilmediği zaman systemd varsayılan olarak .service uzantısını kullanacaktır.
Tüm sistem servislerini listelemek için aşağıdaki komut kullanılabilir:
firewalld.service                  loaded active running firewalld - dynamic firewall daemon
[email protected]                 loaded active running Getty on tty1
[email protected]:2.service            loaded active exited  LVM2 PV scan on device 8:2
network.service                    loaded active exited  LSB: Bring up/down networking
NetworkManager.service             loaded active running Network Manager
polkit.service                     loaded active running Authorization Manager
postfix.service                    loaded active running Postfix Mail Transport Agent
rhel-dmesg.service                 loaded active exited  Dump dmesg to /var/log/dmesg
rhel-import-state.service          loaded active exited  Import network configuration from initramfs
rhel-readonly.service              loaded active exited  Configure read-only root support
rhnsd.service                      loaded failed failed  LSB: Starts the Spacewalk Daemon
rsyslog.service                    loaded active running System Logging Service
sshd.service                       loaded active running OpenSSH server daemon
systemd-journald.service           loaded active running Journal Service
systemd-logind.service             loaded active running Login Service
systemd-random-seed.service        loaded active exited  Load/Save Random Seed
systemd-remount-fs.service         loaded active exited  Remount Root and Kernel File Systems
systemd-sysctl.service             loaded active exited  Apply Kernel Variables
systemd-tmpfiles-setup-dev.service loaded active exited  Create static device nodes in /dev
systemd-tmpfiles-setup.service     loaded active exited  Create Volatile Files and Directories
systemd-udev-trigger.service       loaded active exited  udev Coldplug all Devices
systemd-udevd.service              loaded active running udev Kernel Device Manager
systemd-update-utmp.service        loaded active exited  Update UTMP about System Reboot/Shutdown
systemd-user-sessions.service      loaded active exited  Permit User Sessions
systemd-vconsole-setup.service     loaded active exited  Setup Virtual Console
tuned.service                      loaded active running Dynamic System Tuning Daemon
Gördüğünüz gibi list-units parametresine ayrıca, –type service anahtarını geçerek sadece sistem servislerinin görüntülenmesini sağladık. Bu komut init kullanan sistemler için “chkconfig –list” komutu ile aynı anlama gelmektedir ve active servislerle ilgili durum bilgisini göstermektedir.
Sadece aktif servislerin gösterilmesi yerine tüm sistem servislerini listelemek için ise ayrıca –all anahtarı geçilmelidir. Bu şekilde bir önceki listeye ek olarak devrede olmayan sistem servisleri de aynı şekilde listelenecektir:
ve çıktı aşağıdakine benzer olacaktır:
dm-event.service                      loaded inactive dead    Device-mapper event daemon
dracut-shutdown.service               loaded inactive dead    Restore /run/initramfs
ebtables.service                      loaded inactive dead    Ethernet Bridge Filtering tables
emergency.service                     loaded inactive dead    Emergency Shell
exim.service                          not-found inactive dead    exim.service
firewalld.service                     loaded active   running firewalld - dynamic firewall daemon
[email protected]                    loaded active   running Getty on tty1
ip6tables.service                     not-found inactive dead    ip6tables.service
iptables.service                      not-found inactive dead    iptables.service
### Çıktı çok yer kaplamaması için buradan kesildi... ###
tuned.service                         loaded active   running Dynamic System Tuning Daemon
Eğer –type anahtarı geçilmez ise systemd tüm unitleri listeleyecek ve çıktı şuna benzer olacaktır:
UNIT                                                                         LOAD   ACTIVE SUB       DESCRIPTION
proc-sys-fs-binfmt_misc.automount                                            loaded active running   Arbitrary Executable File Formats File System Automount Point
sys-devices-pci0000:00-00...-ata2-host1-target1:0:0-1:0:0:0-block-sr0.device loaded active plugged   VMware_Virtual_IDE_CDROM_Drive
sys-devices-pci0000:00-00...-host2-target2:0:0-2:0:0:0-block-sda-sda1.device loaded active plugged   VMware_Virtual_S
sys-devices-pci0000:00-00...-host2-target2:0:0-2:0:0:0-block-sda-sda2.device loaded active plugged   LVM PV 3LcfJU-JKul-MxUD-TOch-hiAE-DDph-bogQ9s on /dev/sda2
sys-devices-pci0000:00-00...:10.0-host2-target2:0:0-2:0:0:0-block-sda.device loaded active plugged   VMware_Virtual_S
sys-devices-pci0000:00-00...x2d2-2\x2d2.1-2\x2d2.1:1.0-bluetooth-hci0.device loaded active plugged   /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.1/2-2.1:1.0/bl
sys-devices-pci0000:00-0000:00:11.0-0000:02:01.0-net-eno16777736.device      loaded active plugged   PRO/1000 MT Single Port Adapter
sys-devices-pci0000:00-0000:00:11.0-0000:02:02.0-sound-card0.device          loaded active plugged   AudioPCI 64V/128 / Creative Sound Blaster CT4810
sys-devices-platform-floppy.0-block-fd0.device                               loaded active plugged   /sys/devices/platform/floppy.0/block/fd0
sys-devices-platform-serial8250-tty-ttyS1.device                             loaded active plugged   /sys/devices/platform/serial8250/tty/ttyS1
sys-devices-platform-serial8250-tty-ttyS2.device                             loaded active plugged   /sys/devices/platform/serial8250/tty/ttyS2
multi-user.target                                                            loaded active active    Multi-User System
Servis unitlerinin enable ya da disable olduğu bilgisini almak için ise aşağıdaki komutu kullanıyoruz:
ve çıktı şuna benzer olacaktır:
[email protected]                        static
Servis Durumlarının Görüntülenmesi
Herhangi bir servisin durumu ile ilgili bilgi almak için systemctl komutuna status parametresi geçilebilir. Örnek olarak sshd servisinin durumu ile ilgili bilgi şu şekilde sorgulanabilir:
└─2523 /usr/sbin/sshd -D
Çıktıda görebileceğiniz gibi servisin loaded olduğu, servise ait unit file’ın tam path’inin/usr/lib/systemd/system/sshd.service olduğu ve startup’a ekli olduğu (enabled) görüntülenmektedir.
Ayrıca, servisin state’inin active (running) olduğu ve ne kadardır up olduğu bildirilmektedir. Main PID numarası Linux Control Group bilgileri ve servisin ürettiği logun son bir kısmı yer bildirilmektedir.
Servisleri start etmek için systemctl komutuna start parametresini geçmek yeterlidir. Örnek olarak sshd servisini start etmek için komut aşağıdaki gibidir:
Bir servisi durdurmak için ise stop parametresi geçiyoruz:
Bir servisi restart için ise systemctl komutuna restart parametresi geçiyoruz:
Ayrıca, servisi reload etmek için de aşağıdaki komutu kullanabilirsiniz:
Bu şekilde yapılandırma değişikliklerini servisi durdurmaksızın devreye alabilmek mümkündür.
Servislerin sistem açılışlarında otomatik olarak start edilmesi için systemctl komutuna enable parametresini geçmek yeterlidir. Örnek olarak sshd servisini startup’a eklemek için şu komut kullanılabilir:
Bu komutun çıktısı aşağıdakine benzer olacaktır:
Dikkat edebileceğiniz gibi bu komut sonrası init sistemine benzer bir şekilde ilgili unit file ilgili noktaya linkleniyor.
Servisleri Devredışı Bırakmak
Bir servisi devredışı bırakmak üzere disable parametresi kullanılmaktadır. Gene sshd servisini startup’tan kaldırmak üzere aşağıdaki komut kullanılabilir:
Benzer şekilde disable ettiğiniz bir servisin, bir servis ya da sistem yöneticisi tarafından manual olarak başlatılabilmesini engellemek üzere mask’layabilirsiniz. Örnek olarak sshd servisini masklamak üzere aşağıdaki komut kullanılabilir:
Gördüğünüz üzere komut, sshd’nin unit file’ını /dev/null’a linkleyerek tamamen devredışı bırakıyor.
Maskladığınız bir servisi geri almak üzere ise unmask parametresi kullanılmaktadır. Mask ettiğimiz sshd servisini eski haline getirmek için şu komutu kullanabiliriz:
SysV init ya da upstart tarafından kullanılan runlevel mantığı systemd ile yerini “systemd targets” isimli konsepte bırakmış bulunuyor. Kısaca, .target uzantılı unit file’larda tanımlanan ve bağımlılık silsilesi gereği bol bol include içeren systemd targets, temel olarak runlevel’da olduğu üzere servis unitlerinin gruplanarak hangi çalışma modunda hangi servislerin çalışacağının tanımlandığı sistemdir.
Örnek olarak /usr/lib/systemd/system/multi-user.target path’inde bulunan multi-user.target unit’i init sisteminde RHEL’ler için runlevel 3 debianlar için runlevel 2’ye tekabül eden çok kullanıcılı mode’un benzeridir. graphical.target isimli target ise adından da anlaşılacağı gibi grafik arabirimi de inşa eden çalışma seviyesidir.
/usr/lib/systemd/system/multi-user.target unit file’ının içeriği aşağıdaki gibidir:
“After” satırından bu mode’un run edilebilmesi için öncesinde çalışması gereken -bağımlılık duyulan- target ve servisler belirtilmiştir. Görüldüğü üzere multi user mode için basic.target’i include edilmiştir. Bu target’a baktığınız zaman ise sistemin boot edilebilmesi için gereli olan diğer servislerin include edildiğini görebilirsiniz.
Geri uyumluluk gereği tamamen obsolote edilmemiş olan runlevel mantığına karşılık gelen systemctl komutları aşağıdaki tabloda yer almaktadır.
Default Target’in Görüntülenmesi
Öntanımlı target’İn hangisi olduğunu görüntülemek için aşağıdaki komut kullanılabilir:
Sistemdeki tüm target’leri görüntülemek için ise systemctl aşağıdaki şekilde kullanılabilir:
Çıktı – dolayısı ile RHEL 7 için target’lar ve açıklamaları – şuna benzer olacaktır:
bluetooth.target    loaded active active Bluetooth
Default target’in Değiştirilmesi
Bir nedenle default target’i değiştirmek isterseniz aşağıdakine benzer bir komut kullanabilirsiniz:
Aynı şekilde ilgili oturum için target değiştirmek üzere şöyle bir komut kullanılabiir:
init sisteminde single user mode’a denk gelen target ise rescue mode’dur ve bu mode’a geçmek için aşağıdaki komut kullanılabilir:
Bahsi geçen bu mode’da sistem root şifresi gerektirece ve networking ile multi user mode içermeyecek şekilde boot edilecektir.
Emergency mode, rescure mode’dan tek fark olarak sadece sistemd diskini mount etmekte geri kalan disk bölümlerine dokunmamaktadır. Bu mode’da boot etmek için aşağıdaki komut kullanılabilir:
systemd ile ilgili özellikle servis konusu genel hatları ile bu kadar. Elbette daha derinlere de inmek mümkün ancak yazının başında değindiğim gibi systemd klasik bir servis managerdan fazlası olduğu için tek bir makale ile değinmek mümkün değil. Sonraki makalelerde bu yazıda değinilmeyen diğer systemd özelliklerine atıfta bulunacağız.
cokomoko | (Temmuz 7th, 2015 1:28 pm)
Bu önemli yazınızı Arch-Tr’de paylaştım, teşekkürler, sonraki makaleyi de merakla bekliyorum.
Mert Gör | (Temmuz 7th, 2015 8:49 pm)
Benim için güzel bir eğitim oldu.Teşekkürler.Elinize sağlık.