Ubuntu /boot dizini nasıl temizlenir ve yer açılır
Ubuntu sisteminizde /boot dizini dolduğunda apt paket yöneticisi hata verir. Hangi çekirdek paketlerini güvenle sileceğinizi ve çalışan çekirdeği nasıl koruyacağınızı öğrenin.
Neden /boot dizini eski çekirdeklerle dolduğunda apt çalışmayı durdurur
Ubuntu üzerinde her çekirdek güncellemesi, /boot dizinine yeni bir dosya seti yazar ve öncekileri olduğu gibi bırakır. Bu nedenle küçük boyutlu /boot bölümü dolar ve apt kurulum işlemini tamamlayamaz. Onarım iki aşamalıdır. Sunucudaki hangi paketlerin çekirdek olduğunu ve hangisiyle sistemin başlatıldığını belirleyin, ardından diğerlerini apt autoremove --purge ile kaldırın.
Sıralama önemlidir. Çalışan çekirdek, kesinlikle kaldırmamanız gereken pakettir ve sunucu halihazırda apt komutunun hiç çalışmadığı bir durumda olabilir. Önce tanılama yapın.
Hatanın gerçekte nasıl göründüğü
Bir çekirdek sürümü, /boot dizinine iki büyük dosya kurar: sıkıştırılmış çekirdek (vmlinuz-<version>) ve initramfs (başlangıç RAM dosya sistemi, initrd.img-<version>; çekirdeğin gerçek kök dizini bağlamadan önce açtığı küçük arşiv). initramfs, kurulum sırasında makinenizde oluşturulur; bu nedenle kurulum işlemi sadece indirme bant genişliğine değil, aynı zamanda boş disk alanına da ihtiyaç duyar. Yeterli alan kalmadığında, oluşturma işlemi başarısız olur ve paket kurulumunu da beraberinde durdurur.
update-initramfs: Generating /boot/initrd.img-6.8.0-64-generic
gzip: stdout: No space left on device
E: mkinitramfs failure gzip 1
update-initramfs: failed for /boot/initrd.img-6.8.0-64-generic with 1.
dpkg: error processing package linux-image-6.8.0-64-generic (--configure):
installed linux-image-6.8.0-64-generic package post-installation script subprocess returned error exit status 1Sürüm dizgisi size özel olacaktır. Sıkıştırıcı adı /etc/initramfs-tools/initramfs.conf içindeki COMPRESS= değerinden gelir; bu nedenle yeni bir imaj zstd ismini kullanırken, eski bir imaj gzip ismini kullanabilir. Bu sorunu tanımlayan iki satır No space left on device ve altındaki dpkg: error processing package satırıdır.
Bundan sonra paket, yapılandırması yarım kalmış şekilde bekler. Daha sonra çalıştırılan her apt komutu, paketi tekrar yapılandırmaya çalışır, aynı şekilde başarısız olur ve E: Sub-process /usr/bin/dpkg returned an error code (1) ile sona erer. Disk alanının ötesinde önemli olan kısım şudur: unattended-upgrades kendi zamanlayıcısında çalışır, aynı hataya çarpar ve durur. Sunucu sağlıklı görünür ancak sessizce güvenlik yamalarını uygulamayı bırakır. Bu durum ayrıca, yapmaya çalıştığınız ilgisiz bir kurulumun da aynı satırla başarısız olacağı ve suçun o sırada eklemeye çalıştığınız şeye yükleneceği anlamına gelir; bu yüzden Ubuntu üzerinde başarısız olan bir Tailscale kurulumu konusunu öncelikle bir apt hatası olarak okumakta fayda vardır. Eğer apt update bu aşamaya gelmeden başarısız olursa, bu ayrı bir sorundur ve genellikle deb822 kaynak geçişinden sonra oluşan yinelenen girdi ile ilgilidir.
/boot dizininin ayrı bir bölüm olup olmadığını kontrol edin
Herhangi bir şeyi silmeden önce, gerçekte ne kadar alan açacağınızı belirleyin.
findmnt /boot
findmnt -T /boot
df -h /boot /İlk komut, yalnızca /boot kendi bağlama noktası (mount point) ise bir satır çıktı verir. İkinci komut ise her zaman çıktı verir ve /boot dizinini barındıran dosya sistemini belirtir. Eğer her iki komut da / ile aynı dosya sistemini işaret ediyorsa, /boot kök dosya sistemi üzerinde sadece bir dizindir ve kendi başına dolamaz; kök dosya sisteminiz doludur ve eski çekirdekler (kernels) bu doluluğun nedenlerinden yalnızca biridir. Bu durumda, /var/cache/apt/archives altındaki indirilen .deb dosyalarını temizleyen sudo apt clean komutu size yer kazandıracaktır. Gerçek bir /boot bölümüne sahip bir makinede ise apt clean komutu orada hiçbir alan açmaz, çünkü önbellek farklı bir dosya sisteminde yer alır.
Şimdi üzerinde çalışacağınız sayısal değerleri alın.
df -h /boot
ls -lh /boot/vmlinuz-$(uname -r) /boot/initrd.img-$(uname -r)Avail sütununu bu iki dosyanın boyutuyla karşılaştırın. initrd dosyası daha büyük olandır. Bir sonraki çekirdek güncellemesi, yaklaşık o boyutta bir çift dosya için daha alana ihtiyaç duyar; bu nedenle eğer Avail mevcut initrd dosyasından daha küçükse, bir sonraki güncelleme şimdiden başarısız olacaktır.
Çalışan çekirdeği bulma
uname -r
cat /var/run/reboot-required.pkgsuname -r komutu, bellekte halihazırda çalışan çekirdeğin sürüm dizisini yazdırır. Bu diziyi bir yere kopyalayın. Bu, dokunmamanız gereken tek sürümdür.
İkinci dosya yalnızca bir paket yeniden başlatma istediğinde mevcuttur. İçindeki bir linux-image satırı, diskte daha yeni bir çekirdeğin yüklü olduğunu ve makine o yüklendikten sonra yeniden başlatılmadığı için kullanılmadığını gösterir. Mümkünse temizlik yapmadan önce yeniden başlatın. apt, çalışan çekirdeği ve en yenisini korur; bu nedenle eski bir çekirdek üzerinde çalışırken temizlik yapmak, ihtiyacınız olandan bir sürüm daha fazlasını sabit tutmanıza neden olur.
Çekirdek paketlerini listeleyin ve durumlarını okuyun
dpkg --list | grep -E 'linux-(image|modules|headers|tools)' | awk '{print $1, $2}'İlk alan, dpkg'nin durum kodudur. ii, paketin yüklü ve yapılandırılmış olduğu anlamına gelir. iF, paketin yüklü ancak kısmen yapılandırılmış olduğunu gösterir; yukarıdaki başarısız yükseltme işleminin geride bıraktığı durum tam olarak budur. rc, paketin kaldırıldığını ancak yapılandırma dosyalarının diskte durduğunu belirtir; bu dosyalar /boot üzerinde yer kaplamaz ve güvenle temizlenebilir (purge).
İkinci alan, paketin türünü belirtir. linux-image-6.8.0-64-generic gibi içinde sürüm numarası barındıran bir isim, belirli bir çekirdek sürümünü ifade eder. linux-image-generic, linux-headers-generic veya linux-generic gibi sürüm numarası içermeyen isimler ise meta paketlerdir. Bunlar çekirdek içermez. Tek görevleri, en güncel sürümdeki çekirdeğe bağımlı kalmaktır; böylece apt upgrade yeni çekirdekleri sisteme çeker. Bir meta paketi kaldırmak, makinenin çekirdek güncellemelerini almasını durdurur ve sonrasında hiçbir uyarı almazsınız.
Aileler şu şekilde ayrılır: linux-image-*, sıkıştırılmış çekirdeği /boot dizininde tutar. linux-modules-* ve linux-modules-extra-*, sürücüleri /lib/modules altında barındırır. linux-headers-*, derleme başlıklarını (headers) /usr/src altında tutar; bu da başlıkları temizlemenin kök dosya sisteminde yer açacağı, /boot alanında ise yer açmayacağı anlamına gelir. Sorununuz dolu bir /boot bölümü ise, odaklanmanız gereken paketler imaj paketleridir.
ls -1 /boot/vmlinuz-*
ls -1 /lib/modules/Bu iki liste birbiriyle ve dpkg --list çıktısıyla uyumlu olmalıdır. /lib/modules dizininde yüklü bir paketle eşleşmeyen bir dizin bulunması, dosyaların elle silindiğinin bir göstergesidir.
apt'nin hangi çekirdekleri tutacağına nasıl karar verdiği
apt autoremove, korumalı olarak değerlendirdiği bir çekirdeği kaldırmaz; korumalı küme, o an çalıştırdığınız çekirdeği de içerir. Tutma politikası Ubuntu sürümleri arasında değişiklik gösterdiğinden, herhangi bir yerde yazılı olan bir sayıya güvenmek yerine kendi makinenizden okuyun.
apt-config dump | grep -i -e neverautoremove -e versionedkernel
ls -l /etc/apt/apt.conf.d/01autoremove /etc/apt/apt.conf.d/01autoremove-kernelsAPT::NeverAutoRemove, apt autoremove'ün dokunmayı reddettiği paket adı kalıplarının listesidir. APT::VersionedKernelPackages, apt'in öncelikli olarak sürümlü çekirdek paketleri olarak ele aldığı isim öneklerinin listesidir. /etc/apt/apt.conf.d/01autoremove-kernels dosyasını oluşturan sürümlerde, bu dosya her çekirdek paketi yüklendiğinde /etc/kernel/postinst.d/apt-auto-removal tarafından yeniden yazılır; bu nedenle dosyayı elle düzenlemek bir sonuç vermez: bir sonraki çekirdek kurulumu yaptığınız değişikliğin üzerine yazar. Dosyanın bulunmadığı sürümlerde ise apt aynı korumayı dahili olarak uygular. Her iki durumda da apt-config dump, makinenizde geçerli olan kuralları gösterir ve bu çıktı, sürümünüz için doğru cevaptır.
Güvenle çalıştırılabilecek temizlik işlemi
sudo apt update
sudo apt autoremove --purge --dry-run--dry-run disk üzerinde hiçbir şeyi değiştirmez ve gerçek bir çalıştırma durumunda nelerin silineceğini tam olarak listeler. Listeyi inceleyin. Durmanızı gerektirecek iki durum vardır. Kaldırma listesinde linux-generic veya linux-image-generic gibi bir meta paketinin bulunması, bir şeyin onu otomatik olarak işaretlediği anlamına gelir; bu paketi kaldırmak çekirdek güncellemelerinizin durmasına neden olur. Kaldırma listesinde uname -r dizisinin yer alması, çalışan çekirdeğin korunmadığı anlamına gelir; bu durum normalde gerçekleşmemelidir ve devam etmeden önce incelenmelidir.
Eğer liste doğru görünüyorsa, işlemi gerçek anlamda çalıştırın.
sudo apt autoremove --purge
df -h /boot--purge komutu, paketin yanı sıra geride kalan yapılandırma dosyalarını da siler. Bu işlem az miktarda ek alan açar ve dpkg --list dosyasının rc satırlarıyla dolmasını engeller; bu da bir sonraki denetimin daha okunabilir olmasını sağlar.
Ardından önyükleme menüsünün yeniden oluşturulduğunu doğrulayın. Bir çekirdek paketini kaldırmak sizin yerinize update-grub komutunu çalıştırır, bu nedenle menü yalnızca mevcut olan dosyalara referans vermelidir.
sudo grep -o 'vmlinuz-[^ ]*' /boot/grub/grub.cfg | sort -u
ls -1 /boot/vmlinuz-*İlk çıktıdaki her sürüm, ikinci çıktıda da görünmelidir. Var olmayan bir dosyayı işaretleyen bir menü girdisi, çalışan bir sunucunun GRUB isteminde takılı kalmasına neden olur. Bu, çekirdek güncellemesinden sonra açılmayan bir VPS durumuna giden yollardan biridir ve bu sorunu kurtarma konsolundan düzeltmek, burada önlem almaktan çok daha zordur.
apt autoremove komutu neden bazen hiçbir şeyi kaldırmaz
apt autoremove yalnızca otomatik olarak işaretlenmiş paketleri, yani başka bir yazılımın bağımlılığı olarak yüklenmiş paketleri kaldırır. apt install linux-image-6.8.0-40-generic ile manuel olarak yüklediğiniz bir çekirdek, manuel olarak işaretlenir ve ne kadar eski olursa olsun autoremove bu çekirdeğe dokunmaz.
apt-mark showmanual | grep -E '^linux-'Bu çıktıda görülen sürümlü çekirdeklerin hiçbiri autoremove tarafından görülmez. Kendi listenizdeki sürüm dizgelerini kullanarak bu çekirdekleri manuel olarak kaldırın:
sudo apt-mark auto linux-image-6.8.0-40-generic linux-modules-6.8.0-40-generic
sudo apt autoremove --purge --dry-runMeta paketleri manuel olarak işaretli bırakın. Bu paketler sizin talep ettiğiniz yazılımlar olduğu için manuel olarak işaretlenmiş olmaları gerekir.
Belirli bir çekirdeği manuel olarak kaldırma
Bazen belirli bir sürümün, politika izin verdiğinde değil, hemen kaldırılmasını istersiniz. İmaj paketini belirtin ve gerisini apt aracının halletmesine izin verin.
sudo apt purge linux-image-6.8.0-40-genericapt, herhangi bir işlem yapmadan önce bir kaldırma listesi yazdırır; çünkü linux-modules-extra-* imaj paketine bağımlıdır ve aynı işlem sırasında kaldırılması gerekir. Yazdırılan bu liste gerçek güvenlik kontrolünüzdür; kaldırmak istediğiniz sürümle birlikte bir meta paketin de silinip silinmediğini buradan anlarsınız. Beklenmedik bir durumla karşılaşırsanız n yanıtını verin. Ardından, artık bir işlevi kalmayan modül ve başlık paketlerini temizlemek için sudo apt autoremove --purge komutunu çalıştırın.
Çalışan çekirdeği neden asla kaldırmamalısınız
Dosyaları silinse bile bellekteki çekirdek çalışmaya devam eder, bu nedenle ilk etapta hiçbir şey bozulmamış gibi görünür. Bozulan şey, çekirdeğin henüz yüklemediği her şeydir. linux-modules-$(uname -r) ile temizlik yapmak /lib/modules/$(uname -r)/ dosyasını siler, bu yüzden bir sonraki modül yükleme işlemi başarısız olur:
modprobe: FATAL: Module nf_tables not found in directory /lib/modules/6.8.0-64-genericBu noktadan itibaren bir güvenlik duvarı yeniden yükleme işlemi başarısız olur; aynı durum, çekirdeğin açılıştan bu yana temas etmediği bir dosya sistemi türünü bağlamaya çalışırken de geçerlidir. Bu sırada /boot/vmlinuz-$(uname -r) silinmiş olduğu için, önyükleme menüsü artık o an çalışan çekirdeği sunmaz ve bir sonraki yeniden başlatma işlemi farklı bir sonuçla biter. Makine ağ trafiğini karşılamaya devam eder ancak artık önyükleme yapılamaz durumdadır. Her seferinde uname -r dosyasını kaldırma listesiyle karşılaştırarak kontrol edin.
/boot dizini apt komutunun çalışamayacağı kadar dolu olduğunda
Kullanıcıları bu sayfayı aramaya yönelten durum budur. apt autoremove, yarım kalmış kernel paketinin yapılandırmasını tamamlamak için dpkg komutuna ihtiyaç duyar; bu adım, /boot içerisinde yer gerektiren bir initramfs yeniden oluşturma işlemini tetikler ancak diskte yer kalmamıştır. Bu döngüyü manuel olarak bir kez kırın.
uname -r
ls -1 /boot/initrd.img-*Sürümü uname -r çıktısında yer almayan bir initrd seçin ve bu tek dosyayı silin.
sudo rm /boot/initrd.img-6.8.0-40-generic
sudo apt --fix-broken install
sudo apt autoremove --purge
sudo update-grubHer satırın bir gerekçesi vardır. rm, dpkg sisteminin bir dosyanın var olduğuna inanmasını sağlayan kasıtlı bir istisnadır. apt --fix-broken install, initramfs için yer açıldığından, başarısız olan yapılandırmayı tamamlar. autoremove --purge, sildiğiniz dosyanın ait olduğu paketi ve diğer eski sürümleri kaldırarak dpkg durumunu disk ile tekrar uyumlu hale getirir. update-grub, menüyü mevcut dosyalara göre yeniden oluşturur. rm ve update-grub komutları arasında sistemi yeniden başlatmayın; çünkü bu aralıkta menü, az önce sildiğiniz dosyayı işaret ediyor olabilir. Eğer dpkg kesintiye uğradığına dair bir hata verirse, sudo dpkg --configure -a komutu apt --fix-broken install ile aynı onarım işlemini gerçekleştirir.
dnf tabanlı sistemlerde aynı işlem
VPS'niz Fedora veya Rocky Linux gibi RHEL tabanlı bir dağıtım kullanıyorsa mekanizma tersine işler. Debian ve Ubuntu çekirdekleri apt autoremove kuralları ile korur ve temizlik işlemini size veya unattended-upgrades aracına bırakır; oysa dnf, installonly_limit adında bir sayaç uygular ve yeni bir kurulum bu sınırı aştığı anda en eski çekirdeği otomatik olarak kaldırır. Yürürlükteki değeri grep installonly_limit /etc/dnf/dnf.conf ve man 5 dnf.conf ile okuyabilir, mevcut birikmiş dosyaları ise sudo dnf remove --oldinstallonly ile temizleyebilirsiniz. Çalışan çekirdek orada da korunur. İki paket yöneticisi arasındaki daha geniş eşleştirme için dnf ve apt komut karşılıkları bölümüne bakınız.
Bunun tekrar yaşanmasını önleme
Hatırlamanıza dayalı temizlik işlemleri er ya da geç başarısız olacaktır; bu nedenle bu işlemi çekirdekleri kuran yapılandırmaya ekleyin. /etc/apt/apt.conf.d/50unattended-upgrades dosyasını açın ve halihazırda yorum satırı olarak dosya içerisinde bulunan şu anahtarları arayın:
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";Bunları dosyanın sonuna ikinci bir kopya olarak eklemek yerine yorum satırı olmaktan çıkarın. apt yapılandırmasında bir anahtara yapılan son atama geçerli olur; bu nedenle mükerrer kayıtlar dosyanın kendi içinde çelişmesine ve hangi değerin gerçek olduğunun belirsizleşmesine neden olur. Ayrıştırıcının hangi değerle sonuçlandığını kontrol edin ve hiçbir şeyi değiştirmeyen bir çalıştırmayı izleyin:
apt-config dump | grep -i 'Unattended-Upgrade::Remove'
sudo unattended-upgrade --dry-run --debug
sudo tail -n 40 /var/log/unattended-upgrades/unattended-upgrades.logGünlük kaydı kanıttır. Her çalıştırmayı kaydeder; bu sayede yer yetersizliği nedeniyle başarısız olan bir yükseltme, makinenin yamalar konusunda geride kaldığı fark edilmeden çok önce burada görünür. Bu yapılandırmanın geri kalanı Ubuntu üzerinde otomatik güvenlik güncellemeleri bölümünde ele alınmıştır.
Bir sonraki çekirdek gelmeden önce kontrol edilmesi gereken bir sayı vardır ve bu, kılavuzun başındaki iki komutla aynıdır:
df -h /boot
ls -lh /boot/initrd.img-$(uname -r)Eğer Avail, ilgili dosyadan yeterince büyük değilse, bir sonraki çekirdek kurulumu yukarıda açıklandığı gibi başarısız olacaktır; bu nedenle sorunu yükseltme sırasında değil, şimdi çözün. Bu kontrol, diğer VPS disk sağlığı kontrolleriniz ile birlikte bir dakikanızı ayırmaya değer. Bu durum özellikle sürüm yükseltmeden hemen önce önemlidir, çünkü Ubuntu 24.04'ten 26.04'e geçiş işlemi sürecin başında yeni bir çekirdek kurar ve /boot alanında yer kalmadığında do-release-upgrade devam etmeyi reddeder. LTS sunucunuza henüz bu yükseltme teklif edilmediyse, bunun nedeni bir hata değil zamanlamadır; çünkü Ubuntu, LTS'den LTS'ye yükseltmeleri 26.04.1 ara sürümü yayınlanana kadar bekletir. Bu size /boot ayarlarını düzene koymanız için bilinen bir zaman aralığı sağlar.
FAQ
Ubuntu neden eski çekirdekleri silmek yerine tutar?
Çünkü önyükleme yapamayan bir çekirdek, seçebileceğiniz başka bir seçenek bırakmaz. Önceki sürümü tutmak, hatalı bir güncellemenin kurtarma konsolu yerine GRUB menüsünden düzeltilebilmesi anlamına gelir. apt bu nedenle, çalışmakta olduğunuz çekirdek dahil olmak üzere bir dizi çekirdek paketini otomatik silinmeye karşı korur. Sürümden sürüme politika değiştiği için, dağıtımınızın tam olarak hangi desenleri koruduğunu görmek üzere apt-config dump | grep -i neverautoremove komutunu çalıştırın.
apt autoremove --purge komutunu üretim sunucusunda çalıştırmak güvenli midir?
Evet, ancak önce deneme çalıştırmasını (dry run) okumanız şartıyla. Hiçbir şeyi değiştirmeyen sudo apt autoremove --purge --dry-run komutunu çalıştırın ve listelenen çıktıları kontrol edin. Eğer liste linux-generic veya linux-image-generic gibi bir meta paket içeriyorsa durun; çünkü bunlardan birini kaldırmak gelecekteki çekirdek güncellemelerini durdurur. Ayrıca uname -r komutunun yazdırdığı sürüm dizisini içeriyorsa da durun. Eğer ikisi de görünmüyorsa, silinecek olanlar eski çekirdekler ve yetim kalmış bağımlılıklardır.
apt autoremove hiçbir şeyi silmedi ve /boot hala dolu. Şimdi ne yapmalı?
Eski çekirdekler büyük olasılıkla manuel olarak işaretlenmiştir ve autoremove yalnızca otomatik olarak işaretlenen paketlere müdahale eder. apt-mark showmanual | grep -E '^linux-' komutunu çalıştırın. Listelenen sürümlü çekirdeklerin her biri bir noktada elle kurulmuştur. Bunları sudo apt-mark auto linux-image-<version> ile otomatik olarak işaretleyin ve deneme çalıştırmasını tekrar yapın ya da ilgili sürümü doğrudan sudo apt purge linux-image-<version> ile temizleyin.
/boot içindeki dosyaları elle silebilir miyim?
Yalnızca /boot o kadar dolu olduğunda ve apt bozuk çekirdek paketini yapılandıramadığında, bilinçli ve tek seferlik bir işlem olarak yapılabilir. Sürümü uname -r çıktısı olmayan tek bir initrd.img-<version> dosyasını silin, ardından hemen sudo apt --fix-broken install, sudo apt autoremove --purge ve sudo update-grub komutlarını çalıştırın. Bu takip adımları olmadan dosya silmek, dpkg üzerinde dosyaları artık mevcut olmayan paketlerin kayıtlı kalmasına ve GRUB menü girdilerinin eksik dosyaları işaret etmesine neden olur; bu durumda makine hatayı yaptığınız anda değil, bir sonraki yeniden başlatmada başarısız olur.