apt ve dpkg ile Debian Paket Yönetimi

Debian tabanlı sistemlerde paket yönetimi, bir sistem yöneticisinin günlük hayatının tam merkezinde yer alır. Ubuntu, Debian, Linux Mint veya başka bir Debian türevi kullanıyor olun, apt ve dpkg araçlarını gerçekten iyi anlamadan sunucularınızı sağlıklı tutmanız oldukça güçleşir. Bu yazıda sadece temel komutları değil, prodüksiyonda karşılaşacağınız gerçek senaryoları ve çözüm yollarını ele alacağız.

apt ve dpkg Arasındaki Fark

Çoğu sysadmin bu iki aracı birbiriyle karıştırır ya da sadece apt kullanıp dpkgyi tamamen görmezden gelir. Oysa ikisinin de ayrı bir rolü var.

dpkg, Debian paket sisteminin temel taşıdır. .deb dosyalarını doğrudan sisteme kuran, kaldıran ve sorgulayan alt seviye araçtır. Bağımlılık çözümlemesi yapmaz, sadece size söylenen paketi işleme alır.

apt ise üst seviye bir araçtır. Paket depolarıyla konuşur, bağımlılıkları otomatik çözer, paketleri indirir ve arka planda dpkg’yi çağırır. Yani apt install nginx dediğinizde aslında perde arkasında dpkg çalışıyor.

Bunu şöyle düşünebilirsiniz: dpkg bir tornavida gibidir, apt ise o tornavidayı da içinde barındıran bir alet çantası. Çoğu zaman alet çantasını kullanırsınız ama bazen doğrudan tornavidaya ulaşmanız gerekir.

Temel apt Komutları

Sistem Güncellemesi

Prodüksiyon sunucularında güncelleme rutini kritik öneme sahiptir. Temel akış şu şekildedir:

# Paket listesini güncelle (internetten indirmez, sadece listeyi çeker)
sudo apt update

# Kurulu paketleri güncelle
sudo apt upgrade

# Dağıtım güncellemesi (kernel ve kritik sistem paketleri dahil)
sudo apt full-upgrade

# İkisini tek satırda yapmak için
sudo apt update && sudo apt upgrade -y

apt update ile apt upgrade arasındaki farkı anlamak önemlidir. update sadece hangi paketlerin yeni sürümlerinin mevcut olduğunu öğrenir, hiçbir şey yüklemez. upgrade ise bu bilgiyi kullanarak kurulu paketleri günceller.

full-upgrade komutunu dikkatli kullanın. Bu komut, güncelleme sırasında gerekirse mevcut paketleri kaldırabilir veya yeni bağımlılıklar ekleyebilir. Prodüksiyon ortamında bunu uygulamadan önce mutlaka test ortamında deneyin.

Paket Kurma ve Kaldırma

# Tek paket kurma
sudo apt install nginx

# Birden fazla paket aynı anda kurma
sudo apt install nginx php8.2-fpm mariadb-server

# Belirli bir sürüm kurma
sudo apt install nginx=1.24.0-2

# Paketi kaldırma (yapılandırma dosyaları kalır)
sudo apt remove nginx

# Paketi yapılandırma dosyalarıyla birlikte tamamen kaldırma
sudo apt purge nginx

# Artık gerekmeyen bağımlılıkları temizleme
sudo apt autoremove

# Her şeyi tek seferde yapma
sudo apt purge nginx && sudo apt autoremove

remove ile purge arasındaki farka dikkat edin. Bir servisi tamamen söküp yeniden kuracaksanız purge kullanın, aksi takdirde eski yapılandırma dosyaları kalır ve yeni kurulumu etkileyebilir. Bu hatayı ben de birkaç kez yaşadım; nginx’i kaldırıp yeniden kurdum ama eski bozuk config dosyası nedeniyle servis başlamadı.

Paket Arama ve Bilgi Alma

# Paket arama
apt search "web server"

# Paket hakkında detaylı bilgi
apt show nginx

# Kurulu paketleri listeleme
apt list --installed

