truncate ve fallocate Komutları ile Dosya Boyutu Yönetimi

Disk yönetimi konusunda yıllar içinde öğrendiğim en değerli derslerden biri şu: Dosya boyutunu yönetmek, sadece “dolu diski boşaltmak” demek değil. Kimi zaman tam tersi, belirli bir boyutta dosya oluşturmak, log dosyalarını sıfırlamak ya da disk performansını önceden garantilemek gibi ihtiyaçlar da doğuyor. İşte bu noktalarda truncate ve fallocate komutları devreye giriyor ve çoğu sysadmin’in göz ardı ettiği bu iki araç, doğru ellerde inanılmaz işler başarıyor.

truncate Komutu Nedir ve Ne İşe Yarar?

truncate, bir dosyanın boyutunu belirttiğiniz değere küçülten ya da büyüten bir GNU coreutils aracıdır. “Küçültmek” kısmı mantıklı gelebilir ama “büyütmek” derken ne kastediyoruz? İşte burada devreye sparse file (seyrek dosya) kavramı giriyor. Truncate ile bir dosyayı büyüttüğünüzde, disk üzerinde gerçek bloklar tahsis edilmez; sadece dosya sistemi meta verisine “bu dosya 10GB büyüklüğünde” diye yazılır. Fiziksel alan kullanımı yoktur.

Bu durum hem avantaj hem de dikkat gerektiren bir özellik. Test ortamlarında dev boyutlu dosyalar simüle etmek için mükemmel, ama gerçek veri yazacaksanız yanıltıcı olabilir.

Temel Kullanım Sözdizimi

truncate [SEÇENEKLER] DOSYA

En sık kullanılan parametreler şunlar:

  • -s, –size=BOYUT: Hedef dosya boyutunu belirtir. K, M, G, T gibi son ekler kullanılabilir
  • -c, –no-create: Eğer dosya yoksa oluşturma, sadece var olanı işle
  • -o, –io-blocks: Boyutu bayt yerine I/O blok sayısı olarak yorumla
  • -r, –reference=DOSYA: Boyutu başka bir dosyayla eşleştir

Pratik Kullanım Örnekleri

Bir log dosyasını sıfırlamak (içeriği silmeden inode’u koruyarak):

truncate -s 0 /var/log/uygulama/access.log

Bu komut, açık dosya tanıtıcılarını (file descriptor) bozmadan log dosyasını sıfırlar. > /var/log/uygulama/access.log ile de yapılabilir ama truncate daha açık ve okunabilir bir niyet belirtir.

Belirli boyutta test dosyası oluşturmak:

truncate -s 500M test_dosyasi.img
ls -lh test_dosyasi.img
# -rw-r--r-- 1 root root 500M ...
du -sh test_dosyasi.img
# 0    test_dosyasi.img

Gördünüz mü? ls 500MB gösteriyor ama du 0 gösteriyor. Çünkü bu bir sparse file, gerçek disk alanı kullanmıyor.

Mevcut dosyayı küçültmek:

# Önce 100MB'lık gerçek bir dosya oluşturalım
dd if=/dev/urandom of=buyuk_dosya.bin bs=1M count=100

# Şimdi 50MB'a küçültelim
truncate -s 50M buyuk_dosya.bin

Dikkat: Dosyayı küçülttüğünüzde, kesilen kısımdaki veri geri dönüşü olmaksızın silinir.

Referans dosya kullanarak boyut eşleştirmek:

truncate -r /etc/passwd yeni_dosya.txt
# yeni_dosya.txt, /etc/passwd ile aynı boyuta getirilir

Boyut ifadelerinde artış/azalış kullanmak:

# Mevcut boyutun 2 katına çıkar
truncate -s $(($(stat -c%s dosya.txt) * 2)) dosya.txt

# Ya da daha doğrudan:
truncate -s +100M buyuyen_dosya.img   # 100MB ekle
truncate -s -50M  kuculen_dosya.img  # 50MB azalt

fallocate Komutu: Gerçek Disk Alanı Tahsisi

fallocate, truncate‘in tam tersine, dosya sistemi üzerinde gerçek disk bloklarını önceden tahsis eder. Yani fallocate ile 10GB’lık bir dosya oluşturduğunuzda, o 10GB gerçekten diskinizden gider. Bu bir dezavantaj gibi görünebilir ama production ortamlarında son derece kritik bir avantajdır.

Neden? Çünkü bir veritabanı ya da büyük bir log sistemi çalışırken disk doluysa ve yeni blok tahsis edilemiyorsa, uygulama çöker. Ama alanı önceden ayırdıysanız bu risk ortadan kalkar. Ayrıca önceden tahsis edilmiş dosyalar, parçalanma (fragmentation) olmadan ardışık bloklar halinde yazıldığından, I/O performansı da artar.

