Slide 1

Slide 1 text

無いはずのパーティションがある Phantom Atari Partition Jun. 23rd, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はなすこと ● ブロックデバイス上に誰も作っていないはずの謎のパーティションが見えてしまう Phantom Atari Partitionという問題を紹介 ● データ構造の厳格な仕様が大事だということを学べる 2

Slide 3

Slide 3 text

前提知識 ● Ceph: オープンソースの分散ストレージ ● OSD: Cephを構成するディスク上に存在するデータ構造 ○ ディスクの先頭領域に所定の形式のデータを書き込むことによって作成 3 node node node disk OSD disk OSD disk OSD ストレージプール ファイルシステム ブロックデバイス オブジェクトストレージ

Slide 4

Slide 4 text

事の発端: Cephコミュニティにいくつかの問題報告が ● 「OSDを作ったディスク上にパーティションがあるんだけど…」 ○ 📝 OSDの初期化ではパーティションは作らない 4 $ lsblk vdb 252:16 0 3T 0 disk ├─vdb2 252:18 0 48G 0 part └─vdb3 252:19 0 6.1M 0 part

Slide 5

Slide 5 text

これは何? ● パーティションテーブルのタイプは”Atari” ● 📝 Atariパーティションテーブル ○ 1980年代から1890年代に普及したAtari STというコンピュータがあった ■ ビデゲームの文脈で出てきた Atariが開発 ○ Atari STではディスクのパーティションを Atariパーティションテーブルを使って管理していた 5 $ parted -s /dev/vdb print … Partition Table: atari

Slide 6

Slide 6 text

Phantom Atari Partitionと呼ばれるように ● Phantomは英語で「お化け」の意味 ○ 「無いはずがある」というところから来ているのだろう ○ 正式名称ではなく、Cephコミュニティのローカル用語のはず ● どうしてこうなった 6

Slide 7

Slide 7 text

問題が発生した理由 ● Linuxカーネルはディスク上に特定のデータ構造が存在していればパーティション テーブルであると認識する ● Linuxは多くのパーティションテーブルを認識できる(e.g. MBR,GPT,Atari…) ● Atariパーティションテーブルの認識ロジックは、全然関係ないデータをAtariパー ティションと誤認しやすい ○ 📝 Linuxだけの問題ではなく、根本原因は Atariパーティションの仕様が緩めなことにある ● OSDのデータ構造は、たまたまAtariパーティションと誤認されやすい 7

Slide 8

Slide 8 text

LinuxのAtariパーティションテーブル認識ロジック 8 … rs = read_part_sector(state, 0, &sect); ☆ rsにはディスクの先頭領域のデータが入る if (!rs) return -1; /* Verify this is an Atari rootsector: */ hd_size = get_capacity(state->disk); ☆ 4つの領域のどれかが Atariパーティションと判定されればよし if (!VALID_PARTITION(&rs->part[0], hd_size) && !VALID_PARTITION(&rs->part[1], hd_size) && !VALID_PARTITION(&rs->part[2], hd_size) && !VALID_PARTITION(&rs->part[3], hd_size)) { /* * if there's no valid primary partition, assume that no Atari * format partition table (there's no reliable magic or the like * :-() */ … https://github.com/torvalds/linux/blob/v6.9/block/partitions/atari.c

Slide 9

Slide 9 text

VALID_PARTITION()の定義 9 … /* check if a partition entry looks valid -- Atari format is assumed if at least one of the primary entries is ok this way */ #define VALID_PARTITION(pi,hdsiz) \ (((pi)->flg & 1) && \ isalnum((pi)->id[0]) && isalnum((pi)->id[1]) && isalnum((pi)->id[2]) && \ be32_to_cpu((pi)->st) <= (hdsiz) && \ be32_to_cpu((pi)->st) + be32_to_cpu((pi)->siz) <= (hdsiz)) … https://github.com/torvalds/linux/blob/v6.9/block/partitions/atari.c

Slide 10

Slide 10 text

その他いろいろ ● Ceph以外にもAtari Partitionの報告事例はある ○ Kubernetes PVC Atari partition ■ https://groups.google.com/g/coreos-user/c/ZTUtkQzz1dw ○ Reload this Page Reformatting external drive with parted & mkfs: "Found a atari partition table in /dev/sdb1" ■ https://www.linuxquestions.org/questions/slackware-14/reformatting-external-drive-with-p arted-and-mkfs-found-a-atari-partition-table-in-dev-sdb1-4175698678/ ● RookというCephのオーケストレーションはわりと悲惨なことになった ○ 設定に従ってディスクを自動的に OSDとして初期化 ○ Linuxはディスク上にAtari Partitionがあると認識 ○ 設定次第では、Atari partition上に自動的にOSDを初期化してしってデータ破壊することが … ○ 最終的には問題を回避する修正が Cephに入った 10

Slide 11

Slide 11 text

まとめ ● 存在しないはずのパーティションが認識されるPhantom Atari Partitionという問題 を紹介 ● データ構造がまずいと、別のものと誤認されて悲劇を引き起こすことがある ● 📝 詳しい解説記事 ○ 恐怖のphantom Atari partition ○ https://zenn.dev/satoru_takeuchi/articles/46174f69de3b3d 11