# Güncellenebilir paketleri listeleme
apt list --upgradable

# Belirli bir paketi arama
apt list --installed | grep php

dpkg ile Çalışmak

dpkg’yi genellikle iki durumda kullanırsınız: doğrudan .deb dosyası kuracağınız zaman veya apt’nin çözemediği sorunları elle düzeltmeniz gerektiğinde.

Temel dpkg Komutları

# .deb dosyasından paket kurma
sudo dpkg -i paket_adi.deb

# Paketi kaldırma
sudo dpkg -r paket_adi

# Paketi yapılandırma dosyalarıyla kaldırma
sudo dpkg --purge paket_adi

# Kurulu paketleri listeleme
dpkg -l

# Belirli paketi sorgulama
dpkg -l nginx

# Paketin hangi dosyaları kurduğunu görme
dpkg -L nginx

# Bir dosyanın hangi pakete ait olduğunu bulma
dpkg -S /usr/sbin/nginx

# Paket durumunu kontrol etme
dpkg --status nginx

dpkg -S komutu özellikle çok işe yarar. Bir konfigürasyon dosyasının hangi paketten geldiğini bilmiyorsanız bu komutla öğrenebilirsiniz. Örneğin /etc/nginx/nginx.conf dosyasının hangi paketten geldiğini anlamak için dpkg -S /etc/nginx/nginx.conf yazmanız yeterli.

Gerçek Dünya Senaryosu: Kırık Paket Sorununu Çözme

Prodüksiyonda sık karşılaşılan bir durum: apt bir paket kurarken hata verdi ve şimdi sistem yarım kalmış durumda. Terminaliniz şuna benzer bir şey söylüyordur:

dpkg: error processing package xxx (--configure)
E: Sub-process /usr/bin/dpkg returned an error code (1)

Bu durumda şu adımları takip edin:

# Yarım kalan kurulumları tamamlamaya çalış
sudo dpkg --configure -a

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

# Hala düzelmiyorsa paket veritabanını yenile
sudo apt clean
sudo apt update
sudo apt install -f

# En kötü senaryoda sorunlu paketi zorla kaldır
sudo dpkg --remove --force-remove-reinstreq sorunlu_paket

--force-remove-reinstreq bayrağını kullanmak sizi kurtarabilir ama dikkatli olun. Bu bayrağın ne yaptığını bilmeden rastgele kullanmayın.

apt Yapılandırması ve Depolar

Depo Yönetimi

Yeni bir depo eklemek için iki yöntem vardır. Modern yöntem sources.list.d dizinini kullanmaktır:

# Geleneksel yöntem - sources.list düzenleme
sudo nano /etc/apt/sources.list

# Modern yöntem - ayrı dosya oluşturma
sudo nano /etc/apt/sources.list.d/nginx.list
# İçine eklenecek satır örneği:
# deb http://nginx.org/packages/debian bookworm nginx

# GPG anahtarı ekleme (modern yöntem)
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg

# Ardından sources.list satırını buna göre güncelle
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian bookworm nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Eskiden apt-key add ile anahtar eklenirdi ama bu yöntem artık deprecated sayılıyor. Yukarıdaki signed-by yöntemini kullanmaya alışın.

Paket Tutma (Hold) İşlemi

Prodüksiyonda belirli bir paketin güncellenmesini engellemek isteyebilirsiniz. Örneğin Kubernetes kurulumunuzda belirli bir kernel versiyonuna bağlısınız ya da bir uygulama belirli bir kütüphane versiyonuyla çalışıyor:

# Paketi mevcut versiyonda tut
sudo apt-mark hold nginx

# Tutulmuş paketleri listele
apt-mark showhold

# Tutmayı kaldır
sudo apt-mark unhold nginx

Bu komutu özellikle kernel güncellemelerinde sıkça kullanıyorum. Yeni bir kernel versiyonunun production’a girmesini istemiyorsanız hold koyun, sonra test edin, geçerli ise unhold edin.

Önbellek Yönetimi ve Disk Temizliği

