1.06.2018

Windows'da güncellemeleri 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... :/

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 başlayarak, ikincisi "000" 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-Object 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:

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

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ı.

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

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.

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 dnf stop dnf-makecache.timer
sudo dnf disable dnf-makecache.timer

---

[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

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

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

26.01.2018

Fedora ve Netflix ve hatta başka şeyler

Olay sadece Netflix ile ilgili değil, genel olarak DRM içeriğine sahip tüm siteler için geçerli. Muhtemelen sadece Fedroa ile de ilgili değil, diğer linux dağıtımlarında da aynı şey olabilir. Sorun şu ki ne Netflix videoları, ne de diğer sayısal hak yönetimi diye tercüme edilebilecek DRM nanesine sahip içerik oynatılamıyor. "Netflix video player unavailable" mesajı eşliğinde F7355-1204 hata kodu gösteriliyor. Netflix yardım sayfalarından şu sayfaya ulaştım, ama çok açıklayıcı değil.

Sonra Netflix'in sitesindeki canlı desteğe girip yazdım, hangi codec'i yüklemeliyim diye, oradan da faydalı bir öneri çıkmadı. HTML5 premium codec'ler linux'ta yok falan dediler.

Youtube videolarını falan oynatabiliyordum ama youtube.com/html5 adresine girince farkettim ki aslında H264 eksiğimiz var.


Bu adrese Windows'dan girince şöyle bir ekran çıkıyor.


Demek ki önce H.264 kodeğini bulmak lazım. Derken şu sayfaya denk geldim. Burada deniyor ki, Fedora'da ffmpeg paketi kurulu gelmiyor. Denemek için
# dnf list installed ffmpeg-libs
ile bakmak lazım. Bende yok dedi. Nasıl kuracağız? Yine aynı sayfada Tom G. riken.jp adresinden linkler vermiş. Ben onun yerine rpmfusion repository'sini eklemeyi tercih ettim. Hem free hem de non-free depoları kurmak için şunu kullanmak önerilmiş sitede:
# dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
Bundan sonra bir kez
# dnf check-update
ardından da
# dnf install ffmpeg-libs
yaptıktan, bir kez de ne olur ne olmaz diyerek bilgisayarı tekrar başlattıktan sonra herşey sorunsuz çalışmaya başladı.

Aslında öyle her depoya güvenmem, herşeyi kurmam bilgisayarıma ama şu sayfada rpmfusion "decent repo" olarak sınıflandırılmış ;)

Linux'ta ağ durumu inceleme

Kullandığımız bilgisayar arka planda ne işler yapıyor? Hangi adresler ile iletişime geçmiş, ne kadar veri trafiği olmuş? Bu gibi soruların cevaplarını bulmak lazım.

İlk iş netstat ile bir durum incelemesi yapmak. Önce etkin bağlantıları inceleyelim:
# netstat -tpn
Burada
 -t : tcp bağlantılarını göster
 -n : isimler yerine sayıları kullan (DNS ters sorgusu yapma)
 -p : ilişkili programları da göster

Dinleyen bağlantıları görmek istersek de:
# netstat -l
kullanılabilir.

Bundan sonraki adımda tcptrack kullanılabilir:
# tcptrack -i wlan0
ki bu komut ile hangi adresi ile ne kadar trafik var görülebilir. Diyelim ki listelenecek bağlantıları belli bir IP adresi ile yapılan bağlantılar ile sınırlamak istiyoruz. Bu durumda
# tcptrack -i wlan0 src or dst 192.168.1.1
yazılarak sadece 192.168.1.1 IP adresinden gelen ve bu adrese giden trafiğin görüntülenmesi sağlanabilir. Nispeten biraz daha görsellik ile bantgenişliğini izlemek için de iftop kullanılabilir:
# iftop -i wlan0
Bu komut terminalde çubuk grafikleri kullanarak hangi IP adresinin ne kadar bantgenişliği kullandığını gösterebilir. Her satır için tablonun sağında 3 sütun yer alır. Bu sütunlar soldan sağa 4, 10 ve 40 saniyelik aralıklardaki toplam trafiği gösterir. Her bağlantı için üstte (sağa doğru ==> ok ile) giden trafik miktarı, altta (sola doğru <== ok ile) gelen trafik miktari gösterilir. Ekranın en altında ise toplam giden gelen ve genel toplam bilgileri yer alır.

Diyelim ki bu yetmedi. Belli bir IP adresi ile gerçekleşen paketlerin içini görmek istiyoruz. Bu durumda da tcpdump kullanılabilir:
# tcpdump  -i wlan0 src 192.168.1.1
gibi bir komut ile gelen trafik, veya src'yi dst ile değiştirerek giden trafik yakalanabilir.

Reklam engelleme kuralları