fallocate Parametreleri

  • -l, –length BOYUT: Tahsis edilecek alan miktarı (zorunlu)
  • -o, –offset BOYUT: Tahsisin başlayacağı offset
  • -n, –keep-size: Dosyanın görünür boyutunu değiştirme, sadece bloğu rezerve et
  • -p, –punch-hole: Belirtilen aralıktaki blokları serbest bırak (sparse hale getir)
  • -d, –dig-holes: Dosyadaki sıfır bölgelerini sparse hale dönüştür
  • -z, –zero-range: Belirtilen aralığı sıfırla ama blokları serbest bırakma
  • -x, –posix: POSIX uyumlu tahsis modu kullan

Desteklenen Dosya Sistemleri

fallocate her dosya sisteminde çalışmaz. ext4, XFS, btrfs ve tmpfs üzerinde sorunsuz çalışır. FAT32 ya da bazı ağ dosya sistemlerinde ise hata verir. Bunu aklınızın köşesinde tutun.

Gerçek Dünya Kullanım Senaryoları

Swap dosyası oluşturmak (en klasik kullanım):

# Hızlı swap dosyası oluşturma
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# Kalıcı hale getirmek için /etc/fstab'a ekle
echo '/swapfile none swap sw 0 0' >> /etc/fstab

dd ile swap oluşturmaya kıyasla bu yöntem çok daha hızlıdır. dd her bloğa gerçekten yazar; fallocate ise dosya sistemi düzeyinde blokları rezerve eder.

Veritabanı için önceden alan tahsis etmek:

# PostgreSQL veri dizini için alan ayrımı
fallocate -l 50G /var/lib/postgresql/14/main/prealloc.dat

# Veritabanı büyüdükçe bu dosyayı silebilir,
# böylece anlık disk dolması riskini azaltmış olursunuz

Ağ testi için büyük dosya oluşturmak:

# SCP/rsync hız testi için gerçek veriyle dolu dosya
fallocate -l 1G /tmp/network_test.dat
scp /tmp/network_test.dat kullanici@sunucu:/tmp/

Punch hole ile dosya içindeki boşlukları geri almak:

# Büyük bir log dosyasının ortasındaki eski verileri sparse'a dönüştür
# Önce dosya boyutunu kontrol et
ls -lh buyuk_log.bin
du -sh buyuk_log.bin

# İlk 100MB'ı serbest bırak (punch hole)
fallocate -p -o 0 -l 100M buyuk_log.bin

# Tekrar kontrol et, du değeri düşmeli
du -sh buyuk_log.bin

İki Komutun Karşılaştırmalı Analizi

Şimdi teoriden pratiğe geçelim. Hangi durumda hangisini kullanmalısınız?

truncate ne zaman kullanılır:

  • Log dosyalarını sıfırlarken (aktif process log’u tutmaya devam ediyor)
  • Test amaçlı sahte büyük dosyalar oluştururken
  • Sparse dosyalarla çalışırken
  • VM disk imajları için yer tutucu oluştururken
  • CI/CD pipeline’larında boyut testleri yaparken

fallocate ne zaman kullanılır:

  • Swap alanı oluştururken
  • Veritabanı ön tahsisi yaparken
  • Gerçek I/O performansı testleri için
  • Disk dolması senaryolarını önlemek amacıyla alan rezerve ederken
  • Büyük dosya transferlerinden önce hedef alanı garantilemek için

Performans Farkı Gözlemleme

# truncate hızı (neredeyse anlık)
time truncate -s 10G buyuk_sparse.img

# fallocate hızı (disk hızına bağlı ama yine de dd'den hızlı)
time fallocate -l 10G buyuk_gercek.img

# dd ile karşılaştırma (en yavaş)
time dd if=/dev/zero of=buyuk_dd.img bs=1M count=10240

Kendi test ortamımda SSD üzerinde 10GB için truncate 0.001 saniyede tamamlanırken, fallocate yaklaşık 2-3 saniyede, dd ise 30+ saniyede tamamlandı.

Gerçek Dünya Senaryoları

Senaryo 1: Production Log Rotasyonu

Bir e-ticaret platformunda Nginx access log’larının şiştiği bir durumla karşılaştım. Logrotate ayarları yanlış yapılandırılmıştı ve access.log 40GB’a ulaşmıştı. Uygulama hala dosyaya yazıyordu, bu yüzden dosyayı silemezdik.

# Önce hangi process'in dosyayı açık tuttuğunu bul
lsof /var/log/nginx/access.log

# Nginx'e log dosyasını yeniden açmasını söyle (USR1 sinyali)
# AMA önce truncate et
truncate -s 0 /var/log/nginx/access.log

# Şimdi nginx'e USR1 gönder (opsiyonel, truncate yeterliydi)
kill -USR1 $(cat /var/run/nginx.pid)

Bu işlemle 40GB alan geri kazanıldı, nginx tek bir istek kaybetmeden devam etti.

Senaryo 2: Kubernetes Persistent Volume Testi

Yeni bir Kubernetes cluster’ında storage class’ların düzgün çalışıp çalışmadığını test ederken:

# Pod içinde gerçek disk I/O testi
kubectl exec -it test-pod -- bash

