6 คะแนน โดย GN⁺ 2024-01-09 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เมานต์ไฟล์ที่เติมด้วย 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 ความคิดเห็น

 
GN⁺ 2024-01-09
ความคิดเห็นบน 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 รุ่นถัดไปที่ขับเคลื่อนโลก

    • ตอนเราเป็นเด็ก คนอายุมากกว่าก็คงพูดกันว่า “เสียดายที่คอมพิวเตอร์สมัยนี้ไม่มี LED แสดง สถานะแต่ละบิตของรีจิสเตอร์ควบคุม แบบเมนเฟรมแล้ว ถูกทำให้ง่ายแบบทึ่ม ๆ เกินไป มองไม่ออกด้วยซ้ำว่าตัวชี้คำสั่งอยู่ตรงไหน ทั้งที่มันมีประโยชน์มากในการจับทางว่าฮาร์ดแวร์กำลังทำอะไรอยู่จริง ๆ”
  • มียูทิลิตีชื่อ 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.ext4
    mfks.ext4 a.ext4
    mkdir a
    sudo mount a.ext4 a
    cd a
    sudo 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.ppm
    convert a.ppm a.png
    ไฟล์ผลลัพธ์ a.png สามารถย้อนกลับได้ ถ้าแปลงกลับเป็นไฟล์ .ppm แล้วข้าม 15 ไบต์แรก ก็ควรจะได้ .ext4 ที่ใช้งานได้

    • ถ้า Twitter ไม่บีบอัด ก็คงสนุกดีถ้าจะเก็บไฟล์ขนาดใหญ่เป็นภาพแล้วใช้ Twitter เหมือนไฟล์ซิสเต็ม
  • เจ๋งมาก การแสดงข้อมูลแบบนี้ช่วยให้เข้าใจรายละเอียดได้มากว่าฟอร์แมตดิสก์จัดวางข้อมูลลงดิสก์จริงอย่างไร เช่น วิธี กันพื้นที่ให้เมตาดาต้าไว้ล่วงหน้าอย่างระมัดระวัง เพื่อรองรับการใช้งานบางส่วน
    ผมอยากเห็นด้วยว่าตอนพื้นที่เต็มหมดจะเป็นอย่างไร แต่เสียดายที่แอนิเมชันจบก่อนถึงจุดนั้น

  • ทำให้นึกถึง 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 ที่ต่ออยู่ อย่างไรก็ดี เมตาดาต้าถูกแคชไว้ในหน่วยความจำได้ง่ายกว่ามาก จึงดูเหมือนว่าประโยชน์อาจไม่มากพอจะคุ้มกับความซับซ้อนที่เพิ่มขึ้น

    • ZFS ทำได้ ผมเหมือนจะเคยได้ยินว่าไฟล์ซิสเต็มอื่นก็สามารถแยก journal ไปไว้อีกอุปกรณ์หนึ่งได้เหมือนกัน แต่เดี๋ยวนี้ค้นเว็บหาข้อมูลแย่มากจนไม่มีเวลาหาว่าคืออะไร
    • ดู special-vdev ในบทความนี้ได้
      https://klarasystems.com/articles/openzfs-understanding-zfs-vdev-types/
    • Facebook ใช้ โหมด realtime ของ XFS ในทางที่ผิดเพื่อทำสิ่งนี้ Omar พูดถึงบางส่วนไว้ที่นี่: https://lwn.net/Articles/943693/
    • BcacheFS ทำแบบนี้