Snap Paket Yöneticisi: Ubuntu’da Kurulum ve Yönetim Rehberi

Ubuntu sunucularında paket yönetimi denince akla ilk gelen araç hâlâ apt olsa da, Canonical’ın geliştirdiği Snap sistemi son birkaç yılda ciddi bir kullanıcı tabanı edindi. Özellikle bağımlılık sorunlarından bunalmış, “bu paketi kurunca şu bozuldu” dertleriyle boğuşmuş sysadminler için Snap’in sunduğu izolasyon modeli oldukça cazip görünüyor. Ben de uzun süre “gerek var mı buna?” diye düşünenlerden biriydim; ancak birkaç prodüksiyon senaryosundan sonra Snap’e bakışım değişti. Bu yazıda Snap’i tepeden tırnağa ele alacağız: kurulumdan yönetim komutlarına, servis entegrasyonundan güvenlik konfinement mekanizmasına kadar her şeyi pratiğe dökeceğiz.

Snap Nedir ve Neden Farklıdır?

Geleneksel .deb paketleri sisteme kurulur ve bağımlılıkları sistem kütüphaneleriyle paylaşır. Bu yöntem güzel çalışır, ancak farklı uygulamaların aynı kütüphanenin farklı sürümlerine ihtiyaç duyduğu durumlarda kabus yaratır. Snap ise uygulamayı tüm bağımlılıklarıyla birlikte sıkıştırılmış bir dosya sistemine (SquashFS) paketler ve bu paketi /snap dizinine bağlar.

Snap paketlerinin öne çıkan özellikleri şunlardır:

  • Bağımsız paketleme: Uygulama, ihtiyaç duyduğu kütüphaneleri yanında taşır
  • Otomatik güncelleme: Arka planda sessizce güncellenir, müdahale gerekmez
  • Rol tabanlı izin sistemi (confinement): Uygulama sandbox içinde çalışır, sisteme erişimi kısıtlıdır
  • Sürüm geri alma (rollback): Güncelleme sonrası sorun çıkarsa önceki sürüme anında dönebilirsiniz
  • Çoklu kanal desteği: Stable, candidate, beta, edge kanallarından istediğinizi seçebilirsiniz

Şimdi bu güzel teorinin pratikte nasıl göründüğüne bakalım.

Snapd Kurulumu

Ubuntu 16.04 ve sonrasında snapd daemon’ı genellikle önceden kurulu gelir. Ancak minimal server kurulumlarında ya da temiz bir cloud image üzerinde çalışıyorsanız el ile kurmanız gerekebilir.

sudo apt update
sudo apt install snapd -y

# Servisin çalışıp çalışmadığını kontrol edin
sudo systemctl status snapd

# Snap versiyonunu doğrulayın
snap version

snap version çıktısı size hem snap istemcisinin hem snapd daemon’ının hem de sisteminizin sürümünü gösterir. Tipik bir çıktı şöyle görünür:

snap    2.61.3
snapd   2.61.3
series  16
ubuntu  22.04
kernel  5.15.0-91-generic

Eğer fresh bir Ubuntu Server kurulumu üzerindeyseniz ve snap komutu “command not found” dönüyorsa, PATH’e snap’in binary dizinini eklemeniz gerekebilir:

export PATH=$PATH:/snap/bin
echo 'export PATH=$PATH:/snap/bin' >> ~/.bashrc
source ~/.bashrc

Temel Snap Komutları

Paket Arama ve Bilgi Alma

Snap Store’da bir paket aramak için find komutunu kullanıyoruz:

# Genel arama
snap find "web server"

# Belirli bir paket hakkında detaylı bilgi
snap info nginx

# Kurulu snap paketlerini listele
snap list

# Belirli bir paketin detaylarını gör
snap list --all firefox

snap info komutu gerçekten işe yarar bilgiler verir. Paketin mevcut sürümü, yayıncı, kanallar, açıklama ve hangi pluginlere (izinlere) ihtiyaç duyduğu gibi bilgilere tek komutla ulaşırsınız.

Paket Kurulumu

# Standart kurulum (stable kanalından)
sudo snap install vlc

# Belirli bir kanaldan kurulum
sudo snap install node --channel=20/stable

# Classic confinement modunda kurulum (IDE'ler gibi daha fazla sistem erişimi gereken uygulamalar)
sudo snap install code --classic

