Ext4の可視化
(buredoranna.github.io)- 0で埋めたファイルをループデバイスとしてマウントし、
mkfs.ext4の実行前後を比較することで、ext4が空き領域上にどのような構造を配置するのかをバイト単位で示す - 実験用ファイルは
/dev/zeroで作成した8ブロックサイズで、画像は幅1024バイト、高さ64バイトのブロックのように構成され、1ピクセルが1バイトに対応する odの出力だけではext4の構造を読み取りにくいため、0x00で埋められた状態とmkfs.ext4実行後のバイト分布を画像で比較する- 値が0x00のバイトは、ext4が所有するデータであっても空き領域のように見えることがあるため、基本的な可視化だけでは所有構造を完全には区別しにくい
- 1024バイトの
/dev/urandomファイルをコピーした後、同じパターンを探して色で表示し、ext4メタデータとユーザーデータの位置をあわせて確認する
空ファイル上にext4イメージを作る
- 0x00だけで埋められた空のドライブに
mkfs.ext4を実行すると、ext4がどのようなバイト構造を追加するのかを確認する実験 - 実際の
/dev/sdaのような稼働中のドライブをddで扱う方法は危険なため、VMの補助ドライブの代わりに通常のファイルをループデバイスとして使用する mountとumountは、別途losetupを使わずにloopファイルを直接扱えるmount -o loop <foo_file> <bar_dir>umount <bar_dir>
実験用ブロックファイルの構成
- 実験は常に
/dev/zeroを入力とするddで作成した空ファイルから開始する - ファイルサイズは、最終画像が8ブロックに見えるように計算されている
- 各ブロックは幅1024ピクセル/バイト
- 高さ64ピクセル/バイト
- 生成コマンドは次のとおり
dd if=/dev/zero of=blockfile.ext4 bs=$((64 * 1024)) count=8
- 生成直後の
od出力は、全体が0x00で埋められた予測可能な状態 - 使用したドライブサイズはジャーナルを含めるには小さすぎるため、ジャーナルを含む可視化は今後のプロジェクトとして残されている
mkfs.ext4後に見える構造
mkfs.ext4実行後は、0x00だけだったファイル内にさまざまな値が現れ、ext4が作成したファイルシステム構造が見えてくる- ただし
odのバイト出力は細かすぎて、全体の配置を把握しにくい - 1ピクセルが1バイトを表す画像に変換すると、ブロックファイルをより広い視点で見られる
- 空ファイルの画像は全体が0x00のドライブを示し、
mkfs.ext4後の画像はext4データがディスク上のどこに置かれたかを示す
ユーザーデータと区別する方法
- 基本画像はext4のバイトと非ext4のバイトを直接区別しない
- あるバイトがext4所有のデータであっても、値が0x00なら他の0x00バイトと同じ色で表示される
- ext4データと「ユーザー」データを区別するため、1024バイトサイズの
/dev/urandomファイルを作成し、マウント済みのループデバイスにコピーする - 可視化コードはblockfileを読み込む際、次の1024バイトが参照ファイルの1024バイトと一致するかを検査する
- 一致した場合、その1024ピクセルをユーザーデータとして色付きで表示する
- この方法により、ext4が作成した構造とコピーされたユーザーファイルデータが同時に見える画像を得られる
アニメーションとext2との比較
- 静的画像の後には、同じ方法を基にanimated GIFを作成する
- 各フレームの間で、ユーザーデータファイルをドライブに3回コピーする
- フレームごとに1回だけ
cpする方式より表現力が高い - GIFサイズもより小さくなる
- フレームごとに1回だけ
- 比較対象として、ext2に対する同様のアニメーションもあわせて提供されている
参考リンク
- Wikipedia: ext4の概要
- ext4 wiki: ext4 wiki
- 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 のプロジェクターが私の使っていた薄い青を正しく表示できなかったようだ。発表時には気づかず、ノート PC の画面では問題なかった。ブログには色が正しくレンダリングされた付随動画もある: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
多くの人が コンピューターの利用を単純化しようとするあまり、あえて教えようとしなくても自然に好奇心を刺激し、少しずつ理解させてくれていた要素が消えていっている気がする
昔のコンピューターにあった赤いハードディスクアクセスランプのように、ディスクが動作中であることを知らせる小さな仕掛けがその例だ。特定のパターンで点滅し、高速なディスク読み取り音が気持ちよく続けば、今度こそゲームが本当にロードされるのだと分かった。好奇心の強い人たちが見られるように 詳細表示を隠しつつ残しておくくらいが良い妥協点に思えるし、そういう人たちが次世代のコンピューター nerd になって世の中を動かす可能性は高い
コマンドラインで似たようなデータ可視化を作ってくれる pixd というユーティリティがある: https://github.com/FireyFly/pixd
ただしこれはバイナリデータの静的な表現を見せるだけで、ファイルシステムの変化が時間とともに現れる buredoranna のアニメーション GIF ほど格好よくはない。こうしたピクセル配列は、行単位で描くよりも ヒルベルト曲線上に配置すると有用な場合がある。この方法は 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
ファイルシステム I/O を可視化する nbdkit のデモが興味深かった: 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/