Öncelikle , bu tür konular hakkında kafa karıştırıcı yalnız değilsiniz .
Bu sadece bunlarla sınırlı değildir, tmpfs
aynı zamanda NFSv4 ile belirtilen bir endişe
kaynağıdır .
Bir uygulama seyrek bir dosyada 'delikler' okursa, dosya sistemi boş blokları sıfırlarla dolu "gerçek" bloklara dönüştürür ve uygulamaya geri döndürür.
Bir md5sum
dosyayı taramaya çalışırken açıkça bunu sıralı bir sırayla yapmayı seçer
, bu da md5sum'un ne yapmaya çalıştığına bağlı olarak çok mantıklıdır.
Dosyada temel olarak "delikler" olduğundan, bu sıralı okuma (bazı durumlarda) dosyayı doldurmak için yazma benzeri işlemde bir kopyaya neden olacaktır. Bu daha sonra fallocate()
dosya sisteminde desteklendiği gibi uygulanıp uygulanmadığı konusunda daha derin bir sorunla karşılaşır FALLOC_FL_PUNCH_HOLE
.
Neyse ki, sadece bunu tmpfs
desteklemekle kalmaz, aynı zamanda delikleri "kazmak" için bir mekanizma vardır.
CLI yardımcı programını kullanarak fallocate
bu delikleri başarılı bir şekilde algılayabilir ve yeniden kazabiliriz.
Başı man 1 fallocate
:
-d, --dig-holes
Detect and dig holes. This makes the file sparse in-place, without
using extra disk space. The minimum size of the hole depends on
filesystem I/O block size (usually 4096 bytes). Also, when using
this option, --keep-size is implied. If no range is specified by
--offset and --length, then the entire file is analyzed for holes.
You can think of this option as doing a "cp --sparse" and then
renaming the destination file to the original, without the need for
extra disk space.
See --punch-hole for a list of supported filesystems.
fallocate
olsa dosya düzeyinde çalışır ve md5sum
bir blok cihaza (sıralı okumalar talep) karşı çalıştırırken fallocate()
sistem aramasının nasıl çalışması gerektiği arasındaki boşluğu açarsınız. Bunu çalışırken görebiliriz:
Eylemde, örneğinizi kullanarak aşağıdakileri görüyoruz:
$ fs=$(mktemp -d)
$ echo ${fs}
/tmp/tmp.ONTGAS8L06
$ dd if=/dev/zero of=${fs}/sparse100M conv=sparse seek=$((100*2*1024-1)) count=1 2>/dev/null
$ echo "Before:" "$(ls ${fs}/sparse100M -s)"
Before: 0 /tmp/tmp.ONTGAS8L06/sparse100M
$ sudo losetup /dev/loop0 ${fs}/sparse100M
$ sudo md5sum /dev/loop0
2f282b84e7e608d5852449ed940bfc51 /dev/loop0
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 102400 /tmp/tmp.ONTGAS8L06/sparse100M
$ fallocate -d ${fs}/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 0 /tmp/tmp.ONTGAS8L06/sparse100M
Şimdi ... bu temel sorunuza cevap veriyor. Benim genel sloganım "garip olsun" bu yüzden daha fazla kazdık ...
$ fs=$(mktemp -d)
$ echo ${fs}
/tmp/tmp.ZcAxvW32GY
$ dd if=/dev/zero of=${fs}/sparse100M conv=sparse seek=$((100*2*1024-1)) count=1 2>/dev/null
$ echo "Before:" "$(ls ${fs}/sparse100M -s)"
Before: 0 /tmp/tmp.ZcAxvW32GY/sparse100M
$ sudo losetup /dev/loop0 ${fs}/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 1036 /tmp/tmp.ZcAxvW32GY/sparse100M
$ sudo md5sum ${fs}/sparse100M
2f282b84e7e608d5852449ed940bfc51 /tmp/tmp.ZcAxvW32GY/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 1036 /tmp/tmp.ZcAxvW32GY/sparse100M
$ fallocate -d ${fs}/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 520 /tmp/tmp.ZcAxvW32GY/sparse100M
$ sudo md5sum ${fs}/sparse100M
2f282b84e7e608d5852449ed940bfc51 /tmp/tmp.ZcAxvW32GY/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 520 /tmp/tmp.ZcAxvW32GY/sparse100M
$ fallocate -d ${fs}/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 516 /tmp/tmp.ZcAxvW32GY/sparse100M
$ fallocate -d ${fs}/sparse100M
$ sudo md5sum ${fs}/sparse100M
2f282b84e7e608d5852449ed940bfc51 /tmp/tmp.ZcAxvW32GY/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 512 /tmp/tmp.ZcAxvW32GY/sparse100M
$ fallocate -d ${fs}/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 0 /tmp/tmp.ZcAxvW32GY/sparse100M
$ sudo md5sum ${fs}/sparse100M
2f282b84e7e608d5852449ed940bfc51 /tmp/tmp.ZcAxvW32GY/sparse100M
$ echo "After:" "$(ls ${fs}/sparse100M -s)"
After: 0 /tmp/tmp.ZcAxvW32GY/sparse100M
Sen sadece hareket görüyoruz gerçekleştirenlosetup
seyrek dosyanın boyutunu değiştirir. Böylece bu tmpfs
, HOLE_PUNCH mekanizmasının fallocate
ve blok cihazlarının kesiştiği yerin ilginç bir kombinasyonu haline gelir .