Reklamlar, aslında web'deki ücretsiz içeriğin çarklarını döndüren itici güç. Bu sebeple sade bir reklamın kimseye zararı dokunmaz. Ama internetteki egemen güçlerin ellerindeki çok değerli ve hasass verileri reklam amaçlı kullanmalarının ardından ortada bir dengesizlik oluştu. Hiç farketmeden bizi bizden daha iyi tanıyan internetin "büyük abileri" tarayıcımızın kenarında bizim geçen sene aldığımız ayakkabının benzeri ayakkabı reklamlarını döndürmeye, başka bir sitede sepete eklediğimiz ama henüz satın almasını tamamlamadığımız başka ürünlerin hatırlatmalarını göstermeye başladı. Bu aslında, reklam veren ile hedef kitle arasındaki dengenin bozulduğuna dair bir işaret, sanal dünyanın dönüm noktalarından birisiydi.

Derken reklam engelleyici eklentiler popüler olmaya başladı. Bir haber sitesine girdiğimizde ilgilendiğimiz haberden önce internet operatörümüzün gözümüze soka soka tam sayfa verdiği ilanı en az 10 saniye görmek zorunda bırakılmamız, tatil ve otel bilgileri sunan web sitesinin günde 50 kere görmek zorunda kaldığımız aynı reklamı bizi bu eklentileri kurmaya itti. Sonuçta da şu anda basit bir blog'a bile girsek blog sahibi "bu sayfayı döndürebilmem için reklam almam gerekiyor, lütfen reklam engelleyicinizi kapatır mısınız" türünde mesajlar görüntülemeye başladı.

Ben bu noktada kullanıcıların haklı olduğunu düşünüyorum. Bizi kukla gibi kullanarak ürettikleri her ürünü satabileceklerini düşünerek ilk kurşunu tüketicinin karşısında yer alan konsorsiyum sıktı. Bu durumda tüketicinin de kendini korumaya hakkı var.

Gelelim işin teknik tarafında. Uzun yıllardır AdBlockPlus (ABP) kullandım. Ama git gide surf yapmanın zorlaştığını düşündüğüm bir anda farkettim ki aslında internette gezinmemi zorlaştıran o masum eklentiymiş. Aşırı işlemci ve bellek tüketen bu illetten kurtuldum. Şu anda uBlock kullanıyorum.

Temelde kurallar aynı. ABP veya uBlock için oluşturulmuş genel listeler var. Ama ben daha çok özel birkaç kural yazmak ile ilgileniyorum. Bu konuyla ilgili aşağıdaki tabloyu hazırladım.


KuralEngelleyeceğiEngellenmeyecek
reklamiçinde reklam geçen tüm adresler
swf|http://www.adres.com/reklam.swfhttp://adres.com/swf/icerik.htm
||adres.comhttp://reklam.com, https://reklam.com, http://tr.reklam.com
||adres.com^htttp://adres.com, https://www.adres.com:8080http://adres.com.tr
##.reklam<div class="reklam">, <p class="reklam">
###reklam<div id="reklam">, <table id="reklam">
##reklam<reklam>
##table[width="80%"]<table width="80%"><table>
~https://adres.com/reklam
https://adres.com/reklam
##div[title^="rek"]<div title="reklam">, <div title="reklamlar"><div title="renkli">
##div[title$="lam"]<div title="reklam">, <div title="toplam"><div title="reklamlar">

4.01.2018

Fedora'da rpm komutu

Bilindiği gibi Fedora, paket yönetiminde RPM (RedHat Package Manager) formatını kullanıyor. Paket yönetiminde dnf gibi çevrim içi ve bağımlılık denetimi yapmadan tekil paketlerin kurulumu ve rpm formatında paket yaratmak için rpm adında bir araç da sunuluyor. Bu aracın kullanımı ile ilgili birkaç anahtara göz atalım.

Diyelim ki elimizde Firefox'un firefox-57.0.1-1.fc26.x86_64.rpm paketi var. Bunu kurmak istiyoruz. Kullanmamız gereken komut
rpm -i firefox-57.0.1-1.fc26.x86_64.rpm
olacak. Ayrıntılı çıktı için -v (verbose) ve paketin açılışı ile ilgili ek bilgiler için -h (hash marks) anahtarları da kullanılabilir. Kurulum aşamasına geçmeden önce paketin imzasının geçerliliğini doğrulamak için -checksig anahtarı kullanılabilir.
rpm -checksig firefox-57.0.1-1.fc26.x86_64.rpm
Bu yöntem dnf gibi çevrim içi paketin bağımlılıklarını kontrol edip yüklemeyecektir. Bunun için kurulu paketin bağımlılıklarını kontrol etmek istersek yapmamız gereken
rpm -qpR firefox-57.0.1-1.fc26.x86_64.rpm
Burada -q (query) paketi sorgulamak için,  -p (capabilities provided) paketin sunduğu özellikleri listelemek için, -R (capabilities this package depends on) paketin bağımlı olduğu özellikleri sorgulamak için eklendi.