Zamanla apt önbelleği oldukça büyüyebilir. Özellikle disk alanı kısıtlı VPS’lerde bu ciddi sorun yaratır:

# Önbellek boyutunu kontrol et
du -sh /var/cache/apt/archives/

# İndirilen paket dosyalarını temizle (sadece eski versiyonları)
sudo apt autoclean

# Tüm önbelleği temizle
sudo apt clean

# Kullanılmayan paketleri ve önbelleği temizle
sudo apt autoremove --purge
sudo apt clean

# Ne kadar yer kazanacağını önceden gör
sudo apt autoremove --dry-run

Ben sunucularda bunu aylık bir cron job olarak çalıştırıyorum. Disk dolunca sorun çıktıktan sonra değil, proaktif olarak temizlemek çok daha mantıklı.

Paket Bağımlılıklarını Anlamak

Bir paketin bağımlılıklarını görmek, özellikle minimal kurulum yapıyorsanız çok önemlidir:

# Paketin bağımlılıklarını göster
apt-cache depends nginx

# Hangi paketlerin bu pakete bağımlı olduğunu göster
apt-cache rdepends nginx

# Daha detaylı bağımlılık ağacı
apt-cache showpkg nginx

rdepends komutunu özellikle bir paketi kaldırmadan önce kullanın. Kaldırmak istediğiniz paketin başka kritik paketler tarafından kullanılıp kullanılmadığını önceden görürsünüz.

Gerçek Dünya Senaryosu: Minimal Sunucu Kurulumu

Prodüksiyonda gereksiz paketler güvenlik açığı demektir. Debian’ı minimal kurup ihtiyaç duyduğunuz şeyleri eklemek en iyi pratiktir:

# Kurulu paketleri ve boyutlarını listele
dpkg-query -W -f='${Installed-Size}t${Package}n' | sort -n | tail -20

# Önerilen paketleri otomatik kurmadan paket kur
sudo apt install --no-install-recommends nginx

# Sistemdeki tüm gereksiz paketleri bul ve kaldır
sudo apt autoremove --purge

# Sadece kurulu ve "otomatik" olarak işaretlenmiş paketleri göster
apt-mark showauto | head -30

--no-install-recommends bayrağı özellikle container veya minimal sunucu kurulumlarında hayat kurtarır. Nginx kurduğunuzda normalde onlarca önerilen paket gelir, bu bayrakla sadece zorunlu olanlar gelir.

apt-cache ile Derinlemesine Arama

# Paket adı ve açıklamada arama
apt-cache search nginx

# Sadece paket adında arama
apt-cache search --names-only nginx

# Belirli bir versiyon mevcut mu kontrol et
apt-cache policy nginx

# Tüm mevcut versiyonları listele
apt-cache showpkg nginx | grep "Versions"

apt-cache policy komutu çok değerli bir araçtır. Bir paketin hangi depodan geldiğini, hangi versiyonun kurulu olduğunu ve hangi versiyonların mevcut olduğunu tek seferde gösterir. Birden fazla depo eklediğinizde hangi depoya öncelik verildiğini de buradan anlarsınız.

Otomatik Güncellemeler ve unattended-upgrades

Güvenlik güncellemelerini otomatik uygulamak için unattended-upgrades paketi kullanılır:

# Paketi kur
sudo apt install unattended-upgrades

# Yapılandır
sudo dpkg-reconfigure --priority=low unattended-upgrades

# Yapılandırma dosyasını düzenle
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Yapılandırma dosyasında dikkat etmeniz gereken satırlar şunlardır:

  • Unattended-Upgrade::Allowed-Origins: Hangi depolardan otomatik güncelleme yapılacağı
  • Unattended-Upgrade::Automatic-Reboot: Gerekirse otomatik reboot yapılıp yapılmayacağı
  • Unattended-Upgrade::Mail: Sorun olduğunda e-posta gönderilecek adres

