OverlayFS ile Katmanlı Dizin Yapısı Oluşturma ve Yönetme
Konteyner teknolojilerini biraz kurcaladıysanız, bir noktada kendinize “bu Docker katmanları aslında nasıl çalışıyor?” diye sormuşsunuzdur. Ben de yıllar önce aynı soruyu sordum ve cevap beni OverlayFS’e götürdü. O günden bu yana bu dosya sistemini hem üretim ortamlarında hem de kişisel projelerimde defalarca kullandım. Bugün size sadece teorik bilgi değil, gerçekten işe yarayan pratik bilgiler aktaracağım.
OverlayFS Nedir ve Neden Önemli?
OverlayFS, Linux çekirdeğine 3.18 sürümüyle (2014) entegre edilmiş bir birleştirici dosya sistemidir (union filesystem). Temel fikir şu: iki veya daha fazla dizini üst üste bindirerek tek bir birleşik görünüm oluşturursunuz. Alt katman salt okunur kalırken, üst katmanda değişiklikler yazılır.
Bu yapının asıl gücü şuradan geliyor: orijinal veriye hiç dokunmadan üzerinde çalışabilirsiniz. Docker, LXC, systemd-nspawn gibi araçlar bu yüzden OverlayFS kullanıyor. Ama bu teknoloji sadece konteynerler için değil; test ortamları, canlı sistemler, yazılım dağıtımı gibi onlarca senaryo için kullanılabilir.
Temel Kavramlar
OverlayFS’i anlamak için dört temel kavramı oturtmak gerekiyor:
- lowerdir: Salt okunur alt katman (veya katmanlar). Buraya yazamazsınız, sadece okuyabilirsiniz. Birden fazla lowerdir belirtebilirsiniz.
- upperdir: Yazılabilir üst katman. Tüm değişiklikler buraya kaydedilir.
- workdir: OverlayFS’in iç işlemleri için kullandığı geçici çalışma dizini. upperdir ile aynı dosya sisteminde olmalıdır.
- merged: Birleşik görünümün sunulduğu bağlama noktası (mount point).
Copy-on-Write (CoW) mekanizması burada devreye giriyor. lowerdir’deki bir dosyayı değiştirmek istediğinizde, OverlayFS o dosyayı önce upperdir’e kopyalar, sonra değişikliği yapar. lowerdir’deki orijinal dosyaya hiç dokunulmaz.
Kurulum ve Ön Gereksinimler
Çoğu modern Linux dağıtımında OverlayFS çekirdek modülü olarak zaten gelir. Kontrol edelim:
# Modülün yüklü olup olmadığını kontrol et
lsmod | grep overlay
# Eğer yüklü değilse yükle
modprobe overlay
# Çekirdek desteğini doğrula
grep -i overlay /proc/filesystems
Eğer çıktıda overlay görüyorsanız hazırsınız. Görmüyorsanız çekirdek yapılandırmanızı kontrol etmeniz gerekebilir, ama 4.x ve üzeri çekirdek kullanan herhangi bir Ubuntu, CentOS, RHEL, Debian sistemde bu sorunla karşılaşmazsınız.
İlk OverlayFS Bağlantısını Oluşturmak
Soyut konuşmak yerine direkt örneğe geçelim. Basit bir senaryo: elimizde bir temel dizin var, üzerinde değişiklik yapmak istiyoruz ama orijinale dokunmak istemiyoruz.
# Çalışma dizinlerimizi oluşturalım
mkdir -p /tmp/overlay-test/{lower,upper,work,merged}
# lower dizinine bazı dosyalar koyalım (orijinal içerik)
echo "Bu orijinal dosyadir" > /tmp/overlay-test/lower/dosya1.txt
echo "Bu da orijinal ikinci dosya" > /tmp/overlay-test/lower/dosya2.txt
mkdir /tmp/overlay-test/lower/alt-dizin
echo "Alt dizindeki dosya" > /tmp/overlay-test/lower/alt-dizin/dosya3.txt
# OverlayFS'i bağlayalım
mount -t overlay overlay
-o lowerdir=/tmp/overlay-test/lower,upperdir=/tmp/overlay-test/upper,workdir=/tmp/overlay-test/work
/tmp/overlay-test/merged
# Birleşik görünümü inceleyelim
ls -la /tmp/overlay-test/merged/
Şimdi merged dizininde lower’daki tüm dosyaları görüyor olmalısınız. Bir değişiklik yapalım ve ne olduğuna bakalım:
# merged üzerinden bir dosyayı değiştirelim
echo "Bu satir degistirildi" >> /tmp/overlay-test/merged/dosya1.txt
# Şimdi her katmana bakalım
echo "=== lower ==="
cat /tmp/overlay-test/lower/dosya1.txt
echo "=== upper ==="
cat /tmp/overlay-test/upper/dosya1.txt
echo "=== merged ==="
cat /tmp/overlay-test/merged/dosya1.txt
Gördünüz mü? lower’daki dosya hala orijinal haliyle duruyor. Değişiklikler upper’a yansıdı. merged ise ikisini birleştirerek size şeffaf bir görünüm sunuyor. İşte OverlayFS’in büyüsü bu.
Çoklu Alt Katman Kullanımı
OverlayFS’in az bilinen ama son derece güçlü bir özelliği: birden fazla lowerdir kullanabilirsiniz. Docker’ın imaj katmanlarını bu şekilde uyguladığını düşünürseniz, konunun önemi daha iyi anlaşılır.
# Çoklu katman için dizinleri hazırlayalım
mkdir -p /tmp/multi-overlay/{layer1,layer2,layer3,upper,work,merged}
# Her katmana farklı içerik koyalım
echo "layer1 - temel sistem" > /tmp/multi-overlay/layer1/base.txt
echo "layer1 versiyonu" > /tmp/multi-overlay/layer1/versiyon.txt
echo "layer2 - uygulama katmani" > /tmp/multi-overlay/layer2/app.txt
echo "layer2 versiyonu" > /tmp/multi-overlay/layer2/versiyon.txt # Bu layer1'i gölgeler
echo "layer3 - konfigurasyon katmani" > /tmp/multi-overlay/layer3/config.txt
# Çoklu lowerdir ile bağla (soldan sağa öncelik azalır)
mount -t overlay overlay
-o lowerdir=/tmp/multi-overlay/layer3:/tmp/multi-overlay/layer2:/tmp/multi-overlay/layer1,upperdir=/tmp/multi-overlay/upper,workdir=/tmp/multi-overlay/work
/tmp/multi-overlay/merged
# Sonucu inceleyelim
ls /tmp/multi-overlay/merged/
cat /tmp/multi-overlay/merged/versiyon.txt # layer3 > layer2 > layer1 önceliği
Önemli not: lowerdir listesinde solda olan katman daha yüksek önceliğe sahiptir. Yani aynı isimde bir dosya birden fazla katmanda varsa, en soldaki kazanır.
Gerçek Dünya Senaryosu: Test Ortamı İzolasyonu
Şimdi gerçekten işime yaramış bir senaryoyu paylaşayım. Bir web uygulamasını production sunucusunda test etmek zorunda kaldım (evet, iyi bir pratik değil, ama o gün başka seçenek yoktu). OverlayFS ile production’ı bozmadan güvenli bir test ortamı kurdum.
#!/bin/bash
# production-test-env.sh
# Production dizinini değiştirmeden test ortamı oluşturur
PROD_DIR="/var/www/myapp"
TEST_UPPER="/tmp/test-changes"
TEST_WORK="/tmp/test-work"
TEST_MERGED="/mnt/test-myapp"
# Dizinleri temizle ve oluştur
rm -rf "$TEST_UPPER" "$TEST_WORK"
mkdir -p "$TEST_UPPER" "$TEST_WORK" "$TEST_MERGED"
# OverlayFS bağla
mount -t overlay overlay
-o lowerdir="$PROD_DIR",upperdir="$TEST_UPPER",workdir="$TEST_WORK"
"$TEST_MERGED"
echo "Test ortami hazir: $TEST_MERGED"
echo "Degisiklikler sadece $TEST_UPPER dizinine yazilacak"
echo "Production dizinine ($PROD_DIR) dokunulmayacak"
# Test bittikten sonra temizlik için:
# umount "$TEST_MERGED"
# rm -rf "$TEST_UPPER" "$TEST_WORK"
Bu script’i çalıştırdıktan sonra nginx veya Apache’yi $TEST_MERGED dizinine yönlendirdim, test ettim, değişiklikler beğendiyse production’a uyguladım, beğenmedim ise sadece upper dizinini sildim. Production hiç etkilenmedi.
Silme İşlemleri ve Whiteout Dosyaları
OverlayFS’te silme işlemleri biraz özel çalışır ve bunu anlamamak ciddi kafa karışıklığına yol açabilir. lower katmanındaki bir dosyayı “sildiğinizde” aslında o dosya yerinde durmaya devam eder. OverlayFS, upper katmanında özel bir “whiteout” dosyası oluşturarak o dosyayı merged görünümünden gizler.
# Mevcut overlay bağlantımızı kullanalım
# /tmp/overlay-test/merged üzerinde dosya2.txt'yi silelim
rm /tmp/overlay-test/merged/dosya2.txt
# Merged'de artık görünmüyor
ls /tmp/overlay-test/merged/
# Ama lower'da hala duruyor
ls /tmp/overlay-test/lower/
# Upper'a bakın, whiteout dosyası oluştu
ls -la /tmp/overlay-test/upper/
# c--------- 1 root root 0, 0 ... dosya2.txt <- karakter device, bu whiteout
# Gerçek device numarasını görmek için:
stat /tmp/overlay-test/upper/dosya2.txt
Whiteout dosyaları 0, 0 major/minor numaralı karakter aygıtlarıdır. OverlayFS bu dosyaları görünce ilgili dosyayı merged’den gizler. Dizin silme için ise “opaque” dizinler kullanılır, upper’da silinen dizin yerine trusted.overlay.opaque=y xattr’ına sahip boş bir dizin oluşturulur.
fstab ile Kalıcı OverlayFS Bağlantısı
Sistemi her yeniden başlattığınızda mount komutunu tekrar çalıştırmak istemiyorsanız, /etc/fstab‘a ekleyebilirsiniz:
# /etc/fstab'a eklenecek satır örneği
# overlay /mnt/merged overlay lowerdir=/lower,upperdir=/upper,workdir=/work 0 0
# Önce dizinleri oluşturun
mkdir -p /overlay/{lower,upper,work,merged}
# fstab'a ekleyin
cat >> /etc/fstab << 'EOF'
overlay /overlay/merged overlay lowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/work 0 0
EOF
# Test edin
mount -a
mount | grep overlay
Dikkat: workdir ve upperdir mutlaka aynı dosya sisteminde olmalıdır. Farklı partition’larda veya farklı dosya sistemlerinde (ext4 ve xfs gibi) olamazlar. Bu kuralı ihlal ederseniz mount komutu hata verir.
Performans ve Pratik Notlar
Yıllarca OverlayFS kullandıktan sonra edindiğim bazı pratik bilgiler:
upperdir ve workdir konumu önemli: Bu dizinleri mümkünse tmpfs üzerinde tutun. Geçici değişiklikler için mükemmel bir kombinasyon.
# tmpfs üzerinde upper ve work oluşturma
mount -t tmpfs tmpfs /tmp/overlay-ram
mkdir -p /tmp/overlay-ram/{upper,work}
mount -t overlay overlay
-o lowerdir=/your/base,upperdir=/tmp/overlay-ram/upper,workdir=/tmp/overlay-ram/work
/mnt/merged
Değişiklikleri kaydetmek: Yaptığınız tüm değişiklikler upper dizininde saklanır. upper’ı başka bir yere kopyalayarak değişikliklerinizi yedekleyebilirsiniz. Hatta upper’ı yeni bir lower olarak kullanarak katman üstüne katman ekleyebilirsiniz.
xattr desteği: OverlayFS’in düzgün çalışması için altta yatan dosya sistemlerinin xattr (extended attributes) desteklemesi gerekir. ext4, xfs, btrfs bunları destekler. FAT32 veya bazı ağ dosya sistemleri desteklemez.
Bağlantı durumunu kontrol etme:
# Aktif overlay bağlantılarını listele
mount | grep overlay
# Daha detaylı bilgi için
findmnt -t overlay
# Bağlantıyı kaldır
umount /mnt/merged
# veya zorla kaldır (busy mount için)
umount -l /mnt/merged # lazy unmount
İleri Seviye: Değişiklikleri Analiz Etme
Bir overlay oturumu boyunca ne değiştiğini anlamak için upper dizinini incelemek yeterlidir, ama bunu daha sistematik yapabiliriz:
#!/bin/bash
# overlay-diff.sh
# OverlayFS upper dizinindeki değişiklikleri raporlar
UPPER_DIR="${1:-/tmp/overlay-test/upper}"
echo "=== Eklenen/Degistirilen Dosyalar ==="
find "$UPPER_DIR" -not -type c -not -name ".wh.*" | grep -v "^${UPPER_DIR}$"
echo ""
echo "=== Silinen Dosyalar (Whiteout) ==="
find "$UPPER_DIR" -type c -name ".wh.*" | sed "s|${UPPER_DIR}/||" | sed "s|.wh.||"
echo ""
echo "=== Opaque Dizinler (Icerik Degisen Dizinler) ==="
find "$UPPER_DIR" -type d -exec sh -c
'attr=$(getfattr -n trusted.overlay.opaque "$1" 2>/dev/null); [ -n "$attr" ] && echo "$1"'
_ {} ;
Bu script, bir deployment öncesinde “bu overlay oturumunda gerçekten ne değiştirdim?” sorusunu yanıtlamak için kullanışlıdır.
Docker ve OverlayFS İlişkisi
Docker’ın overlay2 storage driver’ı doğrudan OverlayFS kullanır. Bunu anlarsanız Docker imajlarının neden bu kadar verimli olduğunu da anlarsınız.
# Docker'ın overlay2 yapısını inceleyelim
docker info | grep "Storage Driver"
# Çalışan bir konteyner için overlay mount noktasını bulun
CONTAINER_ID="your_container_id"
docker inspect "$CONTAINER_ID" | grep -A 5 "GraphDriver"
# Sistem düzeyinde Docker overlay bağlantılarını gör
mount | grep overlay | head -5
# Docker'ın overlay dizin yapısını incele (root gerektirir)
ls /var/lib/docker/overlay2/ | head -10
Docker her imaj katmanı için bir lowerdir, her çalışan konteyner için bir upperdir oluşturur. Konteyner durduğunda upper silinir (commit edilmezse), lower korunur. İşte bu yüzden aynı imajdan yüzlerce konteyner çalıştırmak disk açısından bu kadar verimlidir.
Sorun Giderme
Karşılaştığım yaygın hatalar ve çözümleri:
“too many levels of symbolic links” hatası: lowerdir’de çok fazla sembolik link varken olur. Gerçek path’leri kullanın, realpath komutundan yararlanın.
mount -t overlay overlay
-o lowerdir=$(realpath /your/lower),upperdir=$(realpath /your/upper),workdir=$(realpath /your/work)
/mnt/merged
“invalid argument” hatası: Genellikle workdir ve upperdir’in farklı dosya sistemlerinde olmasından kaynaklanır.
# Dosya sistemlerini kontrol et
df -T /your/upper /your/work
stat -f /your/upper
stat -f /your/work
“device or resource busy” hatası umount sırasında:
# Hangi process'lerin mount noktasını kullandığını bul
lsof +D /mnt/merged
fuser -vm /mnt/merged
# Process'leri durdur ya da lazy unmount kullan
umount -l /mnt/merged
xattr desteklenmiyor hatası:
# xattr desteğini test et
touch /your/upper/test-xattr
setfattr -n user.test -v "test" /your/upper/test-xattr
getfattr -n user.test /your/upper/test-xattr
rm /your/upper/test-xattr
Güvenlik Notları
OverlayFS güçlü bir araç ama dikkat edilmesi gereken noktalar var. mount komutunu çalıştırmak için root yetkisi gerekir (veya user namespace içindeyseniz farklıdır). Üretim ortamında:
- workdir’i asla NFS veya CIFS üzerinde oluşturmayın
- upper ve workdir için ayrı bir partition kullanmayı düşünün, disk dolmasını önler
- Konteyner ortamlarında OverlayFS içinde OverlayFS oluşturmak desteklenmeyebilir
Sonuç
OverlayFS, sysadmin araç kutusunda ciddi bir yer hak eden bir teknolojidir. Test izolasyonundan konteyner altyapısına, yazılım dağıtımından sistem yedeklemeye kadar geniş bir kullanım alanı sunar. Copy-on-Write mantığını kavradıktan sonra çok sayıda problemi bu araçla zarif biçimde çözebilirsiniz.
Başlangıç için şu adımları öneririm: önce bir test sunucusunda basit mount örneklerini deneyin, whiteout mekanizmasını bizzat gözlemleyin, sonra Docker’ın overlay2 dizin yapısını inceleyin. Teoriyi pratikle birleştirdiğinizde OverlayFS gerçekten güçlü bir silaha dönüşüyor.
Son bir not: eğer daha kalıcı ve özellik açısından zengin bir union filesystem arıyorsanız AUFS veya UnionFS’e de bakabilirsiniz, ama OverlayFS’in çekirdekte native olarak desteklenmesi ve Docker gibi araçların bunu benimsemesi onu bugün için açık farkla en pratik seçenek yapıyor.
