16.08.2019

Yeni sistemlerde komut satırından IP yapılandırması

Eskiden ifconfig vardı. Artık bu paket bazı sistemlerde kurulu gelmiyor. Onun yerini ip komutu aldı. Bununla birlikte ağ arayüzlerindeki isimler de küçük bir değişime uğradı. Eskisi gibi eth0, wlan1 gibi isimler yok, onun yerine ens33 ya da enp2s0 gibi isimler var. Sanıyorum bunların hepsi altyapıda systemd'nin itiş gücü ile olan değişiklikler.

Bir sistemdeki IP yapılandırmasını görmek için (parantez içindeki kısaltılmış şekli)
$ ip address show (ip a)
Daha özel olarak belli bir arayüze ait IP yapılandırması için
$ ip address show dev ens33 (ip a s ens33)
diyebiliriz. Bir ağ bağlantısının durumunu görmek için
$ ip link show ens33 (ip l sh ens33)
ens33 arayüzü üzerinde yeni bir IP adresi ataması yapmak için
$ sudo ip addr add 192.168.1.1/24 dev ens33
Az önce yaptığımız IP adresi atamasını kaldırmak için
$ sudo ip addr del 192.168.1.1/24 dev ens33
Ağ arayüzü üzerindeki tüm yapıladırmayı kaldırmak için
$ sudo ip addr flush dev ens33
Ağ arayüzü için varsayılan ağ geçidi tanımlamak için
$ sudo ip route add default via 192.168.1.100
Az önce yaptığımız varsayılan ağ geçidi tanımlamasını silmek için
$ sudo ip route del default via 192.168.1.100
Yeni bir statik route eklemek için (bir sonraki tekrar başlatmada silinir)
$ sudo ip route add 192.168.7.0/24 via 192.168.1.200 dev ens33
Bu route'un bir sonraki tekrar başlatma sonrasında da geçerli olmasını istiyorsak /etc/sysconfig/network-scripts/route-eth0 dosyasına (Fedora için)
10.10.20.0/24 via 192.168.50.100 dev eth0
eklemek, Debian ve türevleri için (2018 öncesi) ise /etc/network/interfaces dosyasına
up ip route add 10.10.20.0/24 via 192.168.50.100 dev eth0
eklemek gerek. Sonrasında da
$ sudo systemctl restart systemd-networkd.service

ile ağ hizmetlerini tekrar başlatmak gerek. Ubuntu 18.04 sonrası ve muhtemelen ilgili Debian dağıtımlarında ise NetPlan kullanılıyor. Bu durumda yapılacaklar için tıklayın.

Mevcut route tablosunu görüntülemek için

