18.12.2018

Açılmayan Arch sorunu

Arch kurulumum aşağıdaki mesajlar sonrasında takılıp kalıyordu:

Warning: /lib/modules/4.19.8-arch1-1-ARCH/modules.devname not found -ignoring
starting version 239
ERROR: device 'UUID=.....' not found. Skipping fsck.
mount: /new_root: can't find 'UUID=....'.
You are now being dropped into an emergency shell.
sh: can't access tty; job control turned off
[rootfs ]#
Her ne kadar son gelinen nokta bir acil durum konsolu gibi gözükse de klavye çalışmıyor, öylece kalıyor. UUID ile gösterilen disk bölümü sağlam. Başka bir linux kurulumundan bu bölümü mount edip içeriği görebiliyorum.

Uzun uğraşlar sonucunda anladım ki olay pacman -Syu ile güncelleme yaparken güncellemenin yarım kalmasıyla yeni sürüm linux çekirdeğinin yüklenmesi ama initramfs'in yeniden oluşturulmasının gerçekleşmemesinden kaynaklanıyormuş.

USB sürücüsüne yazdığım archlinux ISO'su ile açtığım bilgisayarda ilk önce boot partition'ı /mnt'ye bağladım:
# mount /dev/sda3 /mnt
Ardından chroot ortamına geçtim:
# arch-chroot /mnt
Sonra gerek var mı, bilemiyorum ama arch forumlarında linux çekirdeği paketini tekrar yüklemem önerilmiş, onu yükledim (çünkü pacman -Qs linux ile mevcut sürümün yüklenmiş olduğunu görebiliyordum).
# pacman -S linux
Bundan sonra asıl işlem olarak initramfs'i tekrar oluşturdum:
# mkinitcpio -o linux
Grub'ı tekrar oluşturma adımını atladım, çünkü benim durumumda grub'ı başka bir linux kontrol ediyordu:
# grub2-mkconfig -o /boot/grub2/grub.cfg
Tekrar başlattığımda sorun giderilmişti.

Bu sorun ile şu adımların arkasından karşılaştım: 2 aya yakın bir süredir bu kurulumu açmamıştım. Açtıktan sonra pacman -Syu ile güncellemeleri kontrol etmek istedim, ama hiç güncelleme olmadığı mesajını aldım. Bu garip, çünkü 2 ay gibi bir süre zarfında arch linux gibi bir kurulumda mutlaka birkaç paket güncellemesi çıkardı. pacman -Syyu da fayda etmedi. Bunun üzerine güncelleme kaynaklarını tekrar oluşturmak istedim:
# reflector --verbose --latest 100 --sort rate --save /etc/pacman.d/mirrorlist

gibi bir komutla mirrorlist dosyasını tekrar oluşturdum. Sonrasında pacman -Syyu ile kontrol ettiğimde çok sayıda güncelleme buldum. Bunları yüklemeye çalıştım. Ama bir sebepten güncellemeler yarım kalmış. Bunun sonucunda da linux çekirdeği yüklenmiş, ama initramfs dosyası yeni sürüme uygun tekrar oluşturulmamş. Bunun sonucunda açılamayan bir sistem oluşmuş.

Ekleme 2021-08-12 : https://archlinux.org/mirrorlist/ sayfasından çevrimiçi mirrorlist dosyası oluşturulabiliyormuş.

Ayrıca şu adreste söylendiği gibi --lastest ve --score değerlerinin çok yüksek verilmesi listelerin indirilememesine sebep olabilirmuş.

1.12.2018

Linux'ta çok yavaş açılış

Yeni kurulum yaptığım bir bilgisayardaki Fedora'nın çok yavaş açılışını incelemek için plymouth ekranında escape'e bastığımda şöyle bir satırda uzun süre beklediğini farkettim:

A startup job is running for dev-disk-by\....
Sorun nerden kaynaklanıyor diye aradığımda bu sorunun /etc/fstab'da yer alan ve UUID'si güncel olmayan bir disk bölümü ile ilgili olabileceğini okudum. Gerçekten de karşılaştırdığımda swap bölümü için UUID'nin güncel olmadığını gördüm.

$ sudo blkid /dev/sdaX
ile güncel UUID'yi öğrendim. Sonra da /etc/fstab'a girerek burayı güncelledim. Kendimden emin bir şekilde tekrar başlattığımda hatanın aynı yerde durduğunu farkettim. 90 saniye kadar bu işlemin hata vermesini bekiyordu. Daha başka nerde sorun olabilir diye düşünürken /boot/grub/grub.cfg dosyasında resume alanın da aynı UUID'yi içerdiğini gördüm. Bunu değiştirmek için /etc/default/grub dosyasına baktığımda GRUB_CMDLINE_LINUX bölümünde yine aynı UUID'nin olduğunu gördüm. Son olarak bu dosyayı da güncelledim ve sorun yine olduğu gibi duruyordu.

Sonra hatırladım ki, swap bölümünün UUID'sinin değişmesine sebep olan, dual boot archlinux kurulumumdu ve grub'ı arch yönetiyordu. Bunun için arch'ı açtım. Bu kurulumda /etc/fstab ile ilgili bir sorun yoktu. Aslında /etc/default/grub dosyasında da sorunlu UUID'nin izine rastlamadım. Sadece
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
ile grub'ı güncellemem yeterli oldu.

16.11.2018

Komut satırından clipboard kullanımı

Bir komutun çıktısını komut satırı penceresinde uzun uzun işaretleyip kopyalamaktansa pipe ile clipboard'a aktarmayı nasıl yaparım diye ararken şu sayfaya denk geldim. Aslında eski komu satırı ile bu işi yaparken clip.exe iş görüyor. Örneğin
dir *.txt /b /s | clip
ile mevcut klasörün tüm alt klasörlerindeki txt dosyalarının isimlerini clipboard'a kopyalayabilirim.

