はじめに
私は、Asus FlipというChromeBookを使っていますが、この機種用にKaliLinuxのUSB(もしくはSD)ブートイメージが公開されています。8GbのUSBメモリー用のものです。
これは、公式サイトの説明にもあるように、以下のようにしてUSBディスクに書き出して使います。
xzcatt kali-$version-veyron.img.xz | dd of=/dev/sdb bs=512k
ディスクイメージは、ChromeOSの拡張GPTテーブルに対応したもので、パーテション1にブートイメージ、パーティション2にルートシステムと、2つのパーティションから構成されています。
さてこのddを、異なるサイズのディスクに対して実行すると、どうなるでしょうか。
実験の結果
たとえば、64GbのSDに対してこれを実行してみます。
当たり前ですが、GPTディスクのセカンダリーGPTヘッダが不正な位置に書き込まれて、正常な状態にはなりません。
もちろん、これは簡単に修復できます。
cgpt repair /dev/mmcblk1
などと実行すれば、セカンダリーGPTヘッダが修復されて、正常に戻ります。
これで終わりならば、そもそもこういう文書を投稿する意味もないのですが、実はさにあらず。
上記で修復されて、確かに正常な状態に戻るのですが、この正常は、少しばかり悲しい正常なのです。
なぜなら、64Gbの容量がありながら、全体を8GbのディスクとしてGPTが認識しているからです。
cgptのrepairオプションで、ディスク容量も正常に書き換えてくれれば、こういう悲しいことにはならないのですが、どうもそのようなオプションは無いようです。
では、他のコマンド、たとえばgdiskで修復したらどうでしょうか。
実は、これをやるとさらに悲惨なことになります。
gdiskは、不正なGPTを修復するにあたり、そこに書かれたすべての情報が不正だとみなし、一から新しいGPTを作成してしまいます。つまり、ディスクは初期化した状態となってしまいます。
こういう状態に陥ったディスクは、どうやって修復するのだろう、といろいろ試してみました。
もちろん、sgdiskはダメでした。また、GPTに対応済みのfdisk, sfdiskもダメでした。
高度なオプションを駆使すれば、こうしたツールでも修復できるのかもしれませんが、私には分かりませんでした。
結論
実は、簡単に修復できるツールがあります。
gpartedです。
起動すると、「このディスクは、容量を目一杯使えない設定になっているが、使えるようにするか?」と、聞いてきます。ここで、OKすると、GPTを修正して、64Gbまで使えるように修復してくれます。ただし、セカンダリーGPTの修復は、あらかじめcgptコマンドで済ませておく必要があります。
もし、対象ディスクが一般的なGPTディスクならば、これで処理は終わりです。
しかし、ChromeOS拡張に対応したGPTディスクの場合は、もうひと仕事必要です。
実はgpartedは、非常にうまくディスクを修復してくれますが、ChromeOS拡張などというのは認識しません。
つまり、priority, tries, successfulのパラメータを、すべて破壊してくれます。
ということで、これらをcgptで復元する必要があります。パーティション情報のバックアップは、こういう時のために必要です。まあ、適当にブートできるような値を設定して、問題がなければそれでもいいのですが。
つまり、最初からまとめますと、
cgptによるセカンダリーGPTヘッダの修復 → gpartedによるディスク容量の修復 → cgptによるブート制御フラグの修復、ということになります。
私は、64Gbのディスクを4つのパーティションに分割したかったのです。
p1:kali-boot, p2:kali-root, p3:crouton(ubuntu), p4:data
ということで、64Gbのディスクにkali8Gbイメージをわざと無理に書き込んだのです。
もちろん、修復方法については、最初から知っていましたが。