การแสดงภาพ Ext4
(buredoranna.github.io)- เมานต์ไฟล์ที่เติมด้วย 0 เป็น loop device แล้วเปรียบเทียบก่อนและหลัง
mkfs.ext4เพื่อแสดงในระดับไบต์ว่า ext4 วางโครงสร้างใดบ้างบนพื้นที่ว่าง - ไฟล์ทดลองมีขนาด 8 บล็อก ที่สร้างจาก
/dev/zeroและภาพถูกจัดเหมือนบล็อกกว้าง 1024 ไบต์และสูง 64 ไบต์ โดยหนึ่งพิกเซลสอดคล้องกับหนึ่งไบต์ - การอ่านโครงสร้าง ext4 จากผลลัพธ์
odเพียงอย่างเดียวทำได้ยาก จึงเปรียบเทียบสถานะที่เติมด้วย 0x00 กับ การกระจายของไบต์ หลังmkfs.ext4ในรูปภาพ - ไบต์ที่มีค่า 0x00 อาจดูเหมือนพื้นที่ว่างแม้จะเป็นข้อมูลที่ ext4 เป็นเจ้าของอยู่ ทำให้การแสดงภาพพื้นฐานแยก โครงสร้างความเป็นเจ้าของ ได้ไม่สมบูรณ์
- หลังคัดลอกไฟล์
/dev/urandomขนาด 1024 ไบต์ แล้วค้นหาแพตเทิร์นเดียวกันเพื่อทำเครื่องหมายด้วยสี จะเห็นทั้งเมทาดาทาของ ext4 และ ตำแหน่งข้อมูลผู้ใช้
สร้างอิมเมจ ext4 บนไฟล์ว่าง
- เป็นการทดลองเพื่อตรวจสอบว่าเมื่อรัน
mkfs.ext4บนไดรฟ์ว่างที่เติมด้วย 0x00 ล้วน ext4 จะเพิ่ม โครงสร้างไบต์ อะไรบ้าง - การใช้
ddกับไดรฟ์สดจริงอย่าง/dev/sdaนั้นอันตราย จึงใช้ไฟล์ทั่วไปเป็น loop device แทนไดรฟ์เสริมใน VM mountและumountสามารถจัดการไฟล์ loop ได้โดยตรงโดยไม่ต้องใช้losetupแยกต่างหากmount -o loop <foo_file> <bar_dir>umount <bar_dir>
การจัดเตรียมไฟล์บล็อกสำหรับทดลอง
- การทดลองเริ่มจากไฟล์ว่างที่สร้างด้วย
ddโดยใช้อินพุตเป็น/dev/zeroเสมอ - ขนาดไฟล์ถูกคำนวณให้ภาพสุดท้ายดูเป็น 8 บล็อก
- แต่ละบล็อกกว้าง 1024 พิกเซล/ไบต์
- สูง 64 พิกเซล/ไบต์
- คำสั่งสร้างมีดังนี้
dd if=/dev/zero of=blockfile.ext4 bs=$((64 * 1024)) count=8
- ทันทีหลังสร้าง ผลลัพธ์
odจะอยู่ในสภาพที่คาดเดาได้ โดยทั้งหมดถูกเติมด้วย 0x00 - ขนาดไดรฟ์ที่ใช้เล็กเกินกว่าจะรวม journal ได้ ดังนั้น การแสดงภาพแบบมี journal จึงถูกทิ้งไว้เป็นโปรเจ็กต์ในภายหลัง
โครงสร้างที่เห็นหลัง mkfs.ext4
- หลังรัน
mkfs.ext4จะมีค่าหลายอย่างเกิดขึ้นในไฟล์ที่เดิมมีแต่ 0x00 และเผยให้เห็น โครงสร้างไฟล์ซิสเต็ม ที่ ext4 สร้างขึ้น - แต่ผลลัพธ์ไบต์ของ
odละเอียดเกินไปจนยากจะเข้าใจการจัดวางโดยรวม - หากแปลงเป็นภาพที่หนึ่งพิกเซลแทนหนึ่งไบต์ จะมองไฟล์บล็อกได้จากมุมมองที่กว้างขึ้น
- ภาพไฟล์ว่างแสดงไดรฟ์ที่ทั้งหมดเป็น 0x00 ส่วนภาพหลัง
mkfs.ext4แสดงว่าข้อมูล ext4 ถูกวางไว้ตรงไหนบนดิสก์
วิธีแยกออกจากข้อมูลผู้ใช้
- ภาพพื้นฐานไม่ได้แยก ไบต์ของ ext4 ออกจากไบต์ที่ไม่ใช่ ext4 โดยตรง
- แม้ไบต์หนึ่งจะเป็นข้อมูลที่ ext4 เป็นเจ้าของ แต่ถ้าค่าเป็น 0x00 ก็จะแสดงด้วยสีเดียวกับไบต์ 0x00 อื่น ๆ
- เพื่อแยกข้อมูล ext4 ออกจากข้อมูล “ผู้ใช้” จึงสร้างไฟล์
/dev/urandomขนาด 1024 ไบต์ แล้วคัดลอกไปยัง loop device ที่เมานต์อยู่ - โค้ดแสดงภาพจะตรวจสอบขณะอ่าน blockfile ว่า 1024 ไบต์ถัดไปตรงกับ 1024 ไบต์ของไฟล์อ้างอิงหรือไม่
- หากตรงกัน จะทำเครื่องหมาย 1024 พิกเซลนั้นเป็นข้อมูลผู้ใช้ด้วยสี
- วิธีนี้ทำให้ได้ภาพที่เห็นทั้งโครงสร้างที่ ext4 สร้างขึ้นและ ข้อมูลไฟล์ผู้ใช้ ที่คัดลอกเข้าไป
แอนิเมชันและการเปรียบเทียบกับ ext2
- หลังจากภาพนิ่งแล้ว จึงสร้าง animated GIF ด้วยแนวทางเดียวกัน
- ระหว่างแต่ละเฟรม จะ คัดลอกไฟล์ข้อมูลผู้ใช้สามครั้ง ลงในไดรฟ์
- ให้การแสดงผลสื่อความหมายได้มากกว่าวิธีที่
cpเพียงครั้งเดียวต่อเฟรม - ขนาด GIF ก็เล็กลงด้วย
- ให้การแสดงผลสื่อความหมายได้มากกว่าวิธีที่
- ยังมีแอนิเมชันลักษณะคล้ายกันสำหรับ ext2 เพื่อใช้เป็นตัวเปรียบเทียบด้วย
ลิงก์อ้างอิง
- Wikipedia: ภาพรวม ext4
- ext4 wiki: วิกิ ext4
- Admin Guide: คู่มือผู้ดูแลระบบ ext4 ของเคอร์เนล
- e2fsprogs: เครื่องมือไฟล์ซิสเต็ม ext
- ext4 Data Structures and Algorithms: เอกสารโครงสร้างข้อมูลและอัลกอริทึมของ ext4
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เมื่อหลายปีก่อนที่ FOSDEM มีการทำ ภาพแสดงผลกราฟิกของ ext4 จริง ๆ และมีวิดีโออยู่ที่นี่ โดยการแสดงผลเริ่มราวนาทีที่ 20
https://archive.fosdem.org/2019/schedule/event/nbdkit/
ตอนที่ในบรรยายพูดถึง trim ของไฟล์ซิสเต็ม “สีน้ำเงิน” อาจทำให้งงได้ เพราะดูเหมือนว่าโปรเจ็กเตอร์ของ FOSDEM จะแสดงสีฟ้าอ่อนที่ผมใช้ไม่ถูกต้อง ตอนนำเสนอผมไม่รู้ตัว และบนหน้าจอแล็ปท็อปก็ดูปกติดี ในบล็อกยังมีวิดีโอคู่กันที่เรนเดอร์สีได้ถูกต้องด้วย: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
ดูเหมือนว่าพอหลายคนพยายาม ทำให้การใช้คอมพิวเตอร์ง่ายขึ้น องค์ประกอบที่เคยกระตุ้นความอยากรู้อยากเห็นและค่อย ๆ สอนเราไปเองโดยไม่ต้องตั้งใจสอนก็หายไป
ตัวอย่างคือไฟแสดงสถานะฮาร์ดดิสก์สีแดงบนคอมพิวเตอร์สมัยก่อน ซึ่งเป็นอุปกรณ์เล็ก ๆ ที่บอกให้รู้ว่าดิสก์กำลังทำงานอยู่ ถ้ามันกะพริบเป็นแพตเทิร์นเฉพาะพร้อมเสียงอ่านดิสก์เร็ว ๆ ต่อเนื่องกัน ก็จะรู้ว่าเกมน่าจะโหลดสำเร็จจริงในรอบนี้ การซ่อน มุมมองขั้นสูง ไว้แต่ยังคงมีให้คนที่อยากรู้อยากเห็นเข้าถึงได้ ดูจะเป็นทางประนีประนอมที่ดี และคนแบบนั้นก็มักมีโอกาสกลายเป็นคอมพิวเตอร์ nerd รุ่นถัดไปที่ขับเคลื่อนโลก
มียูทิลิตีชื่อ pixd ที่สร้างการแสดงผลข้อมูลคล้ายกันบนบรรทัดคำสั่งได้: https://github.com/FireyFly/pixd
แต่ตัวนี้แสดงได้แค่ภาพนิ่งของข้อมูลไบนารี จึงไม่เจ๋งเท่า GIF แบบแอนิเมชันของ buredoranna ที่แสดงการเปลี่ยนแปลงของไฟล์ซิสเต็มตามเวลา การจัดพิกเซลลักษณะนี้อาจมีประโยชน์ถ้าวางเรียงบน เส้นโค้งฮิลเบิร์ต แทนการวาดเป็นบรรทัด ๆ ผมไปรู้วิธีนี้จากปลั๊กอิน Ghidra ชื่อ cantordust และ 3blue1brown ก็อธิบายสัญชาตญาณทางคณิตศาสตร์ว่าทำไมการจัดพิกเซลตามเส้นโค้งฮิลเบิร์ตถึงได้ผล
https://inside.battelle.org/blog-details/battelle-publishes-open-source-binary-visualization-tool
https://www.youtube.com/watch?v=3s7h2MHQtxc&t=311s
เดโม nbdkit ที่แสดงภาพ I/O ของไฟล์ซิสเต็มน่าสนใจมาก: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
บทความนี้ทำให้อยากลอง เลยทำการทดลองแบบนี้
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 สามารถย้อนกลับได้ ถ้าแปลงกลับเป็นไฟล์
.ppmแล้วข้าม 15 ไบต์แรก ก็ควรจะได้.ext4ที่ใช้งานได้เจ๋งมาก การแสดงข้อมูลแบบนี้ช่วยให้เข้าใจรายละเอียดได้มากว่าฟอร์แมตดิสก์จัดวางข้อมูลลงดิสก์จริงอย่างไร เช่น วิธี กันพื้นที่ให้เมตาดาต้าไว้ล่วงหน้าอย่างระมัดระวัง เพื่อรองรับการใช้งานบางส่วน
ผมอยากเห็นด้วยว่าตอนพื้นที่เต็มหมดจะเป็นอย่างไร แต่เสียดายที่แอนิเมชันจบก่อนถึงจุดนั้น
การนั่งเฝ้าหน้าคอมดูโปรแกรมจัดเรียงข้อมูลของ Windows 95/98 ทำงานเป็นความทรงจำวัยเด็กที่ดี: 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 ตัวอย่างการใช้งานอยู่ที่นี่: https://blog.jcole.us/2014/10/02/visualizing-the-impact-of-ordered-vs-random-index-insertion-in-innodb/
ถ้าผู้เขียนมาเห็นคอมเมนต์นี้ การแปลง GIF เป็นวิดีโอจะช่วยลดจำนวนไบต์ที่ส่ง และผู้ใช้ก็จะใช้ คอนโทรลวิดีโอ อย่างหยุดชั่วคราว เลื่อนหา หรือปรับความเร็วได้
ตัวอย่างเช่นแปลงด้วย
ffmpeg -i ext4.gif -pix_fmt yuv420p -c:v libx264 ext4.mp4ใช้ Kaitai IDE แสดงภาพไบนารีฟอร์แมตต่าง ๆ ได้ในระดับไบต์ หรือแม้แต่ระดับบิต ถ้าจำไม่ผิดก็มีไฟล์นิยามของ ext4 ด้วย
พอเห็นไดอะแกรมนี้ก็สงสัยว่ามีไฟล์ซิสเต็มที่ เก็บเมตาดาต้าไว้บนอุปกรณ์แยก ได้หรือไม่
เช่น เก็บข้อมูลไว้บน HDD แต่เก็บเมตาดาต้าไว้บน SSD ที่ต่ออยู่ อย่างไรก็ดี เมตาดาต้าถูกแคชไว้ในหน่วยความจำได้ง่ายกว่ามาก จึงดูเหมือนว่าประโยชน์อาจไม่มากพอจะคุ้มกับความซับซ้อนที่เพิ่มขึ้น
https://klarasystems.com/articles/openzfs-understanding-zfs-vdev-types/