家のマシンのハードディスクのパーティションテーブルを破壊してしまったのでせっせと直してました, なんとか全復活完了♪
- 始まりはWindows Vista RC1の提供開始
- ためしに人柱になろうと思いつく
- しかし, Beta 2のときにMBRのGRUBがじゃまで入らなかったことを思い出す
- WindowsのブートローダはMBRとインストール先パーティションの両方にかかれることを知っていたので, sda1の先頭をsdaの先頭に書き込むことを思いつく
- 念のため現状のsdaとsda1の先頭512Byteをsda7の/rootにバックアップする, これで何かあったときにはレスキューで立ち上げてddすればいいやと思い込む
これが全ての間違いの原因
- sdaに上記のファイル経由でsda1の先頭512 Byteを書き込む, ここは446 Byte書き込むのが正しい, この時点でプライマリパーティションテーブルさようなら
このとき参照したのは@ITのこの記事, バックアップのときとリストアのときのサイズが違っていたが, 特に気にしなかったのが敗因
ちなみにサイズ関連の問題はWikipediaのMBRの記事が参考になる
- 起動しようとして, この時点でパーティションテーブルが昇天しているとは気づいていないうまくいかないっぽかったので, FC5のRescue Diskで起動する
- FC5のディスクがシステムを見つけてくれない, あれれ? と思う
- とりあえずシステムイメージをマウントしていない状態でシェルに突っ込まれたので, fdisk -l, めちゃくちゃなパーティションテーブルを発見する
- 普通に考えてパーティションテーブルまで上書きしちゃったんだなと判断, この時点でsda7などには当然アクセスできないので, 自分でパーティションテーブルを書く羽目になる
- 使える道具はfdiskとpartedぐらい, 因みにmanもない
もともとこのマシンのパーティションはほとんど全てfdiskできったものだったので, パーティション作成はfdiskに任せることに
- とりあえずプライマリはNTFS, ext3, swapの順で切っていたことは覚えていたので, 当時の記憶を遡りながらfdiskで適当に切ってみる
- partedで覗いてみたら, 最初のNTFS以外のパーティションタイプは認識されていないらしい, helpのなかにcheckなるものがあったので興味本位で叩いてみる
NTFSはサポートしていないと断られたが, その前にFSに記録されているサイズとパーティションのサイズが20Gと10Gで違うと教えてくれる, これを使えば全部何とかなりそうという期待がもてる
- 言われたとおりのサイズでsda[123]を切り終える
次のsda4が拡張パーティションなので, そこのテーブルを破壊しない形でそこを拡張パーティションだと認識させることができれば勝ちだが, fdiskではできないっぽい, partedでも無理そうだったので腹をくくって拡張パーティションも手で書くことにする, 途中partedのpartedは通常MBやGBなどのHuman Readableな表現を返すが, これだと20Gと20Gは違うとか言われて途方にくれるので表示を容量確保の単位であるシリンダに変えたunit cylとかに助けられながらもsda7まで復活完了
MBRパックアップを読めるようになったのでさくっと書き戻す
これで基本的にシステムを起動することができるようになる, 残るはsda8
- このsda8がかなりの曲者, データ交換用のFAT32領域なのだが, 後々のことを考えてディスクの最後から領域確保していたり
これではpartedで容量を計測するという非常手段が使えそうもない
仕方がないので一旦Fedoraで再起動, Firefoxを立ち上げて容量のヒントを探す, WindowsでFAT32でフォーマットできるNTFSを使わせるためのMicrosoftの戦略, FATは大きくなりすぎると非効率になるかららしい制限容量mkfs.vfatでこの制限は普通に回避できるので天邪鬼に普段できないことをやってみた @ 1月ごろの自分の2倍を確保していたと思い出したので, その容量を調べ, 容量は64GBとあたりをつける
- ためしにfdiskで64000MBとか65536MBとか確保してみるが, うまく当たらない
partedの単位系のMBとfdiskの単位系のMBは容量が違うようなので, gpartedで確保された領域であると疑う, そういえば最後に配置するためにgpartedで色々いじった記憶がある
- partedで最後から65536MB確保してみる
パーティションの先頭セクタを読みたいときは-sオプションをつけることfileコマンドによるとこのパーティションはMS-DOS Executable(COM)だそうだ, 大嘘だ~
od -cv /dev/sda8 | headの出力がなんとなく壊されたFATっぽい感じ, ためしに-o roでvfatとしてマウントしてみたら普通に読める, 勝ったなと心の中でつぶやく
1GBの空ファイルにmkfs.vfatをかけたファイルと比較してみると, データ中の"FAT32"の最初のFが\0に変わっていたりするが, オフセットは一致した
- ためしにfsck.vfatをやってみる, バックアップの先頭セクタと4箇所ほど違っているけど書き直すかと聞かれる, 心の中で小躍りしながらyes
FATもprimaryとsecondaryで一致していないそうなので, primaryを選んでみたら破損ファイルが大量に列挙されたのでsecondaryを採用
日本語のファイル名が一部Bad Filenameといわれたが, そこはKeep itと答えて最後に空き容量がずれているといわれたので一応直す
これで大丈夫なはずと思ってWindowsに行く, あれ? 読めない
ディスクの管理によるとFAT32 正常(不明なパーティション)
ここでパーティションのタイプを83のまま放置していたことを思い出す, 再度Linuxに行ってbだかcだかにしてWindowsへ, 今度はちゃんと読める, これで復旧完了
まぁこれでもいろいろと端折ったりはしているのですが, 今回の作業内容はこんなかんじ
終わってみるとなかなか楽しい2時間半でした
失敗していたらHDDの全データロストだったけどなぁ~