2.06.2022

Linux'ta Forticlient ile VPN ve internet

 Linux'ta fortisslvpn ile VPN yapaken internete bağlanamıyordum.

$ ip r

ile route tablomu incelediğimde 

default dev ppp0 proto static scope link metric 50

gibi fazladan bir satır gördüm. Bu, herşeyi VPN sanal arayüzüne göndermesini söylüyor. Windows'da forticlient böyle çalışmıyor; trafiğin sadece gereken kısmı VPN tüneline gidiyor, diğer kısmı varsayılan ağ geçidimize yönlendiriliyor. Linux'ta da aynısını yapalım, bu satırı silelim:

$ sudo ip route del default dev ppp0

4.05.2022

Manjaro'da düşük güç kipine giriş ve çıkış kayıtları

Hibernate ve suspend durumlarına ait kayıtları incelemek için bulduğum yöntemler şunlar:

$ sudo journalctl -u systemd-hibernate.service --output=short-iso

$ sudo journalctl -t systemd-sleep --output=short-iso

 Ayrıca beklenmeyen kapanmalarla ilgili şu bilgiler de faydalı olabilir.

12.04.2022

Eventlog ve provider listeleri

Türkçesi olay günlüğü ve sağlayıcı/tedarikçi listeleri. Windows işletim sistemlerinde oluşan olayları arka planda kaydeden bir olay günlüğü mekanizması vardır. Vista öncesi sistemlerde standart olarak Sistem (System), Güvenlik (Security) ve Uygulama (Application) gibi olay günlüklerine daha sonra Uygulama ve Hizmet Günlükleri (Application and Service Logs) altındaki diğer günlükler eklendi.

Powershell'in olay günlükleri ile ilgili ilk cmdlet'i Get-EventLog idi. Bu cmdlet, standart olay günlükleriyle çalışmakta yeterliydi. Örneğin bir makinedeki olay günlüklerinin listesini alabilmek için:

> Get-EventLog -List 

kullanabiliriz. Vista öncesi sistemlerde olay günlüklerine kayıt düşen bileşenlere kaynak (source) denirdi. Sisteme yeni kurulan bir sürücü, yeni bir yazılım, istediği olay günlüğüne kendi uygun gördüğü kaynak ismiyle kayıt düşerdi. Örnek olarak aşağıdaki olay kaydına bakalım:

Bir hizmetin durumu hakkında bizi bilgilendiren bu olay kaydını Sistem olay günlüğüne yazan kaynağın adı "Service Control Manager". Alışkanlıklar daha sonra biraz değişiti. Vista ile birlikte "Uygulama ve Hizmet Günlükleri"ni okumak için hem Get-Eventlog'dan başka bir cmdlet'e ihtiyaç duyuldu, hem de Kaynak (Source) teriminin yerine Sağlayıcı (Provider) geldi.

Yeni cmdlet Get-WinEvent oldu. Vista sonrası sistemlerde var olan yeni logların listesini alabilmek için de önceki örneğe eşdeğer olarak

> Get-WinEvent -ListLog *

geldi. Bu şekilde hiçbir ölçüt belirtmeden sadece * kullanara sorgularsak çok uzun bir liste ile karşılaşabilriz. Bunun yerine örneğin içinde powershell geçen olay günlükleri için

> Get-WinEvent -ListLog *powershell*

yazabiliriz.

Get-EventLog'da olmayan, ama Get-WinEvent ile gelen -ListProvider parametresi de bir önceki paragrafa konu sağlayıcıların listesini alabilmek için:

> Get-WinEvent -ListProvider *

Bu komut da benzer şekilde uzun bir liste verecek. Onun yerine örneğin içinde içinde sadece Sysmon geçen sağlayıcıları görebilmek için

> Get-WinEvent -ListProvider *sysmon*

yazabiliriz.

Get-Eventlog cmdlet'i için benzer bir -ListProvider parametresi yoktu. Bunun yerine kullanılabilecek yöntem şu olabilirdi:

> Get-WmiObject -Class Win32_NTEventLOgFile | Select-Object FileName, Sources

Bu şekilde her olay günlüğüne kaydedilmiş sağlayıcı (ya da kaynakları) ayrı ayrı görebiliriz.




11.03.2022

Powershell'de alias aramak

Get-Alias komutunun varsayılan araması bir alias'ın hangi cmdlet'e karşılık geldiğini bulmaya yönelik. Örneğin

PS> Get-Alias sls

CommandType     Name                           Version    Source
-----------     ----                           -------    ------
Alias           sls -> Select-String