# Fallocate varsa kullan
fallocate -l 500M /data/test_write.dat 2>/dev/null || 
  dd if=/dev/zero of=/data/test_write.dat bs=1M count=500

# Sparse dosya ile meta veri testi
truncate -s 100G /data/sparse_test.img
ls -lh /data/sparse_test.img
du -sh /data/sparse_test.img

Senaryo 3: Otomatik Disk Dolma Koruması

Bir monitoring betiği içinde kritik servislerin çalışması için minimum disk alanını garanti altına almak:

#!/bin/bash
# /usr/local/bin/disk_reserve.sh

REZERV_DOSYA="/opt/rezerv/disk_guard.dat"
REZERV_BOYUT="2G"
KRITIK_ESIK=90  # %90 dolulukta uyarı

mkdir -p /opt/rezerv

# Rezerv dosyası yoksa oluştur
if [ ! -f "$REZERV_DOSYA" ]; then
    fallocate -l $REZERV_BOYUT $REZERV_DOSYA
    echo "Disk rezervi oluşturuldu: $REZERV_BOYUT"
fi

# Disk doluluk kontrolü
DOLULUK=$(df / | awk 'NR==2 {print $5}' | tr -d '%')

if [ "$DOLULUK" -gt "$KRITIK_ESIK" ]; then
    echo "UYARI: Disk %$DOLULUK dolu. Rezerv serbest bırakılıyor..."
    rm -f "$REZERV_DOSYA"
    # Buraya alert gönderme kodu eklenebilir
fi

Bu teknik “disk space guardian” olarak bilinen bir pattern. Disk dolmaya başladığında sisteminize birkaç GB nefes alanı sağlar ve servisleriniz çökmeden müdahale şansınız olur.

Senaryo 4: LXC Container Disk Limitleme

LXC containerlar için sabit boyutlu disk imajları:

# Container için 20GB'lık disk imajı oluştur
fallocate -l 20G /var/lib/lxc/mycontainer/rootfs.img

# Ext4 ile formatla
mkfs.ext4 /var/lib/lxc/mycontainer/rootfs.img

# Mount et
mount -o loop /var/lib/lxc/mycontainer/rootfs.img /var/lib/lxc/mycontainer/rootfs

Dikkat Edilmesi Gereken Noktalar

Sparse dosyalarda yanıltıcı disk kullanımı: truncate ile oluşturulan sparse dosyaları başka bir konuma kopyaladığınızda, hedef disk de sparse olmayabilir ve gerçek alanı kullanır. Bu yüzden büyük sparse dosyaları kopyalarken dikkatli olun:

# Sparse'ı koruyarak kopyalama
cp --sparse=always kaynak.img hedef.img

# Ya da rsync ile
rsync --sparse kaynak.img hedef.img

fallocate ve dosya sistemi uyumu: XFS’te fallocate sorunsuz çalışır ama bazı NFS mount’larında veya FUSE tabanlı dosya sistemlerinde EOPNOTSUPP hatası alabilirsiniz. Script’lerinizde bunu handle edin:

fallocate -l 1G dosya.dat 2>/dev/null
if [ $? -ne 0 ]; then
    echo "fallocate desteklenmiyor, dd kullanılıyor..."
    dd if=/dev/zero of=dosya.dat bs=1M count=1024
fi

truncate ile küçültme geri alınamaz: Bunu yeterince vurgulayamam. Truncate ile dosyayı küçülttüğünüzde, kesilen kısmın verisi kalıcı olarak yok olur. Backup almadan production’da bu işlemi yapmayın.

stat Komutu ile Doğrulama

Her iki komutun etkisini doğrulamak için stat kullanın:

stat dosya.img
# Blocks: gerçek disk bloğu sayısı
# Size: görünür dosya boyutu

# Sparse olup olmadığını anlamak
GORUNEN=$(stat -c%s dosya.img)
GERCEK=$(du -b dosya.img | cut -f1)

if [ "$GERCEK" -lt "$GORUNEN" ]; then
    echo "Bu bir sparse dosya"
fi

Sonuç

truncate ve fallocate, Linux dosya yönetiminin hafife alınan iki güçlü silahı. Her ikisi de benzer görünse de farklı problemleri çözüyor: truncate meta veri düzeyinde boyut manipülasyonu yaparken, fallocate gerçek disk bloklarıyla ilgileniyor.

Günlük iş hayatımda en çok şu iki kullanım senaryosuyla karşılaşıyorum: biri aktif log dosyalarını kesmek için truncate, diğeri swap ve veritabanı ön tahsisi için fallocate. Bu iki komutu ezberlemeniz gerekmiyor ama ne zaman hangisine başvuracağınızı bilmek, bir disk kriziyle karşılaştığınızda sizi kurtarabilir.

Son olarak şunu söyleyeyim: disk space guardian pattern’ini (fallocate ile rezerv tutmak) henüz uygulamıyorsanız, bugün bunu production sistemlerinize ekleyin. Bir gün o 2GB rezervin hayat kurtardığına bizzat şahit olacaksınız.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir