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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Satoru Takeuchi
PRO
December 11, 2023
Technology
830
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
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
44
114-ファイルのshallow_copy.pdf
sat
PRO
2
24
113-Btrfsのスナップショット.pdf
sat
PRO
0
8
システム強制終了時にファイルシステムの整合性を保つ~ コピーオンライト編 ~
sat
PRO
0
54
システム強制終了時に ファイルシステムの整合性を保つ ~ ジャーナリング編 ~
sat
PRO
2
60
ファイルシステムの整合性を回復するfsck
sat
PRO
1
62
小学校5,6年生向けキャリア教育 大人になるまでの道
sat
PRO
8
5k
ファイルシステムの不整合
sat
PRO
2
150
書籍執筆での生成AIの活用
sat
PRO
2
520
Other Decks in Technology
See All in Technology
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
140
SONiCの統計情報を取得したい
sonic
0
230
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
280
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
4
2.3k
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
PostgreSQL 19 新機能概要 OSC Hokkaido 2026
nori_shinoda
0
140
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
100
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.6k
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
300
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
310
AIはどのように 組織のアジリティを変えるのか?
junki
4
1k
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
8
2k
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.1k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
Marketing to machines
jonoalderson
1
5.5k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Code Reviewing Like a Champion
maltzj
528
40k
Odyssey Design
rkendrick25
PRO
2
700
WCS-LA-2024
lcolladotor
0
650
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
YesSQL, Process and Tooling at Scale
rocio
174
15k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
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