squashfs ile Salt Okunur Sıkıştırılmış Dosya Sistemi Oluşturma ve Bağlama
Üretim ortamında bir sistemin dosya sistemini salt okunur hale getirmeniz gerektiğinde, ya da dağıtmak istediğiniz bir yazılım paketini sıkıştırılmış tek bir imaj içine almanız gerektiğinde squashfs tam olarak aradığınız araç. Ben bu teknolojiyle ilk kez gömülü Linux sistemleri üzerinde çalışırken tanıştım; o günden bu yana embedded cihazlardan başlayıp container altyapılarına, live USB sistemlerine kadar pek çok farklı senaryoda squashfs’i aktif olarak kullandım. Bu yazıda teorik bilgiden çok, gerçekten işinize yarayacak pratik kullanım senaryolarını ve ince ayar noktalarını paylaşacağım.
Squashfs Nedir, Neden Kullanılır?
Squashfs, Linux çekirdeğine entegre edilmiş, salt okunur (read-only) ve yüksek oranda sıkıştırılmış bir dosya sistemidir. 2009 yılından itibaren mainline kernel’a dahil edilmiş olup günümüzde neredeyse tüm Linux dağıtımlarında varsayılan olarak desteklenmektedir.
Peki bunu neden kullanmalısınız? Birkaç temel nedeni sıralayayım:
- Yüksek sıkıştırma oranı: gzip, lzo, lz4, xz ve zstd algoritmalarını destekler; xz ile %60-70 oranında alan tasarrufu sağlanabilir
- Salt okunur yapı: güvenlik açısından kritik sistemlerde dosyaların değiştirilmesini fiziksel olarak engeller
- Çekirdek seviyesinde şeffaflık: mount edildikten sonra normal bir dosya sistemi gibi davranır, uygulamalar hiçbir şeyin farkına varmaz
- Düşük bellek ayak izi: verileri decompress ederek okur, tüm içeriği RAM’e açmaz
- Atomik güncelleme: tüm dosya sistemi tek bir imaj dosyasıdır, güncelleme yaparken eski imajı yeni imajla değiştirirsiniz
Live CD/DVD sistemlerini, container base image’larını, firmware güncellemelerini, dağıtım paketlerini ve hatta bazı bulut sağlayıcılarının AMI imajlarını squashfs üzerine inşa ettiğini düşündüğünüzde bu aracın ne kadar yaygın ve köklü bir teknoloji olduğu daha net anlaşılıyor.
Gerekli Araçların Kurulumu
Squashfs ile çalışmak için squashfs-tools paketine ihtiyacınız var. Bu paket iki temel ikili içerir: mksquashfs ve unsquashfs.
# Debian/Ubuntu tabanlı sistemler
sudo apt-get install squashfs-tools
# RHEL/CentOS/AlmaLinux/Rocky Linux
sudo dnf install squashfs-tools
# Arch Linux
sudo pacman -S squashfs-tools
# Mevcut versiyonu kontrol edin
mksquashfs -version
Kernel’in squashfs desteği olup olmadığını da doğrulamak isterseniz:
# Kernel modülü yüklü mü?
lsmod | grep squashfs
# Desteklenen dosya sistemleri arasında squashfs var mı?
cat /proc/filesystems | grep squashfs
# Eğer modül yüklü değilse
sudo modprobe squashfs
echo "squashfs" | sudo tee -a /etc/modules
Temel Squashfs İmajı Oluşturma
Elimizde bir dizin olduğunu varsayalım ve bunu squashfs imajına çevirelim. mksquashfs komutunun temel sözdizimi oldukça basittir.
# Basit bir squashfs imajı oluşturma
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs
# Çıktı dosya sistemini belirterek
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs -comp xz
# İlerleme durumunu görmek için
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs -comp xz -progress
Oluşturulan imaj hakkında bilgi almak için unsquashfs komutunu kullanabilirsiniz:
# İmaj hakkında detaylı bilgi
unsquashfs -s /opt/imajlar/uygulama.sqfs
# İçindeki dosyaları listele (açmadan)
unsquashfs -l /opt/imajlar/uygulama.sqfs
# İçindeki dosyaları listele ve boyutları göster
unsquashfs -lls /opt/imajlar/uygulama.sqfs
Sıkıştırma Algoritmaları ve Performans Dengesi
Squashfs’in en güçlü yanlarından biri farklı sıkıştırma algoritmalarını desteklemesidir. Doğru algoritmayı seçmek, kullanım senaryonuza göre ciddi fark yaratır.
- gzip: Varsayılan algoritma. Hız ve sıkıştırma oranı açısından dengeli. Eski sistemlerle uyumluluk önemli ise tercih edin
- lzo: Çok hızlı decompress eder; okuma performansı kritikse, düşük CPU gücüne sahip cihazlarda tercih edin
- lz4: lzo’dan bile hızlıdır; gerçek zamanlı sistemlerde veya SSD üzerinde çalışan sistemlerde güzel sonuç verir
- xz: En yüksek sıkıştırma oranı. Oluşturma yavaş, okuma orta. Firmware ve dağıtım imajları için ideal
- zstd: Modern tercih. xz’ye yakın sıkıştırma oranıyla çok daha hızlı. squashfs-tools 4.4+ gerektirir
# XZ ile maksimum sıkıştırma (dağıtım için)
mksquashfs /srv/uygulama /opt/imajlar/uygulama-xz.sqfs
-comp xz
-Xbcj x86
-b 1M
-progress
# ZSTD ile dengeli sıkıştırma (production için önerim)
mksquashfs /srv/uygulama /opt/imajlar/uygulama-zstd.sqfs
-comp zstd
-Xcompression-level 15
-b 512K
-progress
# LZ4 ile hız öncelikli (IoT/gömülü sistemler için)
mksquashfs /srv/uygulama /opt/imajlar/uygulama-lz4.sqfs
-comp lz4
-Xhc
-b 128K
-progress
Buradaki -b parametresi blok boyutunu belirler. Büyük bloklar daha iyi sıkıştırma sağlar ama rastgele okuma performansını düşürür. Büyük dosyalar içeren ve sıralı okuma yapılan sistemlerde 1M kullanabilirsiniz; küçük dosyalar veya rastgele erişim için 128K-256K daha uygun olur.
Gelişmiş mksquashfs Parametreleri
Gerçek dünya senaryolarında sadece temel komutla iş bitmez. Üretim ortamında sıkça kullandığım parametreler:
# Belirli dosya ve dizinleri hariç tutarak imaj oluşturma
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs
-comp zstd
-e /srv/uygulama/logs
-e /srv/uygulama/tmp
-e /srv/uygulama/cache
-wildcards
-ef /opt/imajlar/exclude-list.txt
# exclude-list.txt içeriği:
# *.log
# *.tmp
# .git
# __pycache__
# node_modules
# İşlemci çekirdeği sayısını belirleyerek paralel sıkıştırma
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs
-comp zstd
-processors 4
-progress
# Var olan bir imaja dosya ekleme (append)
mksquashfs /srv/ek-moduller /opt/imajlar/uygulama.sqfs
-comp zstd
-noappend
-noappend parametresine dikkat edin. Eğer hedef dosya zaten mevcutsa ve bu parametreyi vermezseniz, mksquashfs dosyaları mevcut imaja eklemeye çalışır. Bu bazen istediğiniz şeydir, bazen de istemeden eski veriyi yeni imajın üstüne bindirmenize yol açar. Ben üretimde her zaman -noappend kullanırım.
Squashfs İmajını Bağlama ve Kullanma
Oluşturduğunuz imajı sisteme bağlamak için mount komutunu kullanırsınız. Squashfs bağlama işlemi loop device üzerinden gerçekleşir.
# Mount noktası oluşturun
sudo mkdir -p /mnt/uygulama
# Temel mount işlemi
sudo mount -t squashfs /opt/imajlar/uygulama.sqfs /mnt/uygulama
# Loop device'ı açıkça belirterek
sudo mount -o loop -t squashfs /opt/imajlar/uygulama.sqfs /mnt/uygulama
# Mount durumunu kontrol edin
mount | grep squashfs
df -h /mnt/uygulama
# İçeriği doğrulayın
ls -la /mnt/uygulama/
Squashfs dosya sistemi salt okunur olduğu için yazma girişimleri hata verecektir:
# Bu komut hata verir: "Read-only file system"
touch /mnt/uygulama/test.txt
# İzinleri de kontrol edin
cat /proc/mounts | grep squashfs
Overlay ile Yazılabilir Katman Ekleme
Squashfs’i salt okunur tutarken üzerine yazılabilir bir katman eklemek isteyebilirsiniz. Container teknolojilerinin de temelinde yatan bu yaklaşım için overlay (overlayfs) kullanırsınız.
# Gerekli dizinleri oluşturun
sudo mkdir -p /mnt/uygulama-overlay/{upper,work,merged}
# Squashfs'i lower layer olarak bağlayın
sudo mount -t squashfs /opt/imajlar/uygulama.sqfs /mnt/uygulama
# Overlayfs ile üzerine yazılabilir katman ekleyin
sudo mount -t overlay overlay
-o lowerdir=/mnt/uygulama,upperdir=/mnt/uygulama-overlay/upper,workdir=/mnt/uygulama-overlay/work
/mnt/uygulama-overlay/merged
# Artık merged dizininde hem okuyabilir hem yazabilirsiniz
ls /mnt/uygulama-overlay/merged/
touch /mnt/uygulama-overlay/merged/yeni-dosya.txt # Bu çalışır
# Orijinal squashfs değişmez, değişiklikler upper dizininde birikir
ls /mnt/uygulama-overlay/upper/
Bu yöntem özellikle şu senaryolarda çok işe yarıyor: bir uygulamayı squashfs içine koyuyorsunuz, her instance kendi upper layer’ını kullanıyor ve squashfs katmanı paylaşılıyor. Hem disk alanı tasarrufu sağlıyorsunuz hem de temel sistemi korumuş oluyorsunuz.
/etc/fstab ile Otomatik Bağlama
Production ortamında squashfs imajlarını sistem açılışında otomatik bağlamak için fstab kullanımı şart.
# /etc/fstab'a eklenecek satır
# Format: <device> <mountpoint> <type> <options> <dump> <pass>
/opt/imajlar/uygulama.sqfs /mnt/uygulama squashfs loop,ro,defaults 0 0
# Birden fazla imaj için
/opt/imajlar/base.sqfs /mnt/base squashfs loop,ro,defaults 0 0
/opt/imajlar/modüller.sqfs /mnt/moduller squashfs loop,ro,defaults 0 0
# fstab'ı test edin (sistemi yeniden başlatmadan)
sudo mount -a
# Bağlı olup olmadığını kontrol edin
findmnt /mnt/uygulama
Dikkat etmeniz gereken önemli bir nokta: squashfs imaj dosyası bağlanmadan önce mevcut olmalı. Eğer imaj dosyası ağ üzerinden veya geç mount edilen bir disk üzerindeyse, _netdev seçeneğini veya systemd mount unit’i kullanmanızı öneririm.
Gerçek Dünya Senaryosu: Uygulama Dağıtımı
Diyelim ki bir Python web uygulamasını squashfs içine paketleyip birden fazla sunucuya dağıtmak istiyorsunuz.
#!/bin/bash
# uygulama-paketle.sh
APP_DIR="/srv/myapp"
OUTPUT_DIR="/opt/releases"
VERSION=$(date +%Y%m%d-%H%M%S)
IMAJ_ADI="myapp-${VERSION}.sqfs"
# Bağımlılıkları kur ve uygulamayı hazırla
cd ${APP_DIR}
pip install -r requirements.txt -t ./vendor --quiet
# Squashfs imajı oluştur
mksquashfs ${APP_DIR} ${OUTPUT_DIR}/${IMAJ_ADI}
-comp zstd
-Xcompression-level 19
-b 256K
-e ${APP_DIR}/.git
-e ${APP_DIR}/__pycache__
-e ${APP_DIR}/*.pyc
-wildcards
-progress
-noappend
# İmajı doğrula
echo "İmaj oluşturuldu:"
unsquashfs -s ${OUTPUT_DIR}/${IMAJ_ADI}
# MD5 checksum oluştur
md5sum ${OUTPUT_DIR}/${IMAJ_ADI} > ${OUTPUT_DIR}/${IMAJ_ADI}.md5
echo "Tamamlandı: ${OUTPUT_DIR}/${IMAJ_ADI}"
echo "Boyut: $(du -sh ${OUTPUT_DIR}/${IMAJ_ADI} | cut -f1)"
Sunucu tarafında bu imajı devreye almak için:
#!/bin/bash
# imaj-devreye-al.sh
IMAJ_DOSYASI=$1
UYGULAMA_ADI="myapp"
MOUNT_NOKTA="/opt/apps/${UYGULAMA_ADI}"
SIMLINK="/opt/apps/current"
# Yeni mount noktası oluştur
sudo mkdir -p ${MOUNT_NOKTA}
# Checksum doğrula
if md5sum -c ${IMAJ_DOSYASI}.md5; then
echo "Checksum doğrulandı"
else
echo "HATA: Checksum uyuşmazlığı!"
exit 1
fi
# Mevcut mount'u kaldır
if mountpoint -q ${MOUNT_NOKTA}; then
sudo umount ${MOUNT_NOKTA}
fi
# Yeni imajı bağla
sudo mount -t squashfs ${IMAJ_DOSYASI} ${MOUNT_NOKTA}
# Sembolik linki güncelle (atomik deployment)
sudo ln -sfn ${MOUNT_NOKTA} ${SIMLINK}
echo "Uygulama devreye alındı: ${SIMLINK} -> ${MOUNT_NOKTA}"
Bu yaklaşımın güzelliği şu: atomik deployment yapıyorsunuz. Sembolik link güncellemesi tek bir işlemdir ve ya tamamen gerçekleşir ya da hiç gerçekleşmez. Geri almak da son derece basit: eski mount noktasına tekrar işaret etmeniz yeterli.
İmaj İçeriğini Çıkarma ve İnceleme
Bazen squashfs içini açmanız veya belirli dosyaları çıkarmanız gerekebilir. unsquashfs bunun için de kullanılır.
# Tüm içeriği mevcut dizine çıkar
unsquashfs /opt/imajlar/uygulama.sqfs
# Belirli bir dizine çıkar
unsquashfs -d /tmp/imaj-icerik /opt/imajlar/uygulama.sqfs
# Sadece belirli dosyaları çıkar
unsquashfs -d /tmp/config-cikari /opt/imajlar/uygulama.sqfs "etc/myapp/*"
# Çıkarma işlemini birden fazla thread ile hızlandır
unsquashfs -d /tmp/imaj-icerik -processors 8 /opt/imajlar/uygulama.sqfs
# Dosyaları çıkarmadan sadece bilgi al
unsquashfs -stat /opt/imajlar/uygulama.sqfs
Özellikle -stat çıktısı imaj hakkında çok değerli bilgiler verir: sıkıştırma algoritması, blok boyutu, oluşturma tarihi, dosya sayısı ve sıkıştırma oranı.
Sorun Giderme
Pratikte karşılaşılan bazı yaygın sorunlar ve çözümleri:
Yeterli loop device yok: Sistem varsayılan olarak sınırlı sayıda loop device açar. Çok sayıda squashfs imajı bağlarsanız bu sınıra çarpabilirsiniz.
# Mevcut loop device'ları listele
losetup -l
# Boş loop device'ları göster
losetup -f
# Gerekirse daha fazla loop device oluştur
sudo mknod -m 660 /dev/loop8 b 7 8
# ya da
sudo modprobe loop max_loop=64
# Kalıcı hale getirmek için:
echo "options loop max_loop=64" | sudo tee /etc/modprobe.d/loop.conf
Mount sonrası izin sorunları: Squashfs, oluşturulurken kaydedilen izinleri korur. Eğer dosyalar yanlış izinlerle oluşturulduysa bunu sonradan değiştiremezsiniz.
# İmaj oluştururken izinleri sıfırla
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs
-force-uid 1000
-force-gid 1000
# Ya da tüm dosyaları root sahipliğine al
mksquashfs /srv/uygulama /opt/imajlar/uygulama.sqfs
-force-uid root
-force-gid root
Sıkıştırılmış imajın bütünlüğünü test etme:
# İmaj bütünlüğünü test et (dosyaları çıkarmadan)
unsquashfs -ll /opt/imajlar/uygulama.sqfs > /dev/null && echo "İmaj sağlıklı" || echo "İmaj bozuk"
# Daha kapsamlı doğrulama
unsquashfs -d /tmp/test-verify -force /opt/imajlar/uygulama.sqfs &&
echo "Başarıyla çıkarıldı" &&
rm -rf /tmp/test-verify
Güvenlik Konuları
Salt okunur olması squashfs’i güvenlik açısından çekici kılar ama bazı noktaları göz ardı etmemelisiniz.
Squashfs şifreleme desteklemez. Eğer içeriğin şifreli olması gerekiyorsa, imajı şifreli bir block device (LUKS) üzerine yerleştirmeniz ya da dm-crypt ile birlikte kullanmanız gerekir.
Ayrıca squashfs, mount eden kullanıcının imaj dosyasına okuma erişimi olmasını gerektirir. İmaj dosyanızın izinlerini dikkatli ayarlayın:
# İmaj dosyasını yalnızca root okuyabilsin
sudo chown root:root /opt/imajlar/uygulama.sqfs
sudo chmod 600 /opt/imajlar/uygulama.sqfs
# Sadece belirli bir grup okuyabilsin
sudo chown root:uygulamagrubu /opt/imajlar/uygulama.sqfs
sudo chmod 640 /opt/imajlar/uygulama.sqfs
Sonuç
Squashfs, sistem yöneticisinin araç kutusunda mutlaka bulunması gereken ama çoğu zaman gözden kaçan bir teknolojidir. Salt okunur olma zorunluluğu ilk başta kısıt gibi görünse de, bu özellik aslında belirli senaryolarda tam olarak istediğiniz şeydir: değişmez altyapı (immutable infrastructure), güvenli uygulama dağıtımı, disk alanı optimizasyonu.
Özellikle şu kullanım senaryolarında squashfs’i öncelikli tercihim olarak konumlandırıyorum: birden fazla sunucuya aynı uygulama paketini dağıtırken, güvenlik açısından hassas ortamlarda sistem bileşenlerini değiştirilemez hale getirirken ve depolama maliyetlerini düşürmeniz gereken büyük ölçekli arşivlerde.
Overlayfs ile kombinasyonu ise modern container altyapısının temel taşlarından biri haline gelmiştir; bu teknoloji çiftini iyi anlamak, Docker ve Kubernetes’in derinliklerinde neler döndüğünü kavramak için de güçlü bir temel oluşturur. Üretim ortamında denemeden önce mutlaka test ortamında pratik yapmanızı ve özellikle mount/umount döngüsünü otomatize eden betiklerinizi kapsamlı şekilde test etmenizi öneririm.