Bir paket, bağımlı olduğu diğer paketler kurulmadan kurulamaz. Ama rpm'in -nodeps anahtarını kullanarak paketi bağımlılıklarını görmezden gelerek kurmaya zorlayabiliriz. Bu durumda kurduğumuz paket, bağımlılıklarını sağlamadan yine çalışmayacaktır. Ama bağımlılıkları sonradan sağlamayı isteyerek kurmak istenmesi durumunda gerekebilir.
rpm -ivh -nodeps firefox-57.0.1-1.fc26.x86_64.rpm
Bir paketin sisteminizde kurulu olup olmadığını sorgulamak için
rpm -q firefox
kullanılabilir. Bunun sonucunda paket kurulu değilse
package firefox is not installed
çıktısı verir. Kurulu ise uyan paketin tam adını yazar:
firefox-57.0.1-1.fc26.x86_64.rpm
gibi. Görüldüğü gibi burada paketin sürüm ve platform bilgisi içermeyen adını kullanarak da sorgu yapabiliyoruz. Tab tuşuyla tamamlama da kullanılabiliyor.

"Kurulu" bir paketin tüm içeriğini sorgulamak için ise -ql kullanılabilir.
rpm -ql firefox-57.0.1-1.fc26.x86_64.rpm
Sistemdeki kurulu tüm paketleri sorgulamak için
rpm -qa
Bir paketi yükseltmek (güncellemek) için -U ile birlikte -v (verbose) ve -h (hash marks) anahtarları kullanılabilir:
rpm -Uvh firefox-57.0.1-1.fc26.x86_64.rpm
Bu komut ile güncellenene sürüm ile eski sürüm aynı anda sistemde kalabilir, yenisi ile ilgili bir sorun olursa eskisi kullanılabilir denmiş, denemedim.

Bir paketi kaldırmak için -e (erase) anahtarı kullanılabilir. Paketi bağımlılıklarına bakmaksızın kaldırmak için kaldırmak için ise yine -nodeps anahtarı kullanılabilir.
rpm -evv -nodeps firefox
Sistemde bir sürü dosya var. Bu dosyaların bir tanesinin hangi paketle geldiğini merak ediyoruz. Bunu bulmak için kullanacağımız komut şu:
rpm -qf /usr/lib/libdl.so.2
Sonuç olarak tüm paket ismini döner, aşağıdaki gibi:
glibc-2.25-12.fc26.i686
Kurulu bir paket hakkında ayrıntılı bilgi sorgusu için -qi (query info) kullanılır. Örneğin yukarıda çıkan glibc paketini sorgulayalım.

$ rpm -qi qlibc
Name        : glibc
Version     : 2.25
Release     : 12.fc26
Architecture: x86_64
Install Date: Wed 15 Nov 2017 01:09:18 AM EST
Group       : System Environment/Libraries
Size        : 13990324
License     : LGPLv2+ and LGPLv2+ with exceptions and GPLv2+
Signature   : RSA/SHA256, Wed 11 Oct 2017 12:22:14 PM EDT, Key ID 812a6b4b64dab85d
Source RPM  : glibc-2.25-12.fc26.src.rpm
Build Date  : Wed 11 Oct 2017 09:05:41 AM EDT
Build Host  : buildhw-06.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://www.gnu.org/software/glibc/
Summary     : The GNU libc libraries
Description :
The glibc package contains standard libraries which are used by
multiple programs on the system. In order to save disk space and
memory, as well as to make upgrading easier, common system code is
kept in one place and shared between programs. This particular package
contains the most important sets of shared libraries: the standard C
library and the standard math library. Without these two libraries, a
Linux system will not function.


Bu kurulu bir paket için sorguydu. Kurulmamış, elimizde rpm uzantılı kurulum dosyası olan bir paket için ayrıntlı bilgi sorgulaması için ise -qip (query info package) kullanılır.

$ rpm -qip firefox-57.0.1-1.fc26.x86_64.rpm
Name        : firefox
Version     : 57.0.1
Release     : 1.fc26
Architecture: x86_64
Install Date: (not installed)
Group       : Unspecified
Size        : 208973671
License     : MPLv1.1 or GPLv2+ or LGPLv2+
Signature   : RSA/SHA256, Fri 01 Dec 2017 02:45:19 AM EST, Key ID 812a6b4b64dab85d
Source RPM  : firefox-57.0.1-1.fc26.src.rpm
Build Date  : Thu 30 Nov 2017 07:54:13 AM EST
Build Host  : buildvm-16.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : https://www.mozilla.org/firefox/
Summary     : Mozilla Firefox Web browser
Description :
Mozilla Firefox is an open-source web browser, designed for standards
compliance, performance and portability.


Bir de bazen bozulan rpm veritabanını tekrar oluşturma bilgisi verilmiş, yazının sonunda görülen referans belgede. O da şöyle:
# cd /var/lib
# rm __db*
# rpm --rebuilddb
# rpmdb_verify Packages
---
[1] https://lintut.com/how-to-use-rpm-command-on-linux/