Bazen ihtiyacım tam tersi oluyor; yani select-string'in alias'ı nedir, bunu bilmek istiyorum. Ama Get-Alias'ın böyle bir araması hata ile sonuçlanıyor:

PS> Get-Alias Select-String

Get-Alias : This command cannot find a matching alias because an alias with the name 'select-string' does not exist.
At line:1 char:1

Get-Alias komutunun ne gibi bir çıktı ürettiğini görmek için Get-Member (gm) cmdlet'ini kullanarak çıktı alanlarını inceledim.

PS> Get-Alias sls | gm

HelpUri             : https://go.microsoft.com/fwlink/?LinkID=113388
ResolvedCommandName : Select-String
DisplayName         : sls -> Select-String
ReferencedCommand   : Select-String
ResolvedCommand     : Select-String
Definition          : Select-String
Options             : None
Description         :
OutputType          : {Microsoft.PowerShell.Commands.MatchInfo, System.Boolean}
Name                : sls
CommandType         : Alias
Source              :
Version             :
Visibility          : Public
ModuleName          :
Module              :
RemotingCapability  : PowerShell
Parameters          : {[InputObject, System.Management.Automation.ParameterMetadata], [Pattern, System.Management.Automation.ParameterMetadata], [
                      Path, System.Management.Automation.ParameterMetadata], [LiteralPath, System.Management.Automation.ParameterMetadata]...}
ParameterSets       :

Yukarıdaki alanların içinde kırmızı ile belirttiğim Definition aradığım alan. Get-Alias'ın parametrelerinin içinde de böyle bir bölüm vardı. Bunu kullanarak:

PS> Get-Alias -Definition Select-String

CommandType     Name                          Version    Source
-----------     ----                          -------    ------
Alias           group -> Group-Object

sonuca ulaştım.

Dosyaların içinde geçen bir kelimeyi saymak

Sıkça olarak anahtar kelime araması yapmak için powershell Select-String'i (sls) kullanıyorum:

PS> sls anahtar_kelime D:\logs\*.log

Bu şekilde çok sayıda dosyanın içinde geçen anahtar_kelime satırı listeleniyor, powershell penceresinde satırlar akıp gidiyor. Bazı durumlarda anahtar kelimenin geçtiği satırdan çok hangi dosyada kaç kere geçtiği, veya en çok hangi dosyada geçtiği önem kazanır. Bu durumlarda Group-Object ile sayım yapıyorum:

PS> sls anahtar_kelime D:\logs\*.log | group path

Bu sonucu biraz güzelleştirmek için verileri count alanına göre sıralamak ve bir tablo şeklinde görüntülemek faydalı oluyor:

PS> sls anahtar_kelime D:\logs\*.log | group path | sort count -desc |ft * -Autosize

Her durumda powershell!

10.03.2022

Windows oturum açma geçmişi

Bir kullanıcı bir Windows bilgisayarda oturum açtığında 4624 olay kaydı oluşur. Ancak ağ üzerinden bağlanma, uzak masaüstü bağlantısı ve kilitli bilgisayarı açmak da dahil olmak üzere birçok durumda yine 4624 olayı kaydedilir. Oturum açma çeşitleri (Logon Type) olarak şu tabloya bakılabilir:


Logon Type Logon Title Description
0 System Sadece "System" hesabı için kullanılır.
2 Interactive Gerçek oturum açma olayı.
3 Network Ağ üzerinden oturum açma. Örneğin bir paylaşıma erişme.
4 Batch Batch logon type is used by batch servers, where processes may be executing on behalf of a user without their direct intervention.
5 Service Service Control Manager tarafından başlatılan bir hizmete ait kayıt.
7 Unlock Kilitli bilgisayarın kilidinin açılmasına ait kayıt.
8 NetworkCleartext Bir kullanıcı ağ üzerinden oturum açmış, ama parola hash olarak değil, açık şekilde gönderilmiş.
9 NewCredentials Oturum açılırken üretilen token tekrar kullanıldı ama yeni oturum açma bilgileri (kullanıcı adı ve parola) belirtti.
10 RemoteInteractive Uzak masaüstü ile bağlantı kuruldu.
11 CachedInteractive Oturum açma sırasında parolayı doğrulamak için etki alanı sunucusuna (DC) danışılmadı, yerel kayıt bilgileri (cache) kullanıldı.
12 CachedRemoteInteractive RemoteInteractive ile aynı, iç izleme için denmiş (?)
13 CachedUnlock Sanıyorum kilit açarken DC'ye danışmadan yerel kayıt bilgilerinin (cache) kullanılması durumu.

