Sıkıştırılmış Dosya Sistemini Oluşturmak ve Kullanmak

Temel Adımlar

Tek bir dizin (örneğin /some/dir) kullanarak sıradan bir dosyada (dosya sistemi görüntüsü) çıktısı oluşacak bir sıkıştırılmış dosya sistemi oluşturmak için aşağıdaki komutu kullanmak yeterlidir.

bash# mksquashfs /some/dir dir.sqsh

Bu komutun sonucu olarak mksquashfs sıkıştırma işlemini yapacak ve düğüm sayısını, yazılan veri boyutunu ve ortalama sıkıştırma oranını çıktı olarak verecektir. Böylece /some/dir dizininin görüntüsünü dir.sqsh dosyasına almış olduk. mount komutunu kullanarak bu dosyayı bağlayabilirsiniz.

bash# mkdir /mnt/dir
bash# mount dir.sqsh /mnt/dir -t squashfs -o loop

Her şeyin yolunda olup olmadığını kontrol edelim.

bash# ls /mnt/dir

Eğer çıktıyı doğrudan bir aygıta (örneğin /dev/fd0'daki disketinize) almak isterseniz:

bash# mksquashfs /some/dir /dev/fd0

Bu aygıtı mount ile bağlayalım;

bash# mount /dev/fd0 /mnt/floppy -t squashfs

Her şeyin yerli yerinde olup olmadığını kontrol edelim;

bash# ls /mnt/floppy

Dosya Sistemini Sıkıştırmak

Burada anlatılan işlemler salt okunur sıkıştırılmış dosya sisteminin kullanılabileceği çoğu duruma uygundur. Bu durumlar sıklıkla değişmeyen büyük FTP/HTTP arşivleri, sıkıştırılmış /usr dizinleri veya başka bir şey olabilir.

Örnek 1

İçerisinde bir çok dosyanın bulunduğu bir /var/arch dizininizin olduğunu ve bu dizini sıkıştırılmış dosya sistemine dönüştürerek kök dizininde bir dosya (bağlayıp kullanabileceğiniz bir dosya sistemi görüntüsü de olabilir) olarak tutmak istediğinizi düşünelim. Bunun için aşağıdaki adımları izlemeniz gerekir:

Dizini sıkıştırın, loopback aygıtı üzerinden denemek için bağlayın:

bash# mksquashfs /var/arch /var/arch.sqsh
bash# mkdir /mnt/tmp
bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
bash# ls /mnt/tmp

Herşey beklediğiniz gibi giderse her açılışta otomatik bağlanması için /etc/fstab dosyasına aşağıdaki satırı ekleyin:

/var/arch.sqsh	/var/arch	squashfs	ro,defaults	0 0

Geçici bağlanma noktasından çözüp fstab girdisine uygun yeniden bağlayın:

bash# umount /mnt/tmp
bash# mount /var/arch

Son olarak her şeyin yolunda olduğunu kontrol edin:

bash# ls /var/arch

Örnek 2

Bu örnekte iki disk bölümünüz olsun: /dev/hda6 (boş) ve /dev/hda7 (veri ile dolu, /var/arch dizinine bağlı ve /dev/hda6'dan daha büyük). İstediğiniz şey de /dev/hda7'yi sıkıştırıp /dev/hda6'ya taşımak ve /dev/hda7'yi başka amaçlar için kullanmak olsun. /etc/fstab dosyasında aşağıdaki gibi bir satır olduğunu kabul edeceğiz (reiserfs örnek olarak kullanılmıştır):

/dev/hda7	/var/arch	reiserfs	defaults	0 0

Bir önceki örnektekine benzer şeyler yapalım:

bash# mksquashfs /var/arch /var/arch.sqsh
bash# mkdir /mnt/tmp
bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
bash# ls /mnt/tmp

Her şey yolunda gitmişse /dev/hda7'yi çözün ve dd komutunu kullanarak /var/arch.sqsh dosyasını /dev/hda6 olarak kopyalayın:

bash# umount /dev/hda7
bash# dd if=/var/arch.sqsh of=/dev/hda6

Artık /etc/fstab dosyasında /dev/hda7 için bulunan satırı aşağıdaki gibi değiştirebilirsiniz:

/dev/hda6	/var/arch	squashfs	ro,defaults	0 0

Yeni dosya sistemini bağlayıp kontrol edin:

bash# mount /var/arch
bash# ls /var/arch

Artık ihtiyacınız olmayan sistem görüntüsünü silmeyi unutmayın:

bash# rm /var/arch.sqsh

Küçük/Gömülü Sistem Yaratmak

"Küçük/Gömülü" terimi ile floppy diskler, IDE/USB flash diskler, iso9660 CD-ROM'lar, küçük boyutlu sabit diskler ve benzerleri ile açılması için imal edilmiş Linux sistemleri kastediyorum. İster bütün kök dizinini tek aygıt üzerinde (tek disk bölümü veya tek disket) tutun, isterseniz modüler (birden çok disket ya da disk bölümü) bir yapınız olsun izlenecek yol aynıdır. Böyle Linux sistemlerini yaratmak bu belgenin kapsamının dışındadır. http://www.tldp.org adresinde bu konuyla ilgili NASIL belgelerine ve kılavuzlara ulaşabilirsiniz.

Disket/Flash/Sabit Disk üzerinde Sıkıştırılmış Dosya Sistemi

Küçük diskler üzerinde Linux sistemler yaratırken SquashFS kullanmak için minimal sistemler yaratırken izlenen adımlar izlenmelidir.

  • Sisteminizin sıkıştırılmış dosya sistemlerini bağlayabilmesi için derlediğiniz çekirdekte SquashFS desteğini aktif edin.
  • Salt okunur ram diskleri ve/veya kök ve/veya diğer diskleri oluşturmak için mksquashfs komutunu kullanın.
  • Sıkıştırılmış dosya sistemlerini bağlayabilmek için /etc/fstab dosyasında ve başlangıç betiklerinde dosya sistemi olarak squashfs'i belirtin.

Örnek Disket

Disket sistem ağacınız /home/user/floppylinux dizininde bulunsun ve sizin kök dosya sistemini bir diskette, /usr dizinini bir diğerinde bulundurmak istediğinizi farzedelim. Bunun için şunları yapmalısınız:

bash# cd /home/user
bash# mksquashfs floppylinux root.sqsh -e usr
bash# mksquashfs floppylinux/usr usr.sqsh
Not

Gördüğünüz gibi -e seçeneğini kullanarak /usr dizinini kök dosya sistemi görüntüsüne dahil etmedik.

Not

Kök dizininizin /etc/fstab dosyasında veya başlangıç betiklerinde /usr dizininin tipini squashfs olarak belirtmeyi unutmayın.

Disket sürücünüze bir disket yerleştirin (bu disket üzerinde bir dosya sistemi olduğunu, lilo veya grub bulunduğunu ve kök dosya sisteminin /boot altında olacağını kabul ediyorum):

bash# mount /mnt/floppy
bash# cp root.sqsh /mnt/floppy/boot

İşlem bittiğinde kök disketini çözün, /usr için yeni bir disket takın ve usr dosya sisteminitaşımak için dd'yi kullanın:

bash# dd if=usr.sqsh of=/dev/fd0

CDROM üzerinde Sıkıştırılmış Dosya Sistemi

SquashFS ile (örneğin) çalışan cd'lerde kullanılacak büyük dosya sistemlerini de sıkıştırabilirsiniz. Bu amaçla SquashFS ile UnionFS birlikte kullanılır.

  • Hedef sistemin Linux çekirdeğinde SquashFS'i aktif edin.
  • Sıkıştırılmış bir kök dosya sistemi oluşturun.
  • Sıkıştırılmış dosya sistemlerini bağlayabilmek için /etc/fstab dosyasında ve başlangıç betiklerini düzenleyin.

Çalışan Linux sisteminizin dışında bir kök dosya sistemi yarattıysanız mksquashfs komutunu -e seçeneği ile kullanarak gerçek birer dosya sistemi olmayan /proc, /sys (2.5.x çekirdek sonrası) ve /dev dizinlerini dahil etmeyin. Ayrıca mksquashfs ile yaratılan dosya sistem görüntüsünün kendisini de çıkaracağınız dizinler arasına eklemeyi unutmayın (bunları neden dahil etmediğimizi bildiğinizi düşünüyorum).

Dosya Sistemini Yazılabilir Yapmak

Yukarıda da bahsettiğimiz gibi SquashFS'in ilginç bir kullanımı da UnionFS dosya sistemi ile birlikte kullanılmasıdır. Bu sayede salt okunur dosya sistemi için kopyala-üzerine yaz (copy-on-write) kavramının olanakları arttırılabilir. (UnionFS için http://www.filesystems.org/project-unionfs.html adresine bakabilirsiniz.)

Bir örnek olması için /home/user dizinini sıkıştırılmış kullanmak ve bu dizinde değişiklik yapma veya yeni dosyalar yazma olanağınızı da kaybetmek istemediğinizi kabul edelim.

ro.fs sıkıştırılmış dosya sistemini ve rw.fs dizinini oluşturun:

bash# mksquashfs /home/user1 ro.fs
bash# mkdir /home/rw.fs

Sıkıştırılmış ro.fs dosya sistemini loopback aygıtı ile bağlayın:

bash# mount -t squashfs ro.fs /mnt -o loop

Unionfs dosya sistemini bağlayın, böylece /mnt ve /home/rw.fs dizinleri /home/user1 altında birleşmiş gibi olur.

bash# cd /home
bash# mount -t unionfs -o dirs=rw.fs=rw:/mnt=ro unionfs user1

Gördüğünüz gibi /home/user1 dizininde yeni dosyalar oluşturabilirsiniz:

bash# cd /home/user1
bash# touch file1
bash# ls

Unionfs ve squashfs dosya sistemlerini çözün ve /home/user1 dizininin içeriğini listeleyin:

bash# cd ..
bash# umount /home/user1
bash# umount /mnt

bash# ls /home/user1
bash# ls /home/rw.fs

Yeni oluşturulan file1 dosyasını /home/rw.fs içinde görebilirsiniz.

Kaarlı ve sıkıştırılmış dosya sisteminize yeni dosyalar eklemek istediğinizde onları mevcut olanlara eklemeniz gerekir:

bash# mksquashfs /home/rw.fs /home/ro.fs

Artık sıkıştırılmış ev dizininizin başlangıçta bağlanması için aşağıdakileri sırasıyla yapmalısınız.

Squashfs ve unionfs modüllerinin başlangıçta yüklenmesini sağlayın.

bash# echo squashfs >> /etc/modules
bash# echo unionfs >> /etc/modules

Yazılabilir dosyanın sahibini user1 olarak değiştirin.

chown user1 /home/rw.fs

/etc/fstab dosyasına aşağıdaki satırları ekleyerek açılışta squashfs ve unionfs dosya sistemlerinin bağlanmasını sağlayın:

...
/home/ro.fs  /mnt squashfs loop 0 0
unionfs /home/user1 unionfs dirs=/home/rw.fs=rw:/mnt=ro 0 0