सबसे पहले आप इस तरह के मुद्दों के बारे में हैरान नहीं होते ।
यह सिर्फ सीमित नहीं है, tmpfs
बल्कि NFSv4 के साथ एक चिंता का विषय है
।
यदि कोई अनुप्रयोग विरल फ़ाइल में 'छेद' पढ़ता है, तो फ़ाइल सिस्टम शून्य ब्लॉकों को "वास्तविक" ब्लॉक में शून्य से भर देता है, और उन्हें अनुप्रयोग में वापस कर देता है।
जब md5sum
किसी फ़ाइल को स्कैन करने का प्रयास किया जाता है, तो यह स्पष्ट रूप से अनुक्रमिक क्रम में ऐसा करने का विकल्प चुनता है
, जो कि md5sum क्या करने का प्रयास कर रहा है, इसके आधार पर बहुत कुछ समझ में आता है।
जैसा कि फ़ाइल में मौलिक रूप से "छेद" होते हैं, यह अनुक्रमिक रीडिंग (कुछ स्थितियों में) फाइल को भरने के लिए ऑपरेशन की तरह लिखने पर एक कॉपी का कारण बनता है। इसके बाद fallocate()
फाइलसिस्टम सपोर्ट में लागू किया जाता है या नहीं, इसके आसपास एक गहरा मुद्दा बन जाता है FALLOC_FL_PUNCH_HOLE
।
सौभाग्य से, न केवल इसका tmpfs
समर्थन करता है, बल्कि छिद्रों को वापस खोदने के लिए एक तंत्र है।
सीएलआई उपयोगिता का उपयोग करके fallocate
हम इन छिद्रों का पता लगाने और फिर से खुदाई करने में सफल हो सकते हैं।
प्रति 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
जब आप ब्लॉक डिवाइस (क्रमिक रीडिंग का अनुरोध करते हैं) के
खिलाफ फाइल स्तर पर काम करते हैं, तो आप सटीक अंतराल पर ट्रिपिंग कर रहे हैं कि कैसे syscall को काम करना चाहिए। हम इसे कार्रवाई में देख सकते हैं:md5sum
fallocate()
कार्रवाई में, आपके उदाहरण का उपयोग करते हुए हम निम्नलिखित देखते हैं:
$ 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
अब ... जो आपके मूल प्रश्न का उत्तर देता है। मेरा सामान्य आदर्श वाक्य "अजीब है" तो मैंने आगे खोदा ...
$ 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
आपको लगता है कि केवल के कार्य को देखने के प्रदर्शनlosetup
स्पार्स फ़ाइल का आकार बदल जाता है। तो यह कहाँ tmpfs
, HOLE_PUNCH तंत्र fallocate
, और ब्लॉक उपकरणों को प्रतिच्छेद का एक दिलचस्प संयोजन बन जाता है।