Debian’da Kernel Güncelleme ve Yönetimi

Kernel yönetimi, bir Debian sunucusunun sağlıklı çalışması için en kritik konulardan biri. Özellikle production ortamında yanlış bir kernel güncellemesi sonrası sunucunun açılmaması ya da bir güvenlik açığını kapatmak için kernel güncellemeyi ertelemek, her sysadmin’in bir noktada karşılaştığı durumlar. Bu yazıda Debian üzerinde kernel güncellemeyi, eski kernel sürümlerini yönetmeyi ve olası sorunlarda nasıl geri dönüleceğini tüm detaylarıyla ele alacağız.

Debian’da Kernel Nasıl Çalışır?

Debian, kernel paketlerini linux-image-* şeklinde adlandırır. Sistem başlarken GRUB, mevcut kernel sürümlerini listeler ve varsayılan olanı yükler. Her kernel sürümü /boot dizininde ayrı bir vmlinuz ve initrd dosyasıyla saklanır.

Mevcut sistemde hangi kernel’in çalıştığını görmek için:

uname -r

Yüklü tüm kernel paketlerini listelemek için:

dpkg --list | grep linux-image

Bu komutun çıktısında ii ile başlayan satırlar yüklü ve düzgün çalışan paketleri, rc ile başlayanlar ise silinmiş ama konfigürasyon dosyaları kalan paketleri gösterir.

/boot dizinindeki dosyalara bakalım:

ls -lh /boot/

Burada göreceğiniz şeyler:

  • vmlinuz-x.x.x-x-amd64: Sıkıştırılmış kernel binary dosyası
  • initrd.img-x.x.x-x-amd64: Başlangıç RAM disk imajı
  • System.map-x.x.x-x-amd64: Kernel sembol tablosu
  • config-x.x.x-x-amd64: Kernel derleme konfigürasyonu

Kernel Güncelleme Yöntemleri

Standart apt ile Güncelleme

En yaygın ve önerilen yöntem apt paket yöneticisini kullanmak. Önce paket listesini güncelleyin:

apt update

Mevcut kernel için güncelleme olup olmadığını kontrol edin:

apt list --upgradable 2>/dev/null | grep linux-image

Sadece kernel paketlerini güncellemek isterseniz:

apt install --only-upgrade linux-image-amd64

Ya da tüm sistemi güncelleyebilirsiniz; bu Debian’ın önerdiği yaklaşım:

apt full-upgrade

full-upgrade ile upgrade arasındaki fark şu: upgrade hiçbir paketi kaldırmadan günceller, full-upgrade ise gerektiğinde bağımlılıkları çözümlemek için bazı paketleri kaldırabilir. Kernel güncellemelerinde genellikle full-upgrade daha sağlıklı çalışır.

Belirli Bir Kernel Sürümü Yüklemek

Bazen belirli bir kernel sürümüne ihtiyaç duyarsınız. Kullanılabilir sürümleri görmek için:

apt-cache search linux-image | grep amd64

Belirli bir sürümü yüklemek için:

apt install linux-image-6.1.0-18-amd64

Eğer backports reposunu kullanıyorsanız daha yeni bir kernel alabilirsiniz:

apt install -t bookworm-backports linux-image-amd64

Debian’da Kernel Sürüm Takibi

Debian’ın stable sürümü çok sık kernel güncellemesi yapmaz, genellikle güvenlik yamalarıyla sınırlı kalır. Testing veya sid kullanıyorsanız güncellemeler daha sık gelir. Hangi sürümü kullandığınızı kontrol edin:

cat /etc/debian_version
lsb_release -a

GRUB Yapılandırması ve Kernel Seçimi

Kernel güncellemesi yapıldığında GRUB otomatik olarak güncellenir ve yeni kernel varsayılan seçenek olur. GRUB yapılandırması /etc/default/grub dosyasında bulunur.

Varsayılan kernel’i görmek için:

grep GRUB_DEFAULT /etc/default/grub

Burada genellikle GRUB_DEFAULT=0 görürsünüz; bu her zaman listedeki ilk kernel’i (en yeni olanı) seçer anlamına gelir.

Belirli bir kernel’i varsayılan yapmak için önce mevcut GRUB menü girdilerini listeleyin:

grep -E "menuentry|submenu" /boot/grub/grub.cfg | head -30

Daha pratik bir yöntem grub-reboot komutunu kullanmak. Bu komut sadece bir sonraki açılış için farklı bir kernel seçmenizi sağlar, kalıcı değişiklik yapmaz:

# Mevcut GRUB girdilerini numaralı listele
awk -F' '/menuentry / {print NR-1, $2}' /boot/grub/grub.cfg

# Bir sonraki boot için 2. seçeneği seç (0'dan başlar)
grub-reboot 2

# Reboot
reboot

Bu yaklaşım production ortamında çok değerli; yeni kernel’i test edip sorun çıkarsa otomatik olarak eski kernel’e dönmüş olursunuz.

Eski Kernel Sürümlerini Temizlemek

/boot dizini dolduğunda kernel güncellemeleri başarısız olmaya başlar. Bu sysadmin’lerin sık karşılaştığı bir sorun. Önce durumu kontrol edin:

