Tosainu Lab

Btrfsが死んだ

> 突然の死 <

それは昨日の朝のことだった.

ちーん

予兆…?

直接大きな影響はなかったものの, 実は少し前から嫌な予感はしていた.

4/3 起動しなくなる

シャットダウンを掛けたところところ, 何故かいつまでたっても電源が切れなかった.
ディスクのアクセスランプも消えてるし, まぁいっかと強制終了させたところ, 次の起動でこうなった.

幸い, この時はArch Linuxのインストールメディアから起動しbtrfs scrub掛けたりしていたら治った.

4/16 checksum errorが出始める

某活動に参加することになり, その関係でどうしてもWindows環境が必要となった.
とりあえずの対応としてKVMにWindows 8.1 Enterprise Evaluationを入れて作業をしていたのだが, 余程負荷がエグかったのか, その仮想HDDイメージにchecksum errorが出るようになった.

とはいえ, 特別何か支障があったわけではないので放置していた.
(KVM上の窓で若干プチフリが起きていた気もするが)

5/6 read errorが出始める

仮想で入れた窓のWindows updateを掛けたところ, Cドライブの空きがやばくなったので, ディスククリーンアップをかけていた.
しかし, どういう訳か処理に1時間半もかかった.

もしやと思いdmesgを叩いたところ, いつもと違うエラーが出ていた…

復旧作業

いろいろ粘ってみたけれど, マウントもできないしbtrfs check --repairが仕事放棄(スタックトレース?吐いて落ちる)するなど復旧する見込みがなさそうなので, 抜き出せるデータだけ取り出して環境を再構築することにした.

環境

エラーを起こした環境

  • Arch Linux x86_64
  • linux-4.0.2
  • btrfs-progs 4.0

復旧作業に使った環境

  • archlinux-2015.05.01-dual.iso
  • btrfs-progsは4.0に更新

エラーが起きているファイルシステムは/dev/md126で認識されている

btrfs restore

死にそうなbtrfsからデータを取り出そうとしてくれるbtrfs restoreというコマンドがあるっぽい.

$ man btrfs-restore

BTRFS-RESTORE(8)                                    Btrfs Manual                                    BTRFS-RESTORE(8)



NAME
       btrfs-restore - try to restore files from a damaged btrfs filesystem(unmounted)

SYNOPSIS
       btrfs restore [options] <device> <path> | -l <device>

DESCRIPTION
       btrfs restore is used to try to salvage files from a damaged filesystem and restore them into <path> or just
       list the tree roots.

       Since current btrfs-check(8) or btrfs-rescue(8) only has very limited usage, btrfs restore is normally a
       better choice.

           Note
           It is recommended to read the following btrfs wiki page if your data is not salvaged with default option:
           https://btrfs.wiki.kernel.org/index.php/Restore

重要なファイルはホームディレクトリ内の幾つかのディレクトリにしか置いていないので, それらを可能な限り抜き出すことを試みた.

// バックアップ先となるUSBメモリをマウント
# mount /dev/sdd1 /mnt

// /home/myon/(codes|Documents|Downloads|Pictures)から取り出せそうなファイルを確認する
//  -v : 詳細表示
//  -i : エラーを無視して処理を継続
//  -D : dry-run (復旧できそうなファイルを表示するだけ)
//  --path-regex : 正規表現にマッチするディレクトリ/ファイルのみ抜き出す
# btrfs restore -v -i -D \
    --path-regex "^/(|home(|/myon(|/(codes|Documents|Downloads|Pictures)(|/.*))))$" \
    /dev/md126 /mnt | less

// 抜き出し開始
# btrfs restore -v -i \
    --path-regex "^/(|home(|/myon(|/(codes|Documents|Downloads|Pictures)(|/.*))))$" \
    /dev/md126 /mnt

抜き出すことができなかったファイルも多少あったが, 無事データの救出に成功した.

おわり

Btrfsはまだ開発中/実験的なファイルシステムで, 公式のドキュメントにも気をつけてね的な記述がちらほらある.
Twitterをはじめ, よく落ちたという話も耳にはしていた.

僕はBtrfsにSSD向けのオプションが用意されていることを知った時から非常に魅力を感じていて, 手元のSSDなArch Linuxマシンのファイルシステムは全部(2台しかないけど)Btrfsで運用している.
実際に使ってみると, SubvolumeやPartitioning?等の機能は本当に便利だし, また管理に必要なコマンドも綺麗にまとまっていて使いやすいなと思った.
今回ファイルシステムが死んだわけだけど, Btrfsじゃなかったら僕にデータの復旧はできなかったんじゃないか1とまで思っている.

このPCでBtrfsを使い続けるのは流石に不安なのでXFSあたりに乗り換え, また素直にWindowsとのデュアルブート環境を組む予定でいるけれど, いずれはまた, より安定したBtrfsに戻りたいなと思っています.

Footnotes

  1. そもそもBtrfsにしなかったらファイルシステムは死ななかったんじゃないかというツッコミはなしで