apt ile Paket Yönetimi: Kurulum Rehberi

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 update
  • apt install = apt-get install
  • apt remove = apt-get remove
  • apt autoremove = apt-get autoremove
  • apt upgrade = apt-get upgrade
  • apt 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.

Yorum yapın