Peki bunun eşdeğeri powershell'de var mıdır diye arıyordum ki arkadaş 3 senelik çalışmasının sonuçlarını paylaşmış, sağolsun. Ama altına Nihayet Mark Minasi bile gelip yorum yapmış; sanıyorum ki gerçek Mark Minasi. Demiş ki, WMF 5.0 ile Get-Clipboard ve Set-Clipboard cmdlet'leri geldi. WMF 5.0 de Powershell 5 demek oluyor.

Şu an itibariyle en son WMF 5.1 var ve yükleyince şu oluyor:
PS> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.0.10586.117
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.10586.117
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

TL;DR
Aynı işi powershell'de yapmak için

dir *.txt -recurse | Set-Clipboard
yeterli.

Komut satırını her açtığımda çalışsın

Powershell'de her açtığımda çalışmasını istediğim bazı komutlarım vardı. Onları profil Belgelerim klasörümün altındaki WindowsPowerShell altına profile.ps1 dosyasına kaydettim (ayrıca bu klasörün altında Modules\[modülismi]\[modülismi].psm1 gibi bir klasöre de kendi modülümü oluşturdum).

Benzer şekilde komut satırı penceresi için de her seferinde çalışacak bir komut dosyası oluşturmak istedim. Bunun cevabını da şurada buldum. Buna göre
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
altına AutoRun adında REG_EXPAND_SZ tipinde bir değer yaratıp adını da örneğin %USERPROFILE%\init.cmd vererek profil klasörümün altındaki init.cmd dosyasının çalışmasını sağlayabilirim. Bu işi tek bir komutta yapmak istersek bunun yolu da
reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun ^
  /t REG_EXPAND_SZ /d "%"USERPROFILE"%\init.cmd" /f
şeklinde verilmiş. Bu da güzel. Örneğin bir ortam değişkeni yaratıp bir de alias yaratmak için içeriğini şöyle oluşturabiliriz:

@echo off
set gdrv="C:\Users\metin\Google Drive"
doskey ls=dir /on
Hep linux zırvası bunlar.

---
[1] https://stackoverflow.com/questions/17404165/how-to-run-a-command-on-command-prompt-startup-in-windows
[2] https://stackoverflow.com/questions/20530996/aliases-in-windows-command-prompt
[3] https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc779439(v=ws.10)

15.11.2018

Windows'da sembolik ve hard link'ler

Windows'da kısayol yaratmanın düz yolu kısayolu kopyalayıp, yapıştırırken "kısayol yapıştır"ı seçmek. Bu şekilde aslında lnk uzantılı bir dosya yaratılır. Bu kısayol çift tıklandığında bu bu lnk uzantılı dosyanın işaret ettiği dosya çalıştırılır.

Bundan başka bir de sembolik link yaratma var. C:\Windows\system32\notepad.exe'nin sembolik linkini yaratmak için komut satırında şunları yazmak gerek (mklink'i yönetici hakları ile çalıştırarak):
mklink notdefteri C:\Windows\system32\notepad.exe
Bu iki yöntem ile mevcut klasörde yaratılan dosyaların farkı aşağıdaki gibi olacak
15.11.2018  13:27    <SYMLINK>      notdefteri [C:\Windows\System32\notepad.exe]
15.11.2018  13:28             1.191 notdefteri.lnk
İlki sembolik kısayol (<SYMLINK> olarak görülüyor), diğeri "kısayolu yapıştır" yöntemi ile oluşturulan.

Bir klasörün sembolink link'ini oluşturmak için /D anahtarı kullanılmalı.

mklink /D Belgelerim C:\Users\metin\Documents

Bu yöntemle oluşturulan kısayol şöyle gözükür (<SYMLINKD>):
15.11.2018  13:34    <SYMLINKD>     tf [E:\testfolder]
Sembolik linkler silinse bile notepad.exe dosyası silinmez. Çünkü bunlar asıl notepad.exe dosyasını gösteren işaretçilerdir. Ama notepad.exe silinirse o zaman sembolik linkler anlamsız birer işaretçi olurlar.

Dosya sistemindeki sembolik linkleri bulmak için dir komutunu /AL ile kullanmak gerek:
dir /AL
Eğer bir klasörün alt klasörlerindeki bütün dosyaları bulmak istiyorsak
dir /AL /S C:\Users
kullanılabilir. Aynı şeyi powershell ile yapmak istersek
Get-ChildItem | where {$_.Attributes -match "ReparsePoint"}
Powershell ile dir komutu (Get-ChildItem) kullanıldığında ilk sütunda görüntülenen Mode alanındaki dosyanın öznitelikleri (attributes) listelenir. Bu özniteliklerden en sağdaki veri dosyanın bir reparsepoint olup olmadığını gösterir. Sembolik linkler için bu kısımda bir "l" harfi gösterilir. Örnek:
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d----l       15.11.2018     13:34                tf
-a---l       15.11.2018     13:27              0 notdefter
Bundan başka bir de hard link'ler var. Bunun için mklink'i  /H anahtarını ile kullanmak lazım:
mklink /H hardlink dosya.exe
Bunun sonucunda diskin üzerindeki aynı veriyi gösteren iki dosya sistemi girişimiz olur. Bunlardan biri silinse bile asıl dosya verisi silinmez. Hard link'in hedefi aynı disk bölümü içinde olmalıdır.

Hard link'ler klasörler için olmaz. Klasörler için benzer kavram junction'dır. Başka bir disk bölümünde yer alan klasör için junction yaratılabilir. Örnek:
mklink /J junction D:\testfolder
Bu konuları özetlemek için ss64.com sitesinden alınma aşağıdaki tablo faydalı olabilir:

Windows komut satırından exe dosyası sürüm numarası sorgulama

Hızlı bir şekilde, çoğunlukla da uzaktaki bir sistemdeki bir exe dosyasının sürüm bilgisini öğrenmek istediğimde şu yöntemlerden birini kullanıyorum.

Düz Windows ortamı, ek bir araç kullanmadan, doğrudan komut satırından:

wmic datafile where name='C:\\windows\\notepad.exe' get Version
Bu yöntem ile ağ üzerinden uzaktaki dosya sorgusu mümkün değil. datafile parametresi UNC yolları desteklemiyor.

