12.02.2018

Fedora hakkında daha fazla

Bir zamanlar yaptığım Ubuntu Admin gibi Fedora için de sık kullanılan işlemlerin bir listesini yapmak istedim. Zamanla buraya daha fazla şey eklemem muhtemel.

Grub
En sık ihtiyaç duyduğum grub2 güncellemesi ile ilgili komutlar. Diyelim ki Fedora, sda3'te kurulu. Bu disk bölümünün başına grub2'yi yazmak için kullanılabilecek komut:
grub2-install /dev/sda3
Grub2 yapılandırmasını tekrar yapmak için (menüyü tekrar oluşturmak)
grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI bir sistemde ise bu komut şöyle olmalı:
grub2-mkconfig -o /boot/efi/EFI/grub.cfg
Grub2'nin varsayılan ayarları /etc/default/grub dosyasındadır, menünün görüntülenme süresi, seçim yapılmaz ise varsayılan olarak menüdeki hangi öğe ile devam edileceği gibi. Örnek bir /etc/default/grub dosyası:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet"
GRUB_DISABLE_RECOVERY="true"


Görüldüğü gibi GRUB_DEFAULT=saved diye bir durum var. Saved hangisi diye düşünmeden şu komut ile bakabiliriz:
grub2-editenv list
ya da /boot/grub2/grubenv dosyası (UEFI sistemlerde /boot/efi/EFI/fedora/grubenv) dosyasının içinde yazar.

Özelleştirilebilen betikler de /etc/grub.d klasöründe bulunur.

