Debian ve Ubuntu tabanlı sistemlerde paket yönetimi, bir sysadmin’in günlük hayatının tam ortasında yer alır. Sunucuları ayağa kaldırırken, güvenlik yamalarını uygularken ya da yeni bir servis kurarken apt aracını kullanmadan bir adım bile atamazsınız. Bu yazıda apt ile paket kurulumunu tüm detaylarıyla ele alacağız; temel komutlardan başlayıp gerçek dünya senaryolarına kadar uzanacağız.
apt Nedir ve Neden Önemlidir?
apt (Advanced Package Tool), Debian tabanlı Linux dağıtımlarında kullanılan paket yönetim sistemidir. Ubuntu, Debian, Linux Mint ve Raspberry Pi OS gibi dağıtımlarda standart paket yöneticisi olarak karşımıza çıkar. Eski apt-get ve apt-cache komutlarının yerini büyük ölçüde almış olsa da arka planda aynı altyapıyı kullanır.
Peki apt ile apt-get arasındaki fark nedir? apt, son kullanıcıya daha temiz bir arayüz sunar; ilerleme çubuğu gösterir, renkli çıktı üretir ve sık kullanılan komutları daha sezgisel hale getirir. Ancak scriptlerde ve otomasyonda apt-get kullanmaya devam etmek daha güvenlidir çünkü apt‘nin çıktı formatı sürümler arasında değişebilir. Bu yazıda her iki aracı da göreceğiz.
Paket Listelerini Güncellemek: Her Şeyin Başlangıcı
Sisteme herhangi bir şey kurmadan önce yapmanız gereken ilk iş paket listelerini güncellemektir. Bu işlem, sisteminizin hangi paketlerin mevcut olduğunu ve hangi sürümlerin kullanılabilir olduğunu öğrenmesini sağlar.
sudo apt update
Bu komut çalıştırıldığında /etc/apt/sources.list dosyasında ve /etc/apt/sources.list.d/ dizinindeki dosyalarda tanımlı repository’lere bağlanır, güncel paket indekslerini indirir. Dikkat: bu komut herhangi bir paketi güncellemez, sadece mevcut paketler hakkındaki bilgiyi günceller.
Çıktıda şöyle bir şey görürsünüz:
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Fetched 229 kB in 2s (114 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Buradaki Hit satırları zaten güncel olan kaynakları, Get satırları ise yeni indirilen indeksleri gösterir. Eğer bir repository’ye bağlanılamıyorsa Err satırıyla karşılaşırsınız ki bu durumu hemen araştırmanız gerekir.
Temel Paket Kurulum Komutları
Tek Paket Kurulumu
En basit haliyle bir paket kurmak için:
sudo apt install nginx
Bu komutu çalıştırdığınızda apt, önce bağımlılıkları hesaplar, size kurulacak paketlerin listesini ve disk kullanımını gösterir, ardından onayınızı ister. Y tuşuna basarak devam edersiniz.
Eğer onay istemeden kurulum yapmak istiyorsanız, otomasyon scriptlerinde çok işe yarayan -y parametresini kullanın:
sudo apt install -y nginx
Birden Fazla Paket Aynı Anda Kurma
Gerçek dünyada çoğu zaman tek bir paket değil, bir grup paketi birlikte kurmanız gerekir. Bunu tek komutla yapabilirsiniz:
sudo apt install -y curl wget vim git htop net-tools unzip
Bu yaklaşım, her paketi ayrı ayrı kurmaktan çok daha verimlidir. Özellikle yeni bir sunucu ayarlarken temel araçları bu şekilde toplu kurabilirsiniz.
Belirli Bir Sürümü Kurmak
Bazen bir paketin belirli bir sürümüne ihtiyaç duyarsınız. Örneğin eski bir uygulama belirli bir kütüphane sürümüne bağımlı olabilir:
sudo apt install nginx=1.18.0-6ubuntu14
Mevcut sürümleri görmek için önce şu komutu çalıştırın:
apt-cache madison nginx
Bu komut size repository’lerde bulunan tüm sürümleri listeler.
Repository Yönetimi: Kurulum Öncesi Kritik Adım
Sisteminizin varsayılan repository’leri bazen ihtiyacınız olan paketi sunmayabilir ya da daha güncel bir sürüm isteyebilirsiniz. Bu durumda yeni repository eklemek gerekir.
PPA Ekleme (Ubuntu)
Ubuntu’da Personal Package Archive (PPA) eklemek oldukça basittir:
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.2
Manuel Repository Ekleme
Örneğin Docker’ı resmi repository’den kuralım:
# Gerekli araçları kur
sudo apt install -y ca-certificates curl gnupg
# Docker GPG anahtarını ekle
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Repository'yi ekle
echo
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Paket listelerini güncelle ve Docker'ı kur
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
Bu adımlar Docker’ın resmi belgelerinden alınmıştır ve production ortamlarında kullanılan standart yöntemdir.
Gerçek Dünya Senaryosu: LAMP Stack Kurulumu
Bir müşteri sizden web uygulaması için LAMP (Linux, Apache, MySQL, PHP) stack kurmanızı istiyor. İşte bu süreci nasıl yönetirsiniz:
#!/bin/bash
# lamp-setup.sh - LAMP Stack otomatik kurulum scripti
set -e # Hata durumunda scripti durdur
echo "Paket listeleri güncelleniyor..."
sudo apt update
echo "Apache kuruluyor..."
sudo apt install -y apache2
echo "MySQL kuruluyor..."
sudo apt install -y mysql-server
echo "PHP ve eklentileri kuruluyor..."
sudo apt install -y php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip
echo "Ek araçlar kuruluyor..."
sudo apt install -y git curl wget unzip
echo "Servisler başlatılıyor..."
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl start mysql
sudo systemctl enable mysql
echo "Kurulum tamamlandi!"
echo "Apache versiyonu: $(apache2 -v | head -1)"
echo "MySQL versiyonu: $(mysql --version)"
echo "PHP versiyonu: $(php -v | head -1)"
Bu scripti çalıştırmadan önce chmod +x lamp-setup.sh ile çalıştırma izni vermeyi unutmayın.
Paket Bilgilerini Sorgulamak
Bir paketi kurmadan önce hakkında bilgi almak isteyebilirsiniz. apt show komutu bu konuda çok işe yarar:
apt show nginx
Çıktı şuna benzer:
Package: nginx
Version: 1.18.0-6ubuntu14.4
Priority: optional
Section: web
Depends: nginx-core (<< 1.18.0-6ubuntu14.4.1~) | nginx-full (<< 1.18.0-6ubuntu14.4.1~) | nginx-light (<< 1.18.0-6ubuntu14.4.1~) | nginx-extras (<< 1.18.0-6ubuntu14.4.1~)
Description: small, powerful, scalable web/proxy server
Bir paketin hangi dosyaları kurduğunu görmek için (kurulumdan önce):
apt-file list nginx
Not: apt-file ayrıca kurulması gereken bir araçtır: sudo apt install apt-file && sudo apt-file update
Kurulu bir paketin dosyalarını görmek için dpkg kullanın:
dpkg -L nginx
Bağımlılık Yönetimi
apt‘nin en güçlü özelliklerinden biri bağımlılık yönetimidir. Bir paket kurduğunuzda, o paketin çalışması için gereken tüm bağımlılıklar otomatik olarak indirilip kurulur.
Ancak bazen bağımlılık sorunlarıyla karşılaşabilirsiniz. Bu durumda şu komutu deneyin:
sudo apt install -f
Bu komut, -f (fix-broken) parametresiyle sisteminizde bozulmuş bağımlılıkları tespit edip düzeltmeye çalışır.
Bir paketin bağımlılıklarını görmek için:
apt-cache depends nginx
Hangi paketlerin bir pakete bağımlı olduğunu görmek için:
apt-cache rdepends nginx
Kurulu Paketleri Listelemek ve Aramak
Sisteminizde hangi paketlerin kurulu olduğunu görmek için:
dpkg -l | grep nginx
Ya da apt ile:
apt list --installed | grep php
Tüm kurulu paketlerin listesini bir dosyaya kaydetmek için:
dpkg --get-selections > kurulu-paketler.txt
Bu dosyayı başka bir sunucuda kullanarak aynı paketleri kurmak mümkündür:
# Listeyi başka sunucuya aktar
sudo dpkg --set-selections < kurulu-paketler.txt
sudo apt-get dselect-upgrade
Repository’lerde paket aramak için:
apt search veritabani
Ya da daha spesifik bir arama için:
apt-cache search mysql | grep server
İndirme ve Önbellek Yönetimi
apt, indirdiği paketleri /var/cache/apt/archives/ dizininde saklar. Bu dizin zamanla büyüyebilir ve disk alanı tüketebilir.
Önbelleği temizlemek için:
# Sadece artık gerekmeyen eski paketleri temizle
sudo apt autoclean
# Tüm önbelleği temizle
sudo apt clean
Ne kadar alan kullanıldığını görmek için:
du -sh /var/cache/apt/archives/
Bir paketi sadece indirip kurmamak için:
sudo apt install --download-only nginx
İnternet bağlantısı olmayan sunuculara paket kurmanız gerektiğinde bu özellik çok işe yarar. Paketi bağlantılı bir sistemde indirip, /var/cache/apt/archives/ dizininden alarak bağlantısız sisteme kopyalayabilirsiniz.
Yerel .deb dosyasından kurulum yapmak için:
sudo dpkg -i paket_adi.deb
# Bağımlılık sorunları varsa:
sudo apt install -f
Gerçek Dünya Senaryosu: Güvenli Paket Güncellemesi
Production sunucularında paket güncellemesi yaparken dikkatli olmalısınız. Özellikle kritik servislerin çalıştığı sunucularda rastgele apt upgrade çalıştırmak ciddi sorunlara yol açabilir.
İşte güvenli bir güncelleme iş akışı:
#!/bin/bash
# guvenli-guncelleme.sh
TARIH=$(date +%Y%m%d_%H%M%S)
LOG_DOSYA="/var/log/apt-update-$TARIH.log"
echo "[$TARIH] Güncelleme başlıyor..." | tee -a $LOG_DOSYA
# Önce ne güncellenecek görelim
echo "Güncellenecek paketler:" | tee -a $LOG_DOSYA
apt list --upgradable 2>/dev/null | tee -a $LOG_DOSYA
# Sadece güvenlik güncellemelerini uygula
echo "Güvenlik güncellemeleri uygulanıyor..." | tee -a $LOG_DOSYA
sudo apt update >> $LOG_DOSYA 2>&1
# unattended-upgrades ile sadece güvenlik yamalarını uygula
sudo unattended-upgrade --dry-run 2>&1 | tee -a $LOG_DOSYA
echo "Dry-run tamamlandi. Devam etmek istiyor musunuz? (e/h)"
read CEVAP
if [ "$CEVAP" = "e" ]; then
sudo unattended-upgrade 2>&1 | tee -a $LOG_DOSYA
echo "Güncelleme tamamlandi. Log: $LOG_DOSYA"
else
echo "Güncelleme iptal edildi."
fi
unattended-upgrades paketi sadece güvenlik güncellemelerini otomatik olarak uygular ve bu sayede sisteminizi daha güvende tutarken kararlılık riskini minimize eder.
Paket Tutma (Hold): Güncellemelerden Koruma
Bazen belirli bir paketin güncellenmesini engellemek isteyebilirsiniz. Örneğin, bir uygulama belirli bir kütüphane sürümüne sıkı sıkıya bağlıysa:
# Paketi hold'a al
sudo apt-mark hold nginx
# Hold durumundaki paketleri listele
sudo apt-mark showhold
# Hold'u kaldır
sudo apt-mark unhold nginx
Ayrıca dpkg ile de yapabilirsiniz:
echo "nginx hold" | sudo dpkg --set-selections
Bu tekniği özellikle Kubernetes cluster’larında kubectl, kubelet ve kubeadm gibi kritik paketleri güncellemelerden korumak için sıkça kullanırız.
apt-get ile apt Farkları ve Script Yazımı
Daha önce belirttiğim gibi, scriptlerde apt-get kullanmak daha güvenlidir. İşte temel karşılaştırma:
apt update=apt-get updateapt install=apt-get installapt remove=apt-get removeapt autoremove=apt-get autoremoveapt upgrade=apt-get upgradeapt full-upgrade=apt-get dist-upgrade
Script yazarken şu iyi pratikleri uygulayın:
#!/bin/bash
# Scriptlerde kullanmak icin onerilen yaklasim
# DEBIAN_FRONTEND=noninteractive ile interaktif soruları engelle
export DEBIAN_FRONTEND=noninteractive
# apt-get kullan, -y ile otomatik onayla, -qq ile sessiz mod
sudo apt-get update -qq
sudo apt-get install -y -qq
nginx
mysql-server
php-fpm
2>&1 | tee /var/log/kurulum.log
# Hata kontrolü
if [ $? -ne 0 ]; then
echo "HATA: Paket kurulumu basarisiz!"
exit 1
fi
DEBIAN_FRONTEND=noninteractive parametresi, kurulum sırasında çıkabilecek interaktif sorulara (timezone, keyboard layout vb.) otomatik cevap verilmesini sağlar. CI/CD pipeline’larında ve otomatik kurulum scriptlerinde bu parametre olmadan işler kilitleniyor.
Sorun Giderme: Sık Karşılaşılan Hatalar
“Unable to acquire the dpkg frontend lock” Hatası
# Başka bir apt işlemi çalışıyor mu kontrol et
ps aux | grep apt
# Lock dosyalarını kontrol et
ls -la /var/lib/dpkg/lock*
ls -la /var/cache/apt/archives/lock
# Eğer gerçekten başka işlem yoksa lock'u kaldır (dikkatli ol!)
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo dpkg --configure -a
“Package has unmet dependencies” Hatası
# Bozuk bağımlılıkları düzelt
sudo apt install -f
# Alternatif olarak
sudo dpkg --configure -a
sudo apt update
sudo apt install paket_adi
GPG Anahtar Hatası
# "NO_PUBKEY" hatasında
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ANAHTAR_ID
# Ya da daha modern yöntem:
curl -fsSL https://repository-url/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/repo.gpg
Performans İpuçları: apt’yi Daha Verimli Kullanmak
Yavaş internet bağlantısında ya da çok sayıda sunucuyu yönetirken şu ipuçları hayat kurtarır:
Yerel apt proxy kurarak tüm sunucularınızın aynı paketi bir kez indirmesini sağlayabilirsiniz. apt-cacher-ng bunun için harika bir araçtır:
# Proxy sunucusunda
sudo apt install apt-cacher-ng
# Client sunucularda /etc/apt/apt.conf.d/01proxy dosyasına ekle:
echo 'Acquire::http::Proxy "http://PROXY-IP:3142";' | sudo tee /etc/apt/apt.conf.d/01proxy
Bu yapıyı kurduğunuzda, özellikle aynı anda birden fazla sunucu güncellerken ağ trafiğini ve güncelleme süresini dramatik biçimde azaltırsınız.
Sonuç
apt ile paket yönetimi, Linux sistem yöneticiliğinin bel kemiğini oluşturur. Temel apt install komutundan başlayıp, repository yönetimine, otomatik kurulum scriptlerine, bağımlılık çözümlemeye ve sorun gidermeye kadar uzanan bu bilgi seti günlük iş akışınızda sürekli karşınıza çıkacak.
Özellikle şu noktalara dikkat etmeyi unutmayın: Production sunucularda apt upgrade çalıştırmadan önce mutlaka ne güncellendiğini kontrol edin, scriptlerde DEBIAN_FRONTEND=noninteractive kullanın, kritik paketleri hold’a alarak kazara güncellenmelerini engelleyin ve yerel apt proxy kullanarak ağ trafiğini optimize edin.
Birden fazla sunucu yönetiyorsanız, bu komutları Ansible gibi konfigürasyon yönetim araçlarıyla birleştirmek işleri çok daha yönetilebilir hale getirir. Ama o konu başlı başına ayrı bir yazı konusu. Sorularınız için yorumlar bölümünü kullanabilirsiniz.