systemd ile Sistem ve Servis Yönetimi


Linux Akademi blogunda yayınladığım systemd makalesini buradan da yayınlıyorum.




Bilindiği gibi RHEL, 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.


systemd Nedir ?

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 scriptleri uyumlu olarak çalışabilmekte, dolayısı ile eski tip init scriptlerinizi de kullanmanıza olanak sağlamakadır.


Unit Files

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 ve chkconfig 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:

description">PHP- Kodu:
***nbsp;systemcl start | stop |restart | reload | status servisadi.service 
Örnek olarak sshd servisini restart etmek için şu komut kullanılabilir:

PHP- Kodu:
***nbsp;systemctl restart sshd 
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.


Sistem Servislerinin Listelenmesi

Tüm sistem servislerini listelemek için aşağıdaki komut kullanılabilir:

PHP- Kodu:
UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
auditd
.service                     loaded active running Security Auditing Service
crond
.service                      loaded active running Command Scheduler
dbus
.service                       loaded active running D-Bus System Message Bus
firewalld
.service                  loaded active running firewalld dynamic firewall daemon
getty
@tty1.service                 loaded active running Getty on tty1
kdump
.service                      loaded failed failed  Crash recovery kernel arming
kmod
-static-nodes.service          loaded active exited  Create list of required static device nodes for the current kernel
lvm2
-lvmetad.service               loaded active running LVM2 metadata daemon
lvm2
-monitor.service               loaded active exited  Monitoring of LVM2 mirrorssnapshots etcusing dmeventd or progress polling
lvm2
-pvscan@8:2.service            loaded active exited  LVM2 PV scan on device 8:2
network
.service                    loaded active exited  LSBBring 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  LSBStarts 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

LOAD   
Reflects whether the unit definition was properly loaded.
ACTIVE The high-level unit activation statei.egeneralization of SUB.
SUB    The low-level unit activation statevalues depend on unit type.

33 loaded units listedPass --all to see loaded but inactive unitstoo.
To show all installed unit files use 'systemctl list-unit-files'
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:

PHP- Kodu:
***nbsp;systemctl list-units --type service --all 
ve çıktı aşağıdakine benzer olacaktır:

PHP- Kodu:
UNIT                                  LOAD   ACTIVE   SUB     DESCRIPTION
auditd
.service                        loaded active   running Security Auditing Service
brandbot
.service                      loaded inactive dead    Flexible Branding Service
cpupower
.service                      loaded inactive dead    Configure CPU power related settings
crond
.service                         loaded active   running Command Scheduler
dbus
.service                          loaded active   running D-Bus System Message Bus
display
-manager.service               not-found inactive dead    display-manager.service
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
getty
@tty1.service                    loaded active   running Getty on tty1
ip6tables
.service                     not-found inactive dead    ip6tables.service
iptables
.service                      not-found inactive dead    iptables.service
##***nbsp;Çıktı çok yer kaplamaması için buradan kesildi... ###
tuned.service                         loaded active   running Dynamic System Tuning Daemon

LOAD   
Reflects whether the unit definition was properly loaded.
ACTIVE The high-level unit activation statei.egeneralization of SUB.
SUB    The low-level unit activation statevalues depend on unit type.

79 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'
Eğer -type anahtarı geçilmez ise systemd tüm unitleri listeleyecek ve çıktı şuna benzer olacaktır:

PHP- Kodu:
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
##***nbsp;Çıktı çok yer kaplamaması için buradan kesildi... ###
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:

PHP- Kodu:
***nbsp;systemctl list-unit-files --type service 
ve çıktı şuna benzer olacaktır:

PHP- Kodu:
UNIT FILE                                   STATE
auditd
.service                              enabled
autovt
@.service                             disabled
blk
-availability.service                    disabled
brandbot
.service                            static
console-getty.service                       disabled
console
-shell.service                       disabled
cpupower
.service                            disabled
crond
.service                               enabled
dbus
-org.fedoraproject.FirewallD1.service   enabled
dbus
-org.freedesktop.hostname1.service      static
dbus-org.freedesktop.locale1.service        static
dbus-org.freedesktop.login1.service         static
dbus-org.freedesktop.machine1.service       static
dbus-org.freedesktop.NetworkManager.service enabled
dbus
-org.freedesktop.nm-dispatcher.service  enabled
dbus
-org.freedesktop.timedate1.service      static
dbus.service                                static
debug-shell.service                         disabled
dm
-event.service                            disabled
dnsmasq
.service                             disabled
dracut
-cmdline.service                      static
dracut-initqueue.service                    static
dracut-mount.service                        static
dracut-pre-mount.service                    static
dracut-pre-pivot.service                    static
dracut-pre-trigger.service                  static
dracut-pre-udev.service                     static
dracut-shutdown.service                     static
ebtables.service                            disabled
emergency
.service                           static
firewalld.service                           enabled
getty
@.service                              enabled
halt
-local.service                          static
initrd-cleanup.service                      static
initrd-parse-etc.service                    static
initrd-switch-root.service                  static
initrd-udevadm-cleanup-db.service           static
iprdump.service                             disabled
iprinit
.service                             disabled
iprupdate
.service                           disabled
irqbalance
.service                          enabled
kdump
.service                               enabled
kmod
-static-nodes.service                   static
lvm2-lvmetad.service                        disabled
lvm2
-monitor.service                        enabled
lvm2
-pvscan@.service                        static
##***nbsp;Çıktı çok yer kaplamaması için buradan kesildi... ###
wpa_supplicant.service                      disabled

128 unit files listed

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:

