Sistem yönetiminde en çok göz ardı edilen ama en çok baş ağrısı yaratan konulardan biri geçici dosya yönetimidir. Disk doldu mu? Büyük ihtimalle /tmp veya /var/tmp suçludur. Uygulama garip davranıyor mu? Bozuk bir geçici dosya yüzünden olabilir. Bu iki dizini iyi anlamak, sysadmin olarak hayatınızı ciddi ölçüde kolaylaştırır.
/tmp ve /var/tmp Nedir, Farkları Nelerdir?
Linux sistemlerinde geçici dosyalar için iki ana konum bulunur ve bu ikisi birbirinin yerine kullanılamaz, her birinin kendine özgü bir amacı vardır.
/tmp dizini, sistem veya uygulama yeniden başlatıldığında temizlenmesi beklenen kısa ömürlü dosyalar içindir. Çoğu modern sistemde bu dizin tmpfs olarak mount edilir, yani RAM üzerinde çalışır. Bu durum onu hem çok hızlı hem de yeniden başlatmalar arasında kalıcısız yapar.
/var/tmp ise yeniden başlatmalar arasında hayatta kalması gereken geçici dosyalar içindir. Örneğin büyük bir yazılım güncellemesi sırasında indirilen paketler, çökme raporları veya uzun süren işlemlerin ara sonuçları buraya gider. Bu dizin disk üzerinde bulunur ve sistem yeniden başlasa bile veriler silinmez, ta ki belirli bir yaş sınırını geçene kadar.
Bunu şöyle düşünebilirsiniz: /tmp masanızın üzerindeki yapışkan not kağıdı, /var/tmp ise masanızın çekmecesindeki not defteri. İkisi de geçici ama biri çok daha uzun süre hayatta kalır.
tmpfs Olup Olmadığını Kontrol Etmek
mount | grep tmp
# veya daha detaylı:
findmnt /tmp
findmnt /var/tmp
Çıktıda /tmp için tmpfs type tmpfs görüyorsanız, bu dizin RAM tabanlı çalışıyordur. Birçok dağıtımda (özellikle Arch Linux, modern Ubuntu ve Fedora) bu varsayılandır. Debian tabanlı sistemlerde ise bazen disk üzerinde olabilir.
df -h /tmp /var/tmp
Bu komut her iki dizinin boyutunu ve kullanımını gösterir. Eğer /tmp için boyut çıktısı sisteminizin RAM miktarının yarısı civarındaysa, tmpfs olduğunu anlarsınız.
systemd-tmpfiles: Modern Geçici Dosya Yönetimi
Systemd kullanan modern Linux dağıtımlarında (ki günümüzde hemen hemen hepsi), geçici dosya temizliği systemd-tmpfiles servisi tarafından yönetilir. Bu araç /tmp ve /var/tmp dahil birçok dizindeki dosyaların ne zaman silineceğini, ne zaman oluşturulacağını ve ne zaman temizleneceğini kontrol eder.
Konfigürasyon dosyaları şu konumlarda bulunur:
- /usr/lib/tmpfiles.d/: Sistem varsayılanları (dokunmayın)
- /etc/tmpfiles.d/: Yönetici özelleştirmeleri (buraya yazın)
- /run/tmpfiles.d/: Çalışma zamanı konfigürasyonları
# Mevcut konfigürasyonları listele
ls /usr/lib/tmpfiles.d/
cat /usr/lib/tmpfiles.d/tmp.conf
Tipik bir tmp.conf içeriği şöyle görünür:
# /tmp içindeki 10 günden eski dosyaları sil
D /tmp 1777 root root 10d
# /var/tmp içindeki 30 günden eski dosyaları sil
D /var/tmp 1777 root root 30d
Buradaki D harfi “dizin oluştur ve temizle” anlamına gelir. Sayısal değer 1777 sticky bit ile herkesin yazabildiği klasik izin modunu gösterir. Son kısım ise dosya yaşını belirtir: 10d 10 gün, 30d 30 gün demektir.
systemd-tmpfiles Komutları
# Konfigürasyonu test et, gerçekte bir şey yapma
systemd-tmpfiles --clean --dry-run
# Temizliği manuel olarak çalıştır
systemd-tmpfiles --clean
# Dizinleri ve dosyaları oluştur (boottaki gibi)
systemd-tmpfiles --create
# Tüm işlemleri yap (create + clean + remove)
systemd-tmpfiles --boot
Bu servislerin zamanlama bilgilerine bakmak için:
systemctl status systemd-tmpfiles-clean.timer
systemctl list-timers | grep tmp
Varsayılan olarak bu timer günde bir çalışır, ek olarak sistem açılışında da tetiklenir.
Geçici Dosyaları Keşfetmek ve Analiz Etmek
Sisteminizde neler olduğunu anlamadan yönetemezsiniz. Şu komutlar /tmp ve /var/tmp içeriğini analiz etmenizi sağlar:
# Boyuta göre sıralanmış liste (en büyük önce)
du -sh /tmp/* /var/tmp/* 2>/dev/null | sort -rh | head -20
# En eski dosyaları bul
find /tmp -maxdepth 1 -printf '%T+ %pn' | sort | head -20
# Belirli bir kullanıcıya ait geçici dosyalar
find /tmp /var/tmp -user kullanici_adi 2>/dev/null
# 1 GB'dan büyük geçici dosyalar (alarm zilleri çalsın)
find /tmp /var/tmp -size +1G -exec ls -lh {} ; 2>/dev/null
Gerçek dünyada karşılaştığım bir senaryo: Bir üretim sunucusunda disk dolmuştu ve kimse nedenini bilmiyordu. Yukarıdaki du komutunu çalıştırdığımda /var/tmp altında 40 GB’lık bir PostgreSQL dump dosyası buldum. Bir geliştirici test amaçlı dump almış, işi bitince silmeyi unutmuştu. Bu kadar basit ama bu kadar yıkıcı.
İnode Kullanımını Kontrol Edin
Disk dolmasının her zaman boyutla ilgisi yoktur. Bazen inode tükenir ve bu da aynı derecede tehlikelidir:
df -i /tmp /var/tmp
Eğer “Use%” sütunu %90’ın üzerindeyse, çok sayıda küçük geçici dosya birikiyor demektir. Bu genellikle hatalı çalışan uygulamaların veya döngüsel process’lerin belirtisidir.
Güvenli Geçici Dosya Oluşturma: mktemp
Script yazarken geçici dosyaları elle oluşturmak kötü bir alışkanlıktır. /tmp/benim_dosyam.txt şeklinde sabit isimler kullanmak race condition ve symlink saldırılarına kapı aralar. Bunun yerine mktemp kullanın:
# Geçici dosya oluştur
TEMP_FILE=$(mktemp)
echo "Geçici dosya: $TEMP_FILE"
# Geçici dizin oluştur
TEMP_DIR=$(mktemp -d)
echo "Geçici dizin: $TEMP_DIR"
# Özel prefix ile
TEMP_FILE=$(mktemp /tmp/myapp.XXXXXX)
# Çıktı: /tmp/myapp.a3Kp9s
# /var/tmp'de oluştur (reboot'tan sonra da yaşasın istiyorsak)
TEMP_FILE=$(mktemp --tmpdir=/var/tmp myapp.XXXXXX)
Önemli bir kural: Script içinde mktemp ile oluşturduğunuz dosyaları mutlaka trap ile temizleyin:
#!/bin/bash
TEMP_DIR=$(mktemp -d)
TEMP_LOG=$(mktemp)
# Script bitince veya hata alınca temizle
cleanup() {
rm -rf "$TEMP_DIR"
rm -f "$TEMP_LOG"
}
trap cleanup EXIT INT TERM
# Buradan sonra işlemlerinizi yapın
echo "İşlem başlıyor..." > "$TEMP_LOG"
# ... diğer komutlar
Bu pattern, script hangi şekilde sona erse de (başarılı, hatalı veya sinyal alarak), geçici dosyaların temizlenmesini garanti eder. Bunu kullanmayan scriptler zamanla disk dolmasına neden olur.
Manuel Temizlik: Ne Zaman, Nasıl?
Bazen otomatik temizliği bekleyemezsiniz. Disk dolmuş, servis cevap vermiyor ve hemen müdahale gerekiyor. İşte bu anlarda kullanabileceğiniz komutlar:
# /tmp içindeki tüm dosyaları sil (DİKKATLİ OLUN)
find /tmp -mindepth 1 -delete
# Daha güvenli yaklaşım: sadece belirli yaşın üzerindeki dosyaları sil
# 24 saatten eski dosyalar
find /tmp -mindepth 1 -mtime +1 -delete
# Aktif process'lerin kullandığı dosyalara dokunmadan temizle
# (lsof ile açık dosyaları hariç tut)
find /tmp -mindepth 1 -mtime +1 ! -exec lsof {} ; -delete 2>/dev/null
Ama dikkat: /tmp altındaki çalışan process’lerin socket ve lock dosyaları olabilir. Bunları silmek servislerin çökmesine neden olabilir. Bu yüzden canlı sistemde find /tmp -mindepth 1 -delete komutu şeker gibi görünse de tehlikelidir. Önce neyin ne olduğunu anlayın.
# Hangi process hangi dosyayı kullanıyor?
lsof +D /tmp 2>/dev/null | head -30
# Belirli bir dosyayı hangi process kullanıyor?
fuser -v /tmp/dosyaadi 2>/dev/null
/var/tmp İçin Temizlik
# 30 günden eski dosyaları sil
find /var/tmp -mindepth 1 -mtime +30 -delete
# Belirli bir uygulamaya ait dosyaları temizle
find /var/tmp -name "*.pid" -mtime +7 -delete
find /var/tmp -name "crash_*" -mtime +14 -delete
Özel Uygulama Senaryoları
Web Sunucusu Geçici Dosyaları
Apache ve Nginx, dosya yüklemeleri sırasında /tmp veya özel dizinler kullanır. PHP özellikle /tmp’i yoğun kullanır:
# PHP'nin geçici upload dizinini kontrol et
php -r "echo sys_get_temp_dir();"
# PHP session dosyalarının nerede olduğunu bul
php -r "echo session_save_path();"
# Eski PHP session dosyalarını temizle (7 günden eski)
find /var/lib/php/sessions -mtime +7 -delete
Yüksek trafikli bir web sunucusunda PHP session dosyaları hızla birikir. Bunu cron job ile otomatize etmek standarttır:
# Crontab'a ekle
echo "0 3 * * * find /var/lib/php/sessions -mtime +7 -delete" | crontab -
Java Uygulamalarının Geçici Dosyaları
Java uygulamaları özellikle JVM başlatılırken ve büyük işlemler sırasında /tmp’i yoğun kullanır. Konteyner ortamlarında bu bazen sorun yaratır:
# Java process'lerinin oluşturduğu geçici dosyalar
find /tmp -name "*.jar" -o -name "*.class" -o -name "hsperfdata_*" | head -20
# Java process'lerine ait tmp dizinleri
ls -la /tmp/hsperfdata_*/
Docker ve Konteyner Ortamları
Docker konteynerlerinde /tmp yönetimi biraz farklıdır. Konteyner silindiğinde her şey gider ama konteyner çalışırken tmpfs boyutu kritik olabilir:
# Konteyner için belirli boyutta tmpfs mount et
docker run --tmpfs /tmp:rw,size=512m,mode=1777 myimage
# Mevcut konteynerin tmp kullanımını gör
docker exec mycontainer df -h /tmp
docker exec mycontainer du -sh /tmp/*
/tmp İçin tmpfs Boyutunu Ayarlamak
Eğer /tmp tmpfs olarak mount ediliyorsa ve varsayılan boyut yetersiz geliyorsa (ya da fazla RAM harcıyorsa), bunu ayarlayabilirsiniz.
/etc/fstab üzerinden kalıcı ayar:
# Mevcut mount'u gör
cat /proc/mounts | grep tmp
# fstab'a özel boyut ekle (örnek: 2GB)
# Mevcut satırı değiştir veya yoksa ekle:
tmpfs /tmp tmpfs defaults,size=2G,mode=1777 0 0
Değişikliği hemen uygulamak için:
mount -o remount /tmp
# veya yeni boyutu hemen ayarla:
mount -o remount,size=2G /tmp
Systemd override ile de yapılabilir:
systemctl edit tmp.mount
Açılan editörde şunu yazın:
[Mount]
Options=mode=1777,strictatime,nosuid,nodev,size=4G
Sonra:
systemctl daemon-reload
systemctl restart tmp.mount
Monitoring ve Alerting
Geçici dosya dizinleri dolmadan önce uyarı almak için basit bir monitoring scripti:
#!/bin/bash
# /tmp ve /var/tmp doluluk kontrolü
THRESHOLD=80
ALERT_EMAIL="[email protected]"
check_dir() {
local dir=$1
local usage
usage=$(df -h "$dir" | awk 'NR==2 {gsub(/%/,""); print $5}')
if [ "$usage" -gt "$THRESHOLD" ]; then
echo "UYARI: $dir %$usage dolu" | mail -s "Disk Uyarisi: $HOSTNAME" "$ALERT_EMAIL"
echo "$(date): $dir %$usage dolu" >> /var/log/tmp_monitor.log
fi
}
check_dir /tmp
check_dir /var/tmp
Bu scripti cron’a ekleyin:
*/15 * * * * /usr/local/bin/check_tmp.sh
Daha kapsamlı izleme için Prometheus node_exporter zaten bu metrikleri toplar, Grafana’da disk kullanımı dashboard’una /tmp ve /var/tmp için alert eklemek yeterlidir.
Güvenlik: Sticky Bit ve İzinler
/tmp dizininin 1777 izni olduğunu gördünüz. Bu sayıdaki 1 sticky bit’tir ve kritik öneme sahiptir:
# Mevcut izinleri kontrol et
ls -ld /tmp /var/tmp
# drwxrwxrwt 15 root root 4096 ... /tmp
# Sondaki 't' sticky bit'i gösterir
# Eğer sticky bit kaybolmuşsa (bu ciddi bir güvenlik sorunudur):
chmod 1777 /tmp
chmod 1777 /var/tmp
Sticky bit olmadan herhangi bir kullanıcı başka bir kullanıcının geçici dosyasını silebilir. Bu hem güvenlik açığı hem de uygulama kararsızlığına yol açar.
Bazı sıkılaştırma senaryolarında /tmp için ek mount option’ları kullanılır:
# noexec: /tmp'den çalıştırılabilir dosya çalıştırmayı engeller
# nosuid: SUID bit'i geçersiz kılar
# nodev: device dosyası oluşturmayı engeller
tmpfs /tmp tmpfs defaults,nosuid,nodev,noexec,size=2G,mode=1777 0 0
noexec özellikle güvenlik açısından önemlidir; birçok exploit /tmp üzerine çalıştırılabilir dosya bırakıp oradan çalıştırmaya çalışır.
Özel tmpfiles.d Konfigürasyonu Yazmak
Kendi uygulamanız için özel temizlik kuralları tanımlayabilirsiniz:
# /etc/tmpfiles.d/myapp.conf dosyası oluştur
cat > /etc/tmpfiles.d/myapp.conf << 'EOF'
# Tip Yol Mod User Group Yaş Argüman
D /var/tmp/myapp 0750 myapp myapp 14d -
D /tmp/myapp-cache 0700 myapp myapp 1d -
f /tmp/myapp/app.pid 0644 myapp myapp - -
EOF
Satır formatı şöyle okunur:
- D: Dizin oluştur ve belirtilen yaştan eski dosyaları temizle
- f: Dosya oluştur (yoksa)
- L: Symlink oluştur
- z: İzinleri ayarla (dosyayı oluşturma)
Değişikliği test etmek için:
systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf
systemd-tmpfiles --clean /etc/tmpfiles.d/myapp.conf --dry-run
Sonuç
Geçici dosya yönetimi, sysadmin işinin “sıkıcı ama kritik” kategorisinde yer alır. Haftalarca sorunsuz çalışan bir sistem, yanlış yönetilen geçici dosyalar yüzünden aniden çökebilir. Öğrendiklerimizi özetlemek gerekirse:
/tmp kısa ömürlü, genellikle RAM tabanlı; /var/tmp ise yeniden başlatmalar arasında hayatta kalan geçici depolama alanıdır. systemd-tmpfiles bu dizinlerin temizliğini otomatize eder, ancak kritik anlarda manuel müdahale gerekebilir.
Script yazarken mktemp kullanmak ve trap ile temizlik yapmak profesyonel bir alışkanlıktır. Sticky bit güvenliği için zorunludur, kaybolduğunda hemen düzeltin. noexec, nosuid, nodev seçenekleri /tmp’i saldırılara karşı sertleştirir.
En önemli tavsiyem: Bu dizinleri monitoring’e dahil edin. “Dolmaz ki” diye düşünmeyin. Dolacak, üstelik en kritik anda dolacak. Önceden alarm kurmak, sizi gece 3’te diskdolu paniğinden kurtarır.