Etki alanı olmayan bir bilgisayara yapılan oturum açmaları arıyorsak 2 veya 7'ye bakmalıyız. Etki alanına üye bir bilgisayar için ise 2, 11 ve 13 olabilir.

Get-WinEvent ile şu şekilde yapılan bir sorgu ile olay gövdesindeki bütün bilgileri görmek yüksek olasılıkla mümkün olmayacaktır:

PS> Get-WinEvent -Filterhashtable @{LogName="Security";Id=4624}

TimeCreated                      Id LevelDisplayName Message
-----------                      -- ---------------- -------
2022-03-10 20:49:38            4624 Bilgi            Bir hesapta başarılı bir şekilde oturum açıldı....

Bunun yerine hem oturum açma tipini hesaba katıp, hem de EventProperty nesnesi ile daha güzel bir çıktı üretmek mümkün. 4624 olayı için EventProperty üyeleri şöyle:

0 : Subject User SID
1 : Subject Username
2 : Subject Domain Name
3 : Subject Logon Id
4 : Target User SID
5 : Target Username
6 : Target Domain Name
7 : Target Logon Id
8 : Logon Type
9 : Logon Process Name
10: Authentication Package Name
11: Workstation Name
12: Logon GUID
13: Transmitted Services
14: LmPackageName
15: Keylength
16: ProcessId
17: ProcessName
18: IP Address
19: IP Port
20: Impersonation Level
21: Restricted Admin Mode
22: Target Outbound Username
23: Target Outbound Domain Name
24: Virtual Account
25: Target Linked Logon Id
26: Elevated Token

4771 Pre-Authentication failed hatasının EventProperty nesnesi içindeki 4 numaralı üye Status için şu ayrıntılar verilmiş:

StatusKerberos RFC tanımı Açıklama
0x1 Client's entry in database has expired  
0x2 Server's entry in database has expired  
0x3 Requested protocol version # not supported  
0x4 Client's key encrypted in old master key  
0x5 Server's key encrypted in old master key  
0x6 Client not found in Kerberos database Bad user name, or new computer/user account has not replicated to DC yet
0x7 Server not found in Kerberos database New computer account has not replicated yet or computer is pre-w2k
0x8 Multiple principal entries in database  
0x9 The client or server has a null key administrator should reset the password on the account
0xA Ticket not eligible for postdating  
0xB Requested start time is later than end time  
0xC KDC policy rejects request Workstation restriction
0xD KDC cannot accommodate requested option  
0xE KDC has no support for encryption type  
0xF KDC has no support for checksum type  
0x10 KDC has no support for padata type  
0x11 KDC has no support for transited type
0x12 Clients credentials have been revoked Hesap devre dışı, süresi dolmuş, kilitlenmiş veya oturum açma saatleri dışında.
0x13 Credentials for server have been revoked  
0x14 TGT has been revoked  
0x15 Client not yet valid - try again later  
0x16 Server not yet valid - try again later  
0x17 Password has expired Parolanın süresi dolmuş
0x18 Pre-authentication information was invalid Genellikle yanlış parola
0x19 Additional pre-authentication required*  
0x1F Integrity check on decrypted field failed  
0x20 Ticket expired Frequently logged by computer accounts
0x21 Ticket not yet valid  
0x21 Ticket not yet valid  
0x22 Request is a replay  
0x23 The ticket isn't for us  
0x24 Ticket and authenticator don't match  
0x25 Clock skew too great Workstation’s clock too far out of sync with the DC’s
0x26 Incorrect net address IP address change?
0x27 Protocol version mismatch  
0x28 Invalid msg type  
0x29 Message stream modified  
0x2A Message out of order  
0x2C Specified version of key is not available  
0x2D Service key not available  
0x2E Mutual authentication failed may be a memory allocation failure
0x2F Incorrect message direction  
0x30 Alternative authentication method required*  
0x31 Incorrect sequence number in message  
0x32 Inappropriate type of checksum in message  
0x3C Generic error (description in e-text)  
0x3D Field is too long for this implementation  

Bunları kullanarak daha şekilli bir çıktı için şöyle bir komut mümkün:

PS> Get-WinEvent -FilterHashtable @{LogName="Security";Id=4624} | 

Where-Object {$_.properties[8].Value -eq 2} |

Select-Object TimeCreated, Id, @{Name="Username";Expression={$_.properties[5].Value}}, @{Name="LogonProcName";Expression={$_.properties[9].Value}}, @{Name="AuthPkgName";Expression={$_.properties[10].Value}}, @{Name="IPAddress";Expression={$_.properties[18].Value}}

