Sunucunu güncellemek hiç bu kadar heyecan verici olmamıştı, değil mi? Yıllarca stabil çalışan bir Ubuntu 20.04 LTS sunucusu, bir gün sürüm desteği bitmekte olan bir sistem haline geliyor ve sen de “hadi yükseltelim” diyorsun. Ama bu karar, özellikle production ortamında, dikkatli bir planlama gerektiriyor. do-release-upgrade aracı Ubuntu’nun resmi sürüm yükseltme mekanizması ve doğru kullanıldığında hayatı gerçekten kolaylaştırıyor. Bu yazıda adım adım, gerçek dünya senaryolarıyla bu süreci ele alacağız.
do-release-upgrade Nedir ve Nasıl Çalışır?
do-release-upgrade, Ubuntu’nun ubuntu-release-upgrader paketinin bir parçası olarak gelen ve sistemini bir LTS sürümünden diğerine yükseltmeni sağlayan resmi araç. Paketin arkasında Python tabanlı bir çerçeve var ve yükseltme sürecini şu adımlarla yönetiyor:
- Mevcut sistem konfigürasyonunu analiz eder
- Hedef sürüm için paket listelerini çeker
- Çakışan paketleri tespit eder
- Bağımlılıkları çözer
- Paketleri sırasıyla günceller
- Kernel ve kritik sistem bileşenlerini yeniler
Aracın en güzel tarafı, süreci tamamen interaktif yönetebilmesi ve bir şeyler ters gittiğinde seni uyarması. Kör bir apt dist-upgrade ile karşılaştırıldığında çok daha güvenli.
Ön Hazırlık: En Kritik Aşama
Yükseltmeye başlamadan önce yapman gereken birkaç temel hazırlık var. Bu adımları atlayan sysadminlerin ağzından sonradan pişmanlık dolu hikayeler dinledim.
Sistem Durumunu Kontrol Et
Önce mevcut sisteminizin sağlıklı olduğundan emin ol. Yarım kalmış paket kurulumları, bozuk bağımlılıklar yükseltme sürecini patlatabilir.
# Mevcut Ubuntu sürümünü kontrol et
lsb_release -a
# Sistemi tamamen güncelle
sudo apt update && sudo apt upgrade -y
# Bozuk paketleri kontrol et
sudo dpkg --audit
# Yarım kalmış kurulumları düzelt
sudo apt --fix-broken install
# Gereksiz paketleri temizle
sudo apt autoremove -y
sudo apt autoclean
Bu komutları çalıştırdıktan sonra hiçbir hata mesajı görmüyorsan devam edebilirsin. Eğer dpkg --audit sonuç döndürüyorsa önce o sorunları çöz.
Disk Alanı Kontrolü
Yükseltme süreci ciddi disk alanı gerektiriyor. Minimum 5-6 GB boş alan olması gerekiyor ama 10 GB üzeri olmasını öneririm.
# Disk kullanımını kontrol et
df -h
# En çok yer kaplayan dizinleri bul
du -sh /var/log/* | sort -rh | head -20
# Log dosyalarını temizle (isteğe bağlı)
sudo journalctl --vacuum-size=500M
sudo find /var/log -name "*.gz" -delete
/boot bölümü özellikle kritik. Eski kernel dosyaları burayı doldurmuş olabilir.
# Boot bölümündeki eski kernelleri temizle
sudo apt autoremove --purge
Kritik Servisleri ve Konfigürasyonları Yedekle
Bu adım asla atlanmamalı. Production sunucuda çalışıyorsan, yükseltme öncesi bir snapshot almak en doğrusu. Snapshot alamıyorsan en azından kritik dosyaları yedekle.
# Önemli konfigürasyon dosyalarını yedekle
sudo tar -czf /root/backup-configs-$(date +%Y%m%d).tar.gz
/etc/nginx/
/etc/apache2/
/etc/mysql/
/etc/postgresql/
/etc/ssh/sshd_config
/etc/fstab
/etc/hosts
/etc/crontab
/var/spool/cron/
# Kurulu paket listesini kaydet
dpkg --get-selections > /root/installed-packages-$(date +%Y%m%d).txt
# Servis durumlarını kaydet
systemctl list-units --type=service --state=active > /root/active-services-$(date +%Y%m%d).txt
SSH Bağlantısı için Önlem Al
Remote sunucularda yükseltme yapıyorsan, SSH bağlantısı koptuğunda süreci kurtarmak için screen veya tmux kullanmak şart. Bu, deneyimli sysadminlerin bile zaman zaman unuttuğu kritik bir nokta.
# Screen kur ve bir oturum başlat
sudo apt install screen -y
screen -S upgrade
# Ya da tmux kullan
sudo apt install tmux -y
tmux new-session -s upgrade
Oturum kopsa bile screen -r upgrade veya tmux attach -t upgrade ile geri bağlanabilirsin.
Ek güvenlik için alternatif bir SSH portu üzerinden backup bağlantısı da açabilirsin:
# sshd konfigürasyonuna geçici olarak ikinci port ekle
sudo sed -i 's/#Port 22/Port 22nPort 2222/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# Firewall'da bu portu aç (UFW kullanıyorsan)
sudo ufw allow 2222/tcp
Release Upgrade Konfigürasyonu
Ubuntu hangi kanaldan yükseltme yapacağını /etc/update-manager/release-upgrades dosyasından belirliyor.
# Mevcut konfigürasyonu görüntüle
cat /etc/update-manager/release-upgrades
Çıktı şöyle görünmeli:
[DEFAULT]
Prompt=lts
Prompt değeri şunlar olabilir:
- lts: Sadece LTS sürümlerine yükselt (önerilen production için)
- normal: Her yeni Ubuntu sürümüne yükselt
- never: Otomatik yükseltme önerilmesin
Production sunucular için lts kalmasını öneririm. Her 6 ayda bir yeni non-LTS sürüme geçmek gereksiz risk.
do-release-upgrade Parametreleri
Aracın temel parametrelerini bilmek önemli:
- -d: Development sürümüne yükselt (test ortamları için)
- -f DistUpgradeViewNonInteractive: Tamamen non-interaktif mod
- -m server: Server modunda çalıştır (GUI bileşenlerini atla)
- -m desktop: Desktop modunda çalıştır
- –allow-third-party: Üçüncü taraf repoları da güncelle
- -q: Quiet mod, daha az çıktı üretir
Yükseltme Sürecini Başlat
Hazırlıkları tamamladıktan sonra yükseltmeyi başlatabilirsin. Screen oturumunun içinde olduğundan emin ol.
# Standard yükseltme (interaktif)
sudo do-release-upgrade
# Server ortamları için (GUI yok, server modunda)
sudo do-release-upgrade -m server
# Eğer henüz yeni sürüm "normal" kanalda değilse ve zorlamak istiyorsan
sudo do-release-upgrade -d
Araç başladığında sana birkaç soru soracak. Genel akış şöyle işleyecek:
1. Adım: Ön kontroller – Mevcut sistem analiz edilir, gereksinimler kontrol edilir.
2. Adım: Yeni sürüm paket listesi indirilir ve analiz edilir.
3. Adım: Kaldırılacak, yüklenecek ve güncellenecek paketler listelenir. Burada “x packages are going to be removed” gibi bir çıktı görürsün. Dikkatli oku.
4. Adım: Paket indirme başlar. Bağlantı hızına göre bu aşama uzun sürebilir.
5. Adım: Paket kurulumu yapılır. Bu aşamada konfigurasyon dosyalarıyla ilgili sorular sorulur.
6. Adım: Sistem yeniden başlatılır.
Konfigürasyon Dosyası Çakışmaları: Ne Yapmalısın?
Yükseltme sırasında en sık karşılaşılan durum konfigürasyon dosyası çakışmaları. Araç sana şöyle bir soru sorar:
Configuration file '/etc/mysql/mysql.conf.d/mysqld.cnf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
Default is N : keep your currently-installed version
Burada D tuşuna basarak önce farkları incele. Özelleştirdiğin ayarların üzerine yazılacaksa N de ve kendi sürümünü koru. Konfigürasyon dosyasında değişiklik yapmamışsan Y diyerek yeni sürümü al.
Genel kural: Üretimde özelleştirilmiş konfigürasyon dosyaları için genellikle N (koru) seçeneği tercih edilir, sonra yeni sürümle manuel karşılaştırma yapılır.
Gerçek Dünya Senaryosu: 20.04’ten 22.04’e Nginx Sunucu Yükseltme
Bir müşterinin web sunucusunda yaşadığım gerçek bir senaryoyu aktarayım. Ubuntu 20.04 üzerinde Nginx, PHP-FPM ve MySQL çalışıyordu. İşte o gün attığım adımlar:
# Önce sistem güncellemesi
sudo apt update && sudo apt dist-upgrade -y
# Nginx konfigürasyonunu test et
sudo nginx -t
# MySQL durumunu kontrol et
sudo systemctl status mysql
# Mevcut PHP sürümünü not et
php --version
# Yükseltme öncesi yedek
sudo mysqldump --all-databases -u root -p > /root/all-databases-backup.sql
# Screen başlat
screen -S server-upgrade
# Yükseltmeyi başlat
sudo do-release-upgrade -m server
Yükseltme sonrasında ilk yaptığım şey kritik servislerin durumunu kontrol etmek oldu:
# Yükseltme sonrası servis kontrolü
sudo systemctl status nginx
sudo systemctl status mysql
sudo systemctl status php8.1-fpm # Sürüm değişmiş olabilir
# Yeni PHP sürümünü kontrol et
php --version
# Nginx konfigürasyonunu test et
sudo nginx -t && sudo systemctl reload nginx
# Aktif dinleme portlarını kontrol et
sudo ss -tlnp
22.04’e geçince PHP 7.4 yerine PHP 8.1 default geldi. PHP-FPM socket path değiştiği için Nginx konfigürasyonunu güncellememiz gerekti. Bu tür değişiklikler için release notes’u önceden okumak çok önemli.
Sık Karşılaşılan Sorunlar ve Çözümleri
Sorun 1: “No new release found”
# Bu hatayı alıyorsan
sudo do-release-upgrade
# Checking for a new Ubuntu release
# No new release found.
# Çözüm: update-manager-core'u yeniden kur
sudo apt install update-manager-core
sudo do-release-upgrade
# Ya da development kanalını dene (dikkatli kullan)
sudo do-release-upgrade -d
Sorun 2: Üçüncü Taraf Repolar Yüzünden Takılma
PPa veya üçüncü taraf repolar yükseltme sırasında sorun çıkarır. Araç bunları otomatik disable eder ama bazen manuel müdahale gerekir.
# Tüm aktif repoları listele
ls /etc/apt/sources.list.d/
# Sorunlu repoları geçici devre dışı bırak
sudo mv /etc/apt/sources.list.d/problematic-repo.list
/etc/apt/sources.list.d/problematic-repo.list.bak
# Yükseltmeden sonra yeniden aktive et ve güncelle
sudo mv /etc/apt/sources.list.d/problematic-repo.list.bak
/etc/apt/sources.list.d/problematic-repo.list
sudo apt update
Sorun 3: Disk Alanı Yetersizliği Sırasında
Yükseltme ortasında disk dolar ve sistem kilitlenirse:
# /boot doluysa eski kernelleri temizle
sudo dpkg --list | grep linux-image
sudo apt remove --purge linux-image-5.4.0-XXX-generic
# /var/cache/apt/archives temizle
sudo apt clean
# Log dosyalarını temizle
sudo journalctl --vacuum-size=200M
Sorun 4: Yükseltme Yarıda Kesildi
SSH koptu ve yükseltme yarıda kaldıysa, sisteme erişim sağladıktan sonra:
# Yarım kalan kurulumları tamamla
sudo dpkg --configure -a
# Bozuk bağımlılıkları düzelt
sudo apt --fix-broken install
# Yükseltmeyi yeniden başlatmayı dene
sudo do-release-upgrade
Yükseltme Sonrası Yapılması Gerekenler
Sistem yeniden başladıktan sonra kapsamlı bir kontrol listesi işliyorum:
# Yeni sürümü doğrula
lsb_release -a
uname -r
# Servis durumlarını kontrol et
systemctl --failed
# Önemli servisleri tek tek kontrol et
for service in nginx apache2 mysql postgresql ssh; do
if systemctl is-active --quiet $service; then
echo "$service: RUNNING"
else
echo "$service: STOPPED or NOT INSTALLED"
fi
done
# Açık portları kontrol et
sudo ss -tlnp
# Son boot loglarını kontrol et
sudo journalctl -b 0 --priority=err
# Depolama durumu
df -h
# Hafıza durumu
free -h
Üçüncü Taraf Repoları Güncelle
Yükseltme sırasında disable edilen repoları yeni sürüm için güncellemeyi unutma:
# Örneğin Docker reposunu güncelle
sudo rm /etc/apt/sources.list.d/docker.list
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture)
signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
Kernel ve Paket Temizliği
Yükseltme sonrası eski kernel ve gereksiz paketler sistemde kalır:
# Eski kernelleri ve gereksiz paketleri temizle
sudo apt autoremove --purge -y
# Paket cache temizle
sudo apt autoclean
# Orphan paketleri kontrol et (deborphan gerekli)
sudo apt install deborphan -y
sudo deborphan
Non-Interactive Yükseltme: CI/CD ve Otomasyonda Kullanım
Bazı durumlarda otomatik yükseltme yapmak gerekebilir, özellikle test ortamları veya image building süreçlerinde. Bu durumda non-interactive modu kullanabilirsin:
# Tamamen non-interaktif yükseltme
# DEBIAN_FRONTEND=noninteractive kritik!
export DEBIAN_FRONTEND=noninteractive
sudo -E do-release-upgrade -f DistUpgradeViewNonInteractive -m server
Ama şunu net söyleyeyim: Production ortamında non-interactive modu kullanmak risklidir. Konfigürasyon dosyası çakışmalarını otomatik çözecek ve beklenmedik değişiklikler yapabilir. Bu modu sadece iyi test edilmiş, otomatize pipeline’lar için kullan.
Yükseltme Planlaması: Zaman Çizelgesi
Deneyimlerime göre ideal bir yükseltme süreci şöyle planlanmalı:
Yükseltmeden 1 hafta önce:
- Test ortamında yükseltmeyi dene
- Uygulama uyumluluğunu kontrol et
- Release notes’u oku
- Yedekleri doğrula
Yükseltmeden 1 gün önce:
- Son system update yap
- Disk alanını kontrol et
- Maintenance window belirle
- Ekibi bilgilendir
Yükseltme günü:
- Snapshot al
- Screen/tmux başlat
- Yükseltmeyi başlat
- Yükseltme sonrası kontrolleri yap
Yükseltmeden 1 hafta sonra:
- Sistem loglarını gözlemle
- Performans metriklerini karşılaştır
- Eski kernel ve paketleri temizle
Rollback Stratejisi
Ubuntu sürüm yükseltmesini geri almak resmi olarak desteklenmiyor. Bu yüzden rollback stratejin şunlardan biri olmalı:
- Snapshot/Snapshot tabanlı geri alma: Hypervisor snapshot’ı (VMware, KVM, Proxmox) veya cloud snapshot (AWS AMI, Azure Image) en hızlı yol
- Yedekten geri yükleme: Tam sistem yedeğin varsa buradan dön
- Yeni sunucu kurulumu: En temiz yöntem, yeni bir sunucuya temiz kurulum yap ve servisleri taşı
Bu yüzden başta belirttiğim snapshot adımı hayati önem taşıyor. Snapshot imkanın yoksa en azından kritik verilerin yedeğini al ve yeni bir sunucu üzerinde rollback senaryosu pratiği yap.
Sonuç
do-release-upgrade doğru kullanıldığında son derece güvenilir bir araç. Ama “doğru kullanmak” demek sistematik bir ön hazırlık, dikkatli izleme ve kapsamlı yükseltme sonrası kontrol demek.
En önemli çıkarımları özetleyecek olursam: her zaman screen veya tmux içinde çalış, yükseltme öncesi mutlaka snapshot veya yedek al, konfigürasyon dosyası çakışmalarını körü körüne geçme, üçüncü taraf repoları sonradan güncelle.
Production ortamında bu süreçten kaçınmak yerine onu planlı yönetmek çok daha akıllıca. Desteksiz bir Ubuntu sürümü üzerinde çalışmak, düzenli yükseltme zahmetinden çok daha büyük güvenlik ve stabilite riskleri taşıyor. Bir sonraki LTS yükseltmenden önce bu rehberi tekrar gözden geçir ve kendi ortamına göre uyarla.