PHP- Kodu:
***nbsp;systemctl status sshd 
Komutun çıktısı aşağıdaki gibi olacaktır:

PHP- Kodu:
sshd.service OpenSSH server daemon
   Loaded
loaded (/usr/lib/systemd/system/sshd.serviceenabled)
   
Activeactive (runningsince Mon 2015-06-22 21:24:12 EEST46min ago
 Main PID
2523 (sshd)
   
CGroup: /system.slice/sshd.service
           â””─2523 
/usr/sbin/sshd -D

Jun 22 21
:24:12 oraclelinux7.crom.lab systemd[1]: Starting OpenSSH server daemon...
Jun 22 21:24:12 oraclelinux7.crom.lab systemd[1]: Started OpenSSH server daemon.
Jun 22 21:24:12 oraclelinux7.crom.lab sshd[2523]: Server listening on 0.0.0.0 port 22.
Jun 22 21
:24:12 oraclelinux7.crom.lab sshd[2523]: Server listening on :: port 22. 
Çı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.


Servis Başlatma

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:

PHP- Kodu:
***nbsp;systemctl start sshd 
Servis Durdurma

Bir servisi durdurmak için ise stop parametresi geçiyoruz:

PHP- Kodu:
***nbsp;systemctl stop sshd 
Servis Restart Etmek

Bir servisi restart için ise systemctl komutuna restart parametresi geçiyoruz:

PHP- Kodu:
***nbsp;systemctl restart sshd 
Ayrıca, servisi reload etmek için de aşağıdaki komutu kullanabilirsiniz:

PHP- Kodu:
***nbsp;systemctl reload sshd 
Bu şekilde yapılandırma değişikliklerini servisi durdurmaksızın devreye alabilmek mümkündür.


Servisleri Devreye Almak

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:

PHP- Kodu:
***nbsp;systemctl enable sshd 
Bu komutun çıktısı aşağıdakine benzer olacaktır:

PHP- Kodu:
ln -'/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service' 
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:

PHP- Kodu:
***nbsp;systemctl disable sshd 
Komutun çıktısı aşağıdaki gibi olacaktır:

PHP- Kodu:
***nbsp;rm '/etc/systemd/system/multi-user.target.wants/sshd.service' 
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:

PHP- Kodu:
***nbsp;systemctl mask sshd 
Komutun çıktısı aşağıdaki gibi olacaktır:

PHP- Kodu:
ln -'/dev/null' '/etc/systemd/system/sshd.service' 
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:

PHP- Kodu:
***nbsp;systemctl unmask sshd 
Komutun çıktısı aşağıdaki gibi olacaktır:

PHP- Kodu:
rm '/etc/systemd/system/sshd.service' 
runlevel vs systemd targets

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:

PHP- Kodu:
[Unit]
Description=Multi-User System
Documentation
=man:systemd.special(7)
Requires=basic.target
Conflicts
=rescue.service rescue.target
After
=basic.target rescue.service rescue.target
AllowIsolate
=yes

[Install]
Alias=default.target 
























"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.


Runlevel Target Units Description
0 runlevel0.target, poweroff.target Shut down and power off the system.
1 runlevel1.target, rescue.target Set up a rescue shell.
2 runlevel2.target, multi-user.target Set up a non-graphical multi-user system.
3 runlevel3.target, multi-user.target Set up a non-graphical multi-user system.
4 runlevel4.target, multi-user.target Set up a non-graphical multi-user system.
5 runlevel5.target, graphical.target Set up a graphical multi-user system.
6 runlevel6.target, reboot.target Shut down and reboot the system.


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:

PHP- Kodu:
***nbsp;systemctl get-default 
Sistemdeki tüm target'leri görüntülemek için ise systemctl aşağıdaki şekilde kullanılabilir:

PHP- Kodu:
***nbsp;systemctl list-units --type target 
Çıktı - dolayısı ile RHEL 7 için target'lar ve açıklamaları - şuna benzer olacaktır:

PHP- Kodu:
UNIT                LOAD   ACTIVE SUB    DESCRIPTION
basic
.target        loaded active active Basic System
bluetooth
.target    loaded active active Bluetooth
cryptsetup
.target   loaded active active Encrypted Volumes
getty
.target        loaded active active Login Prompts
local
-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target     loaded active active Local File Systems
multi
-user.target   loaded active active Multi-User System
network
.target      loaded active active Network
paths
.target        loaded active active Paths
remote
-fs.target    loaded active active Remote File Systems
slices
.target       loaded active active Slices
sockets
.target      loaded active active Sockets
sound
.target        loaded active active Sound Card
swap
.target         loaded active active Swap
sysinit
.target      loaded active active System Initialization
timers
.target       loaded active active Timers 
Default target'in Değiştirilmesi

Bir nedenle default target'i değiştirmek isterseniz aşağıdakine benzer bir komut kullanabilirsiniz:

PHP- Kodu:
***nbsp;systemctl set-default multi-user.target 
Aynı şekilde ilgili oturum için target değiştirmek üzere şöyle bir komut kullanılabiir:

PHP- Kodu:
***nbsp;systemctl isolate multi-user.target 
Single User Mode Aka Rescue Mode

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:

PHP- Kodu:
***nbsp;systemctl rescue 
Bahsi geçen bu mode'da sistem root şifresi gerektirece ve networking ile multi user mode içermeyecek şekilde boot edilecektir.


Emergency Mode

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:

PHP- Kodu:
***nbsp;systemctl emergency 
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 manager'dan 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.

Çağrı ERSEN: https://www.syslogs.org/systemd-ile-...rvis-yonetimi/