Ubuntu Güncelleme ve Yükseltme Hatalarını Düzeltme: Eksiksiz Sorun Giderme Kılavuzu
Ubuntu’nun APT paket yönetim sistemi, Linux ekosistemindeki en güvenilir sistemlerden biridir; ancak hatalara karşı bağışık değildir. `apt-get upgrade`, `apt-get dist-upgrade` veya `do-release-upgrade` bir hata verdiğinde, temel neden neredeyse her zaman beş kategoriden birine girer: eski veya bozuk bir paket dizini, çözümlenmemiş bağımlılık zincirleri, çökmüş bir işlem tarafından bırakılan eski bir kilit dosyası, kök bölümünde yetersiz disk alanı veya önceki kesintiye uğramış bir işlem tarafından bozuk durumda bırakılmış kısmen yapılandırılmış bir paket.
Bu kılavuz, her büyük Ubuntu güncelleme ve yükseltme hatasını — genel eğitim içeriklerinin düzenli olarak atladığı uç durumlar dahil — tanımlamak ve kalıcı olarak çözmek için sistematik, mühendis düzeyinde bir tanılama iş akışı sunar.
Ubuntu Yükseltmesi Sırasında Gerçekte Ne Yanlış Gider?
Komutları körü körüne çalıştırmadan önce, dahili mekanizmaları anlamak faydalıdır. `sudo apt-get upgrade` komutunu çağırdığınızda, APT `/var/lib/apt/lists/` konumundaki yerel paket önbelleğine karşı bir bağımlılık çözümleme geçişi gerçekleştirir. Bu önbellek eski, hatalı biçimlendirilmiş veya `/etc/apt/sources.list` ve `/etc/apt/sources.list.d/` içinde yapılandırılmış depolarla senkronize değilse, çözümleyici ya tamamen başarısız olur ya da tutarsız bir paket kümesi önerir.
APT’nin altındaki dpkg katmanı, kendi durum veritabanını `/var/lib/dpkg/` konumunda tutar. Önceki bir kurulum veya yükseltme — bir güç kesintisi, SSH oturumunun düşmesi veya manuel bir `Ctrl+C` nedeniyle — kesintiye uğradıysa, dpkg bir veya daha fazla paketi `half-installed` veya `triggers-awaiting` durumunda bırakabilir. dpkg’nin durumu temiz olana kadar APT devam edemez.
Beş Temel Nedene Genel Bakış
| Temel Neden | Belirti | Birincil Düzeltme |
|---|
| — | — | — |
|---|
| Eski paket dizini | Paket URL’leri için “404 Not Found” | `apt-get update` |
|---|
| Bozuk/karşılanmamış bağımlılıklar | “Unmet dependencies” veya “held broken packages” | `apt-get install -f` |
|---|
| Eski kilit dosyası | “Could not get lock /var/lib/dpkg/lock” | Kilit dosyalarını manuel olarak kaldırın |
|---|
| Yetersiz disk alanı | “No space left on device” | `/` bölümünde alan açın |
|---|
| Kısmen yapılandırılmış paket | “dpkg was interrupted” | `dpkg –configure -a` |
|---|
Çözüm 1: Paket Dizinini Yenileyin ve Tam Yükseltme Çalıştırın
Bu, her tanılama iş akışında doğru ilk adımdır. Her zaman `upgrade`’den önce `update` çalıştırın — bunlar birbirinin yerine kullanılamaz.
“`bash
sudo apt-get update
sudo apt-get upgrade
“`
Her komutun gerçekte ne yaptığı:
- `apt-get update` — `sources.list` dosyanızda tanımlanan her depodan taze paket meta verilerini indirir. Hiçbir şey yüklemez. `/var/lib/apt/lists/` altındaki dizin dosyalarını yeniden yazar.
- `apt-get upgrade` — Halihazırda kurulu tüm paketlerin daha yeni sürümlerini çözümler ve yükler. Kurulu bir paketi hiçbir zaman kaldırmaz veya bir bağımlılığı karşılamak için yeni bir paket yüklemez — bu kasıtlı bir güvenlik kısıtlamasıdır.
`apt-get upgrade` yeni bağımlılıklar gerektiren veya çakışanların kaldırılmasını gerektiren paketler tarafından geri tutuluyorsa, şuna yükseltin:
“`bash
sudo apt-get dist-upgrade
“`
`dist-upgrade`, bağımlılık grafiğini karşılamak için yeni paketler yükleyebilen ve eski olanları kaldırabilen daha agresif bir çözümleyici kullanır. Aynı Ubuntu sürümü içindeki nokta sürümü yükseltmeleri için doğru araçtır (örn. 22.04.1’den 22.04.4’e).
Kritik nüans: Üretim sunucularında, onaylamadan önce her zaman `dist-upgrade` planını inceleyin. Sisteme dokunmadan tam olarak neyin yükleneceğini, yükseltileceğini veya kaldırılacağını görmek için önce `apt-get dist-upgrade –dry-run` çalıştırın.
Çözüm 2: Bozuk ve Karşılanmamış Bağımlılıkları Düzeltin
Bozuk bir bağımlılık durumu, yükseltmelerin işlem ortasında başarısız olmasının en yaygın nedenlerinden biridir. Standart düzeltme şudur:
“`bash
sudo apt-get install -f
“`
`-f` bayrağı (`–fix-broken`), APT’ye eksik bağımlılıkları indirip yükleyerek veya karşılanamayan paketleri kaldırarak bozuk bir bağımlılık grafiğini düzeltmeye çalışmasını söyler. Bu tamamlandıktan sonra yükseltmeyi yeniden çalıştırın.
`-f` yeterli olmadığında: Resmi depolar dışından manuel olarak `.deb` paketleri yüklediyseniz (üçüncü taraf yazılım yüklerken yaygın bir uygulama), bu paketler bağımlılıkları depo sürümleriyle çakışan belirli sürümlere sabitleyebilir. Bunları şununla tanımlayın:
“`bash
apt-cache policy <package_name>
dpkg -l | grep "^ii" | grep -v "^ii lib"
“`
“Installed” ile “Candidate” sürümlerini karşılaştırın. Sabitlenmiş bir paket, deponun sunduğundan daha düşük bir aday gösterir veya hiç aday göstermez. Çakışan paketi kaldırmanız, yükseltmeyi tamamlamanız ve ardından uyumlu bir sürümü yeniden yüklemeniz gerekebilir.
Çözüm 3: Kısmen Yüklü Paketleri dpkg ile Yeniden Yapılandırın
Önceki bir yükseltme kesintiye uğradıysa, dpkg’nin durum veritabanı `half-configured` veya `half-installed` olarak işaretlenmiş paketler içerecektir. APT, bunlar çözülene kadar devam etmeyi reddeder.
“`bash
sudo dpkg –configure -a
“`
`-a` bayrağı “tümü” anlamına gelir — dpkg, eksik durumda bırakılan her paket için kurulum sonrası yapılandırma betiklerini (`postinst`) çalıştırmaya çalışır. Bu genellikle şunun gibi hataları çözer:
“`
dpkg was interrupted, you must manually run 'sudo dpkg –configure -a' to correct the problem.
“`
Bunu hemen taze bir dizin güncellemesi ve yükseltme girişimiyle takip edin:
“`bash
sudo apt-get update && sudo apt-get upgrade
“`
Uç durum — bozuk dpkg veritabanı: Nadir senaryolarda, dpkg veritabanının kendisi bozulur (en yaygın olarak bir disk arızası veya dosya sistemi hatasından sonra). Belirtiler arasında `dpkg: error: parsing file '/var/lib/dpkg/status'` bulunur. Kurtarma prosedürü, dpkg’nin `/var/backups/dpkg.status*` konumunda otomatik olarak tuttuğu yedekten geri yüklemeyi içerir. En son yedeği bozuk durum dosyasının üzerine kopyalayın:
“`bash
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo dpkg –configure -a
“`
Çözüm 4: Eski Kilit Dosyalarını Kaldırın
APT ve dpkg, eşzamanlı paket işlemlerinin veritabanını bozmasını önlemek için kilit dosyaları kullanır. Bir kilidi tutan işlem çöktüğünde veya sonlandırıldığında, kilit dosyası diskte kalır. Sonraki herhangi bir APT çağrısı şu hatayla başarısız olur:
“`
E: Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarily unavailable)
“`
Kilit dosyalarını kaldırmadan önce, hiçbir meşru işlemin bunları tutmadığını her zaman doğrulayın:
“`bash
sudo lsof /var/lib/dpkg/lock-frontend
sudo lsof /var/lib/dpkg/lock
sudo lsof /var/cache/apt/archives/lock
“`
`lsof` çıktı döndürmezse, kilit eskidir ve güvenle kaldırılabilir:
“`bash
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archives/lock
sudo dpkg –configure -a
sudo apt-get update
“`
Uyarı: Başka bir `apt`, `apt-get`, `dpkg` veya `unattended-upgrades` işlemi etkin olarak çalışırken kilit dosyalarını asla kaldırmayın. Bunu canlı bir işlemde yapmak, paket veritabanını bozar. `lsof` etkin bir PID gösteriyorsa, işlemin tamamlanmasını bekleyin veya harekete geçmeden önce neden askıda kaldığını araştırın.
Çözüm 5: Kök Bölümünde Disk Alanı Açın
Ubuntu yükseltmeleri — özellikle büyük sürüm yükseltmeleri — kök bölümünde önemli miktarda boş alan gerektirir. Yaygın bir başarısızlık noktası, eski çekirdek görüntüleriyle dolup taşan `/boot`’dur; bu durum yeni çekirdek kurulumunu tamamen engeller.
Mevcut disk kullanımını kontrol edin:
“`bash
df -h
“`
`/boot` içinde özellikle neyin alan tükettiğini kontrol edin:
“`bash
du -sh /boot/*
ls /boot/vmlinuz-*
“`
Sistematik alan kurtarma prosedürü:
“`bash
Remove packages installed as dependencies that are no longer needed
sudo apt-get autoremove –purge
Remove cached .deb files from the local package archive
sudo apt-get clean
Remove old kernel images (keeps the two most recent)
sudo apt-get autoremove –purge
“`
`autoremove`’dan sonra `/boot` hâlâ doluysa, eski çekirdekleri tanımlayın ve manuel olarak kaldırın. Önce, kaldırmamak için şu anda çalışan çekirdeği bulun:
“`bash
uname -r
“`
Ardından kurulu çekirdekleri listeleyin ve eskileri açıkça kaldırın:
“`bash
dpkg -l 'linux-image-*' | grep '^ii'
sudo apt-get purge linux-image-X.X.X-XX-generic
“`
Sürüm dizesini daha eski bir çekirdek sürümüyle değiştirin — asla `uname -r` tarafından döndürülen sürümle değil.
Sabit kök bölümü boyutuna sahip bir VPS Hosting ortamı çalıştırıyorsanız, bu senaryo özellikle yaygındır. VPS’inizi başlangıçtan itibaren yeterli disk tahsisiyle sağlamak — veya ayrı bir `/boot` bölümü kullanmak — bu tür hataları tamamen önler.
Çözüm 6: Gereksiz Paketleri ve APT Önbelleğini Temizleyin
Birikmiş paket önbelleği ve sahipsiz paketler hem sistem performansını hem de yükseltme güvenilirliğini düşürür.
“`bash
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get clean
“`
`autoclean` ile `clean` arasındaki fark:
- `autoclean` yalnızca yapılandırılmış depolardan artık indirilemeyen paketler için önbelleğe alınmış `.deb` dosyalarını kaldırır (yani eskimiş olanlardır). Halihazırda mevcut paketler için önbelleğe alınmış dosyaları korur.
- `clean` hâlâ mevcut olup olmadığına bakılmaksızın tüm önbelleğe alınmış `.deb` dosyalarını koşulsuz olarak kaldırır. Maksimum disk alanını kurtarmanız gerektiğinde bunu kullanın.
Disk alanının yönetilen bir kaynak olduğu sunucularda — birden fazla hizmet çalıştıran Dedicated Servers gibi — periyodik önbellek temizliğini bir cron görevi veya systemd zamanlayıcısı aracılığıyla otomatikleştirmek sağlam bir operasyonel uygulamadır.
Çözüm 7: Belirli Paket Çakışmalarını Manuel Olarak Çözün
`apt-get upgrade` genel bir bağımlılık hatası yerine belirli paket çakışmalarını bildirdiğinde, hedefli müdahale gereklidir.
“`bash
sudo apt-get upgrade –fix-missing
“`
Bu bayrak, APT’ye alınamayan paketleri (örn. geçici olarak kullanılamayan bir ayna nedeniyle) atlamasını ve diğer her şeyi yükseltmesini söyler. Tek bir kullanılamayan paketin tüm yükseltmeyi engellediği durumlarda kullanışlıdır.
Belirli bir çakışan paketi kaldırıp yeniden yüklemek için:
“`bash
sudo apt-get remove –purge <package_name>
sudo apt-get install <package_name>
“`
`–purge`’ı `remove` ile birlikte kullanmak, hem paket ikili dosyalarını hem de yapılandırma dosyalarını siler; bu, bozuk bir yapılandırma dosyasının çakışmanın gerçek kaynağı olduğu durumlarda önemlidir.
Tam çakışma kaynağını belirleme: APT bir çakışma bildirdiğinde, hata mesajı genellikle ilgili paketleri adlandırır. Daha derin analiz için:
“`bash
apt-cache show <package_name>
apt-cache depends <package_name>
apt-cache rdepends <package_name>
“`
`rdepends` (ters bağımlılıklar), söz konusu pakete bağlı diğer kurulu paketleri gösterir — herhangi bir şeyi kaldırmadan önce kritik bilgidir.
Çözüm 8: do-release-upgrade ile Büyük Sürüm Yükseltmesi Gerçekleştirin
Ubuntu LTS sürümleri arasında yükseltme yapmak (örn. 20.04 Focal’dan 22.04 Jammy’ye veya 22.04’ten 24.04 Noble’a) özel bir araç gerektirir. Büyük sürüm yükseltmesi için yalnızca `apt-get dist-upgrade` kullanmak desteklenmez ve tutarsız bir sistem üretir.
Doğru prosedür:
“`bash
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get autoremove
sudo do-release-upgrade
“`
Yükseltme öncesi `dist-upgrade`’ın önemi: `do-release-upgrade`, sürüm geçişini başlatmadan önce mevcut sisteminizin tamamen güncel olduğunu kontrol eder. Geri tutulan paketleriniz veya çözümlenmemiş bağımlılıklarınız varsa, devam etmeyi reddeder. Önce `dist-upgrade` çalıştırmak temiz bir temel sağlar.
`do-release-upgrade` için sunucuya özgü dikkat edilmesi gerekenler:
- SSH aracılığıyla erişilen başsız sunucularda, her zaman `do-release-upgrade`’ı bir `tmux` veya `screen` oturumu içinde çalıştırın. SSH bağlantınız yükseltme ortasında düşerse, işlem arka planda devam eder; aksi takdirde sonlandırılır ve sistem bozuk bir ara durumda kalır.
- `-d` bayrağını yalnızca geliştirme sürümüne yükseltirken kullanın (henüz LTS kararlı değil). Üretim sistemleri için asla `-d` kullanmayın.
- Araç, varsayılanlarından değiştirilmiş yapılandırma dosyalarındaki değişiklikleri incelemenizi isteyecektir. Bu istemleri dikkatlice okuyun — bakımcının sürümünü körü körüne kabul etmek özel sunucu yapılandırmalarının üzerine yazabilir.
“`bash
Start a persistent session before upgrading
tmux new -s upgrade
sudo do-release-upgrade
“`
Birden fazla Ubuntu sunucusunu yönetiyorsanız — örneğin bir VPS with cPanel örneği filosu — yükseltme yolunu önce üretim dışı bir düğümde test edin. cPanel ve benzeri kontrol panellerinin genellikle resmi sürüm döngüsünün gerisinde kalan belirli Ubuntu sürümü destek pencereleri vardır.
Çözüm 9: Üçüncü Taraf Depo Sorunlarını Düzeltin
Güncelleme hatalarının sıkça gözden kaçan bir nedeni, bozuk veya uyumsuz bir üçüncü taraf PPA (Kişisel Paket Arşivi) veya deposudur. Bir Ubuntu sürümü için PPA eklendiğinde ve bir sonrakine yükseltme yaptığınızda, PPA yeni sürüm kod adı için paketlere sahip olmayabilir ve `apt-get update`’ın şunun gibi hatalar vermesine neden olabilir:
“`
E: The repository 'http://ppa.launchpad.net/…' does not have a Release file.
“`
Yapılandırılmış tüm depoları listeleyin:
“`bash
ls /etc/apt/sources.list.d/
cat /etc/apt/sources.list
“`
Sorunlu PPA’ları `/etc/apt/sources.list.d/` içindeki `.list` dosyalarını yorum satırına alarak veya kaldırarak geçici olarak devre dışı bırakın, sistem yükseltmesini tamamlayın, ardından yeni sürümle uyumlu sürümlerle yeniden etkinleştirin veya değiştirin.
“`bash
sudo add-apt-repository –remove ppa:<ppa_name>/<ppa_name>
“`
Çözüm 10: İşlem Düzeyindeki Müdahaleyi Temizlemek için Yeniden Başlatın
Belirli güncelleme hataları, disk düzeyindeki sorunlardan değil, bellek içi durumdan kaynaklanır — örneğin, APT’nin değiştirmesi gereken bir kitaplık üzerinde dosya tanıtıcısı tutan çalışan bir hizmet veya yeni yüklenen bir sürümle çakışan bir çekirdek modülü.
“`bash
sudo reboot
“`
Yeniden başlatmanın ardından, temiz bir durumdan tam güncelleme dizisini çalıştırın:
“`bash
sudo apt-get update && sudo apt-get upgrade
“`
Yeniden başlatmanın operasyonel risk taşıdığı uzak sunucularda, tam sistem yeniden başlatması olmadan hangi hizmetlerin yeniden başlatılması gerektiğini belirlemek için `needrestart` kullanın:
“`bash
sudo apt-get install needrestart
sudo needrestart
“`
`needrestart` çalışan işlemleri inceler ve güncel olmayan paylaşılan kitaplıkları kullananları tanımlar; bu sayede tüm sistemi değil, yalnızca etkilenen hizmetleri yeniden başlatabilirsiniz.
Ubuntu Güncelleme Hatalarını Önleme: Operasyonel En İyi Uygulamalar
Reaktif sorun giderme gereklidir, ancak proaktif sistem hijyeni bu hataların çoğunu oluşmadan önce ortadan kaldırır.
Ubuntu sunucuları için bakım kontrol listesi:
- `sudo apt-get update && sudo apt-get upgrade`’ı düzenli bir programda çalıştırın — üretim sistemleri için en az haftada bir.
- `/`, `/boot` ve `/var` üzerindeki disk alanını uyarı eşikleriyle izleyin (%85 kullanım makul bir tetikleyicidir).
- Her büyük yükseltme döngüsünden önce üçüncü taraf PPA’ları denetleyin.
- Uzak sistemlerde büyük yükseltmeleri her zaman `tmux` veya `screen` içinde çalıştırın.
- Herhangi bir `do-release-upgrade` işleminden önce bir anlık görüntü veya yedek alın. Bir Dedicated Server veya VPS’te bu, yükseltmeyi başlatmadan önce tam bir disk görüntüsü veya dosya sistemi anlık görüntüsü almak anlamına gelir.
- Üretim sistemlerinde beklenmedik bağımlılık değişikliklerini önlemek için yükseltme prosedürlerini üretime uygulamadan önce hazırlık ortamında test edin.
- Üretim sistemlerinde beklenmedik bağımlılık değişikliklerini önlemek için tam paket yükseltmeleri için değil, yalnızca güvenlik yamaları için `unattended-upgrades` kullanın.
Web altyapısını yöneten ekipler için — Shared Web Hosting ortamları veya çok kiracılı uygulama sunucuları dahil — yükseltme öncesi doğrulama adımlarını, geri alma prosedürlerini ve yükseltme sonrası doğrulama testlerini içeren belgelenmiş bir yükseltme çalışma kitabı oluşturmak temel operasyonel uygulamadır.
Karar Matrisi: Önce Hangi Düzeltmeyi Uygulamalı
| Hata Mesajı | İlk Eylem | İkinci Eylem |
|---|
| — | — | — |
|---|
| “Could not get lock” | `lsof`’ı kontrol edin, eski kilit dosyalarını kaldırın | `dpkg –configure -a` |
|---|
| “Unmet dependencies” | `apt-get install -f` | `dpkg –configure -a` |
|---|
| “No space left on device” | `apt-get autoremove –purge && apt-get clean` | Eski çekirdekleri manuel olarak kaldırın |
|---|
| “dpkg was interrupted” | `dpkg –configure -a` | `apt-get update && apt-get upgrade` |
|---|
| Paketler için “404 Not Found” | `apt-get update` (ayna kullanılabilirliğini kontrol edin) | Bozuk PPA’ları devre dışı bırakın |
|---|
| “held broken packages” | `apt-get dist-upgrade –dry-run` | Çakışan paketi kaldırın/yeniden yükleyin |
|---|
| Yükseltme sırasında SSH düşmesi | Yeniden bağlanın ve `tmux`/`screen` oturumuna eklenin | Oturum kaybedildiyse `dpkg –configure -a` |
|---|
SSS
Neden `apt-get upgrade` bazı paketleri “held back” olarak bırakır?
Paketler, yükseltilmeleri yeni paketlerin yüklenmesini veya mevcut olanların kaldırılmasını gerektirdiğinde geri tutulur — bunlar `apt-get upgrade`’ın tasarım gereği yapmasına izin verilmeyen eylemlerdir. Geri tutulan paketleri çözmek için `apt-get dist-upgrade` kullanın, ancak üretim sistemlerinde her zaman önce `–dry-run` ile önerilen değişiklikleri inceleyin.
`/var/lib/dpkg/`’dan kilit dosyalarını kaldırmak güvenli midir?
Yalnızca hiçbir APT veya dpkg işlemi etkin olarak çalışmıyorsa. Kaldırmadan önce `sudo lsof /var/lib/dpkg/lock-frontend` ile doğrulayın. Canlı bir işlem kilidi tutuyorsa ve dosyayı kaldırırsanız, paket veritabanını bozarsınız; bu durum dpkg durum yedeğinden manuel kurtarma gerektirir.
`apt-get upgrade` ile `apt-get dist-upgrade` arasındaki fark nedir?
`apt-get upgrade` bağımlılıkları çözmek için kurulu paketleri asla kaldırmaz veya yeni paketler yüklemez — yalnızca yapısal değişiklikler olmadan karşılanabilecek paketleri yükseltir. `apt-get dist-upgrade` yeni paketler yükleyebilen ve eskimiş olanları kaldırabilen daha akıllı bir çözümleyici kullanır. Nokta sürümü güncellemeleri ve büyük sürüm yükseltmeleri için `dist-upgrade` doğru araçtır.
Neden `do-release-upgrade` çalıştırıldıktan hemen sonra başarısız olur?
En yaygın neden, mevcut sistemin çözümlenmemiş bağımlılıklara veya geri tutulan paketlere sahip olmasıdır. `do-release-upgrade`’ı çağırmadan önce sistemi tamamen tutarlı bir duruma getirmek için `sudo apt-get dist-upgrade` ve `sudo apt-get autoremove` çalıştırın. Ayrıca tüm üçüncü taraf PPA’ların devre dışı bırakıldığını veya hedef sürümle uyumlu olduğunu doğrulayın.
Büyük bir Ubuntu sürüm yükseltmesi için ne kadar boş disk alanı gereklidir?
Pratik minimum olarak, kök bölümünde en az 2–3 GB ve `/boot` üzerinde en az 200–300 MB boş alana ihtiyacınız vardır. Gerçek gereksinim, kurulu paket sayısına göre değişir. `sudo do-release-upgrade`’ı sistem bu eşiklerde veya üzerindeyken çalıştırın; alan kısıtlıysa, yükseltmeyi başlatmadan hemen önce `sudo apt-get autoremove –purge && sudo apt-get clean` çalıştırın.
