PDA

Orijinalini görmek için tıklayınız : systemd ile Sistem ve Servis Yönetimi



erkolay
06.Temmuz.2015, 00:52
systemd ile Sistem ve Servis Yönetimi



Linux Akademi (https://www.linuxakademi.com.tr) blogunda yayınladığım systemd makalesini buradan da yayınlıyorum.

https://resim.webmaster.bbs.tr/image.uploads/05-07-2015/original-04d4c1f175141fbd27a14af83948d1e3.jpg



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 (https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/chap-Managing_Services_with_systemd.html#tabl-Managing_Services_with_systemd-Introduction-Units-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:


# systemcl start | stop |restart | reload | status servisadi.service


Örnek olarak sshd servisini restart etmek için şu komut kullanılabilir:


# 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:


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
[email protected] 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 mirrors, snapshots etc. using dmeventd or progress polling
[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

LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.

33 loaded units listed. Pass --all to see loaded but inactive units, too.
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:


# systemctl list-units --type service --all


ve çıktı aşağıdakine benzer olacaktır:


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
[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

LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values 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:


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
### Çı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:


# systemctl list-unit-files --type service


ve çıktı şuna benzer olacaktır:


UNIT FILE STATE
auditd.service enabled
[email protected] 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
[email protected] 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
[email protected] static
### Çı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:


# systemctl status sshd


Komutun çıktısı aşağıdaki gibi olacaktır:


sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Mon 2015-06-22 21:24:12 EEST; 46min 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:


# systemctl start sshd

Servis Durdurma


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


# systemctl stop sshd

Servis Restart Etmek


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


# systemctl restart sshd


Ayrıca, servisi reload etmek için de aşağıdaki komutu kullanabilirsiniz:


# 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:


# systemctl enable sshd


Bu komutun çıktısı aşağıdakine benzer olacaktır:


ln -s '/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:


# systemctl disable sshd


Komutun çıktısı aşağıdaki gibi olacaktır:


# 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:


# systemctl mask sshd


Komutun çıktısı aşağıdaki gibi olacaktır:


ln -s '/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:


# systemctl unmask sshd


Komutun çıktısı aşağıdaki gibi olacaktır:


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:


[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:


# systemctl get-default



Sistemdeki tüm target'leri görüntülemek için ise systemctl aşağıdaki şekilde kullanılabilir:


# systemctl list-units --type target


Çıktı - dolayısı ile RHEL 7 için target'lar ve açıklamaları - şuna benzer olacaktır:


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:


# systemctl set-default multi-user.target


Aynı şekilde ilgili oturum için target değiştirmek üzere şöyle bir komut kullanılabiir:


# 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:


# 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:


# 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-sistem-ve-servis-yonetimi/