RAM’in boş bırakılması, Linux dünyasında neredeyse günah sayılır. Sistem yöneticileri olarak biz de bu felsefeyi benimseyip RAM’i her fırsatta verimli kullanmaya çalışırız. İşte tmpfs tam da bu noktada devreye giriyor: disk I/O’sunu tamamen devre dışı bırakıp geçici verilerinizi doğrudan RAM’de tutmanızı sağlayan, kernel tarafından desteklenen bir dosya sistemi. Bu yazıda tmpfs’i derinlemesine inceleyeceğiz, gerçek dünya senaryolarıyla nasıl kullanabileceğinizi göstereceğiz ve dikkat etmeniz gereken noktalara değineceğiz.
tmpfs Nedir ve Nasıl Çalışır?
tmpfs, Linux kernel’inin içinde yerleşik olarak gelen sanal bir dosya sistemidir. Veriler RAM’de tutulur ve sistem yeniden başlatıldığında tüm içerik silinir. Ama işin ilginç tarafı şu: tmpfs sadece RAM kullanmaz, gerektiğinde swap alanını da devreye sokar. Yani “tamamen RAM’de” demek teknik olarak biraz yanıltıcı, kernel yük altında bazı sayfaları swap’a taşıyabilir.
Klasik ramdisk yaklaşımından farkı ise çok önemli. Ramdisk, kullanmasanız bile belirlediğiniz boyutu RAM’den ayırır. tmpfs ise dinamik çalışır: içine 100 MB veri koyduğunuzda 100 MB RAM kullanır, 500 MB boyut limiti koymuş olsanız bile boş alanı israf etmez.
Sisteminizde zaten birkaç tmpfs mount noktası çalışıyor olabilir:
df -h -t tmpfs
Çıktıda şöyle şeyler göreceksiniz:
Filesystem Size Used Avail Use% Mounted on
tmpfs 7.8G 2.1M 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.8G 68K 7.8G 1% /run/user/1000
/dev/shm zaten POSIX paylaşımlı bellek için kullanılan bir tmpfs alanıdır. Birçok uygulama bunu farkında olmadan kullanır.
Temel Mount Parametreleri
tmpfs’i mount ederken birkaç önemli parametre var:
size: Maksimum boyut. 1G, 512M, 2048k gibi değerler alır. Belirtmezseniz RAM’in yarısı varsayılan olur.
nr_inodes: Maksimum inode sayısı. Dosya sayısını sınırlamak için kullanılır.
nr_blocks: Boyut yerine blok sayısıyla sınırlama yapar.
mode: Mount noktasının izinleri. Örneğin 1777 sticky bit ile herkese açık ama sadece kendi dosyasını silen bir yapı kurar.
uid ve gid: Sahiplik ayarları. Belirli bir kullanıcı veya gruba özel tmpfs için kullanışlıdır.
noexec: Bu alan üzerinden çalıştırılabilir dosyaların çalıştırılmasını engeller. Güvenlik açısından önemli.
nosuid: SUID bitinin etkisini kaldırır.
nodev: Aygıt dosyalarının kullanılmasını engeller.
İlk tmpfs Mount İşlemi
Hemen elimizi kirletelim. Geçici bir çalışma alanı oluşturalım:
sudo mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=512M,mode=1777 tmpfs /mnt/ramdisk
Mount oldu mu kontrol edelim:
mount | grep tmpfs
df -h /mnt/ramdisk
Bu kadar basit. Artık /mnt/ramdisk altında yaptığınız her şey RAM’de yaşar. Sistemi yeniden başlattığınızda hepsi gider.
Geçici test için bile olsa unmount etmek isterseniz:
sudo umount /mnt/ramdisk
fstab ile Kalıcı Hale Getirme
Sistemi her yeniden başlattığınızda elle mount yapmak istemezsiniz. /etc/fstab‘a ekleyelim:
sudo nano /etc/fstab
Şu satırı ekleyin:
tmpfs /mnt/ramdisk tmpfs defaults,size=1G,mode=1777,noexec,nosuid,nodev 0 0
Test etmek için:
sudo mount -a
df -h /mnt/ramdisk
Hata yoksa, bir dahaki boot’ta otomatik mount edilecek.
Gerçek Dünya Senaryosu 1: Derleme Süreçlerini Hızlandırma
Büyük bir C++ veya Rust projesi derliyorsunuz ve her seferinde dakikalar bekliyorsunuz. Derleme geçici dosyaları (object dosyaları, intermediate artifacts) disk üzerinde oluşturuluyor. Bunu tmpfs’e taşıdığınızda çarpıcı farklar görürsünüz.
Örnek: Linux kernel derlemek için:
# Önce tmpfs alanını hazırla
sudo mkdir -p /tmp/kernel-build
sudo mount -t tmpfs -o size=8G tmpfs /tmp/kernel-build
# Kernel kaynak kodunu indir ve çıkart
cd /tmp/kernel-build
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
tar -xf linux-6.6.tar.xz
cd linux-6.6
# Derlemeyi yap - tüm geçici çıktılar RAM'de
make defconfig
make -j$(nproc) O=/tmp/kernel-build/output
O= parametresiyle tüm build çıktısını tmpfs’e yönlendiriyoruz. Gerçek kaynak dosyalar diskte kalıyor, sadece derleme artefaktları RAM’de oluşuyor. Disk I/O’yu neredeyse sıfıra indiriyoruz.
Aynı yaklaşım Rust projeleri için de geçerli:
# Cargo target dizinini tmpfs'e taşı
sudo mount -t tmpfs -o size=4G tmpfs /home/user/project/target
cd /home/user/project
cargo build --release
Gerçek Dünya Senaryosu 2: Web Sunucusu Log Optimizasyonu
Yoğun trafik alan bir web sunucusunda Nginx veya Apache logları saniyede binlerce satır yazıyor. Bu disk I/O’su hem performansı düşürür hem de SSD’lerin ömrünü kısaltır.
Çözüm: Access logları (hata logları değil, onlar diskte kalmalı) tmpfs’e almak.
# Log için tmpfs oluştur
sudo mkdir -p /var/log/nginx-ram
sudo mount -t tmpfs -o size=256M,noexec,nosuid,nodev tmpfs /var/log/nginx-ram
sudo chown www-data:www-data /var/log/nginx-ram
# Nginx konfigürasyonunu güncelle
sudo nano /etc/nginx/nginx.conf
Nginx konfigürasyonunda:
access_log /var/log/nginx-ram/access.log main buffer=64k flush=5m;
error_log /var/log/var/nginx/error.log warn;
Burada buffer=64k ve flush=5m parametreleri çok önemli. Nginx her satırda yazmak yerine 64KB dolduğunda veya 5 dakika geçtiğinde yazacak. Ama bu loglar kritikse, düzenli aralıklarla diske yedeklemek şart:
# Cron ile her 15 dakikada bir diske yedekle
cat > /etc/cron.d/nginx-log-sync << 'EOF'
*/15 * * * * www-data rsync -a /var/log/nginx-ram/ /var/log/nginx/archive/
EOF
Gerçek Dünya Senaryosu 3: Veritabanı Geçici Tablolar
PostgreSQL ve MySQL/MariaDB, karmaşık sorgularda geçici tablolar oluşturur. Bunları tmpfs’e almak sorgu performansını ciddi ölçüde artırır.
PostgreSQL için:
# PostgreSQL geçici dizini için tmpfs
sudo mkdir -p /var/lib/postgresql/tmp
sudo mount -t tmpfs -o size=2G,uid=postgres,gid=postgres,mode=0700 tmpfs /var/lib/postgresql/tmp
PostgreSQL konfigürasyonunda (postgresql.conf):
temp_tablespaces = 'fast_tmp'
Tablespace oluşturmak için:
CREATE TABLESPACE fast_tmp LOCATION '/var/lib/postgresql/tmp';
MySQL için my.cnf:
[mysqld]
tmpdir = /var/lib/mysql-tmp
Ve mount:
sudo mkdir -p /var/lib/mysql-tmp
sudo mount -t tmpfs -o size=1G,uid=mysql,gid=mysql,mode=0700 tmpfs /var/lib/mysql-tmp
Dikkat: Sadece geçici tablolar ve sort buffer gibi operasyonlar için kullanın. Ana veritabanı dosyalarını asla tmpfs’e taşımayın, sistem yeniden başlarsa her şeyi kaybedersiniz.
Gerçek Dünya Senaryosu 4: CI/CD Pipeline Hızlandırma
Jenkins, GitLab Runner veya benzeri CI/CD araçlarını çalıştırıyorsanız, her build için workspace temizlenip yeniden oluşturuluyor. Bu süreç disk I/O’suna çok bağlı.
# CI workspace için tmpfs
sudo mkdir -p /opt/ci-workspace
sudo mount -t tmpfs -o size=10G,noexec=off tmpfs /opt/ci-workspace
# Not: noexec=off, çünkü burada binary derleme ve çalıştırma gerekiyor
# Jenkins için workspace ayarı
sudo chown -R jenkins:jenkins /opt/ci-workspace
Jenkins konfigürasyonunda workspace dizinini /opt/ci-workspace olarak ayarlayın. Her build çok daha hızlı çalışacak, özellikle dependency indirme ve dosya kopyalama adımları.
tmpfs Boyutunu Dinamik Olarak Değiştirme
tmpfs’in güzel özelliklerinden biri, unmount etmeden boyutunu değiştirebilmeniz:
# Mevcut boyutu gör
df -h /mnt/ramdisk
# Boyutu 1GB'a çıkar (unmount gerekmez)
sudo mount -o remount,size=1G /mnt/ramdisk
# Tekrar kontrol et
df -h /mnt/ramdisk
Bu özellik özellikle derleme süreçlerinde çok işe yarıyor. “Az biraz daha lazım” dediğinizde her şeyi kaybetmeden genişletebiliyorsunuz.
Güvenlik Konuları
tmpfs kullanırken güvenliği ihmal etmek tehlikeli olabilir. Birkaç kritik nokta:
noexec kullanımı: Mümkün olduğunca tmpfs alanlarına noexec koyun. Kullanıcıların bu alana zararlı script yükleyip çalıştırmasını engeller.
nosuid ve nodev: Neredeyse her zaman bu iki seçeneği de ekleyin. SUID binary’ler ve aygıt dosyaları çoğu durumda tmpfs’te işinize yaramaz.
# Güvenli mount örneği
sudo mount -t tmpfs -o size=512M,mode=1777,noexec,nosuid,nodev tmpfs /mnt/secure-tmp
Boyut limiti: Boyut limiti koymazsanız kullanıcılar RAM’i doldurabilir. Her zaman makul bir limit belirleyin.
Şifreleme: Hassas veriler için tmpfs ideal olsa da, swap devreye girdiğinde veriler diskte şifresiz kalabilir. Swap şifreleme kullanmıyorsanız dikkatli olun. /etc/crypttab ile swap şifrelemeyi aktif edebilirsiniz.
Kullanımı İzleme ve Alarm Sistemi
tmpfs dolduğunda yazan işlem hata alır ve ciddi sorunlar çıkabilir. İzleme şart:
# Basit kullanım kontrolü
df -h -t tmpfs
# Yüzde olarak - alarm için
df -t tmpfs --output=pcent,target | tail -n +2
Basit bir monitoring scripti yazalım:
cat > /usr/local/bin/check-tmpfs.sh << 'SCRIPT'
#!/bin/bash
THRESHOLD=85
ALERT_EMAIL="[email protected]"
while IFS= read -r line; do
USAGE=$(echo "$line" | awk '{print $1}' | tr -d '%')
MOUNT=$(echo "$line" | awk '{print $2}')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "UYARI: $MOUNT tmpfs kullanimi %$USAGE seviyesinde!" |
mail -s "tmpfs Doluluk Alarmı: $MOUNT" "$ALERT_EMAIL"
logger "tmpfs alarm: $MOUNT at $USAGE%"
fi
done < <(df -t tmpfs --output=pcent,target | tail -n +2)
SCRIPT
chmod +x /usr/local/bin/check-tmpfs.sh
# Cron'a ekle - her 5 dakikada kontrol
echo "*/5 * * * * root /usr/local/bin/check-tmpfs.sh" > /etc/cron.d/tmpfs-monitor
Sistem Yeniden Başlatmada İçerik Kaybı Yönetimi
tmpfs’teki veriler sistem kapanınca gider. Ama bazı durumlarda bu verileri yeniden oluşturmanız gerekir. systemd servisleriyle bunu otomatize edebilirsiniz:
cat > /etc/systemd/system/setup-ramdisk.service << 'EOF'
[Unit]
Description=RAM Disk Kurulum ve Hazırlık
After=local-fs.target
Before=nginx.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/setup-ramdisk.sh
ExecStop=/usr/local/bin/cleanup-ramdisk.sh
[Install]
WantedBy=multi-user.target
EOF
Ve çalıştırılacak script:
cat > /usr/local/bin/setup-ramdisk.sh << 'SCRIPT'
#!/bin/bash
RAMDISK="/mnt/ramdisk"
# Dizin yapısını oluştur
mkdir -p "$RAMDISK"/{cache,tmp,sessions}
# Gerekli izinleri ayarla
chown -R www-data:www-data "$RAMDISK/cache"
chown -R www-data:www-data "$RAMDISK/sessions"
chmod 1777 "$RAMDISK/tmp"
# Varsa yedekten geri yükle
if [ -d "/var/backup/ramdisk-snapshot" ]; then
rsync -a /var/backup/ramdisk-snapshot/ "$RAMDISK/"
echo "Yedekten geri yüklendi."
fi
echo "RAM disk hazır: $RAMDISK"
SCRIPT
chmod +x /usr/local/bin/setup-ramdisk.sh
sudo systemctl enable setup-ramdisk.service
sudo systemctl start setup-ramdisk.service
tmpfs ile /tmp Optimizasyonu
Birçok modern Linux dağıtımında /tmp zaten tmpfs olarak yapılandırılabilir. Ubuntu ve Fedora’da bunu aktif etmek için:
# Ubuntu/Debian
sudo systemctl enable tmp.mount
sudo systemctl start tmp.mount
# Durumu kontrol et
systemctl status tmp.mount
df -h /tmp
Eğer /tmp boyutunu özelleştirmek istiyorsanız:
sudo cp /usr/share/systemd/tmp.mount /etc/systemd/system/tmp.mount
sudo nano /etc/systemd/system/tmp.mount
[Mount] bölümüne ekleyin:
[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,nosuid,nodev,size=2G
Performans Karşılaştırması
Gerçek dünyadan rakamlar vermek gerekirse, aynı işlemi disk ve tmpfs üzerinde test eden basit bir yöntem:
# Disk üzerinde yazma hızı testi
time dd if=/dev/zero of=/tmp/disktest bs=1M count=1024 conv=fdatasync
rm /tmp/disktest
# tmpfs üzerinde yazma hızı testi (zaten /tmp tmpfs ise)
mount | grep "on /tmp"
time dd if=/dev/zero of=/tmp/ramtest bs=1M count=1024
rm /tmp/ramtest
# Okuma hızı - önce cache temizle
sudo sync && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
time dd if=/tmp/ramtest of=/dev/null bs=1M
Tipik sonuçlar: SATA SSD üzerinde 400-500 MB/s yazma, tmpfs üzerinde 8-15 GB/s yazma hızı görürsünüz. NVMe SSD ile fark biraz kapanır ama yine de tmpfs birkaç kat hızlı çalışır.
Sık Karşılaşılan Hatalar
“No space left on device” hatası: tmpfs sınırına ulaştınız. Boyutu artırın veya içeriği temizleyin.
# Ne kadar dolduğunu gör
du -sh /mnt/ramdisk/*
# Boyutu artır
sudo mount -o remount,size=2G /mnt/ramdisk
Sistem reboot sonrası mount noktasının boş olması: fstab’ı doğru yazdınız ama servisler veri bekliyor. systemd servisiyle başlangıç scriptini düzgün yapılandırın.
swap kullanımının artması: Çok fazla tmpfs alanı açtınız ve kernel swap’a itiyor. RAM kullanımınızı izleyin, gereksiz tmpfs alanlarını kapatın.
# Swap kullanımını gör
swapon --show
free -h
Sonuç
tmpfs, doğru kullanıldığında sistem yöneticisinin elindeki en güçlü performans araçlarından biri. Özellikle derleme süreçleri, web sunucu cache’leri, veritabanı geçici alanları ve CI/CD pipeline’ları için muhteşem sonuçlar veriyor.
Ama bazı temel kuralları asla unutmayın: boyut limiti koyun, güvenlik bayraklarını (noexec, nosuid, nodev) ihmal etmeyin, kritik verileri tmpfs’e taşımayın ve mutlaka bir izleme sistemi kurun. tmpfs dolduğunda sessiz sedasız hata verip uygulamanızı çökertebilir.
Başlangıç için /tmp‘yi tmpfs yapmak ve derleme ortamınızı optimize etmek iyi bir ilk adım. Zamanla hangi iş yüklerinizin disk I/O’suna bağlı olduğunu profiling araçlarıyla tespit edip (iotop, iostat, blktrace) tmpfs ile hızlandırabilirsiniz. RAM’i boş bırakmak gerçekten israftır, en azından geçici veriler için dolu tutun.