Ağ üzerinden sorgu yapabilmek için Sysinternals'ın sigcheck komutuna ihtiyaç var. Kullanım şöyle:
sigcheck -nobanner -n \\uzakbilgisayar\c$\Windows\notepad.exe
Powershell ile yapmak için ise
(Get-Item \\uzakbilgisayar\c$\Windows\notepad.exe).VersionInfo.Fileversion
kullanılabilir.

23.10.2018

İnternet ve kısayollar

İnternette dolaşırken sıkça kullanmaya başladığım birkaç kısa yol şöyle:

DuckDuckGo kısayolları
h : Arama kutusuna git, arama metnini seç
j veya alt ok : arama sonuçlarında aşağıya git (odağı kazanmamışsa sayfada boş bir yere tıklamak gerekebilir)
k veya üst ok : arama sonuçlarında yukarıya git
t : arama sonuçlarında en üste git
l (küçük L harfi) veya o (küçük O harfi) : seçili arama sonucunu aç

Youtube
Herhangi bir youtube videosunu izlerken Shift+? kısayollar listeler.
boşluk çubuğu : oynatmayı duraklat / devam ettir (odak videoda olmalı)
k : oynatmayı duraklat / devam ettir (odağın videoda olmasına gerek yok)
m : videoyu sessize al
c : altyazılar varsa etkinleştir
sola ok : videoda 5 saniye geriye git
j : videoda 10 saniye geriye git
sağa ok : videoda 5 saniye ileriye git
l (küçük L harfi) : videoda 10 saniye ileriye git
yukarı ok : sesi artır
aşağı ok : sesi azalt
0 (sıfır) : videonun başına git
1-9 : video'nun sırasıyla %10, %20, ... %90'ına atla
ö veya / : youtube'un arama kutusuna git
Shift + N : oynatma listesinde bir sonraki videoya atla
Shift + P : oynatma listesinde bir önceki videoya atla
Ctrl + sağ ok : videonun ilerleme çubuğunda görülen bir sonraki bölümüne atla
Ctrl + sol ok : videonun ilerleme çubuğunda görülen bir önceki bölümüne atla
> veya Shift + . : oynatma hızını artır
< veya Shift + , : oynatma hızını düşür
. / , : (duraklatılığında) videoda 1'er kare olarak ileri veya geri git
t : Sinema modunu aç veya kapat
i : mini oynatıcıya geç
---
[1] https://duck.co/help/features/keyboard-shortcuts
[2] https://support.google.com/youtube/answer/7631406?hl=en

23.07.2018

archlinux kablosuz ağ şifresini güncelleme

İlk archlinux kurulumumda, wifi şifresini değiştirdikten sonra ağ bağlantısı sorunu yaşamaya başladım. Bilgisayarım bir türlü şifresi değişen kablosuz ağa bağlanmıyordu. Archlinux forumlarındaki şu sayfada faydalı birkaç öneri verilmiş.

Kablosuz erişim noktası üzerindeki kablosuz ağ şifremi değiştirdikten sonra /etc/netctl klasörü altında profil dosyama girip şifremi güncellemiştim. Benimki için dosya adı
/etc/netctl/wlo1-Deneme
idi. Dosyanın içinde Key ile başlayan satırdaki şifreyi güncelledikten sonra
sudo netctl start wlo1-Deneme
komutu ile profilimi başlatmayı denediğimde şöyle bir hata alıyordum:

Job for netctl@Deneme.service failed because the control process exited with error code. 
See "systemctl status netctl@Deneme.service" and "journalctl -xe" for details.

Forumdaki yüce kişilik öncelikle bu hatanın birden fazla IP otomatik ayarlaması yapan hizmetin çalışması ile ilgili olabileceğini farkederek bu kontrolü yaptırmış:
ls -l /etc/systemd/system/multi-user.target.wants 
 Klasörünün altındaki hizmetleri listeletmiş. Benimkinde de dhcp hizmetine ait bir öğe vardı. Önce onu kaldırdım:
systemctl disable dhcpcd.service systemd-networkd.service wicd.service
Daha sonra bilgisayarımı tekrar başlattım. Bilgisayarım tekrar başladıktan sonra netctl komutlarına daha önceki gibi hata vermeyi bıraktı. Artık wifi şifremi değiştirdikten sonra ilgili profil dosyamdaki şifreyi değiştirip sonrasında
netctl stop wlo1-Deneme
ve ardından (bazı durumlarda ip link set wlo1 up gerekebilir)
netctl start wlo1-Deneme
yapmam yetiyor :)

Ek 2019-05-29: Bilgisayarımın bağlandığı varsayılan wifi ağını değiştirdim. Archlinux, hala eski ağa bağlanmaya çalışıyor. Yenisine otomatik olarak bağlanmıyor. Şu adımları izledim:
sudo netctl disable wlo1-EskiAg
sudo netctl enable wlo1-YeniAg
Bu şekilde /etc/systemd/system/multi-user.target.wants  altındaki varsayılan bağlantı değiştirilir.

Archlinux ve pacman

Ubuntu ve Fedora'nın ardından yeni favorim Archlinux. Bir deneme yapabilmek için diskimde yeni bir bölüm oluşturdum, manuel kurulumu tamamladım. Komut satırı, AUR ve pacman ile biraz daha yakın ilişkim olacak, orası kesin.

Pacman'i biraz özetlemek benim için faydalı olacak.

Öncelikle söylenen o ki pacman, apt ve dnf'e kıyasla daha hızlı. Ama ihtiyaç duyulan parametreler biraz daha içgüdüden uzak. Kendi içinde bir yapısı var elbette, ama öğremek zaman alacak.

 Pacman'da işlemler 5 ana kategoride:

-Q : (Query) pacman veritabanını sorgula
-R : (Remove) sistemden paket kaldır
-S : (Sync) paketleri senkronize et
-U : (Upgrade) Sistemdeki paketleri güncelle
-F : (File) sistemde kurulu dosyaların içinde sorgu çalıştır