Prodüksiyonda Automatic-Reboot ayarını genellikle kapalı tutarım. Bir güvenlik güncellemesi için sunucunun otomatik reboot yapması uygulamanızın beklenmedik anlarda kapanması demektir. Reboot’u kendiniz planlayın ve uygulayın.

Paket Sabitleme (Pinning)

Birden fazla deponuz varsa ve belirli bir depodan belirli paketlerin gelmesini istiyorsanız pin kullanırsınız:

# /etc/apt/preferences.d/ altında dosya oluştur
sudo nano /etc/apt/preferences.d/nginx-pin

# İçeriği şu şekilde olmalı:
# Package: nginx
# Pin: origin nginx.org
# Pin-Priority: 1000

# Pin önceliklerini kontrol et
apt-cache policy nginx

Pin öncelikleri şöyle çalışır:

  • 1000 üzeri: Downgrade dahil her durumda bu depo tercih edilir
  • 990: Kurulu versiyondan daha yeniyse bu depo tercih edilir
  • 500: Normal öncelik
  • 100 altı: Sadece başka seçenek yoksa kullanılır
  • Negatif değer: Bu depodan paket kurulmasın

Sorun Giderme: Yaygın Hatalar

“Unable to lock the administration directory” Hatası

# Kilidi tutan process var mı kontrol et
sudo lsof /var/lib/dpkg/lock-frontend

# Eğer process yoksa kilit dosyalarını temizle
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo dpkg --configure -a

Bu hatayı sık sık görüyorsanız muhtemelen başka bir apt işlemi arka planda çalışıyor. ps aux | grep apt ile kontrol edin. Özellikle unattended-upgrades arka planda çalışırken manuel apt komutu verirseniz bu hatayla karşılaşırsınız.

GPG Anahtar Hataları

# "NO_PUBKEY" hatasını gidermek için
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EKSIK_ANAHTAR_ID

# Modern yöntem
curl -fsSL ANAHTAR_URL | sudo gpg --dearmor -o /usr/share/keyrings/paket-archive-keyring.gpg

Paket Listesi Bozulması

# Paket listelerini temizle ve yeniden indir
sudo rm -rf /var/lib/apt/lists/*
sudo apt update

dpkg ile Paket Dosyası İnceleme

Bir .deb paketini kurmadan önce içini görmek isteyebilirsiniz:

# .deb dosyasının içeriğini listele
dpkg -c paket.deb

# .deb dosyasının meta bilgilerini göster
dpkg -I paket.deb

# .deb dosyasını belirli bir dizine aç (kurmadan)
dpkg -x paket.deb /tmp/paket_icerik/

# Sadece kontrol dosyalarını çıkar
dpkg -e paket.deb /tmp/paket_kontrol/

Bu komutlar özellikle güvenlik açısından şüpheli bir .deb dosyasını incelemek istediğinizde işe yarar. Kurmadan önce ne içerdiğini görmek her zaman iyi bir alışkanlıktır.

Sonuç

apt ve dpkg aslında birbirini tamamlayan araçlardır ve ikisini birlikte iyi bilmek Debian sunucu yönetiminin temelini oluşturur. Günlük işlerin yüzde doksanı apt ile hallolur ama kırık paketler, .deb kurulumları veya düşük seviye paket sorgulama işlemlerinde dpkg’ye inmek gerekir.

Pratik olarak söylemek gerekirse, en çok işinize yarayacak alışkanlıklar şunlardır: Paket kaldırırken purge kullanmak, kritik paketlere hold koymak, depo eklerken modern signed-by yöntemini tercih etmek ve disk temizliğini düzenli yapmak. Bunlara apt-cache policy ile paketlerin nereden geldiğini takip etmeyi de ekleyin.

Sistem yönetimi deneyiminden öğrendiğim en önemli ders şu: Bir şeyler patlamadan önce araçlarınızı öğrenin. apt ve dpkg’yi sadece “bir şeyler kuran araçlar” olarak değil, sistemin sağlığını yönettiğiniz temel mekanizmalar olarak görün. O zaman hem sorunları daha hızlı çözersiniz hem de onları baştan yaratmazsınız.

Yorum yapın