# Belirli bir revizyonu kur
sudo snap install firefox --revision=3836

Classic mode hakkında bir not düşmek gerekiyor: Bazı uygulamalar (VS Code, IntelliJ, Helm gibi geliştirici araçları) sıkı sandbox politikasıyla çalışamaz çünkü sisteme geniş çaplı erişim gerektirirler. Bu yüzden --classic flag’ini kullanırsınız. Ancak bu, o uygulamanın sandbox dışına çıktığı anlamına gelir, yani normal bir apt paketiyle aynı erişim seviyesine sahip olur. Prodüksiyon sunucularında bunu bilerek yapmanız önemli.

Güncelleme Yönetimi

Snap’in en tartışmalı özelliklerinden biri otomatik güncelleme mekanizmasıdır. Varsayılan olarak snapd, günde 4 kez güncelleme kontrolü yapar ve bulduğunda sessizce uygular. Bu masaüstü kullanıcısı için harika, sunucu yöneticisi için ise bazen sorun çıkarabilir.

# Manuel güncelleme (tüm paketler)
sudo snap refresh

# Belirli bir paketi güncelle
sudo snap refresh node

# Mevcut güncellemeleri kontrol et (uygulamadan)
sudo snap refresh --list

# Güncelleme zamanlamasını görüntüle
sudo snap get system refresh.timer

Otomatik Güncelleme Kontrolü

Sunucularda güncelleme zamanlamasını kendiniz belirlemek isteyebilirsiniz. Mesela gece 2-4 arası bir bakım penceresi tanımlamak için:

# Güncelleme saatini gece 02:00-04:00 arasına ayarla
sudo snap set system refresh.timer="02:00-04:00"

# Haftanın belirli günleri için
sudo snap set system refresh.timer="mon,wed,fri:02:00-04:00"

# Güncellemeyi geçici olarak durdur (maksimum 90 gün)
sudo snap set system refresh.hold="$(date --date='60 days' +%Y-%m-%dT%H:%M:%S%:z)"

Ben genellikle kritik prodüksiyon sunucularında güncelleme zamanlamasını belirleyip bir cron job ile de manuel kontrol eklerim. “Otomatiğe güveniyorum ama kontrol de ederim” felsefesiyle yaklaşıyorum.

Sürüm Geri Alma (Rollback)

Bu özellik beni Snap’e ısındıran şeylerden biriydi. Bir güncelleme sonrası uygulama patlarsa:

# Önceki sürüme dön
sudo snap revert node

# Belirli bir revizyona dön
sudo snap revert node --revision=8842

# Mevcut ve önceki revizyonları gör
snap list --all node

snap list --all çıktısında disabled olarak işaretlenmiş revizyonları görürsünüz. Bunlar hâlâ diskte tutulan eski sürümlerdir. Disk alanı konusuna birazdan döneceğiz.

Snap Servislerini Yönetmek

Snap paketleri içinde servis olarak çalışan uygulamalar (veritabanları, proxy’ler vs.) kendi servis yönetim komutlarıyla gelir. Bu, systemctl ile yönettiğiniz servislerden biraz farklıdır.

# Bir snap'in servislerini listele
snap services

# Belirli bir snap'in servislerini gör
snap services microk8s

# Servisi başlat/durdur/yeniden başlat
sudo snap start microk8s
sudo snap stop microk8s
sudo snap restart microk8s

# Servisin sistem açılışında başlamasını ayarla
sudo snap start --enable microk8s
sudo snap stop --disable microk8s

# Servis loglarını takip et
sudo snap logs microk8s -f
sudo snap logs microk8s.kubelet -n 100

Prodüksiyonda MicroK8s kullananlar bu komutlara çok aşinadır. Snap servislerinin logları ayrıca journalctl ile de görüntülenebilir:

journalctl -u snap.microk8s.daemon-apiserver -f

İzin Yönetimi (Interfaces ve Connections)

Snap’in güvenlik modeli “interface” ve “connection” kavramları üzerine kuruludur. Bir snap uygulaması belirli sistem kaynaklarına erişmek için interface talep eder. Bazıları otomatik bağlanır, bazıları ise siz onaylamadan çalışmaz.

# Bir snap'in bağlı olduğu interface'leri gör
snap connections vlc

# Sistemdeki tüm bağlantıları listele
snap connections --all

# Bir interface'i manuel bağla
sudo snap connect vlc:camera

