systemd ile Sistem ve Servis Yönetimi
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY7Zocfq' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
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 scriptileri 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 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:
# 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:
# systemctl list-units --type service
Çıktı şu şekilde olacaktır:
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 lvm2-pvscan@8: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 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.
Bu yazılar da ilginizi çekebilir:
Yorumlar
Trackbacks
Yorumda bulunun.
Bu önemli yazınızı Arch-Tr’de paylaştım, teşekkürler, sonraki makaleyi de merakla bekliyorum.
http://archtr.org/forum/viewtopic.php?f=30&t=1404&p=12723#p12723
[Cevapla]
Benim için güzel bir eğitim oldu.Teşekkürler.Elinize sağlık.
[Cevapla]