Query (-Q) işlemleri için kullanılabilecek anahtarlar:
-i : Kurulu paket ile ilgili bilgileri göster. Örneğin
pacman -Qi firefox
-k : Bir pakedin sahip olduğu dosyaları kontrol et. Ayrıntılı kontrol için -kk kullanılabilir.
-l : Bir paketin sisteme kurduğu dosyaları göster
-o : Bir dosyanın sahibi olan paketi ara
-s : Kurulu paketlerin arasında bir paket ismi ara
-e : explicit : sistemin kurduğu değil, kullanıcı tarafından kurulan programları listele.
-q : Quiet. sürüm no gibi ek bilgileri gösterme, sadece paket isimlerini listele.
-n : Sadece ana repo'lardan kurulan programları listele.
-m: AUR'dan kurulan programları listele.
-d : dependencies. Başka bir programın alt bağımlığı olarak kurulan programları listele.
-t : unrequired. gereksinim duyulmayan paketleri listele.
-dt: genelde ihtiyaç duyulmayan paketleri listelemek için ikisi beraber kullanılır.

vlc kurulu mu değil mi öğrenmek için:
pacman -Qs vlc

Remove (-R) işlemleri için kullanılabilecek anahtarlar:
-s : recursive. bir paketi ve o paketle gelen tüm alt bağımlılıkları kaldırmak için
-u : unneeded. gereksiz paketleri de kaldır
-n : paketle beraber gelen sistem yapılandırma dosyalarını da sil

Dolayısıyla thunderbird ile gelen bütün herşeyi kaldırmak için gereken komut:
pacman -Rnu thunderbird
olabilir.

Sync (-S) anahtarları:
-c : clean, yerel belleği temizle
-i : Kurulu olmayan paket ile ilgili bilgileri göster
-l : list
-q : quiet. Ekstra ayrıntılara (sürüm no, repo adı vs) girmeden sadece isimleri listele.
-s : search. depolarda arama yap.

Depolarda chromium aramak için
pacman -Ss chromium
-y : refresh. depolardan paket listesini tekrar indir (-Syy : liste yeniyse bile tekrar indir)
-u : upgrade. Tüm kurulu paketleri güncelle (-Suu: depodaki paket kurulu sürümden eskiyse bile güncelle)
-w : indir, ama kurma

File system (-F) işlemleri ile kullanılabilecek anahtar:
-s : search. Diskte kurulu bir dosyayı hangi paket kurmuş Bu artık (2024-02-27) yok. Bu işlev yerine sadece -F kullanılmalı.
-yy : force update. Henüz yeni güncellenmiş olsa da yine de paket listesini güncelle.
pacman -Fy
pacman -F libmozgtk.so
pacman -F /usr/lib/firefox/libmozgtk.so

Yukarıdaki ilk adımda pacman'in dosya/paket listesini güncellemesini, ikinci adımda libmozgtk.so dosyasının hangi paketlerde bulunabileceğini, üçüncü adımda ise tam yolu verilen dosyanın hangi paketlerde bulunabileceğini sorguluyoruz. Buna benzer bir işlev pkgfile ile de sunuluyor:

pkgfile lsb-release
pkgfile /etc/lsb-release
Genel bir anahtar: 
-p : işlemi yapmaktansa sadece işlemin uygulanacağı paket adını yaz.

Birkaç örnek üzerinden gidelim:

pacman -Syy // yerel paket verisini sunucularla eşleştir (sync)
pacman -Syu // tüm paketleri güncelle
pacman -Ss firefox // repository'lerde adında firefox geçen paket ara
pacman -Ssq ^firefox$ // tam adı firefox olan paketi ara, ayrıntısız
pacman -S firefox // firefox'u depolardan kur
pacman -S extra/firefox // belli bir depodan kur
pacman -U /home/user/package // sistemdeki yerel dosyayı kur
pacman -U http://github/... // bir URL'den dosya kur
pacman -S gnome // gnome paket grubunu kur
pacman -R firefox // bir paket kaldır
pacman -Rs apache // bir paket ve tüm alt bağımlılıklarını kaldır
pacman -Rns $(pacman -Qtdq) // sistemdeki tüm kullanılmayan paketleri temizle/kaldır
pacman -Ru gnome // tüm gnome paket grubunu kaldır
pacman -Q | more // tüm kurulu paketleri listele
pacman -Ql apache // apache tarafından kurulan tüm dosyaları listele
pacman -Ss chromium // depolarda bir paket ara
pacman -Qs firefox // kurulu paketlerin içinde bir paket ara
pacman -Si chromium // kurulu olmayan bir paket hakkında bilgileri göster
pacman -Qi apache // kurulu bir paket ile ilgili bilgileri göster

pactree apache // bir paket ile ilgili bağımlılık ağacını göster
pacman -Qdt // artık gerekli olmayan paketleri listele
pacman -Sc  // cache verileri temizle
pacman -Scc // cache belleğe alınan paketleri sil
pacman -Qo netctl // netctl dosyasını hangi paket kurmuş göster
pacman-optimize // optimize pacman

Ayrıca pacman'in yapılandırmasını /etc/pacman.conf dosyasını düzenleyerek de yapabiliriz. Örneğin şu ayarlar mümkün:

Color # renkli çıkış
CheckSpace # indirme yaparken her seferinde diskte boş yer var mı kontrol et

VerbosePkgList # kurulacak paketler ile ilgili ayrıntılı bilgi
TotalDownload # dosya bazında değil, tüm indirmelerin ne kadarının tamamlandığını göster


2021-12-23 ek:

Kurulu çekirdekleri listelemek için:

$ pacman -Qsq ^linux | grep -E '^linux[0-9]{2,3}$'

veya

$ ls -l /boot/vmlinux*

ve hatta sadece Manjaro'ya özel

$ mhwd-kernel -li

kullanılabilir.

---

https://wiki.archlinux.org/title/Pacman/Tips_and_tricks

9.07.2018