# Bir interface bağlantısını kes
sudo snap disconnect vlc:camera

# Mevcut tüm interface'leri gör
snap interface
snap interface camera

Gerçek dünya senaryosu: Sunucunuza kurduğunuz bir monitoring aracı disk okuma iznine ihtiyaç duyuyor ama varsayılan sandbox bunu engelliyor. İşte tam bu noktada:

# Hangi interface'lerin bağlı olmadığını bul
snap connections netdata | grep "-"

# Gerekli disk erişimini ver
sudo snap connect netdata:mount-observe
sudo snap connect netdata:hardware-observe
sudo snap connect netdata:system-observe

Disk Alanı Yönetimi

Snap’in eleştiri aldığı konulardan biri disk kullanımıdır. Her snap paketi kendi bağımlılıklarını taşıdığı için ve eski revizyonlar silinmediği için disk dolabilir. Bunu kontrol altında tutmanın yolları:

# Snap'lerin kapladığı toplam alanı gör
du -sh /snap/*
df -h /var/lib/snapd

# Eski revizyonları temizle
sudo snap set system snapshots.automatic.retention=no

# Kullanılmayan revizyonları manuel temizle
sudo snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do
    sudo snap remove "$snapname" --revision="$revision"
done

Bu son komut bloğunu bir script’e alıp cron’a eklemek çok iyi bir alışkanlıktır. Ben genellikle haftalık çalıştırırım.

Ayrıca snapd’nin otomatik temizleme ayarlarını yapabilirsiniz:

# Kaç eski revizyon tutulacağını ayarla (varsayılan 2)
sudo snap set system refresh.retain=2

Snap’i Scriptlerde Kullanmak

Otomasyonu seven bir sysadmin olarak Snap komutlarını script’lere entegre etmek kaçınılmaz oluyor. Birkaç pratik örnek:

#!/bin/bash
# Snap güncelleme durumunu kontrol et ve logla

LOG_FILE="/var/log/snap-refresh.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Snap refresh kontrolu basladi" >> "$LOG_FILE"

# Bekleyen güncellemeleri kontrol et
UPDATES=$(snap refresh --list 2>/dev/null | tail -n +2 | wc -l)

if [ "$UPDATES" -gt 0 ]; then
    echo "[$DATE] $UPDATES guncelleme mevcut, uygulanıyor..." >> "$LOG_FILE"
    snap refresh >> "$LOG_FILE" 2>&1
    echo "[$DATE] Guncelleme tamamlandi" >> "$LOG_FILE"
else
    echo "[$DATE] Guncel, islem yok" >> "$LOG_FILE"
fi

# Eski revizyonları temizle
snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do
    snap remove "$snapname" --revision="$revision" >> "$LOG_FILE" 2>&1
done

Bu script’i /etc/cron.weekly/ altına bırakarak haftalık otomatik temizlik yapabilirsiniz.

Snap Store Dışından Kurulum (Sideloading)

Bazen internete erişimi kısıtlı air-gapped sunucularda çalışırsınız. Bu durumda snap paketini internetten indirip el ile kurabilirsiniz:

# Snap paketini .snap dosyası olarak indir
snap download node --channel=20/stable

# İndirilen dosyaları gör (node_*.snap ve node_*.assert)
ls -la node*

# Assert dosyasıyla birlikte kur (imza doğrulaması için)
sudo snap ack node_*.assert
sudo snap install node_*.snap

# Eğer imza doğrulaması istemiyorsanız (güvenilmeyen kaynak için dikkatli kullanın)
sudo snap install node_*.snap --dangerous

Air-gapped ortamlarda --dangerous flag’ini kullanmak zorunda kaldığınızda bu paketin Snap Store’dan geçmediğini ve imzasının doğrulanmadığını unutmayın. Kaynağa güvendiğinizden emin olun.

Snap’i Devre Dışı Bırakmak veya Kaldırmak

Bazı durumlar var: Minimal bir sunucuda snapd gereksiz kaynak tüketiyor, ya da güvenlik politikanız snap kullanımına izin vermiyor. Bu durumlarda:

# Önce tüm kurulu snap'leri kaldır
snap list | awk 'NR>1 {print $1}' | xargs -I {} sudo snap remove {}

# snapd'yi durdur ve devre dışı bırak
sudo systemctl stop snapd
sudo systemctl disable snapd
sudo systemctl mask snapd

# apt ile tamamen kaldır
sudo apt purge snapd -y

# Kalan dizinleri temizle
sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd ~/snap

Ubuntu 22.04 sunucularında bazı paketler (örneğin firefox) artık varsayılan olarak snap üzerinden geliyor. Bunları apt ile geri almak için önce snap sürümünü kaldırıp sonra apt repository’sini eklemeniz gerekebilir. Bu ayrı bir yazı konusu ama en azından bilinmesi gereken bir nokta.

Gerçek Dünya Senaryosu: Node.js Versiyonlarını Snap ile Yönetmek

Geliştirme sunucularında farklı projeler farklı Node.js versiyonları gerektirebilir. nvm kullanmak bir seçenek ama sistem servislerinde kullanılması karmaşıklaşır. Snap kanalları bu noktada güzel bir alternatif sunar:

# Mevcut Node.js kanallarını gör
snap info node | grep -A 20 "channels:"

# Node 20 LTS kur
sudo snap install node --channel=20/stable --classic

# Versiyon kontrolü
node --version
npm --version

# Gerekirse farklı bir kanala geç
sudo snap switch node --channel=18/stable
sudo snap refresh node

# Belirli bir snap için otomatik güncellemeyi durdur
sudo snap refresh --hold=forever node

--hold=forever seçeneği o paketi güncelleme döngüsünün tamamen dışına çıkarır. Kritik servislerde hangi sürümü çalıştırdığınızı bilmek istediğinizde bu çok işe yarar.

Monitoring ve Troubleshooting

Snap ile ilgili sorun yaşandığında ilk bakılacak yerler:

# snapd'nin detaylı logları
sudo journalctl -u snapd -f
sudo journalctl -u snapd --since "1 hour ago"

# Snap hata ayıklama bilgisi
sudo snap debug state /var/lib/snapd/state.json | head -50

# Bağlantı sorunlarını kontrol et
sudo snap debug connectivity

# Bir snap'in kurulum durumunu gör
sudo snap changes
sudo snap tasks <change-id>

# snapd'nin sağlık durumu
sudo snap debug sandbox-features

Bir keresinde bir snap paketi “error: cannot refresh” hatasıyla takılıp kalmıştı. Çözüm beklenmedik kadar basitti:

# Takılı kalan işlemleri iptal et
sudo snap abort <change-id>

# snapd'yi yeniden başlat
sudo systemctl restart snapd

# Tekrar dene
sudo snap refresh <paket-adi>

Snap ve Güvenlik Duvarı Notları

Snap uygulamaları kendi network namespace’lerinde çalışabilir ve bu bazen beklenmedik davranışlara yol açar. Özellikle sunucu uygulamalarında dikkat edilmesi gereken birkaç nokta:

  • Snap içindeki servisler 0.0.0.0 yerine 127.0.0.1‘e bağlanabilir, bu durumda dış erişim çalışmaz
  • network-bind interface’i aktif olması gerekebilir
  • UFW ile çakışma yaşanabilir, snap connections ile interface durumunu kontrol edin
# Ağ bağlama iznini ver
sudo snap connect <paket-adi>:network-bind

# Snap uygulamasının açık portlarını gör
sudo ss -tlnp | grep snap

Sonuç

Snap, her derde deva değil; bazı kısıtlamaları ve ek yükleri var. Disk kullanımı, başlangıç süresi ve otomatik güncelleme politikası özellikle sunucu ortamlarında dikkatli yönetim gerektiriyor. Ancak bağımlılık izolasyonu, kolay rollback ve kanal tabanlı sürüm yönetimi gibi özellikleri doğru kullanıldığında ciddi değer katıyor.

Prodüksiyon sunucularında benim tercihim şu şekilde:

  • Sistem genelinde kritik araçlar için apt kullanmaya devam
  • Geliştirici araçları ve versiyonu sık değişen paketler için Snap
  • Otomatik güncellemeyi bakım penceresine almak
  • Haftalık eski revizyon temizliği script’i çalıştırmak
  • snap connections ve izin yönetimine dikkat etmek

Snap’i “apt’ın rakibi” olarak değil, araç kutusuna eklenen farklı bir seçenek olarak görmek en sağlıklı yaklaşım. Hangi senaryoda hangisini kullanacağınızı bilmek sizi iyi bir sysadmin yapan şeylerden biri. Umarım bu yazı o kararı verirken işinize yarar.

Yorum yapın