- 0 से भरी हुई फ़ाइल को loop device के रूप में mount करके
mkfs.ext4से पहले और बाद की स्थिति की तुलना की गई है, ताकि byte स्तर पर दिखाया जा सके कि ext4 खाली जगह पर कौन-सी संरचनाएँ रखता है - प्रयोग में इस्तेमाल की गई फ़ाइल
/dev/zeroसे बनाई गई 8 ब्लॉक आकार की है, और इमेज को 1024-byte चौड़ाई तथा 64-byte ऊँचाई वाले ब्लॉकों के रूप में व्यवस्थित किया गया है, जहाँ एक pixel एक byte के बराबर है - सिर्फ
odआउटपुट से ext4 की संरचना पढ़ना कठिन है, इसलिए 0x00 से भरी हुई स्थिति औरmkfs.ext4के बाद के byte वितरण की तुलना इमेज के रूप में की गई है - जिन bytes का मान 0x00 है, वे ext4 के स्वामित्व वाले डेटा होने पर भी खाली जगह जैसे दिख सकते हैं, इसलिए केवल मूल विज़ुअलाइज़ेशन से स्वामित्व वाली संरचनाओं को पूरी तरह अलग करना मुश्किल है
- 1024-byte की
/dev/urandomफ़ाइल कॉपी करने के बाद उसी pattern को खोजकर रंग से दिखाया गया है, ताकि ext4 metadata और user data की स्थिति दोनों को साथ देखा जा सके
खाली फ़ाइल पर ext4 इमेज बनाना
- यह प्रयोग देखता है कि जब केवल 0x00 से भरी खाली drive पर
mkfs.ext4चलाया जाता है, तो ext4 कौन-सी byte संरचनाएँ जोड़ता है - असली
/dev/sdaजैसी live drive कोddसे संभालना जोखिम भरा है, इसलिए VM की अतिरिक्त drive की जगह सामान्य फ़ाइल को loop device के रूप में इस्तेमाल किया गया है mountऔरumountअलगlosetupके बिना भी loop फ़ाइल को सीधे संभाल सकते हैंmount -o loop <foo_file> <bar_dir>umount <bar_dir>
प्रयोग के लिए ब्लॉक फ़ाइल की संरचना
- प्रयोग हमेशा
/dev/zeroको input बनाकरddसे तैयार की गई खाली फ़ाइल से शुरू होता है - फ़ाइल का आकार इस तरह निकाला गया है कि अंतिम इमेज 8 ब्लॉक के रूप में दिखाई दे
- हर ब्लॉक 1024 pixel/byte चौड़ा
- 64 pixel/byte ऊँचा
- बनाने का कमांड यह है
dd if=/dev/zero of=blockfile.ext4 bs=$((64 * 1024)) count=8
- बनने के तुरंत बाद
odआउटपुट पूरी तरह 0x00 से भरी हुई, अनुमानित स्थिति दिखाता है - इस्तेमाल की गई drive का आकार journal शामिल करने के लिए बहुत छोटा है, इसलिए journal सहित विज़ुअलाइज़ेशन को आगे के प्रोजेक्ट के लिए छोड़ा गया है
mkfs.ext4 के बाद दिखने वाली संरचना
mkfs.ext4चलाने के बाद पहले केवल 0x00 वाली फ़ाइल में कई मान दिखाई देने लगते हैं, और ext4 द्वारा बनाई गई filesystem संरचना सामने आती है- लेकिन
odका byte आउटपुट इतना सूक्ष्म है कि पूरी layout समझना कठिन हो जाता है - जब इसे ऐसी इमेज में बदला जाता है जहाँ एक pixel एक byte दिखाता है, तब block फ़ाइल को अधिक व्यापक नज़रिए से देखा जा सकता है
- खाली फ़ाइल की इमेज पूरी तरह 0x00 वाली drive दिखाती है, और
mkfs.ext4के बाद की इमेज बताती है कि ext4 का डेटा डिस्क पर कहाँ रखा गया है
user data से अलग पहचानने का तरीका
- मूल इमेज सीधे ext4 bytes और non-ext4 bytes में भेद नहीं करती
- कोई byte ext4 के स्वामित्व वाले डेटा का हिस्सा हो, फिर भी यदि उसका मान 0x00 है, तो उसे दूसरे 0x00 bytes जैसा ही रंग दिया जाता है
- ext4 डेटा और “user” डेटा को अलग करने के लिए 1024-byte आकार की
/dev/urandomफ़ाइल बनाई जाती है और उसे mounted loop device पर कॉपी किया जाता है - blockfile पढ़ते समय विज़ुअलाइज़ेशन कोड जाँचता है कि अगले 1024 bytes संदर्भ फ़ाइल के 1024 bytes से मेल खाते हैं या नहीं
- यदि मेल खाते हैं, तो उन 1024 pixels को user data के रूप में रंग से चिह्नित किया जाता है
- इस तरीके से ext4 द्वारा बनाई गई संरचना और कॉपी किए गए user file data दोनों को साथ दिखाने वाली इमेज मिलती है
animation और ext2 तुलना
- स्थिर इमेज के बाद, इसी तरीके के आधार पर animated GIF बनाया गया है
- हर frame के बीच user data फ़ाइल को drive पर तीन बार कॉपी किया जाता है
- हर frame में केवल एक बार
cpकरने की तुलना में यह अधिक प्रभावी प्रस्तुति देता है - GIF का आकार भी छोटा हो जाता है
- हर frame में केवल एक बार
- तुलना के लिए ext2 का एक समान animation भी दिया गया है
संदर्भ लिंक
- Wikipedia: ext4 का अवलोकन
- ext4 wiki: ext4 wiki
- Admin Guide: kernel ext4 admin guide
- e2fsprogs: ext filesystem tools
- ext4 Data Structures and Algorithms: ext4 data structures और algorithms दस्तावेज़
1 टिप्पणियां
Hacker News की राय
कुछ साल पहले FOSDEM में ext4 का वास्तविक graphical visualization किया था, वीडियो यहां है और visualization करीब 20 मिनट के आसपास शुरू होता है
https://archive.fosdem.org/2019/schedule/event/nbdkit/
प्रेजेंटेशन में जहां "नीले" filesystem trim की बात है, वह थोड़ा भ्रमित कर सकता है; लगता है FOSDEM प्रोजेक्टर वह हल्का नीला रंग ठीक से नहीं दिखा पा रहा था जो मैं इस्तेमाल कर रहा था. प्रेजेंट करते समय मुझे पता नहीं चला और लैपटॉप स्क्रीन पर वह ठीक दिख रहा था. ब्लॉग पर रंग सही render हुए companion वीडियो भी है: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
बहुत से लोग computer इस्तेमाल को आसान बनाने की कोशिश करते हैं, और इस प्रक्रिया में लगता है कि वे चीजें गायब हो रही हैं जो बिना जानबूझकर सिखाए भी स्वाभाविक रूप से जिज्ञासा जगाती थीं और थोड़ा-थोड़ा सिखा देती थीं
पुराने कंप्यूटरों की लाल hard disk indicator light की तरह—एक छोटी-सी चीज जो बताती थी कि disk काम कर रही है. अगर वह किसी खास pattern में blink करती और तेज disk-read की आवाज संतोषजनक ढंग से जारी रहती, तो पता चल जाता था कि game इस बार सच में load होने वाला है. जिज्ञासु लोगों के लिए advanced view को छिपाकर मगर मौजूद रखना एक अच्छा समझौता लगता है; और ऐसे ही लोग अगली पीढ़ी के computer nerd बनकर दुनिया चलाने की संभावना रखते हैं
command line पर मिलते-जुलते data visualization बनाने वाली pixd नाम की utility है: https://github.com/FireyFly/pixd
हालांकि यह binary data का सिर्फ static representation दिखाती है, और buredoranna के animated GIF जितनी शानदार नहीं है, जिसमें filesystem changes समय के साथ दिखते हैं. ऐसे pixel arrays को line-by-line draw करने के बजाय Hilbert curve पर रखना उपयोगी हो सकता है. यह तरीका मैंने Ghidra plugin cantordust से सीखा, और 3blue1brown Hilbert curve pixel arrays के प्रभावी होने के पीछे की mathematical intuition देता है
https://inside.battelle.org/blog-details/battelle-publishes-open-source-binary-visualization-tool
https://www.youtube.com/watch?v=3s7h2MHQtxc&t=311s
filesystem I/O को visualize करने वाला nbdkit demo दिलचस्प था: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
इस लेख से प्रेरित होकर यह experiment किया
dd if=/dev/zero bs=1K count=$(( 256 * 3 )) of=a.ext4mfks.ext4 a.ext4mkdir asudo mount a.ext4 acd asudo chown 1000:1000 .python3 -c 'open("a", "wb").write(b"\xff\x00\x00" * 2000)'python3 -c 'open("b", "wb").write(b"\xff\xff\x00" * 2000)'python3 -c 'open("c", "wb").write(b"\xff\x00\xff" * 2000)'cd ..sudo umount a(echo -n 'P6\n512 512\n255\n' ; cat a.ext4 ) > a.ppmconvert a.ppm a.pngबनी हुई a.png को वापस बदला जा सकता है. उसे फिर
.ppmfile में convert करने के बाद पहले 15 bytes skip करें, तो एक valid.ext4मिलना चाहिएबेहद शानदार. इस तरह का data visualization यह समझने में बहुत मदद करता है कि disk format असल में disk पर data कैसे व्यवस्थित करता है—मसलन कुछ usage के लिए metadata को सावधानी से पहले से allocate करने जैसी details
मैं यह भी देखना चाहता था कि space भर जाने पर क्या होता है, लेकिन अफसोस animation उससे पहले ही खत्म हो गया
पुराने Windows 95/98 defragmenter को computer के सामने बैठकर चलते देखना बचपन की अच्छी यादों में से है: https://academy.avast.com/hs-fs/hubfs/New_Avast_Academy/how_to_defrag_your_pc_hard_drive_academy_refresh/img-06.png?width=600&name=img-06.png
innodb_ruby याद आया: https://github.com/jeremycole/innodb_ruby
यह InnoDB structure को visualize करने और सीखने के लिए बहुत उपयोगी tools का set है. इस्तेमाल का example यहां है: https://blog.jcole.us/2014/10/02/visualizing-the-impact-of-ordered-vs-random-index-insertion-in-innodb/
अगर author यह comment देख रहे हों, तो GIF को video में बदलने से भेजे जाने वाले bytes कम होंगे और users pause, seek, speed control जैसे video controls इस्तेमाल कर पाएंगे
उदाहरण के लिए
ffmpeg -i ext4.gif -pix_fmt yuv420p -c:v libx264 ext4.mp4की तरह convert किया जा सकता हैKaitai IDE से कई binary formats को byte-level, यहां तक कि bit-level तक visualize किया जा सकता है. अगर मुझे सही याद है तो ext4 definition file भी है
यह diagram देखकर सोचने लगा कि क्या ऐसा कोई filesystem है जो metadata को अलग device पर store कर सकता हो
उदाहरण के लिए data HDD पर रहे और metadata जुड़े हुए SSD पर. हालांकि metadata को memory में cache करना कहीं आसान होता है, इसलिए शायद extra complexity की भरपाई करने लायक फायदा बड़ा नहीं होगा
https://klarasystems.com/articles/openzfs-understanding-zfs-vdev-types/