Komut satırından harici IP adresi bulmak

Arch linux kurulumu sırasında harici IP adresimi bulmak istedim. Aradığımda aşağıdaki gibi sonuçlara ulaştım:

OpenDNS ile:

dig +short myip.opendns.com @resolver1.opendns.com
Bu sayede öğrendim ki OpenDNS sunucuları üzerinde myip.opendns.com için yapılan sorgularda sorguyu yapan istemcinin adresi dönüyormuş.

Web Hizmeti ile:

Aynı  www.whatismyip.com gibi bir sayfaya girerek bakmak gibi, ama düz metin olarak IP dönüyor:
curl -S http://whatismyip.akamai.com

Elbette şu sayfada whatismyip.akamai.com için alternatifler de verilmiş.

2021 güncellemesi: Şu video'da gördüm ki

curl ifconfig.me

gibi daha da basit olabiliyormuş.

2022 güncellemesi: Yeni bir alanadı

    curl echoip.xyz 

ya da

    curl ipecho.net/plain

ya da

  curl icanhazip.com 

belki de

  curl ifconfig.io 

hatta

  curl wtfismyip.com/text (json da var)

ve hatta

  iwr api.ipify.org 

Bir de bunları Windows'da yapmanın yollarını bulmak istedim. dig'in Windows eşdeğeri (basit bir DNS sorgusu yapmak aslında) nslookup veya Resolve-DnsName olabilir:

nslookup myip.opendns.com resolver1.opendns.com
Ama bu komut sonunda tek satırlık bir hedef dönmüyor, en alt satırdaki sonuca odaklanmak lazım.

Ya da Powershell eşdeğerini kullanarak
PS> (Resolve-DnsName -Name myip.opendns.com -Server resolver1.opendns.com).IPAddress
Curl'un eşdeğerini aradığımda da zaten curl diye bir alias'ı bulunan Invoke-WebRequest cmdlet'ini gördüm. Sadece IP adresini döndürmek için alias'ı kullanarak:
PS> curl http://whatismyip.akamai.com | select -ExpandProperty content

1.06.2018

Windows'da güncelleştirmeleri komut satırından yükleme

Linux ile fazla içli dışlı olunca insan Windows'da da aynı şeyleri arıyor. Linux'taki bütün güncellemelerin komut satırından yönetilmesi çok güzel. Powershell ile bunu Windows'da yapmayı bulunca çok hoşuma gitti.

Sanıyorum sürüm 3'ten beri Powershell'de PoweShellGet adında bir sağlayıcı (provider) bulunuyor. Bu sağlayıcı aracılığıyla bazı ek paketler (packages) yüklenebiliyor. Bunlardan biri de PSWindowsUpdate paketi.

Öncelikle PowerShell ile gelen modülleri görelim:

PS> Get-Module -ListAvailable

    Directory: C:\Program Files\WindowsPowerShell\Modules