$ ip route show
Bir arayüzü pasif duruma getirmek için
$ sudo ip link set ens33 down
Tekrar etkinleştirmek için
$ sudo ip link set eth1 up
ARP cache'ini görüntülemek için
$ ip neighbor
Özellikle DHCP tarafından atanmış DNS sunucuları bulmak için:
$ resolvctl dns
Ve hatta DHCP'nin adresini bulmak için
$ journalctl -b -g DHCPACK
veya
$ sudo grep -IR "DHCPOFFER" /var/log/*

olabilir. Bu da olmazsa dhclient aracını kullanarak atanmış adresi değiştirme talebiyle bir DHCPDISCOVER gönderilir. Bunun sonucunda ortamdaki DHCP sunucusu da bize DHCPOFFER ile bir IP adresi teklif eder, bizim makinemiz de DHCPACK ile bunu kabul eder, aşağıdaki gibi

# dhclient -d -nw enp3s0
Internet Systems Consortium DHCP Client 4.4.2b1
Copyright 2004-2019 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/enp3s0/38:60:77:42:4e:32
Sending on   LPF/enp3s0/38:60:77:42:4e:32
Sending on   Socket/fallback
DHCPDISCOVER on enp3s0 to 255.255.255.255 port 67 interval 7 (xid=0xb59d4262)
DHCPOFFER of 192.168.0.25 from 192.168.0.1
DHCPREQUEST for 192.168.0.25 on enp3s0 to 255.255.255.255 port 67 (xid=0xb59d4262)
DHCPACK of 192.168.0.25 from 192.168.0.1 (xid=0xb59d4262)
/usr/sbin/dhclient-script: line 706: /etc/resolv.conf: Permission denied
bound to 192.168.0.25 -- renewal in 254332 seconds.

15.08.2019

Linux hizmetleri ve systemd

sysemd, linux dünyasında çok tartışılan bir konu. Ama birçok dağıtım da bunu kullanmaya başladı. Ben daha çok bu bileşen ile linux'ta hizmetlerin nasıl yönetileceğine değineceğim.

Öncelikle systemctl komutuna terminalde aldığınız cevap
systemctl is not installed
gibi birşey olursa muhtemelen systemd dışında bir init sistemi kullanan bir linux dağıtımıyla karşı karşıyayız demektir.

Çalışan hizmetlerin bir listesini almak için kullanılacak komut
systemctl list-units
olacaktır. Systemctl yardım sayfasında hafızadaki birimleri listeler denmiş. Bu komut varsayılan olarak etkin birimleri (unit) listeler. Bunun yerine sadece
systemctl
ile de aynı şeyi yapabiliriz. Bu komut ile listelenen tablodaki LOAD, ACTIVE ve SUB sütunlarında yer alan değerlerin anlamları şöyledir:

LOAD: loaded / not-found / bad-setting / error / masked. ilgili birim dosyası bulundu ve yüklendi veya bulunamadı, kötü yapılandırma, hata, maskelenme.

ACTIVE: active / inactive. birimin durumu; etkin veya değil.

SUB (substate): running / dead / exited / plugged / mounted. Bu sütunda yer alan değerler ACTIVE sütununda verilen durum bilgisi ile ilgili daha ayrıntı vermek için kullanılır. Değerler sistemden sisteme, sürümden sürüme değişebilir. Tam listeyi görmek için systemctl --state=help kullanılabilir.

unit olarak ifade edilen birimler hizmetler olabildiği gibi soketler, zamanlayıcılar da olabilir. Systemd'nin haberdar olduğu tüm birim dosyalarını listelemek için
systemctl list-unit-files
kullanılabilir. Bunların içinden sadece hizmetlere ait birim dosyalarını listelemek için
systemctl list-unit-files --type=service

kullanılır. Bu komut sonucunda STATE sütununda görülebilecek değerlerin anlamları şöyle olur:

enabled: etkin birim
disabled: etkin olmayan birim

static: Birim dosyasında birimin etkinleştirilmesi için bir "kurulum" (install) bölümü yok demektir. Bu gibi birimler ya başka bir birimin bağımlılığı olarak başlar ve dururlar, etkinleştirilemezler.

masked: etkinleştirilmesi bile engellenmiş birimler.

Bir birimin özelliklerini görmek için

systemctl show docker.service

Bu komutla bir sürü özellik listelenir. Sadece bir özellik için -p <property> gibi özellik değeri listelenebilir. 

systemctl show docker.service -p Type

Bir birime ait yapılandırma dosyasını görmek için

systemctl cat docker.service
komutunu kullanabiliriz. Genel olarak birim adının noktadan sonraki .service son ekini atlayarak
systemctl cat docker
kullanabiliriz.

Sırasıya bir hizmeti (servis) durdurmak, başlatmak ve yeniden başlatmak için aşağıdaki komutlar kullanılır:
systemctl stop docker
systemctl start docker
systemctl restart docker
Bazı birimler reload komutunu destekler. Restart'tan farklı olarak bu komut sadece değişen yapılandırma dosyalarını tekrar yükler ve hizmeti ayarları duraksamadan değiştirilebilir.
systemctl reload docker
Bir hizmeti etkinleştirmek veya tersi için
systemctl enable docker
systemctl disable docker
kullanılır. Bir hizmetin durumunu görmek için
systemctl status docker
veya kısaca etkin olup olmadığını görmek için
systemctl is-enabled docker
ya da
systemctl is-failed docker
kullanılabilir.

list-unit-files ile sistemdeki etkin olan veya olmayan tüm birim dosyaları listelendi. Peki sistemdeki aktif birimleri (units) görmek için ne yapılabilir? Elbette
systemctl list-unit-files --state=enabled
gibi bir komut kullanılabilir ama etkinleştirilmiş ama mevcut durumu "çalışıyor"dan farklı olan tüm birimleri görmek için ilk başta yazdığım gibi şu komut daha uygun:
systemctl list-units
ya da, hiçbir parametre kullanmadan sadece systemctl de aynı işi yapıyor. [1]'de list-units ve list-unit-files arasındaki fark için şöyle denmiş:
"list-units, sadece systemd'nin gerekli görüp hafızaya aldığı birim dosyalarını listeler."
Bu durumda list-units'in, list-unit-files'ın bir altkümesini listelediğini düşünebiliriz. Aynı kaynakta birim için de şöyle bir tanım yapılmış:
"Birimler, systemd'nin bildiği kaynakların temsil edildiği dosyalardır."
Bir birimin bağımlılıklarını görmek için
systemctl list-dependencies docker

kullanılabilir.

2022-08-01 Ek:

systemctl status komutuyla çalışan, hata vermiş ve devre dışı bırakılmış birimlerin durumlarını ayırt edebilmek için bazı örnekler:

Aktif ve çalışan bir hizmet:

Aktive (running) yazar, altında çalışan sürecin PID'si ve kullandığı bellek (Memory) miktarı yazar. Durumunda "loaded active running" gibi ifade olur. Etkin bir birimin Loaded: satırında ise aşağıdaki sarı ile vurgulanan alandaki gibi enabled yazar. Devre dışı bırakılmış bir birim için burada disabled yazar.

crond.service                        loaded active running

crond.service - Command Scheduler

     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)

     Active: active (running) since Tue 2021-01-05 09:27:47 +03; 1h 25min ago

   Main PID: 956 (crond)r

      Tasks: 1 (limit: 2294)

     Memory: 1.7M

        CPU: 150ms

     CGroup: /system.slice/crond.service

             └─956 /usr/sbin/crond -n


Oca 05 10:01:01 localhost.localdomain anacron[15910]: Anacron started on 2021-01-05

Oca 05 10:01:01 localhost.localdomain run-parts[15912]: (/etc/cron.hourly) finished 0anacron

Oca 05 10:01:01 localhost.localdomain anacron[15910]: Will run job `cron.daily' in 30 min.

Oca 05 10:01:01 localhost.localdomain anacron[15910]: Will run job `cron.weekly' in 50 min.

Oca 05 10:01:01 localhost.localdomain anacron[15910]: Jobs will be executed sequentially

Oca 05 10:31:01 localhost.localdomain anacron[15910]: Job `cron.daily' started

Oca 05 10:31:01 localhost.localdomain anacron[15910]: Job `cron.daily' terminated

Oca 05 10:51:01 localhost.localdomain anacron[15910]: Job `cron.weekly' started

Oca 05 10:51:01 localhost.localdomain anacron[15910]: Job `cron.weekly' terminated

Oca 05 10:51:01 localhost.localdomain anacron[15910]: Normal exit (2 jobs run)

---

Sonlanmış (durmuş) bir hizmet: 

● bluetooth.service - Bluetooth service            loaded inactive dead

     Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)

     Active: inactive (dead)

       Docs: man:bluetoothd(8)


Oca 08 21:52:51 ozm-fed systemd[1]: Condition check resulted in Bluetooth service being skipped.

Çalışmış ve ihtiyaç olmadığı için sonlanmış bir hizmet:

Active (exited) yazar. Bellek kullanımı sıfırdır. Durum bilgisi "loaded active exited" gibi bir ifadedir.

systemd-journal-flush.service                loaded active exited

systemd-journal-flush.service - Flush Journal to Persistent Storage

     Loaded: loaded (/usr/lib/systemd/system/systemd-journal-flush.service; static; vendor preset: disabled)

     Active: active (exited) since Tue 2021-01-05 09:27:09 +03; 1h 23min ago

       Docs: man:systemd-journald.service(8)

             man:journald.conf(5)

   Main PID: 587 (code=exited, status=0/SUCCESS)

      Tasks: 0 (limit: 2294) 

     Memory: 0B

        CPU: 0

     CGroup: /system.slice/systemd-journal-flush.service


Oca 05 09:26:59 localhost.localdomain systemd[1]: Starting Flush Journal to Persistent Storage...

Oca 05 09:27:09 localhost.localdomain systemd[1]: Finished Flush Journal to Persistent Storage.

Hata vermiş ve çalışmayan bir hizmet:

Active: failed yazar. sonrasında bir exit-code, altında CPU ve Memory alanları olmaz. Durumda "loaded failed failed" gibi bir ifade olur. Alıntılanan journalctl loglarında ayrıntı verilir.

initial-setup.service                    loaded failed failed

initial-setup.service - Initial Setup configuration program

     Loaded: loaded (/usr/lib/systemd/system/initial-setup.service; enabled; vendor preset: disabled)

     Active: failed (Result: exit-code) since Tue 2021-01-05 09:27:30 +03; 1h 14min ago

        CPU: 5ms


Oca 05 09:27:29 localhost.localdomain systemd[1]: Starting Initial Setup configuration program...

Oca 05 09:27:30 localhost.localdomain kill[739]: kill: geçersiz sinyal adı ya da numarası: SIGRTMIN+21

Oca 05 09:27:30 localhost.localdomain systemd[1]: initial-setup.service: Control process exited, code=exited, status=1/FAILURE

Oca 05 09:27:30 localhost.localdomain systemd[1]: initial-setup.service: Failed with result 'exit-code'.

Oca 05 09:27:30 localhost.localdomain systemd[1]: Failed to start Initial Setup configuration program.

Hata vermiş ve çalışmayan bir hizmet:


---

[1] https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
[2] https://wiki.archlinux.org/index.php/Systemd

[3] https://adamtheautomator.com/ubuntu-systemctl/