Bozuk Paket Sorunları: apt ve yum ile Hata Giderme Rehberi

Paket yöneticisi hatalarıyla uğraşmak, Linux sysadmin hayatının kaçınılmaz bir parçası. Production sunucunda sabah 3’te apt upgrade çalıştırıyorsun, yarı yolda bir şeyler patlıyor ve sistem yarım kalıyor. Ya da yum ile kritik bir güvenlik yaması uygulamaya çalışıyorsun, dependency cehennemi seni karşılıyor. Bu yazıda hem apt hem de yum/dnf için en sık karşılaşılan paket sorunlarını, bunların nedenlerini ve gerçek çözüm yollarını ele alacağız.

Sorunun Köküne Inmek: Neden Paket Bozulur?

Paket bozulmaları genellikle birkaç ana nedenden kaynaklanır. Kurulum sırasında elektrik kesintisi veya bağlantı kopması, disk doluluğu nedeniyle yarım kalan işlemler, elle yapılan /var/lib/dpkg veya /var/lib/rpm müdahaleleri, uyumsuz repository ekleme ve en yaygın olanı: kill -9 ile zorla kapatılan paket yöneticisi işlemleri.

Sorunu doğru teşhis etmeden rastgele komut çalıştırmak durumu daha da kötüleştirebilir. O yüzden önce ne olduğunu anlayalım, sonra müdahale edelim.

apt ile Hata Giderme (Debian/Ubuntu)

Lock Dosyası Sorunları

En sık karşılaşılan hata budur. apt veya dpkg çalıştırdığında şu mesajı görürsün:

E: Could not get lock /var/lib/dpkg/lock-frontend
E: Unable to acquire the dpkg frontend lock, is another process using it?

Bu hatanın iki farklı nedeni olabilir: gerçekten başka bir apt işlemi çalışıyor olabilir (Ubuntu’da arka planda otomatik güncelleme çok sık tetiklenir) ya da önceki bir işlem kilidi temizlemeden çökmüş olabilir.

Önce gerçekten başka bir işlem var mı kontrol et:

# Çalışan apt/dpkg işlemlerini listele
ps aux | grep -E 'apt|dpkg'

# Veya daha temiz görünüm için
pgrep -la apt
pgrep -la dpkg

# Unattended-upgrades çalışıyor mu?
systemctl status unattended-upgrades

Eğer gerçekten aktif bir işlem varsa, ona dokunma. Bekle veya gerekiyorsa düzgünce sonlandır:

# PID'i bulduktan sonra nazikçe sonlandır
sudo kill -15 <PID>

# Işlem bitmezse (30 saniye bekle önce)
sudo kill -9 <PID>

Hayalet kilit durumunda (işlem yok ama kilit var) kilitleri temizle:

# Lock dosyalarını temizle
sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/apt/lists/lock

# dpkg'yi tekrar yapılandır
sudo dpkg --configure -a

Yarım Kalmış Kurulumları Düzeltmek

Disk dolduğunda veya işlem çöktüğünde paketler yarım kalır. apt install veya apt upgrade çalıştırınca şu hatayı alırsın:

dpkg: error processing package nginx (--configure):
 subprocess installed post-installation script returned error exit status 1
E: Sub-process /usr/bin/dpkg returned an error code (1)

Bu durumda önce sistemi tutarlı hale getirmeye çalış:

# Yarım kalmış tüm konfigürasyonları tamamla
sudo dpkg --configure -a

# Eksik bağımlılıkları düzelt
sudo apt-get install -f

# Sonra tekrar dene
sudo apt-get update && sudo apt-get upgrade

Eğer belirli bir paket sürekli sorun çıkarıyorsa ve o paketi kaldırman gerekiyorsa:

# Paketi zorla kaldır (bağımlılıkları görmezden gel)
sudo dpkg --remove --force-remove-reinstreq sorunlu-paket

# Veya purge ile config dosyalarını da sil
sudo dpkg --purge --force-remove-reinstreq sorunlu-paket

# Sonra temizlik yap
sudo apt-get autoremove
sudo apt-get autoclean

Bozuk Cache ve Repository Sorunları