ModuleType Version    Name                   ExportedCommands
---------- -------    ----                   ----------------
Script     1.1.7.2    PackageManagement      {Find-Package, Get-Package, ...
Manifest   2.0.2      Posh-SSH               {Get-SCPFile, Get-SCPFolder, ...
Script     1.6.5      PowerShellGet          {Find-Command, Find-DSCResource, ...
Binary     2.0.0.4    PSWindowsUpdate        {Enable-WURemoting, Get-WUJob, ...


    Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules


ModuleType Version    Name                   ExportedCommands
---------- -------    ----                   ----------------
Manifest   1.0.0.0    ActiveDirectory        {Add-ADCentralAccessPolicyMember,...
Manifest   1.0.0.0    AppBackgroundTask      {Disable-AppBackgroundTaskDiagnosticLog, ...
Manifest   2.0.0.0    AppLocker              {Get-AppLockerFileInformation, ...


Liste bu kadar değild, kısa kestim. Burada kalın olarak vurguladığım kısım, bahsettiğim PowerShellGet modülü. Yanında bu modül ile gelen cmdlet'ler listelenmiş. Ben bunu güncellediğim için sürüm 1.6.5 gözüküyor. Güncellemek için

PS> Install-Module -Name PowerShellGet

kullanmak gerek. Tüm kurulumlar için yönetici yetkileri gerek. Ayrıca bu adımda NuGet'i de kurmak isteyecek, izin vermek durumundayız. Bunu yapınca sistemde 2 tane PoweShellGet olabilir, eski sürümü

$env:ProgramFiles\WindowsPowerShell\Modules\PowerShellGet

konumundan silebiliriz. Aslında Update-Module diye de bir cmdlet var, ama sadece Install-Module ile kurulan modüller Update-Module kullanarak güncellenebiliyormuş

Sonrasında PowerShellGet sağlayıcısının içinde ne gibi paketler var diye bakmak için Find-Package cmdlet'ini kullanabiliriz (öncesinde execution policy'yi remotesigned olarak ayarlamak gerekebilir):

Find-Package -ProviderName PowerShellGet

Bende 2820 tane paket çıktı. Bu paketlerden biri de PSWindowsUpdate. Yüklemek için şu komudu kullandım:

Install-Package -Name PSWindowsUpdate

Birkaç saniye içinde kuruldu. Bu paket ile acaba hangi komutlar geldi?

PS> Get-Command -Module PSWindowsUpdate

CommandType     Name                                 Version    Source
-----------     ----                                 -------    ------
Alias           Download-WindowsUpdate               2.0.0.4    PSWindowsUpdate
Alias           Get-WUInstall                        2.0.0.4    PSWindowsUpdate
Alias           Get-WUList                           2.0.0.4    PSWindowsUpdate
Alias           Hide-WindowsUpdate                   2.0.0.4    PSWindowsUpdate
Alias           Install-WindowsUpdate                2.0.0.4    PSWindowsUpdate
Alias           Show-WindowsUpdate                   2.0.0.4    PSWindowsUpdate
Alias           UnHide-WindowsUpdate                 2.0.0.4    PSWindowsUpdate
Alias           Uninstall-WindowsUpdate              2.0.0.4    PSWindowsUpdate
Cmdlet          Add-WUServiceManager                 2.0.0.4    PSWindowsUpdate
Cmdlet          Enable-WURemoting                    2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WindowsUpdate                    2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUApiVersion                     2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUHistory                        2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUInstallerStatus                2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUJob                            2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WULastResults                    2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WURebootStatus                   2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUServiceManager                 2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUSettings                       2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUTest                           2.0.0.4    PSWindowsUpdate
Cmdlet          Invoke-WUJob                         2.0.0.4    PSWindowsUpdate
Cmdlet          Remove-WindowsUpdate                 2.0.0.4    PSWindowsUpdate
Cmdlet          Remove-WUServiceManager              2.0.0.4    PSWindowsUpdate
Cmdlet          Set-WUSettings                       2.0.0.4    PSWindowsUpdate
Cmdlet          Update-WUModule                      2.0.0.4    PSWindowsUpdate


Şimdi Windows güncellemelerini kontrol edelim:

PS> Get-WindowsUpdate

Bu aşamada her güncelleştirme için status sütununda bazı kısatlamar yer alacak. Bunların anlamları şöyle:

[A|R]DIMHUB:
A: Accepted (kabul edilmiş)
R: Rejected (kabul edilmemiş)
D: Downloaded (indirilmiş)
F: Download failed (indirme başarısız)
?: Invoked (sanıyorum kurulumuna başlanmış ve devam eden)
I: Installed (kurulmuş)
R: Reboot required (tekrar başlatma bekleniyor)
M: Mandatory (zorunlu)
H: Hidden (gizlenmiş)
U: Uninstalled (kaldırılmış)
B: Beta (test aşamasında)


Bu güncellemelerin tümünü indirip kurmak istiyorsak şunu yapabiliriz:

PS> Get-WindowsUpdate -AcceptAll -Install -

Ya da belli birkaç güncelleştirmeyi saat 23:30'da kurmak üzere zamanlamak ve sonrasında gerekiyorsa otomatik olarak tekrar başltmak için:

PS> Get-WindowsUpdate -KBArticleID KB7585315 -AcceptAll -Install -ScheduleJob (Get-Date -Hour 23 -Minute 30 -Second 0) -AutoReboot

Tüm bu komutların -ComputerName anahtarını kullanarak uzak bir veya birkaç bilgisayarda da yapabiliriz.

PowershellGet altında dikkatimi bir paket daha çekti: PSScreenFetch. Linux altındaki screenfetch'in bir benzeri olabilir mi diye bir de bunu kurayım dedim:

PS> Install-Package -Name PSScreenFetch

Sonrasında da bu paket ile acaba hangi komutlar geldi diye baktım:

PS> Get-Command -Module PSScreenFetch

CommandType           Name                  Version  Source
--------------------  -----                 -------  ------
Function              Invoke-PSScreenFetch  0.0.3    psscreenfetch

Gelen Invoke-PSScreenFetch'i çalıştırdım ve sürpriz...


Windows için screenfetch! Tek kötü tarafı, sadece Windows 10'da çalışıyor. Madem yaptınız, az daha uğraşıp diğer sürümlerde de çalıştırsaydınız ya... :/

---

https://woshub.com/pswindowsupdate-module/

23.05.2018

Fedora 28'e yükseltme sorunu

Fedora 28'e yükseltme sırasında aşağıdaki gibi bir hata aldım:

Error:
 Problem: nss-pem-1.0.3-6.fc27.i686 has inferior architecture
 - nss-pem-1.0.3-6.fc27.x86_64 does not belong to disupgrade repository
 - problem with installed package nss-pem-1.0.3-6.fc27_i686

Sorunun bir dnf hatasından kaynaklandığı, çözüm olarak nss-pem'i elle kurulması önerilmiş [1]:

sudo dnf install nss-pem-1.0.3-9.fc28

ya da daha açık bir şekilde sürüm 28 için [2]:

sudo dnf install nss-pem-1.0.3-9.fc28 --releasever=28

İşe yaradı.


---
[1] https://ask.fedoraproject.org/en/question/119529/upgrade-issue-does-not-belong-to-a-distupgrade-repository/
[2] https://bodhi.fedoraproject.org/updates/FEDORA-2018-7f8b60cd0e

15.05.2018

Windows komut satırı gelişmiş kullanımı

Linux ve MacOS gibi Windows'un da yazarak komut verilen bir arayüzü var. Bu arayüzü yıllardır neredeyse aynı. Windows 10 ile birlikte bazı ufak değişiklikler oldu (Alt+Enter ile tam ekran olma, şeffaflık kazanma gibi) ama temelde değişen ciddi birşeyler yok. Sık kullananlar için bazı ileri seviye yöntemler faydalı olabilir, tekrarlanan yazmaları azaltmak için.


Şu sayfada bazı ileri seviye teknikler anlatılmış. Benim ilgilendiğim ise iki bölümden oluşan bir komutun birinci ve ikinci kısımlarını tekrar yazmadan kullanabilmek.

Örneğin şöyle bir komut kullandığımızı varsayalım:
ping hedefpc1
Burada komut boşlukla ayrılan iki bölümden oluşuyor. Birinci bölüm ping komutu, ikinci bölüm ise bilgisayar adı.

Eğer arka arkaya birkaç cihazı ping'lemek istiyorsak bu komuttaki ilk bölüm aynı kalacak, ikinci bölüm değişecek demektir. Her seferinde ise ping'i yazmaktan kurtulabiliriz. Bunun için önce F2'ye sonra da boşluk tuşuna basmak olacaktır. Bu tuş kombinasyonu bize bir önceki komutun ilk boşluk karakterine kadarki kısmını verecektir. Sonrasında bilgisayar ismini yazarak devam edebiliriz.

Veya tam tersi bir durum olsun. Varsayalım ki önce hedefin ICMP'ye cevap verip vermediğini kontrol ettik, eğer cevap veriyorsa başka bir işlem yapmak istiyoruz. Bu durumda bilgisayar adını yazmadan sadece ping komutunu başka bir komut ile değiştirmek istiyoruz. Bu durumda yapılacak olan önce F8 tuşu ile bir önceki komudu ekrana getirmek (takipçi otomatik olarak satır başına konumlandırılır) ve daha sonra F4'e ve boşluk tuşuna basmak. Bu şekilde boşluk karakterine kadar olan kısım (yani ping) silinir, sadece bilgisayar adı kalır.

Evet, bunun yerine linux terminalindeki gibi sadece Ctrl+w kısa yolunun olmasını isterdim, ama elimizdeki bu.

Bir de son olarak komut satırında kullanılan fontu değiştirmek var. Bu da aynı komut satırını yıllardır görüp sıkılanlar için. Komut satırı fontlarını değiştirmek için sistem menüsünden özelliklere gelerek Font sekmesine geçebiliriz. Ama buraya sistemde yüklü olan bütün fontlar gelmeyecektir. Buraya gelmesini istediğimiz fontlar için Windows kayıt defterine bazı girişler yapmak gerek.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont

anahtarı altına adı ilk fonta ait kayıt defteri değeri adı "00"dan (çift sıfır) başlayarak, ikincisi "000" (üç sıfır) diye her seferinde 1 fazla sıfır "0" koyarak girişler yapmak, bunların da değerlerini font ismi olarak ayarlamak gerek. Örneğin ben Google'ın Noto Mono fontlarını kullanmak istedim. Bu font, girdiğim ilk ek font olduğu için "00" ismini kullandım. İkincisini girmek isteseydim "000" kullanacaktım. Bu girişin değeri olarak da "Noto Mono" (tabi öncesinde ilgili fontları download etmek lazım) yazdım, aşağıdaki gibi:


Nihayetinde font sekmesinde artık seçimim gözüküyor. Buraya sadece sabit genişlikli fontların (monospace) eklenmesini tercih etmek isteyebilirsiniz.


Bu yöntemin bir dezavantajı, F7 geçmiş menüsünde olduğu gibi karakter tabanlı pencere kenarlıkları istenilen şekilde görüntülenemiyor.

4.04.2018

Powershell'de fonksiyon hangi modülden geliyor

Bir yanlışlık yapıp oluşturduğum fonksiyon'a var olan bir başka fonksiyon ile aynı ismi vermişim. Aslında böyle bir fonksiyon bile olduğunu bilmiyordum, tesadüfen öğrenmiş oldum.

Peki bir fonksiyonun hangi modülden geldiğini nasıl bulurum? Get-Command cmdlet'i ile.
Get-Command Test-DNSServer
CommandType  Name                 Version    Source
-----------  ----                 -------    ------
Function     Test-DnsServer       2.0.0.0    DnsServer

Görüldüğü gibi Source altında DnsServer adında bir modül adı yazıyor.
Peki benim yanlışlıkla aynı ismi verip sonradan düzelttiğim fonksiyon hangi modülden?

Get-Command Test-DNSServerResponse
CommandType  Name                   Version    Source
-----------  ----                   -------    ------
Function     Test-DnsServerResponse 2.0.0.0    Local
Bu fonksiyon, görüldüğü gibi kendi yazdığım ve adı local olan başka bir modülden.

Get-Command ayrıca adını tam bilmediğimiz cmdlet veya fonksiyonları da aramak için faydalı:
get-command Get-Net*IP*
Veya test ile başlayan tüm cmdlet'leri aramak için:
get-command -Verb test
Ya da tireden sonraki ikinci kısmında connection olan cmdlet'leri aramak için:
get-command -Noun connection

3.04.2018

DNS ve Cloudflare

İnternet sitelerine siber saldırılara karşı savunma hizmeti veren Cloudflare firması, herkese açık yeni DNS sunucularını duyurdu. DNS konusu hem önemli hem de hassas bir konu. Bir dönem ülkemizde de DNS sunucu değişikliği halk arasında bayağı popüler bir konuydu. Yeni DNS'in duyurulduğu sayfada da Türkiye'deki bu duruma atıflar yapılmış.

Neyse, ben işin teknik tarafındayım. En başta OpenDNS vardı, 208.67.220.220 ve 208.67.222.222 gibi iki sunucu ile hizmet veriyordu. Daha sonra Google da halka açık DNS'lerini duyurdu: 8.8.8.8 ve 8.8.4.4. Google'ın bütün hizmetleri gibi DNS'lerinin IP'leri de kolay ve akılda kalıcıydı. Google, hizmetlerinin hızlı olacağını da taahhüt ediyordu.

Ve nihayet Cloudflare'in DNS sunucuları da duyuruldı: 1.1.1.1 ve 1.0.0.1. IP adresleri çok havalı, değil mi? Firmanın blog'unda yazdığına göre bu IP adresleri uzun süredir reserve durumdaydı. Ancak muhtemelen kontrolsüzce her yere girilmiş olduğundan dolayı önlenemez bir trafik yüzünden hiçbir yere atanamıyordu. Cloudflare bununla baş edebileceğini düşünmüş. Bu adreslere gelen gereksiz trafiği süzüp, sadece DNS trafiğini cevaplayarak bu güzel IP adreslerini kullanıma açmışlar.

Bir süre önce 3. parti programlarla DNS sunucuların performansını ölçmüştüm. Ama bunu artık Powershell ile yapabilirim düşüncesiyle yaptığım bir aramada şu sayfaya ulaştım. Kaynağı belli olmayan bir exe dosyasına göre basit bir Powershell betiği her zaman tercih edilir. Script çok basit. Measure-Command ile Resolve-DNS'in çoklu sorgularını ölçüyor. Ben biraz daha değiştirip bir fonksiyon haline getirdim:

function Test-DNSServerResponse
{
    [CmdletBinding()]
    Param
    (
        [string]$Query = "wwww.bing.com",
        [string]$DNSserver = "8.8.8.8",
        [int]$numberoftests = 20
    )
   
    $totalmeasurement = 0

    $i = 0

    while ($i -ne $numberoftests)

    {
        $measurement = (Measure-Command {Resolve-DnsName $Query -Server $dnsserver –Type A}).TotalSeconds
        $totalmeasurement += $measurement
        $i += 1
    }

    Write-Output "DNS Sunucu: $dnsserver"
    Write-Output "Deneme sayısı: $numberoftests"
    Write-Output "Toplam süre: $totalmeasurement seconds"
    Write-Output "Ortalama süre: $($totalmeasurement/$numberoftests) seconds/test"
}


Denemeleri de her bir DNS sunucu için şu şekilde yaptım:
Test-DNSServerResponse -DNSserver 1.1.1.1
Hedef olarak Google'ın DNS sunucularını, OpenDNS'in sunucularını ve CloudFlare'in sunucularını seçtim. Karşılaştırabilmek için Türk Telekom'un DNS sunucularını kullandım. Testleri hem ICMP hem de DNS protokolü ile yaptım. ICMP'yi de dahil etme sebebim, nispeten sunucu yoğunluğu hakkında bir bilgi verebilme ihtimali.

100 dk kadar (saniyede 1 ping, 32 byte, toplamda 6061 paket) ping attıktan sonra durum şu şekilde oldu (ortalama ping süresine göre artan sıralama):

SunucuKayıp Paket (adet)Başarılı (adet)Ortalama süre (ms)
195.175.39.39060614
195.175.39.40160604
8.8.8.87605435
1.0.0.10606164
208.67.220.2209605265
208.67.222.22210605169
1.1.1.1347571468
8.8.4.41179488267

Ek 24.10.2018: Aynı tablonun 5000 ping sonrası oluşturulmuşu:
SunucuKayıp Paket (adet)Başarılı (adet)Ortalama süre (ms)
195.175.39.39949915
195.175.39.40549955
8.8.4.410499026
8.8.8.815498532
1.0.0.13499755
208.67.220.2205499557
1.1.1.13499758
208.67.222.2223499759

Ek 31.01.2019: Aynı tablonun 1500 ping sonrası oluşturulmuşu:
SunucuKayıp Paket (adet)Başarılı (adet)Ortalama süre (ms)
195.175.39.40015004
195.175.39.39114994
8.8.8.80150019
8.8.4.40150019
208.67.222.2220150047
1.0.0.12149848
208.67.220.2202148950
1.1.1.11149956

Ek 09.12.2019: Aynı tablonun 5121 ping sonrası oluşturulmuşu (CloudFlare gelişme kaydetmiş):
SunucuKayıp Paket (adet)Başarılı (adet)Ortalama süre (ms)
195.175.39.39551164
195.175.39.40651154
1.1.1.16511516
1.0.0.16511518
8.8.8.85511619
8.8.4.45511521
208.67.220.2202511954
208.67.222.2224511754

Buradan anlaşılan, Türk Telekom'un 195.175.39.39 IP adresine sahip DNS sunucusu bana gayet yakın bir sunucu. 6061 ping paketinden hiçbiri kaybolmamış ve ortalama ICMP cevap süresi de 4 ms. Cloudflare'in 1.0.0.1 sunucusuna gönderilen paketlerde de kayıp yok, ama bu sunucunun ortalama cevap süresi 64 ms. Öte yandan Cloudflare'in diğer 1.1.1.1 sunucusu ise şu anda oldukça yoğun gözüküyor. Bu sunucuya gönderilen 347 paket kayıp. Ortalama cevap süresi ise aynı. Yalnız bu cevap, ICMP cevabı. DNS cevabı değil.

DNS sorgularını cevaplama bakımından ise durum biraz farklı (ortalama çözüm süresine göre artan sıralama):

SunucuOrtalama Çözümleme Süresi (ms)
195.175.39.396,18
195.175.39.407,30
1.0.0.160,39
1.1.1.167,02
208.67.222.22279,12
208.67.220.220123,01
8.8.4.4129,61
8.8.8.8213,38

Ek 24.10.2018: Aynı tablonunun tekrar oluşturulmuşu (50'şer sorgu ile):
SunucuOrtalama Çözümleme Süresi (ms)
195.175.39.396,7
195.175.39.406,9
8.8.8.840,9
1.1.1.150,6
1.0.0.151,6
208.67.222.22254,7
208.67.220.22055,0
8.8.4.461,6

Ek 31.01.2019: Aynı tablonunun tekrar oluşturulmuşu (50'şer sorgu ile):
SunucuOrtalama Çözümleme Süresi (ms)
195.175.39.393,8
195.175.39.404,7
8.8.4.439,9
8.8.8.840,7
1.0.0.143,0
208.67.220.22043,8
208.67.222.22244,0
1.1.1.144,2

Ek 09.12.2019: Aynı tablonunun tekrar oluşturulmuşu (50'şer sorgu ile; ClouldFlare sorgularda da gelişme kaydetmiş):
SunucuOrtalama Çözümleme Süresi (ms)
195.175.39.393,7
195.175.39.404,7
1.0.0.113,1
1.1.1.113,8
8.8.4.435,0
8.8.8.835,8
208.67.222.22240,9
208.67.220.22041,3

Ortalamaları hesaplarken günün farklı iki saatinde 20'şer sorgu yapıp ortalamalarını aldım.

Özet olarak, Cloudflare'in ikinci DNS sunucusu (1.0.0.1), bana en yakın Türk Telekom DNS'lerinden sonra en iyi durumda olanı. Özellikle Google DNS sunucularının performansı pek parlak değil.

Zamanla 1.1.1.1 veya 1.0.0.1 IP adreslerine gelen yoğun istenmeyen trafik miktarında bir değişiklik olur da cevap süreleri düzelir mi, göreceğiz.

Ek 24.10.2018: Zamanla sonuçlar biraz değişmiş. Sanırım ilk denemelerimi yaptığım gün yoğun bir gündü, çözümleme süreleri olağan dışı uzunmuş. İkinci denememde Google üstünlüğü geri almış görünüyor.

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