Bunun sonucunda çıktı şöyle olur:

TimeCreated           Id Username LogonProcName AuthPkgName IPAddress
-----------           -- -------- ------------- ----------- ---------
2022-03-10 19:53:21 4624 user1    Advapi        Negotiate   -
2022-03-10 19:53:21 4624 user2    Advapi        Negotiate   -
2022-03-10 19:53:21 4624 user2    Advapi        Negotiate   -
2022-03-10 19:53:14 4624 user4    User32        Negotiate   127.0.0.1
2022-03-10 19:53:14 4624 user5    User32        Negotiate   127.0.0.1

Oturum kapatma olayı 4634, oturum açma hatası (yanlış parola/kullanıcı adı) 4625 olayları ile sorgulanabilir. Oturum kapatma için EventProperties nesnesinde 5 alan vardır. 4625'te ise 4624'tekine benzer sayı ve nitelikte alanlar vardır.

26.02.2022

Linux os-prober

Grub'ın disk(ler)deki diğer işletim sistemlerini bulmak için kullandığı os-prober'ı biliyordum ama komut satırından çalıştırıldığında çıktılarını gösterebildiğini yeni öğrendim:

$ sudo os-prober

Bunun sonucunda da diğer işletim sistemleri grub menüsündeki sırasıyla listelenir.

20.01.2022

Uzak bilgisayardaki açık dosyaları listelemek

Yerel bilgisayarda açık dosyaların listesini değişik şekillerde alınabiliyor. Resource Monitor, Process Monitor veya komut satırından handles.exe ile bunu yapmak mümkün. Ama uzak bilgisayardaki açık dosyalar için aynı şeyi yapmak zor. Her seferinde uzak masaüstünden bağlanıp bunu yapmak da istemiyorum. Önce psexec ile handles'i uzak bilgisayarda çalıştırmayı düşündüm ama hem çok yavaş sonuç döndü, hem de dönen sonuçlarda görmeyi istediğim açılan dosya ile bu dosyayı açan proses aynı satırda yer almadığı için find.exe veys findstr.exe ile süzmek mümkün olmadı.

Sonra bugün öğrendiğim başka bir araç buldum: openfiles.exe

Bugüne kadar kullanmamış olmama şaşırmakla birlikte aynı anda şu adreste gösterilen şekilde powershell ile birlikte kullanmak çok hoşuma gitti.

PS> openfiles /Query /S SERVER01 /FO CSV /V | ConvertFrom-Csv | Out-GridView

Bu şekilde gelen grid nesnesinin içinde kelime araması yapmak da mümkün.

Bunu bir powershell fonksiyonu yaparak sadece bilgisayar adını değiştirerek çağırmak da güzel oldu:

function Get-OpenFiles
{
   [CmdletBinding()]
   param(
      [string]$Computername=$env:COMPUTERNAME,
      [string]$Output
   )

   if ($Output -eq "table")
   {
      openfiles /Query /S $Computername /FO TABLE /V
   }
   elseif ($Output -eq "csv")
   {
      openfiles /Query /S $Computername /FO CSV /V
   }
      elseif ($Output -eq "list")
   {
      openfiles /Query /S $Computername /FO LIST /V
   }
   else
   {
      openfiles /Query /S $Computername /FO CSV /V | ConvertFrom-Csv | Out-GridView
   }
}

Bu şekilde hiçbir Output parametresi verilmezse grid yeni bir pencerede grid nesnesinde görüntülenecek. Diğer seçeneklerde de console host içinde tablo, liste ve csv formatında çıktı almak mümkün.

18.01.2022

Powershell ile diskleri yönetmek

Yeni bir disk geldi. Bilgisayara bağlantısını yaptıktan sonra ilk açılışta elbette gözükmeyecek. Öncelikle diski initialize (Diski Başlat) edip disk bölümleri oluşturmalıyız. Bunu grafik arayüz yerine powershell'den yapalım.

Önce bilgisayarda takılı diskleri listeyelelim

> Get-Disk

Number Friendly Name               HealthStatus   OperationalStatus   Total Size Partition Style
------ -------------               ------------   -----------------   ---------- ----------
0      Samsung SSD 860 PRO 512GB   Healthy        Online               476.94 GB GPT
1      TOSHIBA HDWL120             Healthy        Online                 1.82 TB RAW

Son satırda Partition Style olarak RAW gözüken disk, yeni takılan diskimiz. Bunun üzerinde yeni bölümler oluşturmadan önce bu diski initialize etmemiz gerek.

> Get-Disk -Number 1 | Initialize-Disk -PartitionStyle GPT

Initialize-Disk cmdlet'inin varsayılan partition style'ı GPT, yani yazmaya gerek yok aslında. MBR yapmak için açıkça belirtmek gerek.

Bu işlemden sonra diskimiz bir GPT disk olarak bölümlendirmeye hazır. Yeni bir disk bölümü oluşturalım:

> Get-Disk -Number 1 | New-Partition -Size 500GB -Driveletter P -Offset 500GB

Bu komut ile önce disk listesinde görülen 1 numaralı diski seçip new-partition cmdlet'ine gönderdim. Bu cmdlet ile de üzerinde 500 GB'lık bir disk bölümü oluşturup P: sürücü harfi ile erişilmesini istedim. Offset parametresinin varlığını göstermek istediğim için kullandım. Disk bölümünü boş diskin başında değil de ortasında yaratmak istersek bunu kullanabiliriz. Boyut olarak bütün diski kullanmasını istersek -UserMaximumSize parametresini kullanabiliriz.

Son aşamada bu sürücüyü biçimlendirmemiz gerek.

> Format-Volume -Driveletter P -Filesystem NTFS -AllocationUnitsize 8192

Bu komut ile de P: sürücümüzü NTFS dosya sistemi kullanarak biçimlendirip her disk biriminin (segment) 8192 Byte boyutunda olmasını sağladık.

Daha sonra bu disk bölümünün boyutunu değiştirmek istediğimizi varsayalım. Yanlış disk/bölüm üzerinde işlem yapmamak için önce Get-* cmdlet'leriyle seçimizi yapıp sonrasında bu seçimi boru "|" karakteriyle işlemi yapacak cmdlet'e gönderelim:

> Get-Disk -Number 1 | Get-Partition -PartitionNumber 2 | Set-Partition -size 512GB

Daha kısa bir şekilde

> Get-Partition -Driveletter P | Resize-Partition -Size 512GB

da diyebilirdik.

Var olan bir disk bölümünden kurtulmak için

> Get-Partition -Driveletter P | Remove-Partition

Bir diskteki bütün disk bölüm yapısını silmek için

> Clear-Disk -Number 1

Offline bir diski online yapmak için

> Get-Disk -Number 1 | Set-Disk -IsOffline $False


16.01.2022

Çalışan linux sistemde DNS ve DHCP sunucuları bulmak

Açık bir linux sistemimiz var. Geçerli DNS sunucuyu ve eğer IP ataması otomatik yapılmışsa bu atamayı yapan sunucuyu (DHCP) nasıl buluruz?

$ resolvectl dns

Global:
Link 3 (wlp4s0): 8.8.8.8 1.1.1.1

Bu komutla sistemimize ataması yapılmış olan 2 DNS sunucu gözüküyor. Ama bunlardan biri aktif. Diğeri yedek. Hangisi aktif, onu bulmak için de:

$ resolvectl status

Link 3 (wlp4s0)
...
Current DNS Server: 1.1.1.1
...

Şu an çalışan sunucu 1.1.1.1'miş.

Peki DHCP sunucu? Çalışan sistem IP adresini bir DHCP sunucudan almışsa muhtemelen journalctl loglarına bir kayıt düşmüştür. Ama atamayı yapan sunucunun IP adresi geçmiyor olabilir. Fedora'da DHCPACK anahtar kelimesiyle yapılan aramada sonuca ulaştım.

$ journalctl -b -g DHCPACK

Jan 16 02:39:33 fedora dhclient[43751]: DHCPACK of 192.168.0.13 from 192.168.0.1 (xid=0x3ef11a2b)

Bu bir sonuç vermezse dhcpcd paketi işimizi görebilir:

$ dhcpcd -T wlp4s0

...

wlp2s0: offered 192.168.0.13 from 192.168.0.1

...

Ağda gerçekleşen trafiği izlemek de bir seçenek olabilir:

$ sudo tcpdump -i wlp4s0 udp port 67 and port 68 -vvv

IP yenileme sürecini tetiklemek:

$ sudo dhclient -d -nw wlp4s0

Ya da dhclient.leases dosyasına bakmak (root ile)

# less /var/lib/dhcp/dhclient.leases

Bazı sistemlerde

# less /var/lib/NetworkManager/internal-d785775d-11eb-47a9-84bf-40f2cf9426bb-wlp4s0.lease

Belki de nmap ile bir DHCPDISCOVER broadcast'ı yapmak

$ sudo nmap --script broadcast-dhcp-discover -e eth0


11.01.2022

