Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
device mapperによるディスクI/O障害のエミュレーション 既存ターゲット編
Search
Satoru Takeuchi
PRO
December 11, 2023
Technology
850
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
device mapperによるディスクI/O障害のエミュレーション 既存ターゲット編
以下動画のテキストです
https://youtu.be/8Mbd31KHDR4
Satoru Takeuchi
PRO
December 11, 2023
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
Machine Check Exception
sat
PRO
2
44
バイナリダンプの模様を読む
sat
PRO
0
69
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
54
114-ファイルのshallow_copy.pdf
sat
PRO
2
39
113-Btrfsのスナップショット.pdf
sat
PRO
0
16
システム強制終了時にファイルシステムの整合性を保つ~ コピーオンライト編 ~
sat
PRO
0
59
システム強制終了時に ファイルシステムの整合性を保つ ~ ジャーナリング編 ~
sat
PRO
2
64
ファイルシステムの整合性を回復するfsck
sat
PRO
1
65
小学校5,6年生向けキャリア教育 大人になるまでの道
sat
PRO
8
5.4k
Other Decks in Technology
See All in Technology
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
510
書籍セキュアAPIについて
riiimparm
0
320
AIが当たり前の組織で エンジニアはどう育つか
nishihira
1
1.2k
AI時代のPlaywright活用(システムテストを自動化する ー 実行エンジンにPla ywrightを選んだ理由)
ynisqa1988
2
1k
AIとハーネスで育てるトランスコンパイラ / 20260722 Yasushi Katayama
shift_evolve
PRO
3
890
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
0
170
インシデント事例と パッケージの全量解析に学ぶ ソフトウェアサプライチェーンの守り方 / supply-chain-attack-defense
flatt_security
0
1k
【公開用】AI_Dev_Ex2026_AI_登壇資料
matsuritechnologies
PRO
2
590
Claude Mythos、Fable...フロンティアAIの最新動向と企業のセキュリティ対策
flatt_security
0
130
人とエージェントが高め合う協業設計
kintotechdev
0
880
OpenTelemetryにおけるGoのゼロコード・コンパイル時計装について #fukuokago
quiver
0
300
OPENLOGI Company Profile for engineer
hr01
1
75k
Featured
See All Featured
Evolving SEO for Evolving Search Engines
ryanjones
0
250
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Optimizing for Happiness
mojombo
378
71k
A better future with KSS
kneath
240
18k
Color Theory Basics | Prateek | Gurzu
gurzu
0
400
Producing Creativity
orderedlist
PRO
348
40k
WENDY [Excerpt]
tessaabrams
11
39k
Everyday Curiosity
cassininazir
0
260
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
Marketing to machines
jonoalderson
1
5.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
160
Transcript
device mapperによる ディスクI/O障害のエミュレーション ~ 既存ターゲット編 ~ Dec, 10th, 2023 Satoru
Takeuchi X: satoru_takeuchi 1
はじめに • LinuxでディスクI/O障害をエミュレーションする方法を紹介 • ブロックデバイスレベルの障害にフォーカス • Ubuntu 22.04.3のカーネル(kernel 5.15.0-89-generic)を使って動作確認 2
ディスクは色々な理由で壊れる • I/Oが遅延 • 特定セクタが壊れる • ディスクが応答しない 3
壊れたときのためにエラー処理がある • I/Oのリトライ ◦ 一時的に起きてすぐ解消することもある • データの破壊検知、修復 • ユーザに対処を任せる 4
disk ソフトウェア 何らかの異常 対処 理想 • I/Oが最終的に成功する • I/Oが失敗を返して対処がゆだねられる
エラー処理はテストが大変 • 課題 ◦ ディスクはテスト中に気を使って障害を起こしてくれたりしない ◦ うまくテストできなくてバグの温床になりがち • 解決策(の一つ) ◦
Linuxカーネルのdevice mapper 5
device mapper • ブロックデバイスに機能追加するためのLinuxカーネルの仕組み • 用語 ◦ ターゲット: device mapperの個々の機能
▪ 暗号化、マルチパス化、 ディスク障害エミュレーション など ◦ dmデバイス: device mapperが作るブロックデバイス • 基本はdmsetupコマンドで制御 6 /dev/sda /dev/mapper/<dm device name> 書き込み 書き込み+α 読み出し 読み出し+α
dmsetupのつかいかた • dmデバイスとマップ先デバイスを対応付けるテーブルを作る • dmデバイスを作る • dmデバイスの挙動を動的に変更する 7 $ cat
table.txt <開始セクタ> <長さ> <ターゲット名> <マップ先デバイス> [<パラメタ>...] ... $ sudo dmsetup create <dmデバイス名> <テーブルファイル> $ ls /dev/mapper/ … <dmデバイス名> … 1セクタ=512バイト $ sudo dmsetup message <dmデバイス名> 0 <コマンド> [<パラメタ>...]
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
8
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
9
dm-delay • I/Oを遅延させる • テーブルの形式 10 <開始セクタ> <長さ> delay <マップ先デバイス>
<マップ先開始セクタ > <遅延[ms]> dm-delay disk write 遅延を入れてからwrite read 遅延を入れてからread
使用例 11 $ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct
… 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較)
使用例 12 $ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct
… 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較) $ cat test-delay.txt 0 2097152 delay /dev/loop0 0 10 $ sudo dmsetup create test-delay test-delay.txt dmデバイスの作成
使用例 13 $ sudo dd if=/dev/zero of=/dev/mapper/test-delay bs=1M count=1024 oflag=direct
$ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較) $ cat test-delay.txt 0 2097152 delay /dev/loop0 0 10 $ sudo dmsetup create test-delay test-delay.txt dmデバイスの作成 dmデバイスにwrite
使用例 14 $ sudo dd if=/dev/zero of=/dev/mapper/test-delay bs=1M count=1024 oflag=direct
… 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.4044 s, 65.5 MB/s $ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較) $ cat test-delay.txt 0 2097152 delay /dev/loop0 0 10 $ sudo dmsetup create test-delay test-delay.txt dmデバイスの作成 dmデバイスにwrite すごく遅くなった
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
15
dm-flakey • I/Oエラーを一定間隔で発生させる • テーブルの形式 16 <開始セクタ> <長さ> flakey <マップ対象デバイス>
<マップ先開始セクタ> <成功期間> <失敗期間> dm-delay disk write write(たまに失敗) read read(たまに失敗)
使用例 17 $ cat test-flakey.txt 0 2097152 flakey /dev/loop0 0
2 2 $ sudo dmsetup create test-flakey test-flakey.txt dmデバイスの作成 2秒間の正常動作後 2秒間I/Oエラーを出す
使用例 18 $ cat test-flakey.txt 0 2097152 flakey /dev/loop0 0
2 2 $ sudo dmsetup create test-flakey test-flakey.txt $ sudo bash -c 'for ((i=0;i<10;i++)) ; do dd if=/dev/mapper/test-flakey of=/dev/null bs=128 count=1 sleep 1 done' dmデバイスの作成 dmデバイスから1秒に1回read
使用例 19 $ cat test-flakey.txt 0 2097152 flakey /dev/loop0 0
2 2 $ sudo dmsetup create test-flakey test-flakey.txt $ sudo bash -c 'for ((i=0;i<10;i++)) ; do dd if=/dev/mapper/test-flakey of=/dev/null bs=128 count=1 sleep 1 done' ... 128 bytes copied, 0.000198435 s, 645 kB/s dd: error reading '/dev/mapper/test-flakey': Input/output error ... dd: error reading '/dev/mapper/test-flakey': Input/output error ... 128 bytes copied, 0.000169802 s, 754 kB/s ... 128 bytes copied, 0.000224296 s, 571 kB/s dd: error reading '/dev/mapper/test-flakey': Input/output error ... dmデバイスの作成 dmデバイスから1秒に1回read 仕様通りに動作
dm-flakey上でファイルシステムを作ると… 20 $ sudo mkfs.ext4 -F /dev/loop0 $ sudo dmsetup
create test-flakey test-flakey.txt $ mount /dev/mapper/test-flakey mnt ファイルシステムが存在するデバイス上にdmデバイスを作成
dm-flakey上でファイルシステムを作ると… 21 $ for ((i=0;i<10;i++)) ; do sudo dd if=/dev/zero
of=mnt/test.txt bs=1 count=1 oflag=direct sleep 1 done $ sudo mkfs.ext4 -F /dev/loop0 $ sudo dmsetup create test-flakey test-flakey.txt $ mount /dev/mapper/test-flakey mnt ファイルシステムが存在するデバイス上にdmデバイスを作成 ファイルシステム上のファイルに1秒に1回write
dm-flakey上でファイルシステムを作ると… 22 $ for ((i=0;i<10;i++)) ; do sudo dd if=/dev/zero
of=mnt/test.txt bs=1 count=1 oflag=direct sleep 1 done dd: failed to open 'mnt/test.txt': Input/output error dd: failed to open 'mnt/test.txt': Input/output error dd: failed to open 'mnt/test.txt': Read-only file system … ファイルシステムが存在するデバイス上にdmデバイスを作成 ファイルシステム上のファイルに1秒に1回write すぐにread onlyに $ sudo mkfs.ext4 -F /dev/loop0 $ sudo dmsetup create test-flakey test-flakey.txt $ mount /dev/mapper/test-flakey mnt
カーネルログを見ると… 23 $ sudo dmesg … [10912.976026] EXT4-fs error (device
dm-0): ext4_journal_check_start:83: comm dd: Detected aborted journal [10912.991408] EXT4-fs (dm-0): Remounting filesystem read-only • ext4はデータが存在するデバイスの挙動が怪しいとreadonlyでremountする ◦ 他のファイルシステムもこのようなフェイルセーフのしくみがある • 📝 dm-flakeyをファイルシステム上のI/Oエラーのエミュレーションに使うのは面倒 ジャーナル処理も失敗
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
24
dm-dust • 特定ブロックの故障をエミュレーション • テーブル形式 25 <開始セクタ> <長さ> dust <マップ先デバイス>
<マップ先開始セクタ> <ブロックサイズ> データ 不良ブロック dm-dust disk
dm-dustの主なメッセージ • 機能の有効化/無効化(デフォルトは無効) • 指定したセクタを疑似不良ブロックにする • 指定したブロックを疑似不良ブロックではなくする • 疑似不良ブロックのリスト ◦
26 $ sudo dmsetup message <dmデバイス名> 0 addbadblock <ブロック番号> [修復前にI/Oが失敗する回数] $ sudo dmsetup message <dmデバイス名> 0 removebadblock <ブロック番号> $ sudo dmsetup message <dmデバイス名> 0 {enable,disable} $ sudo dmsetup message <dmデバイス名> 0 listbadblocks <ブロック番号>
dm-dustを使う前の準備 • kernel 5.15.0-89-genericではdm-dustは無効化されている • 自前ビルドすれば使える 27 $ git clone
https://github.com/satoru-takeuchi/youtube-sample $ cd youtube-sample/0063-dm-io-failures-existing-targets $ make -C kernel-modules $ sudo insmod kernel-modules/dm-dust.ko
使用例 28 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 dmデバイスの作成&設定 セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
使用例 29 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 dmデバイスの作成&設定 セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 不良ブロックからread
使用例 30 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 dd: error reading '/dev/mapper/test-dust': Input/output error … dmデバイスの作成&設定 不良blockからのread セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
使用例 31 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 dd: error reading '/dev/mapper/test-dust': Input/output error … $ sudo dd if=/dev/zero of=/dev/mapper/test-dust bs=512 count=1 oflag=direct,dsync dd: error writing '/dev/mapper/test-dust': Input/output error … dmデバイスの作成&設定 不良blockへのwrite セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
使用例 32 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 dd: error reading '/dev/mapper/test-dust': Input/output error … $ sudo dd if=/dev/zero of=/dev/mapper/test-dust bs=512 count=1 oflag=direct,dsync dd: error writing '/dev/mapper/test-dust': Input/output error … $ sudo dd if=/dev/zero of=/dev/mapper/test-dust bs=512 count=1 oflag=direct,dsync … 512 bytes copied, 0.0134639 s, 38.0 kB/s dmデバイスの作成&設定 不良ブロックへの2度目のwrite セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
ファイルとセクタの関係 • 一般的にユーザはブロックデバイスを直接使わず、その上にファイルシステムを置 いて使う • あるファイルの、あるオフセットへのアクセス時に障害を起こしたい • それはどこのセクタにあるの? 33 disk
ファイル ? ? ?
ioctl(FS_IOC_FIEMAP)を使えばわかる • ファイルとextent、extentとブロックの対応が得るためのioctl() • xfs_io -c fiemapコマンドを介して手軽に使える 34 $ xfs_io
-c fiemap test.txt test.txt: 0: [0..7]: 266240..266247 test.txtの先頭領域を含むextentは ファイルシステムの下にあるブロックデバイスの セクタ266240~266247に存在する
使用例 35 $ sudo dmsetup message test-dust 0 enable $
sudo xfs_io -c fiemap mnt/test.txt mnt/test.txt: 0: [0..7]: 266240..266247 $ sudo dmsetup message test-dust 0 addbadblock 266240 dmデバイス上の作成&設定 test.txtファイル先頭のデータに対応 するセクタを不良セクタにする /dev/loop0 /dev/mapper/test-dust filesystem test.txt
使用例 36 $ sudo dmsetup message test-dust 0 enable $
sudo xfs_io -c fiemap mnt/test.txt mnt/test.txt: 0: [0..7]: 266240..266247 $ sudo dmsetup message test-dust 0 addbadblock 266240 $ sudo dd if=mnt/test.txt of=/dev/null bs=512 count=1 iflag=direct dmデバイス上の作成&設定 dmデバイス上のファイルからread /dev/loop0 /dev/mapper/test-dust filesystem test.txt
使用例 37 $ sudo dmsetup message test-dust 0 enable $
sudo xfs_io -c fiemap mnt/test.txt mnt/test.txt: 0: [0..7]: 266240..266247 $ sudo dmsetup message test-dust 0 addbadblock 266240 $ sudo dd if=mnt/test.txt of=/dev/null bs=512 count=1 iflag=direct dd: error reading 'mnt/test-dust.txt': Input/output error … dmデバイス上の作成&設定 dmデバイス上のファイルからread /dev/loop0 /dev/mapper/test-dust filesystem test.txt
• CoW型、ログ構造型のファイルシステムではうまく機能しない ◦ 例: Btrfs, NILFS ◦ writeするたびにextentとblockの対応関係が変化 dm-dustと相性の悪いファイルシステム 38
Btrfs データ 不良ブロック dm-dust disk
• CoW型、ログ構造型のファイルシステムではうまく機能しない ◦ 例: Btrfs, NILFS ◦ writeするたびにextentとblockの対応関係が変化 dm-dustと相性の悪いファイルシステム 39
Btrfs 旧データ 不良ブロック 新データ writeするとデータの場所が変わる dm-dust disk
• CoW型、ログ構造型のファイルシステムではうまく機能しない ◦ 例: Btrfs, NILFS ◦ writeするたびにextentとblockの対応関係が変化 dm-dustと相性の悪いファイルシステム 40
Btrfs 旧データ 不良ブロック 新データ writeするとデータの場所が変わる dm-dust disk 📝 ファイルシステムはなんでもいいなら ext4などのin-placeな更新をするものを使う
デバイスに全くアクセスできない状況も作れる • ターゲットへのI/Oを受け付けない状態にする • 上記の状態の解除 • 📝 どんなターゲットでも使える技 41 dmsetup
suspend <dmデバイス名> dmsetup resume <dmデバイス名>
ターゲットを重ねるとさらに高機能化 42 disk dm-flakey dm-delay dm-dust 元気です I/O失敗させます I/O遅延させます セクタ壊します
やったね!
まとめ • device mapperを使えばディスクI/O障害をエミュレーションできる • device mapperターゲットのドキュメント ◦ https://docs.kernel.org/admin-guide/device-mapper 43