df -h /boot

Yüklü kernel sürümlerini ve boyutlarını görün:

dpkg --list | grep linux-image | awk '{print $2, $3}'

Dikkat: Silme işlemi yapmadan önce şu anki aktif kernel’i asla silmeyin.

Aktif kernel’i öğrenin:

uname -r

Eski kernel’leri manuel silmek için:

# Belirli bir kernel'i kaldır
apt purge linux-image-6.1.0-17-amd64

# İlgili header ve modülleri de temizle
apt purge linux-headers-6.1.0-17-amd64
apt purge linux-image-6.1.0-17-amd64-dbg

Daha akıllı bir yaklaşım autoremove kullanmak. Debian, aktif kernel dışındaki eski kernel’leri otomatik olarak gereksiz paket olarak işaretler:

apt autoremove --purge

Ancak autoremove bazen çok agresif davranabilir ve ihtiyaç duyduğunuz eski bir kernel’i silebilir. Bu yüzden çalıştırmadan önce neyin silineceğini kontrol edin:

apt autoremove --purge --dry-run

--dry-run parametresi gerçekten bir şey silmez, sadece ne olacağını gösterir.

Toplu Temizlik Script’i

Production ortamında düzenli kernel temizliği için basit bir script:

#!/bin/bash

CURRENT_KERNEL=$(uname -r)
echo "Aktif kernel: $CURRENT_KERNEL"
echo "Silinecek eski kernel'ler:"

# Aktif kernel haricindeki tüm kernel'leri listele
dpkg --list | grep linux-image | grep -v "$CURRENT_KERNEL" | grep -v "linux-image-amd64" | awk '{print $2}'

echo ""
read -p "Devam etmek istiyor musunuz? (y/n): " CONFIRM

if [ "$CONFIRM" = "y" ]; then
    dpkg --list | grep linux-image | grep -v "$CURRENT_KERNEL" | grep -v "linux-image-amd64" | awk '{print $2}' | xargs apt purge -y
    apt autoremove -y
    update-grub
    echo "Temizlik tamamlandi."
fi

Bu script’i /usr/local/sbin/kernel-cleanup.sh olarak kaydedin ve çalıştırma izni verin:

chmod +x /usr/local/sbin/kernel-cleanup.sh

Kernel Güncelleme Sonrası Kontroller

Kernel güncellemesi yapıp sistemi yeniden başlattıktan sonra bazı kontrolleri yapmanız gerekiyor.

Önce doğru kernel’in yüklendiğini teyit edin:

uname -r
uname -a

Sistem loglarında kernel ile ilgili hata var mı kontrol edin:

dmesg | grep -i error
dmesg | grep -i "failed"
journalctl -b 0 -k --priority=err

Kritik servislerin çalıştığını kontrol edin:

systemctl --failed

Özellikle DKMS modülleri kullanan yazılımlarınız varsa (VirtualBox, NVIDIA sürücüsü, ZFS gibi) bunların yeni kernel ile derlenip derlenmediğini kontrol edin:

dkms status

Eğer bir modül yeni kernel için derlenmemişse:

dkms autoinstall

Gerçek Dünya Senaryosu: Production Sunucuda Kernel Güncelleme

Şimdi gerçek bir senaryoyu ele alalım. 7/24 çalışan bir web sunucusunda kernel güncellemeniz gerekiyor. İşte bu süreci nasıl yönetirsiniz:

1. Önce snapshot veya yedek alın. Sanal makineyse bir snapshot, fiziksel sunucuysa kritik verilerinizin yedeği olmalı.

2. Maintenance window planlayın. En az trafik olan saatte yapın.

3. Güncel durumu kaydedin:

uname -r > /root/pre-update-kernel.txt
dpkg --list | grep linux-image >> /root/pre-update-kernel.txt
df -h /boot >> /root/pre-update-kernel.txt
systemctl --failed >> /root/pre-update-kernel.txt
date >> /root/pre-update-kernel.txt

4. Güncellemeyi yapın:

apt update && apt full-upgrade

5. Reboot öncesi GRUB yapılandırmasını kontrol edin:

grep GRUB_DEFAULT /etc/default/grub
cat /boot/grub/grub.cfg | grep menuentry | head -10

6. Sistemi yeniden başlatın ve uzaktan izleyin. SSH bağlantısı kopmadan önce bir screen veya tmux oturumu açın:

screen -S kernel-update
reboot

7. Yeniden bağlandıktan sonra kontrolleri yapın.

Sorun Giderme: Kernel Başlamıyorsa Ne Yapmalı?

En korkulan durum budur. Kernel güncellendikten sonra sistem başlamıyor. Bu durumda panik yapmadan adım adım ilerleyin.

Sanal sunucu ise: Hypervisor konsolundan GRUB ekranına erişin. Ekranın hızlıca geçmesini engellemek için başlangıçta Shift tuşuna basılı tutun veya ESC’ye basın.

GRUB menüsünde “Advanced options for Debian” seçeneğine girin. Buradan eski kernel sürümünü seçin. Sistem eski kernel ile açılıyorsa sorun yeni kernel’de demektir.

