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.