Bazen paket listesi cache’i bozulur. Özellikle apt update garip hatalar veriyorsa:

# Tüm cache'i temizle
sudo apt-get clean

# Paket listelerini de sil
sudo rm -rf /var/lib/apt/lists/*

# Taze başlangıç
sudo apt-get update

Repository imza hatalarıyla karşılaşıyorsun? Genellikle expired GPG key sorunudur:

# Hata veren key'i tespit et (NO_PUBKEY ile gösterir)
sudo apt-get update 2>&1 | grep "NO_PUBKEY"

# Key'i manuel ekle (örnek key ID: ABCD1234)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABCD1234

# Modern yöntem (Ubuntu 22.04+)
curl -fsSL https://example.com/repo.gpg | sudo gpg --dearmor -o /usr/share/keyrings/example.gpg

Dependency Hell: Bağımlılık Cehenneminden Çıkmak

Ubuntu’da PPA eklediğinde veya üçüncü parti paket kurduğunda sık sık bağımlılık çakışması yaşanır:

# Bağımlılık sorunlarını detaylı görmek için
apt-cache policy sorunlu-paket

# Hangi paket neye bağımlı?
apt-cache depends sorunlu-paket

# Hangi paket bu pakete bağımlı?
apt-cache rdepends sorunlu-paket

# Paket durumunu kontrol et
dpkg -l | grep sorunlu-paket

Gerçek dünya senaryosu: Production Ubuntu 20.04 sunucusunda özel bir uygulama için eski libssl versiyonu gerekiyor ama sistem güncel libssl istiyor. Bu durumda belirli paket versiyonunu pin’leme yöntemi işe yarar:

# /etc/apt/preferences.d/libssl-pin dosyası oluştur
sudo tee /etc/apt/preferences.d/libssl-pin << 'EOF'
Package: libssl1.1
Pin: version 1.1.1f-1ubuntu2
Pin-Priority: 1001
EOF

# Artık bu paket versiyon değişmez
apt-cache policy libssl1.1

dpkg Database Bütünlüğünü Kontrol Etme

Daha derin sorunlar için dpkg veritabanının kendisi bozulmuş olabilir:

# dpkg database audit
sudo dpkg --audit

# Tüm paketlerin durumunu listele (ii = iyi, rc = kaldırılmış config var, iF = başarısız)
dpkg -l | grep -v "^ii"

# Belirli bir paketin dosyalarını doğrula
sudo dpkg --verify paket-adi

# Tüm paketleri doğrula (uzun sürer)
sudo dpkg --verify

yum/dnf ile Hata Giderme (RHEL/CentOS/Fedora)

yum vs dnf: Hangisini Kullanmalısın?

CentOS 7 ve eski RHEL için yum, CentOS 8+, RHEL 8+ ve Fedora için dnf kullan. dnf, yum’un yerini alan modern versiyondur. Komutların büyük çoğunluğu aynıdır ama dnf daha iyi hata mesajları verir ve dependency çözümü çok daha akıllıdır.

Transaction Hatalarını Çözmek

RHEL/CentOS’ta en sinir bozucu hatalardan biri yarım kalmış transaction’lardır:

# Yarım kalmış transaction'ları listele
sudo yum history list
sudo dnf history list

# Son transaction'ın detayına bak
sudo dnf history info last

# Yarım kalmış transaction'ı geri al
sudo yum-complete-transaction --cleanup-only

# dnf için
sudo dnf history undo last

# Veya belirli transaction ID ile
sudo dnf history undo 15

Gerçek senaryo: CentOS 7 sunucusunda yum update çalışırken SSH bağlantısı koptu, sunucuya geri girdiğinde yum çalışmıyor. İşte bu durumda adım adım yapman gerekenler:

# Önce lock dosyalarını kontrol et
ls -la /var/run/yum.pid
cat /var/run/yum.pid

# İşlem yoksa lock'u temizle
sudo rm -f /var/run/yum.pid

# Yarım kalmış transaction'ı temizle
sudo yum-complete-transaction

# RPM database'i yeniden oluştur
sudo rpm --rebuilddb

# Cache'i temizle ve tekrar başla
sudo yum clean all
sudo yum makecache

RPM Database Sorunları

RPM veritabanı bozulması, özellikle eski sistemlerde ciddi bir sorun. Belirtiler: rpmdb: PANIC: fatal region error detected; run recovery, error: db3 error gibi mesajlar.

# RPM database durumunu kontrol et
sudo rpm -qa > /dev/null

# Database'i backup'la (önce!)
sudo cp -r /var/lib/rpm /var/lib/rpm.backup.$(date +%Y%m%d)

# Eski database dosyalarını temizle
sudo rm -f /var/lib/rpm/__db*

# Database'i yeniden oluştur
sudo rpm --rebuilddb -v

# Sonucu kontrol et
sudo rpm -qa | wc -l

Dependency Sorunları ve Çakışmalar

dnf ile dependency çakışması yaşandığında sistem net hata mesajı verir ama çözüm her zaman obvious değil:

# Conflict detaylarını göster
sudo dnf install sorunlu-paket --best --allowerasing 2>&1

# Hangi paket çakışıyor?
sudo dnf repoquery --conflicts sorunlu-paket

# Güvenli upgrade - sadece güvenli olanları yükle
sudo dnf upgrade --skip-broken

# Belirli bir paketi hariç tutarak upgrade
sudo dnf upgrade --exclude=sorunlu-paket*

# Paket geçmişini gör
sudo dnf history info sorunlu-paket

Kernel update sonrası eski kernel’ı kaldırma bazen bağımlılık sorunlarına yol açar. Bu konuya özel yaklaşım:

# Mevcut kernel versiyonlarını listele
rpm -q kernel

# Hangi kernel aktif?
uname -r

# Güvenli kernel temizliği (en az 2 eski kernel bırak)
sudo dnf remove --oldinstallonly --setopt installonly_limit=2 kernel

# Veya manuel olarak
sudo dnf remove kernel-4.18.0-100.el8.x86_64

Repository Sorunları

RHEL/CentOS’ta repo sorunları subscription yönetimi, mirror erişimi veya bozuk metadata nedeniyle olabilir:

# Tüm aktif repoları listele
sudo dnf repolist
sudo yum repolist all

# Belirli bir reponun durumu
sudo dnf repoinfo base

# Repo metadata'yı zorla yenile
sudo dnf clean metadata
sudo dnf makecache --refresh

# Bozuk repo'yu geçici olarak devre dışı bırak
sudo dnf install paket --disablerepo=bozuk-repo

# Belirli repo'dan yükle
sudo dnf install paket --enablerepo=epel

RHEL subscription sorunu yaşıyorsan:

# Subscription durumunu kontrol et
sudo subscription-manager status
sudo subscription-manager list --installed

# Yeniden register et
sudo subscription-manager refresh

# Cache'i temizle
sudo subscription-manager clean
sudo subscription-manager register --username=user --password=pass

Genel Ileri Seviye Teknikler

Paket Bütünlüğünü Doğrulama

Hem apt hem de rpm tabanlı sistemlerde yüklü paketlerin bütünlüğünü kontrol edebilirsin:

# Debian/Ubuntu - paket dosya listesini doğrula
sudo debsums -c paket-adi

# Tüm paketleri kontrol et (uzun sürer, geceleyin çalıştır)
sudo debsums -c 2>/dev/null | head -50

# RHEL/CentOS - RPM ile doğrulama
sudo rpm -V paket-adi

# Tüm paketleri doğrula
sudo rpm -Va 2>/dev/null | grep -v "^......G"

# Çıktı formatı: S=boyut, M=izin, 5=MD5, L=symlink, D=device, U=kullanıcı, G=grup, T=zaman

Log Analizi ile Sorun Teşhisi

Sorunu geçmişe dönük anlamak için loglar çok değerli:

# apt log dosyaları
sudo cat /var/log/apt/history.log | tail -100
sudo cat /var/log/apt/term.log | tail -100
sudo zcat /var/log/apt/history.log.1.gz | grep "error|Error" 

# dpkg log
sudo grep -i "error|fail" /var/log/dpkg.log | tail -50

# yum/dnf log
sudo cat /var/log/yum.log | tail -100
sudo cat /var/log/dnf.log | tail -100
sudo grep -i "error|fail" /var/log/dnf.rpm.log | tail -50

Disk Alanı Sorunlarını Paket Yönetimiyle Çözmek

Disk doluyken paket güncelleme başarısız olur. Önce alan aç:

# apt cache temizliği
sudo apt-get clean
sudo apt-get autoclean
sudo apt-get autoremove --purge

# Ne kadar yer kazandı?
du -sh /var/cache/apt/archives/

# yum/dnf cache temizliği
sudo dnf clean all
sudo yum clean all

# Eski log dosyaları ne kadar yer kaplıyor?
du -sh /var/log/*/ | sort -h | tail -20

# Journald log boyutunu kısıtla
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=7d

Offline Ortamda Paket Kurulumu

Internet erişimi olmayan production sunucularında paket sorunları daha da karmaşık hale gelir:

# Debian/Ubuntu - paketi bağımlılıklarıyla birlikte indir (başka bir sistemde)
sudo apt-get download paket-adi
apt-cache depends --recurse --no-recommends --no-suggests 
  --no-conflicts --no-breaks --no-replaces --no-enhances 
  paket-adi | grep "^w" | sort -u | xargs apt-get download

# USB/NFS üzerinden yükle
sudo dpkg -i *.deb

# RHEL/CentOS - yerel repo oluştur
sudo dnf install createrepo
sudo createrepo /opt/local-packages/
# /etc/yum.repos.d/local.repo dosyası oluştur
sudo tee /etc/yum.repos.d/local.repo << 'EOF'
[local]
name=Local Repository
baseurl=file:///opt/local-packages/
enabled=1
gpgcheck=0
EOF
sudo dnf install --disablerepo="*" --enablerepo="local" paket-adi

Önleyici Tedbirler: Sorun Çıkmadan Önce

Reaktif olmak yerine proaktif olmak, deneyimli sysadmin’i ayırt eden en önemli özelliktir.

  • Snapshot al: VM kullanıyorsan kritik güncellemelerden önce mutlaka snapshot al. Bunu atlama.
  • Test ortamı kullan: Production’da denemeden önce staging veya test sunucusunda paket güncellemelerini dene.
  • unattended-upgrades dikkatli yönet: Ubuntu’da otomatik güncelleme iyi bir fikir gibi görünür ama production’da bazen sürprizler yaratır. En azından reboot gerektiren güncellemeleri manüele bırak.
  • /var partition’ı ayrı tut: Disk dolmasının sistemi felç etmemesi için /var ayrı bir partition veya LVM volume üzerinde olsun.
  • Düzenli dpkg --audit veya rpm -Va: Bunu cron’a ekle, haftalık çalıştır, sonuçları logla.
  • Repo listesini versiyon kontrolüne al: /etc/apt/sources.list.d/ ve /etc/yum.repos.d/ içeriğini Git ile takip et.
# Sistemi güncellemeden önce snapshot veya yedek al (LVM)
sudo lvcreate -L 5G -s -n snap_root /dev/vg0/root

# Güncelleme sonrası sorun çıkarsa geri dön
sudo lvconvert --merge /dev/vg0/snap_root

Sonuç

Paket bozulma sorunları ne kadar can sıkıcı olsa da büyük çoğunluğu birkaç standart adımla çözülür. Temel prensip şu: önce ne olduğunu anla, sonra müdahale et. --force veya --fix-broken gibi komutlara direkt atlamak bazen sorunu daha da derinleştirir.

apt için altın kural: dpkg --configure -a, sonra apt install -f, sonra apt update && apt upgrade. yum/dnf için: rpm --rebuilddb, sonra dnf clean all, sonra dnf history undo ile geri al veya --skip-broken ile ilerle.

En önemli şey log dosyalarını okumayı öğrenmek. Hata mesajı sana genellikle tam olarak ne yapman gerektiğini söylüyor, ama birçok kişi panikleyip mesajı okumadan rastgele komut deniyor. Bir dahaki sefere sunucu güncelleme sırasında sorun çıkardığında, derin bir nefes al, log dosyasını aç ve oradan başla.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir