sala@home:~$

sparse fájlok

Ha szükségem volt egy nagy tesztfájlra, többnyire a következő módszerrel készítettem a fájlt:

$ time dd if=/dev/zero bs=$((1024*1024)) count=1024 of=large.dat
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 12.3933 s, 86.6 MB/s
real    0m12.394s
user    0m0.005s
sys     0m0.480s

Az 1GB-os fájl elkészítése kb. 12 másodperc volt.

Listázzuk ki a fájlt, az egyszerűség kedvéért 1024 bájtos blokkméretben megnézve az elfoglalt blokkok számát:

$ ls -lsk large.dat 
1048580 -rw-r--r-- 1 user live 1073741824 Jun 11 17:18 large.dat

Az 1048580 db. blokk reálisnak tűnik, 1024-gyel szorozva kb. 1GB-ot kapunk, a különbség (4096 byte) elhanyagolható.

Mivel a fájlt csupa 0-ból áll, elvileg van egy másik mód is az 1GB-os fájl létrehozására:

$ time dd if=/dev/zero bs=1 count=1 of=large2.dat seek=$((1024*1024*1024-1))
1+0 records in
1+0 records out
1 byte (1 B) copied, 6.7613e-05 s, 14.8 kB/s
real    0m0.001s
user    0m0.000s
sys     0m0.000s

Ebben a példában dd-vel egyetlen bájtot iratok csak a fájlba, azt viszont seek segítségével pont ugyanoda írom ahol az előző példában a fájl vége volt. A parancs döbbenetesen gyorsan lefut, elég nyilvánvaló, hogy ennyi idő nem elég 1GB-nyi 0 lemezre írására.

Listázzuk ki a két fájlt:

$ ls -lsk large*
      4 -rw-r--r-- 1 user live 1073741824 Jun 11 17:19 large2.dat
1048580 -rw-r--r-- 1 user live 1073741824 Jun 11 17:18 large.dat

A fájlméret bájtra megegyezik, viszont az új fájl összesen csak 4 blokkot foglal az 1 GB helyett mivel sparse (ritka?) fájl jön létre, a rendszer nem tárolja feleslegesen a sok-sok 0 bájtot.

Nem minden fájlrendszer támogatja ezt, én ext3-mal teszteltem.

Az előnyei mellett nyilvánvaló veszélyei is vannak az ilyen fájloknak, például az ilyen fájlokat módosítva könnyen elfogyhat a lemezen a szabad hely akkor is, ha a látszólagos fájlméret nem nő.