Ubuntu yansılarını değiştirmek

Ubuntu güncelleştirmeleri için kullanılan sunuculara yansı (mirror) deniyor. Dünya üzerinde, hatta Türkiye'de bile bir sürü yansı var. Bunların hepsi her durumda aynı performansı vermiyor. Hatta bazen erişimlerle ilgili hatalar yaşanabiliyor. Bu durumda değiştirmek gerekebiliyor.

Değiştirme yöntemlerinden biri apt-mirror-updater. Ama bu apt ile değil, pip ile yükleniyor. Yüklü değilse önce pip'i yüklemek gerek:

$ sudo apt install python3-pip

ardından pip ile hedef paketimiz apt-mirror-updater'ı yüklemek gerek

$ sudo pip3 install apt-mirror-updater

Bu paketle birlikte apt-mirror-updater'in aşağıdaki parametrelerine sahip oluyoruz:

apt-mirror-updater -l  # --list-mirrors; yansıları listele
apt-mirror-updater -a  # --auto-change-mirror; otomatik değiştir
apt-mirror-updater -b  # --find-best-mirror; en iyiyi bul
apt-mirror-updater -c  # --change-mirror=MIRROR_URL; verileni seç
apt-mirror-updater -u  # --update (apt update'i kullan ve başarılı sonuç elde edene kadar ara)

Başka bir alternatif de yine pip ile kurulabilen apt-select:

$ sudo pip3 install apt-select

Bununla ülke bazlı bir seçim yapılabilir:

$ sudo apt-select --country TR

Ya da ülkedeki en iyi 3 tanesi seçilebilir:

$ sudo apt-select --country TR -t 3 --choose

---

[1] https://askubuntu.com/questions/1093451/how-to-switch-apt-mirror-from-the-commandline

Ubuntu'yu yükseltmek

Ubuntu'nun normal ve LTS (Long Term Support) olarak iki farklı yayını (release) var. Normal için yılda 2 kez güncelleme yayınlanıyor. LTS ise daha uzun süre desteğe sahip. Bu yayındaki paketler için de normal yayında olduğu gibi güncellemeler geliyor ama dağıtım (distro) güncellemesi 2 yılda bir. Her ikisi için de yükseltme süreci aynı.

İlk iş mevcut depolarda paket güncelleştirmeleri var mı yok mu bakmak:

$ sudo apt update && sudo apt dist-upgrade

Bu adımda normalde dist-upgrade yerine sadece upgrade kullanırdım. İkisinin farkı şöyle açıklanmış; upgrade sadece var olan paketleri yenileri ile değiştirir. Bağımlılık çakışmalarını (dependency conflict) çözmek için ekranda sorular sorar. dist-upgrade ise bağımlılık çakışmalarını yükseltmekten yana çözer, kalkması gereken paketleri kaldırır, yenileriyle değiştirir vs.

Bu aşamadan sonra sistem bir yeniden başlatmaya ihtiyaç duyabilir. 

$  cat /var/run/reboot-required
*** System restart required ***

ile bakıp gerekiyorsa bir yeniden başlatma yapmamız gerek.

Dağıtım güncellemesini komut satırından yapmak için update-manager-core paketini kurmalıyız. Bazı kaynaklarda ubuntu-release-upgrader-core paketi de önerilmiş, ama gerekli olduğunu görmedim.

$ sudo apt install update-manager-core

Sistemimiz LTS ise normal yayın güncelleştirmelerini almayacaktır. Bir kontrol edelim:

$ cat /etc/update-manager/release-upgrades |grep Prompt

Buradan dönen değer lts (aynen böyle, küçük harflerle) ise sistemimiz bir sonraki LTS güncelleştirmesini bekliyor demektir. Beklemeyelim, hemen güncelleştirip normal döngüye dönelim dersek ilgili dosyadaki LTS'yi normal (hepsi küçük harf olur) ile değiştirmek gerek.

Bu aşamadan sonra dağıtım güncelleştirmesini başlatalım:

$ sudo do-release-upgrade

Kararlı sürüme geçmeden önce geliştirme aşamasında (development) olan sürüme geçiş yapmayı zorlamak için yukarıdaki  komutu -d parametresi ile çalıştırmak gerek:

$ sudo do-release-upgrade -d

Ubuntu GNOME'da GUI ile güncelleştirmelerin kontrolü

$ update-manager -c

ile yapılabilir. Ayrıca yeni yayın geldiğinde bunu bildiren grafik arayüzü tekrar göstermek istersek

$ /usr/lib/ubuntu-release-upgrader/check-new-release-gtk

2022-05-14 ekleme: Mevcut LTS'yi yeni LTS'ye yükseltmek istiyorsak ve yeni LTS sürümü yayınlanmış olmasına rağmen

Checking for a new Ubuntu release
There is no development version of an LTS available.
To upgrade to the latest non-LTS development release
set Prompt=normal in /etc/update-manager/release-upgrades.

şeklinde bir mesajla karşışalıyorsak bunun açıklaması şurada belirtildiği gibi LTS'nin ilk güncellemesinden sonra (örneğin 20.04 LTS'den 22.04 LTS'ye yükseltmek için 22.04.1'in çıkmasını, ki bu da 2022'nin Ağustos ayı başı gibi öngörülmüş) mümkün olacağı. Böyle bir durumda yine de yükseltmek için update-manager'ı -d anahtarı ile çalıştırmak ya da /etc/update-manager/release-upgrades dosyasında Prompt=normal yapmak gerek.

Bazen de güncelleme sisteminde bir bug ile karşılaşılması durumunda geçici olarak yükseltmelerin kapatıldığı da (örneğin 21.10'dan 22.04'e geçiş snapd bug'ı sebebiyle biraz geciktirilmiş durumda) aynı kaynakta belirtilmiş.

Fedora'yı yükseltmek

Fedora her yıl 2 kez yeni sürüm çıkartıyor. Birisi Nisan gibi yılın ilk yarısında, ikincisi de Ekim gibi yılın ikinci yarısında. Ocak 2022 itibariyle güncel sürüm 35. Nisan gibi 36'nın çıkması bekleniyor.

Tümü komut satırından gerçekleşecek bir yükseltme için öncelikle mevcut paketlerimi güncel sürümlerine yükseltmem öneriliyor:

$ sudo dnf update --refresh

Bu adımda yeni çekirdek kurulumu yapıldıysa sistemi bir kez yeniden başlatmak gerek. Kurulmadıysa bir sonraki adımda sistem yükseltmesi için ihtiyaç duyulan dnf eklentisini kurmam gerek:

$ sudo dnf install dnf-plugin-system-upgrade

Şu anda amacımız sürüm 36'ya yükseltmek olduğu için aşağıda releasever=36 yazacağız ama daha sonraki yükseltmelerde bu daha yeni sürümler de olabilir. Fedora, resmi olarak tek seferde en fazla 2 sürüm yükseltmeyi destekliyor. Yani sürüm 34 kullanıyorsak doğrudan --releasever=36 yazabiliriz.

$ sudo dnf system-upgrade download --refresh --releasever=36

Buradaki --refresh parametresinin amacı, en son update yaptıktan sonra depolara bir kez daha bakıp yeni güncellenmiş paket var mı yok mu, kontrol etmek. Bu komut duruma göre 1 GB'tan daha fazla verinin indirilmesini gerektireceği için uzun sürecektir. İndirme sırasında, yeni yüklenmekte olan sürüme ait deponun GPG anahtarını doğrulamanız istenecek. GPG Fedora yüklemesini yaptığımız DVD/USB imajı Fedora'nın sitesinden indirildiyse ve çok büyük bir kumpasın içinde değilsek bu zaten doğru anahtar olacaktır ama yine de bir kontrol etmek için https://getfedora.org/security/ adresine girip bakabilir, yeni sürüme ait anahtarı ekranda yazan ile karşılaştırabiliriz. Benzer şekilde rpmfusion deposu kuruluysa bu depoların da (free ve non-free) GPG anahtlarını https://rpmfusion.org/keys adresinden doğrulayabiliriz.

İndirme tamamlandıktan sonra ekranda bir sonraki adımda çalıştırılması gereken adımlar yazacak:

$ sudo dnf system-upgrade reboot

Bu adımda az önce indirilen paketlerin tümünün kurulması gerçekleşecek. Fedora eğer grub menüsünde ilk sırada değilse başında durum açılmasını sağlamak ya da belki grub'da geçici bir süre varsayılan yapmak gerekebilir. Tüm kurumlum işlemleri tamamlandıktan sonra, hiç ciddi bir sorunla karşılaşmadım, umuyorum ki normal açılacak. Sonra kısa bir temizlik yapmak iyi olabilir:

$ sudo dnf system-upgrade clean

$ sudo dnf clean packages


snap

Fedora'nın flatpak'ine karşı Ubuntu'unun snap'i. Elbette bir tek bu iki dağıtımda değil, başka dağıtımlarda da kullanılıyor, ikisi de. Wikipedia'ya göre önce Flatpak yayınlanmış, sonra snap. Aslında Snap hakkında Flatpak'in çıkışına karşı yapılmış ve kullanıcıları Canonical ekosistemi içinde tutmaya yönelik, açık kaynak kod anlayışına ters bir hareket olduğu söylenmiş.

Bütün bu önbilgiler ışığında, Flatpak'e girdikten sonra snap'e de bir giriş yapayım.

Varsayılan olarak kurulu geliyor, gelmiyorsa

$ sudo apt install snapd

ile kurulabilir. Kurduktan sonra bir paket aratmak için find komutu kullanılır:

$ snap find spotify

ya da kurulu olan paketleri görmek için

$ snap list

bir paket ismi ile de listeleme yapılabilir

$ snap list spotify

Kurmak içinse 

$ snap install spotify

Kurulu snap paketleri için güncellemeleri görmek için

$ snap refresh --list

Bir paketi (örneğin spotify) güncellemek için

$ snap refresh spotify

Tüm güncellemeleri kurmak için ise

$ snap refresh

Snap logları journalctl ile kaydediliyor. Görmek için 

$ journalctl -u snapd

Snap ile kurulan spotify şöyle bir konumdan çalışır:

/snap/spotify/56/usr/share/spotify/spotify


Flatpak

Fedora, flatpak adındaki ek paket yönetim sistemini kullanıyor. Zaten rpm paket yöneticisi vardı, bir de ek paket yöneticisine niye ihtiyaç duyuldu sorusuna iki şekilde cevap verilebilir; birincisi her türlü paket depolarda yok. Çoğu dağıtım özgür ve açık kaynak kodlu yazılımlara sahip depoları varsayılan olarak hizmete sunuyor ama özgür yazılımlar her ihtiyaca cevap veremeyebiliyor. Bu gibi durumlarda rpmfusion depolarını etkinleştirmek, ya da copr gibi (Ubuntu'da ppa gibi, Manjaro'da AUR gibi) ek çözümler kullanılabilir. Flatpak, Snap ve AppImage de bu açıdan benzer bir amaca sahip. Ama cevabın ikinci kısmı; sandbox ortamı. Yani izole bir çalışma ortamı. Buradaki izlosyon ile bilgi güvenliği amaçlı izolasyon kastedilmiyor olabilir; benim gördüğüm kadarıyla sadece paket bağımlılıkları açısından bir yalıtım söz konusu. Flatpak ile yüklenmek istenen paketin bağımlılıkları sistemde yüklü olan sürümlerle aynı olmak zorunda değil. Bu işin dezavantajları da yok değil, ama bazı durumlarda kullanmak avantajlı olabilir. Nasıl kuracağımıza gelirsek, Fedora'da varsayılan olarak yüklü geliyor ama önce gelip gelmediğine bi bakalım:

$ rpm -q flatpak

veya 

$ dnf list installed flatpak

yüklü değilse de flatpak'i yüklemek gerek:

$ sudo dnf install flatpak

Bir sonraki adımda bu vesileyle sadece Fedora'da değil, Ubuntu'da da kullanılabildiğini öğrendiğim flathub deposunu ekleyeceğiz. Ama önce var mı, yok mu bi kontrol edelim:

$ flatpak remotes

Yoksa depoyu ekleyelim:

$ sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

Aradığımız paketi https://flathub.org/home adresinden ya da komut satırından, örneğin

$ flatpak  search spotify

şeklinde arayıp bulabiliriz. Ben örnek olması açısından Spotify'ı ve Nootka'yı yükleyeceğim:

$ sudo flatpak install flathub com.spotify.Client

$ sudo flatpak install flathub net.sf.nootka

Bir GUI varsa menüye kısayolları eklenebilir, ama olmaması durumunda yüklenen uygulama komut satırından şu şekilde çalıştırılabilir:

$ flatpak run com.spotify.Client

Kurulu paketleri listelemek için

$ flatpak list

Bu şekilde kurulan çalışma zamanı kütüphaneleri de listelenir. Sadece flatpak'e kurmasını komutunu verdiğimiz uygulamaları görmek istersek:

$ flatpak list --app

ya da tam tersi çalışma zamanı kütüphanelerini istersek

$ flatpak list --runtime

Kurulu tüm uygulamaları (veya belli bir uygulamayı) güncllemek için

$ flatpak update (veya paket adıyla herhngi bir paket de güncellenebilir)

Flatpak kayıtları journalctl ile tutulur. Ayrıca flatpak'in history komutu da kullanılabilir.

Flatpak'e benzeyen snap ve AppImage var.