Özellikle birden fazla işletim sisteminin yüklendiği durumlarda GRUB ile ilgili sorunlar yaşanabilir. Eğer açılışta grub menüsü görünmüyorsa
grub2-instsall /dev/sda
ile diskin başına grub stage 1'i yazmak gerekir. Eğer menü görünüyor, ama sonrasında bir hata alınıyorsa
grub2-mkconfig -o /boot/grub2/grub.cfg
ile grub yapılandırılması tekrar oluşturulmalıdır. Eğer o hata ekranında kaldıysak e'ye basarak düzenleme moduna girebilir, ya da c'ye basarak etkileşimli kabuğa (interactive shell) girmek olabilir. Etkileşimli kabuğa girdikten sonra ls ile mevcut disk bölümlerini görmek isteyebiliriz. Burada dikkat edilecek nokta, disklerin 0'dan, bölümlerin 1'den başlayarak numaralandırılmış olması. Hedef disk bölümünü seçtikten sonra
set root=(hd0,msdos3)
komutuyla /dev/sda3'e root olarak belirleyebiliriz. Bundan sonra da kernel ve initrd'yi belirlemek gerek. Bunun için de (yine sda3'de olduğunu varsaydığımız vmlinuz ve initrd için)
linux /boot/4.15.9-300.fc27.x86_64 root=/dev/sda3 rhgb quiet
initrd /boot/
Son aşama olarak sistemi tekrar açma komutu vermek gerek.
boot
Sistem açıldıktan sonra da grub'ı tekrar yazmak için
grub2-install /dev/sda
yazmayı unutmamak gerek [1], [2].

Bazen de bir CD/USB ya da diskteki ikincil durumda (grub açısından) bulunan linux kurulumundan grub'ı onarmak gerekebilir. Bunun için şu adımlar izlenebilir:

- Önce hedef disk bölümünü mount etmek gerek.
mount /dev/sda3 /mnt
Eğer /boot ayrı bir bölüm ise bunu da
mount /dev/sdaX /mnt/boot
ile bağlamak gerek.

- Ardından canlı sistemin (şu anda açık olan) /dev klasörü ile hedef sistemin /dev klasörü arasında bir bağ kurmak gerek
mount --bind /dev /mnt/dev
- Root'u geçici olarak /mnt olarak değiştirelim
chroot /mnt
- Şu anda grub'ı tekrar yazabiliriz
grub2-install /dev/sda
- İşimiz bittikten sonra önce chroot'tan çıkmak, sonra da mount edilen klasörleri unmount etmek gerek:
exit
umount /mnt/dev
umount /mnt/boot (ayrıca mount edildiyse)
umount /mnt
Repoları Yönetmek
Ubuntu'ya kıyasla varsayılan depolarında daha az yazılım var, Fedora'nın. Bunun sebebi de özgür yazılıma olan daha sıkı bağlılığı. Eğer özgür olmayan yazılımları da kurmak isterseniz Fedora'da bazı ek repository'leri eklemek gerek. Repoların bilgileri /etc/yum.repos.d klasöründe tutulur. dnf ile de bir depo listesi çekilebilir:
dnf repolist
kullanılabilir.Eğer repository'lerden birini geçici olarak kapatmak (kalıcı olarak silmek değil) istersek
dnf config-manager --set-disabled <repo-id>
kullanılabilir. repo-id, dnf repolist komutu ile elde edilen listenin ilk sütunundaki veri alanıdır. Tekrar etkinleştirmek için ise
dnf config-manager --set-enabled <repo-id>
kullanılabilir. Repository'yi tamamen silmek için ise /etc/yum.repos.d klasöründeki ilgili kaydı silmek gerekir.

Dnf-Makecache
Bilgisayarım her açıldığında software center, komut satırından yazdığım dnf check-update komutundan bağımsız olarak arka planda güncellemeleri kontrol ediyordu. Ben de güncellemeleri kendim kontrol takip ettiğimden, software center'ın (dnf-makecache adında bir hizmet) ayrıca takip etmesine gerek olmadığını düşünüp bu hizmeti kapattım:
sudo systemctl stop dnf-makecache.timer
sudo systemctl disable dnf-makecache.timer
Firewall
Güvenlik durumunun durumunu şu şekilde sorgulayabiliriz
$ firewall-cmd --state
running
Yapılandırma ile ilgili daha fazla bilgi için şu veya bu sayfalar güzel.

Çalışan uygulamanın sürecini bulmak
Çalışan bir uygulamaya (pencere) ait sürecin hangisi olduğunu bulmak için komut satırından önce:
$ xprop _NET_WM_PID
komutunu vererek seçiciyi başlatmak lazım. Seçici başlayınca farenin oku bir artı işaretine dönüşecek. Daha sonra tıkladığımız pencereye ait sürecin ID'si görüntülenecek. Örneğin XFCE masaüstünde boş masaüstüne tıkladığımda
_NET_WM_PID(CARDINAL) = 1384
çıktı. Sonra
$ ps -p 1384 -o pid,command

kullanarak 1384 pid'li sürecin hangisi olduğunu bulabilirim.

Alternatif olarak bir de şu sayfada önerildiği gibi xdotool kullanılabilir:

$ xdotool selectwindow getwindowpid

Bu da, tıklanan pencerenin pid'sin verecek. Bunlar X window manager için geçerli. Wayland'de xdotool yerine wtype kullanılabilir, denemedim. Ayrıca şu sayfada lg (looking glass) önerilmiş.

Açılış performans görüntüleme
Her bilgisayar yavaştır. Herkes bilgisayarını hızlandırmak ister. Açılışta bilgisayarın nerelerde zaman harcadığını incelemek için yapılabilecek:

$ systemd-analyze
Startup finished in 1.053s (kernel) + 4.058s (initrd) + 34.774s (userspace) = 39.885s
graphical.target reached after 28.225s in userspace
Buradan görüldüğü üzre bilgisayarımın kullanıma hazır hale gelmesi 39,885 saniye sürmüş. Bunun 34 küsur saniyesi benim kullanıcı seviyesindeki işlemlerim için harcanmış. Biraz daha fazla bilgi isteyip süreçler/hizmetlerden birini "suçlamak" için
$ systemd-analyze blame
Bu şekilde en çok zaman nereye harcanmış şu şekilde bir liste çıkar:
         12.888s firewalld.service
         11.540s accounts-daemon.service
          7.707s rtkit-daemon.service
          7.439s avahi-daemon.service
          7.410s systemd-logind.service
          7.397s abrtd.service
          7.380s livesys-late.service
          7.378s initial-setup.service
          7.156s NetworkManager-wait-online.service
          6.907s lvm2-monitor.service
Bunların azaltılması ve açılışın daha hızlı hale getirilmesi tamamen başka bir konu. Bu gibi konularda güzel bir kaynak olarak arch-wiki sayfası görülebilir. Ama genel olarak eğer kullanılmıyorsa şu hizmetler önce durdurulup sonra devre dışı bırakılabilir:

bluetooth.service (bluetooth cihazlara bağlantı)
ModemManager.service (bir modem üzerinden bağlantı oluşturma)
abrtd.service (hata bildirme hizmeti)
cupsd.service (yazıcı ve çıktı alma işleri)
accounts-daemon.service (kullanıcı hesabı işleri, bkz [3])
avahi-daemon.service (ağ sıfır yapılandırma hizmeti, bkz [3])

Örnek hizmet durdurma:
sudo systemctl stop bluetooth.service
Örnek hizmet devre dışı bırakma
sudo systemctl disable bluetooth.service

Bazı hizmetler başka hizmetler tarafından tekrar başlatılabilir. Hiçbir şekilde başlatılmasını istemiyorsak mask edilebilir:
sudo systemctl mask bluetooth.service
Ayrıca açılış sürecini grafiksel olarak değerlendirebilmek için [4]
systemd-analyse plot > plot.svg
Systemctl hakkında cheatsheat için [5] güzel bir kaynak.

Disk işleri
Önce sistemde hangi diskler var bulmak için:
$ sudo fdisk -l
Disk /dev/sda: 40 GiB, 42949672960 bayt, 83886080 sektör
Birimler: sektör'i 1 * 512 = 512 baytın
Sektör boyutu (montıksal/fiziksel): 512 bayt / 512 bayt
G/Ç boyutu (en düşük/en uygun): 512 bayt / 512 bayt
Disketikeri tipi: dos
Disk belirleyicisi: 0xa039b385

Aygıt      Açılış Başlangıç      Son   Sektör Boyut ld Türü
/dev/sda1  *           2048  2099199  2097152    1G 83 Linux
/dev/sda2           2099200 83886079 81786880   39G 8e Linux LVM

Disk /dev/mapper/fedora_localhost--live-root: 37 GiB, 39669727232 bayt, 77479936 sektör
Birimler: sektör'i 1 * 512 = 512 baytın
Sektör boyutu (montıksal/fiziksel): 512 bayt / 512 bayt
G/Ç boyutu (en düşük/en uygun): 512 bayt / 512 bayt

Disk /dev/mapper/fedora_localhost--live-swap: 2,1 GiB, 2202009600 bayt, 4300800 sektörBirimler: sektör'i 1 * 512 = 512 baytın
Sektör boyutu (montıksal/fiziksel): 512 bayt / 512 bayt
G/Ç boyutu (en düşük/en uygun): 512 bayt / 512 bayt
Kırmızı ile vurgulanan satırda görüleceği gibi sistemde sadece 40 GB'lık bir disk var (sda). Bunu ayrıca şu komutla da doğrulayabiliriz:
$ ll /dev/sd?
brw-rw----. 1 root disk 8, 0 Eki 31 17:08 /dev/sda
Bu diskin içindeki bölümler de mavi ile vurgulanan satırlarda görülen sda1 (1 GB) ve sda2 (39 GB). sda2'nin türünün LVM olduğuna dikkat! Kök (root) ve takas (swap) bölümleri bu ikisinden birisi de değil. sda2'nin içinde iki ayrı bölüm daha var; root (37 GiB) ve swap (2,1 GiB). Bu bilgiyi lsblk komutu ile de edinebiliriz:
$ lsblk
NAME                            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                               8:0    0   40G  0 disk
├─sda1                            8:1    0    1G  0 part /boot
└─sda2                            8:2    0   39G  0 part
  ├─fedora_localhost--live-root 253:0    0   37G  0 lvm  /
  └─fedora_localhost--live-swap 253:1    0  2,1G  0 lvm  [SWAP]
sr0                              11:0    1  1,3G  0 rom 
Biraz daha şekilli bir liste görebilmek için
$ lsblk -o NAME,KNAME,TYPE,SIZE,MOUNTPOINT
NAME                            KNAME TYPE  SIZE MOUNTPOINT
sda                             sda   disk   40G
├─sda1                          sda1  part    1G /boot
└─sda2                          sda2  part   39G
  ├─fedora_localhost--live-root dm-0  lvm    37G /
  └─fedora_localhost--live-swap dm-1  lvm   2,1G [SWAP]
sr0                             sr0   rom   1,3G
/dev/mapper klasörü altındaki dm-0 ve dm-1'i merak ettim:
$ ll /dev/mapper/
lrwxrwxrwx. 1 root root       7 Eki 31 10:17 fedora_localhost--live-root -> ../dm-0
lrwxrwxrwx. 1 root root       7 Eki 31 10:17 fedora_localhost--live-swap -> ../dm-1
Görüldüğü gibi fedora_localhost--live-root aslında /dev/dm-0'a kısayol, fedora_localhost--live-swap da /dev/dm-1'e kısayol.

Ayrıca dmsetup ile listeleme ile:
$ sudo dmsetup ls
fedora_localhost--live-swap    (253:1)
fedora_localhost--live-root    (253:0)
Bu bölümlerin herhangi biri hakkında daha fazla bilgiyi de dmsetup ile edinebiliriz:
$ sudo dmsetup info /dev/dm-1
Name:              fedora_localhost--live-swap
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        2
Event number:      0
Major, minor:      253, 1
Number of targets: 1
UUID: LVM-Bwl8Nw83iw3OjVwS9MVJZxXDm7WadBd1g5peulxJvJ3oSI9gbbpz1usck3vVNhKD
Aynı bilgiyi dmsetup info fedora_localhost--live-swap diyerek de alabilirdik.

Disk bilgileri /etc/fstab içinde bu şekilde geçiyor.

Fedora Administrator's Guide bir de partx komutunu vermiş:
$ sudo partx /dev/sda
NR   START      END  SECTORS SIZE NAME UUID
 1    2048  2099199  2097152   1G      a039b385-01
 2 2099200 83886079 81786880  39G      a039b385-02
Şu anda bağlanmış (mount) dosya sistemlerinin listesini almak için
$ findmnt
komutu kullanılabilir. Uzun bir ağaç verecek. Düz liste alabilmek için -l anahtarı kullanılabilir.

Disk bölümleri ne kadar kullanımda görmek için (-x ile tmpfs'i hariç tutarak):
$ df -h -x tmpfs
Dosyasistemi                              Boy  Dolu   Boş Kull% Bağlanılan yer
devtmpfs                                 972M     0  972M    0% /dev
/dev/mapper/fedora_localhost--live-root   37G  4,5G   30G   13% /
/dev/sda1                                976M  218M  692M   24% /boot


---

[1] https://fedoraproject.org/wiki/GRUB_2
[2] https://docs-old.fedoraproject.org/en-US/Fedora/26/html/System_Administrators_Guide/sec-Managing_DNF_Repositories.html
[3] https://www.linux.com/learn/cleaning-your-linux-startup-process
[4] http://0pointer.de/public/systemd-ebook-psankar.pdf
[5] https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet 

dd komutu, bs, count, skip ve seek kullanımı

Zamana zaman kullandığım dd komutunun parametereleri ile ilgili güzel bir örnek olacağını düşündüğüm aşağıdaki örneği kolay hatırlamak için kullanmak istiyorum.

dd komutu, bir giriş dosyasından (karakter bazlı bir cihaz da olabilir) verileri alıp başka bir dosyaya (karakter bazlı başkak bir cihaz da olabilir) yazmaya yarar. Aslında çok faydalı bir araç. Örnek olarak giriş dosyamız input.txt'nin 0'dan 9'a ve a'dan z'ye devam eden aşağıdaki gibi düz bir metin içerği olsun:

0123456789abcdefghijklmnopqrstuvwxyz

Bu dosyayı dd komutu ile aşağıdaki şekilde kopyalayabiliriz:
dd if=input.txt of=output.txt
Bu komutun ardından output.txt de aynen yukarıdaki gibi bir içeriğe sahip olacaktır. dd, giriş dosyasından her seferinde varsayılan olarak 512 byte okuyarak çıkış dosyasına yazar. Bu işlemi giriş dosyasının sonu gelene kadar yapar. Bizim dosyamız 512 byte'tan küçük olduğu için bu işlemi bir adımda bitirdi. bs parametresiyle bu varsayılan blok boyutunu değiştirebiliriz. Hatta count parametresiyle toplamda kaç blok kopyalayacağını da belirtebiliriz. Örneğin sadece baştan 15 karakteri alabilmek için bs=1 ve count=15 ile bu komutu tekrarlayalım.
dd if=input of=output bs=1 count=15
Bunun sonucunda output.txt şöyle olur:

0123456789abcde

Tam olarak 15 karakter. Her komut çalıştırmamızda da şöyle bir çıkış üretir:

15+0 records in
15+0 records out
15 bytes copied, 0,0000456 s, 45,8 kB/s

Giriş dosyasından 15 karater alıp çıkış dosyasına 15 karakter yazdığını ve işlem sürelerini vermiş.

İşler skip ve seek parametreleri girince daha eğlenceli hale geliyor. Eğer giriş dosyasındaki rakamları atlayıp doğrudan harfleri çıkışa yazmak isteseydik (yani girişten 10 karakter, ya da bs, atlamak isteseydik) şöyle yapmamız gerekirdi:

dd if=input.txt of=output.txt bs=1 skip=10
Bu komutun sonunda output.txt dosyamız şöyle olur:

abcdefghijklmnopqrstuvwxyz

Dahası var. Eğer rakamları da bu alfabenin sonuna yazmak istiyorsak bu sefer giriş dosyasından 10 karakter okuyup, bu sefer de çıkış dosyasındaki ilk 26 karakteri atlayıp daha sonra yazmasını söylememiz gerekirdi. Bunu da seek parametresiyle yapmamaız gerekir.
dd if=input.txt of=output.txt bs=1 count=10 seek=26
Bu noktaya kadar output.txt dosyasının hep üzerine yazmıştık. Ama seek parametresini kullanmaya başlayınca durum değişecek. Belirtilen sayıda (10) karaktere dokunulmayıp, o sayıdan sonrasının (11) üzerine yazılmaya başlanacak. Bu komutun sonunda da çıkış dosyamız aynen şöyle olur:

abcdefghijklmnopqrstuvwxyz0123456789

Burada count=10 giriş dosyasından sadece rakamların okunmasını sağladı.

Bir başka güzel özelliği de girişten okuyup çıkışa yazmadan önce dönüştürme yapıyor olması. Örneğin girişteki karakterlerin hepsini büyük harfe çevirmesini istiyorsak conv=ucase parametresini kullanabiliriz.
dd if=input.txt of=output.txt conv=ucase
Benzer şekilde küçük harfe çevirmek için de lcase kullanılabilir.

Bazı durumlarda da giriş dosyasındaki her iki byte çiftinin yerlerini değiştirmek gerekir. Bu durumda conv=swab kullanılmalı:
dd if=input.txt of=output.txt bs=2 conv=swab
Çıkış şöyle olur:

1032547698badcfehgjilknmporqtsvuxwzy

Kullanım alanları bununla kısıtlı değil. Örnek olarak bir disk bölümünün yedeğini almak için:
# dd if=/dev/sda1 of=/home/username/part1_backup.img

Gerektiği anda da bu yedeği kullanarak disk bölümünü tekrar oluşturmak için
# dd if=/home/username/part1_backupimg of=/dev/sda1
Bu dosya elbette çok fazla yer kaplayabilir. Yedek alırken bir de gzip ile sıkıştırmak için:
# dd if=/dev/sda1 | gzip > /home/username/part1_backup.gz
ya da bzip ile sıkıştırmak için
# dd if=/dev/sda1 | bzip2 --best > /home/username/part1_backup.bz2

Bu sıkıştırılmış dosyayı kullanarak disk bölümünü tekrar oluşturmak için ise
# gunzip -c /home/username/part1_backup.gz | dd of=/dev/sda1
Uzun işlemlerde sürecin neresindeyiz, işlemin kaçta kaçı bitti, görmek istersek status=progress anahtarını kullanabiliriz.

Büyük disklerle çalışırken bs=64K kullanılması önerilmiş.  conv=noerror,sync gibi seçeneklerle hatlar olsa bile devam etmesi ve eşzamanlı giriş/çıkış (syncronized I/O) kullanılabileceği de belirtilmiş.

Daha başka özellikler için bakınız man dd.

11.02.2018

Diskteki önyükleyiciyi bulmak

Bir diskin başında veya bir partition'ın başında önyükleyici var mı, yok mu nasıl anlarız? [1] ve [2]'de basit iki yöntem verilmiş.

Birincisinde dd komutunu kullanarak diskin ilk 512 byte'lık alanı okunuyor. Daha sonra bu alanın içeriği strings komutuna yönlendiriliyor:
# dd bs=512 count=1 if=/dev/sda 2>/dev/null | strings
Benim diskimin başında grub2 yüklüydü, şöyle bir çıktı verdi:

ZRr=
`|f   
\|f1
GRUB
Geom
Hard Disk
Read
 Error


Grub yüklü olmayan disk bölümlerinde hiçbir sonuç vermedi.

İkinci yöntemde ise file komutu ile diskin (veya bölümün) başı okunuyor. Benim bilgisayarımda şu çıktıyı verdi:

# file -s /dev/sda
/dev/sda: DOS/MBR boot sector
Bunların hiçbiri diskin (veya bölümün) başında çalışan bir önyükleyici bulunduğunun kanıtı olamaz. Yalnızca başarılı veya başarısız bir yükleme girişimi olmuş mu sorusunun yanıtı olabilir.
---
[1] https://serverfault.com/questions/61400/how-do-i-tell-if-grub-is-installed-on-a-device#289154
[2] https://superuser.com/questions/466086/how-can-i-discover-which-bootloader-is-installed-where