Slide 1

Slide 1 text

ファイルシステムのデータを ブロックデバイスへの操作で変更 May. 6th, 2025 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はじめに ● 前置き ○ ファイルはディスク上に所定のフォーマットで置かれたデータのかたまり ○ ファイルにアクセスすると最終的にディスク上のデータにアクセスする ○ ブロックデバイスファイルはファイルシステムを介さずディスクに直接アクセスする ● やること ○ ブロックデバイスファイルを使ってファイルシステムのデータを書き換える 2

Slide 3

Slide 3 text

ファイルシステムとブロックデバイスの関係(簡易版) 3 プロセス プロセス プロセス ユーザ空間 カーネル空間 現実世界 ディスク ブロックデバイスファイル (例: /dev/sda) 通常ファイル (例: /home/sat/foo) デバイスドライバ 色々なレイヤ(今は気にしなくてよい )

Slide 4

Slide 4 text

手順 1. ファイルシステムを作成 2. ファイルシステム上のファイルにデータを書き込む 3. 書き込んだデータのブロックデバイス上のオフセットを得る 4. 上述のオフセットにブロックデバイスファイル経由でデータを書き込む 5. ファイルからデータを読み出す 4

Slide 5

Slide 5 text

1. ファイルシステムを作成 ● loop device上にext2ファイルシステムを作成 ○ 📝 過去動画: その30 loop device ○ 📝 ext4やXFS、Btrfsだとデータの整合性を保つためのジャーナリングやコピーオンライト (後日別 動画で説明予定)といった仕組みのために実験結果がわかりにくくなるので避けた。 5 $ sudo dd if=/dev/zero of=test.img bs=1G count=0 seek=1 # サイズ1GiBのファイルを作成 … $ sudo mkfs.ext2 test.img # test.imgの中身をext2でフォーマット mke2fs 1.47.0 (5-Feb-2023) … $ sudo losetup -f test.img # test.imgをloop deviceにマップ $ losetup -l NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC /dev/loop0 0 0 0 0 /home/sat/test.img 0 512 $ sudo mount test.img /mnt/ # loop deviceをmount $ sudo ls /mnt/ lost+found

Slide 6

Slide 6 text

2. ファイルシステム上のファイルにデータを書き込む ● “hello block device”という文字列を先ほど作成したファイルシステム上のtestファイ ルに書き込む 6 $ echo "hello block device" >test $ sudo dd if=test of=/mnt/test … $ cat /mnt/test hello block device $ sudo sync /mnt # 書き込んだ内容を確実にディスクに反映させる

Slide 7

Slide 7 text

3. 書き込んだデータのブロックデバイス上のオフセットを得る ● ファイル内に存在する文字列を一覧する”strings”コマンドを使う ○ -tdオプションを使用すると各文字列のファイル内オフセットが得られる 7 $ sudo strings -td /dev/loop0 1128 $PcA 1160 /mnt 2371616 lost+found 2371636 test 4194304 hello block device 134217832 $PcA 402653288 $PcA 671088744 $PcA 939524200 $PcA

Slide 8

Slide 8 text

4. 上述のオフセットにブロックデバイスファイル経由でデータを書き込む ● /mnt/testの内容が保存されているオフセットに別のデータを書き込む 8 $ umount /mnt # ページキャッシュの影響を排除 $ echo "HELLO BLOCK DEVICE" >test2 $ sudo dd if=test2 of=/dev/loop0 bs=1 seek=4194304 … $ sudo mount test.img /mnt/

Slide 9

Slide 9 text

5. ファイルからデータを読み出す ● 9 $ sudo cat /mnt/test HELLO BLOCK DEVICE

Slide 10

Slide 10 text

まとめ ● ファイルのデータをファイルシステムが存在するディスクに対応するブロックデバイ スファイル経由で書き換えられた ● ブロックデバイスファイル経由でディスクにアクセスできることがわかった 10