マウント中のファイルシステムの破壊を防ぐ小技

 マウント中のファイルシステムの破壊を防ぐ小技

以下動画のテキストです。
https://youtu.be/Hbgtt1dj9tM

842515eaf8fbb2dfcc75197e7797dc15?s=128

Satoru Takeuchi

August 01, 2020
Tweet

Transcript

  1. マウント中のファイルシステムの破 壊を防ぐ小技 Aug 1st, 2020 Satoru Takeuchi Twitter: satoru_takeuchi 1

  2. 人間はミスをする • プログラムにバグがなくても人間の操作ミスでデータは簡単に壊せる ◦ 例: wipefs -a /dev/sdb ◦ ブロックデバイス(/dev/sdb)の中にある「ファイルシステムが存在する」という情報をクリア

    • 人間はいずれ必ず操作ミスをする ◦ “Rm -rf /” やっちゃった系ネタの多さ • ミスを防ぐ方法、ミスから復旧する方法はたくさんある ◦ GNU coreutils: “rm -rf /”は”--preserve-root”オプション(デフォルトで有効)付きなら異常終了 ◦ 定期的にバックアップをとっておく • 今回はマウント中のファイルシステムを壊さない方法の一つを紹介 2
  3. Wipefs -aを使ってみる • ソフトウェア環境 1. Ubuntu: 18.04 2. util-linux(wipefsが入っているパッケージ ):

    2.31.1 • 演習 1. 空のデバイスファイルを用意する (以下/dev/sdbとする) 2. /dev/sdb上にファイルシステムを作る ▪ Mkfs.ext4 /dev/sdb 3. ファイルシステムができていることを確認 ▪ Blkid /dev/sdb 4. ファイルシステムを消す ▪ Wipefs -a /dev/sdb 5. ファイルシステムが消えていることを確認 ▪ Blkid /dev/sdb 3
  4. マウント中のファイルシステムを消す • 演習 1. 空のブロックデバイスを用意する (以下/dev/sdbとする) 2. /dev/sdb上にファイルシステムを作る ▪ Mkfs.ext4

    /dev/sdb 3. 上記ファイルシステムをマウント ▪ Mount /dev/sdb mnt 4. ファイルシステムを消す ▪ Wipefs -a /dev/sdb 4
  5. 結果 • 消えなかった、セーフ! ◦ wipefs: error: /dev/sdb: probing initialization failed:

    Device or resource busy • でも、なんで? 5
  6. 破壊を防げた理由 • ファイルを開くopen()システムコールのO_EXCLフラグ ◦ 通常はファイルを作成する O_CREATフラグと組み合わせて使う ▪ O_CREATとO_EXCLを両方指定すると、すでにファイルが存在すればエラー終了 ◦ ファイルシステム(正確にはブロックデバイス

    )の保護にも使える ▪ Man 2 openより抜粋 • 演習 1. Strace -o test.log wipefs -a /dev/sdb 2. test.logを見て/dev/sdbをopenしているときのフラグを見る 6 on Linux 2.6 and later, O_EXCL can be used without O_CREAT if pathname refers to a block device. If the block device is in use by the system (e.g., mounted), open() fails with the error EBUSY.
  7. O_EXCLフラグの使用状況 • 有名どころのコマンド ◦ Mkfs.ext4: 使ってる。-f付けてもmount中なら失敗 ◦ Mkfs.xfs: 使ってない ◦

    Mkfs.btrfs: 使ってる。-f付けてもmount中なら失敗 ◦ dd: 使ってない ◦ Shred: 使ってない • フラグを意図的に使っていないのか対応してないだけなのかは不明 7
  8. まとめ • データは壊れる&人は必ずミスをする • マウント中のファイルシステムの破壊防止にはopen()のO_EXCLが便利 • 有名どころのコマンドが必ず使っているわけではない • 自分でブロックデバイスに書き込むプログラムを作るときは使ってみよう 8