Sisteme girdikten sonra sorunu araştırın:

# Yeni kernel'in boot log'larını inceleyin
journalctl -b -1 -k

# Varsa dmesg çıktısını kontrol edin
dmesg | tail -50

# DKMS modülleri sorun çıkarıyor mu?
dkms status

Sorunlu kernel’i kaldırıp tekrar yükleyebilirsiniz:

apt purge linux-image-6.1.0-18-amd64
apt install linux-image-6.1.0-18-amd64
update-grub

Rescue mode ile erişim: Eğer hiçbir kernel açılmıyorsa Debian netinstall ISO’su ile boot edin ve rescue mode seçin. Disk bölümünüzü mount edip chroot ile sisteme girin:

mount /dev/sda1 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt

# Şimdi GRUB'u yeniden yükleyin
grub-install /dev/sda
update-grub

# Ya da eski kernel'i yükleyin
apt install linux-image-6.1.0-17-amd64

Kernel Parametreleri ile İnce Ayar

Bazen yeni bir kernel versiyonu bazı donanım veya uygulama sorunlarına yol açar. Kernel parametreleri ile bu sorunları geçici olarak aşabilirsiniz.

Geçici olarak test etmek için GRUB menüsünde kernel seçili iken e tuşuna basın. linux ile başlayan satırın sonuna parametre ekleyin ve F10 ile başlatın.

Kalıcı kernel parametresi eklemek için:

# /etc/default/grub dosyasını düzenleyin
nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT satırını bulup parametrelerinizi ekleyin:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=noaer"

Sık kullanılan parametreler:

  • quiet: Açılış sırasında kernel mesajlarını gizler
  • pci=noaer: PCI Advanced Error Reporting’i kapatır, bazı donanım hatalarını bastırır
  • intel_iommu=off: Intel IOMMU’yu kapatır, sanallaştırma sorunlarında işe yarar
  • noapic: APIC’i kapatır, eski donanımlarda yardımcı olabilir
  • nomodeset: Grafik modunu resetlemez, ekran sorunlarında kullanılır

Değişikliği kaydedin ve GRUB’u güncelleyin:

update-grub

Kernel Güncelleme Bildirimleri ve Otomasyon

Production sunucularda kernel güncellemelerini takip etmek için apticron veya apt-listchanges kullanabilirsiniz:

apt install apticron apt-listchanges

apticron günlük olarak mail gönderir ve bekleyen güncellemeleri raporlar. Yapılandırma dosyası /etc/apticron/apticron.conf konumunda bulunur:

nano /etc/apticron/apticron.conf
# EMAIL="[email protected]" satırını düzenleyin

Güvenlik güncellemelerini otomatik uygulamak için unattended-upgrades kullanabilirsiniz ancak kernel güncellemeleri için bu yaklaşım dikkatli kullanılmalı:

apt install unattended-upgrades
dpkg-reconfigure unattended-upgrades

Yapılandırma dosyasında kernel güncellemelerini otomatik almak isteyip istemediğinizi belirleyebilirsiniz:

nano /etc/apt/apt.conf.d/50unattended-upgrades

Kernel güncellemelerini otomatik almak ama yeniden başlatmayı manuel yapmak için:

# Bu satırı dosyaya ekleyin
Unattended-Upgrade::Automatic-Reboot "false";

Bekleyen reboot var mı kontrol etmek için:

ls /var/run/reboot-required 2>/dev/null && echo "Reboot gerekiyor" || echo "Reboot gerekmiyor"
cat /var/run/reboot-required.pkgs 2>/dev/null

/boot Dizini İçin Ayrı Partition Kullanımı

Uzun vadeli kernel yönetimini kolaylaştırmak için /boot dizinini ayrı bir partition üzerinde tutmanız önerilir. Genellikle 512MB veya 1GB yeterlidir ancak birden fazla kernel tutmak istiyorsanız 1GB daha sağlıklı.

Mevcut /boot boyutunu kontrol edin:

df -h /boot
du -sh /boot/*

Her kernel yaklaşık 30-50MB yer kaplar. 3-4 kernel tutmak istiyorsanız 512MB genellikle yeterli, daha fazlası için 1GB önerilir.

Sonuç

Debian’da kernel yönetimi, sysadmin’in temel yetkinliklerinden biri. Özetlemek gerekirse: güncellemeleri düzenli yapın ama acele etmeyin, her güncelleme öncesi sistemi belgeleyin, eski kernel’leri biriktirmeyin ama en az bir tane yedek kernel bulundurun ve /boot dolmadan temizlik alışkanlığı edinin.

Production ortamı için altın kural şu: önce test ortamında deneyin, grub-reboot ile tek seferlik test yapın, sorun yoksa kalıcı hale getirin. Bu sırayı atlamamak, gecenin ikisinde kriz çözme seanslarından sizi uzak tutar.

Kernel güncelleme korkutucu görünebilir ama sistematik bir yaklaşımla yönetildiğinde son derece rutin bir işlem haline gelir. Asıl tehlike ise güncellemeleri ertelemek; güvenlik açıkları beklemez.

Yorum yapın