2009/05/12

True ImageとUSBメモリのブート

Acronis True Image 11 Homeでは付属のブータブルメディアビルダでTrue ImageのブータブルUSBメモリを作成できるが、これが成功したり失敗したりする。こういうときに理由が分からないのが一番厄介なので、理由を調べてみた。なお、USBメモリがUSB-HDDとして認識されることが前提。

1. 成功させる方法


先に、ブータブルメディアビルダを実行しても失敗する場合に、これを成功させるための事前準備の方法を挙げておく。いずれもブータブルメディアビルダの前にUSBメモリに行っておくもの。

1.1. PeToUSBを使う(XP、Vista以降とも)


PeToUSB自体はBartPE/WinPEを目的としたツールだが、今回の目的にも使える。最も簡単。これをダウンロードし、PeToUSB.exeを実行すると(Vistaでは管理者として)、以下の画面が出る。

「Enable Disk Format」にチェック。その横のオプションは必須ではない。「Start」で実行すれば準備完了。

(注)PeToUSBはFAT(FAT16)でフォーマットするが、FAT16にはパーティションの最大サイズが4GBという制限があるので(Windows XPでFAT16ファイルシステムを使用した場合のパーティションの最大容量)、4GBを超える容量のUSBメモリはフォーマットが完了しない。この場合は、その後に「ディスクの管理」でFAT32でフォーマットし直せばよい。

1.2. VistaのDiskPartを使う(Vista以降の場合に)


Vistaの「ディスクの管理」ではなくコマンドラインのDiskPartを使う方法。なお、XPのDiskPartではUSBメモリを認識できないので無理。


  1. 管理者としてコマンドプロンプトを開き、「diskpart」と実行。するとDiskPartが起動する(カレントがDISKPARTになる)。
  2. 「list disk」と実行(認識されているディスクを表示)。
  3. 対象のUSBメモリを容量等から判断し、例えば「Disk 1」であれば「select disk 1」と実行(ディスクを対象として選択)。
  4. 「clean」を実行(対象ディスクの既存データ/パーティションを削除)。
  5. 「create partition primary」を実行(全容量で基本パーティションを作成)。
  6. 「active」を実行(作成した基本パーティションをアクティブにする)。
  7. 「format fs=fat32」を実行(FAT32でフォーマットする。これはFATでも構わない。なお、フォーマットは「ディスクの管理」から行っても同じ)。
  8. 「list partition」を実行し、アクティブな基本パーティション(Typeが「プライマリ」で左端に「*」が付く)が作成されていることを確認(これは必須ではない)。
  9. 「exit」でDiskPartを終了。
以上で準備完了。なお、操作順によっては、6.の前に対象のパーティションを選択する(「list partition」を実行し、例えば「partition 1」であれば「select partition 1」と実行)必要があることがある。

1.3. Windows PE 2.0を使う(XPの場合に)


やることはVistaのDiskPartと同じで、VistaベースのWindows PE 2.0のブータブルCD/DVDをXP上で作成し、そこからブートしてVistaのDiskPartを使う方法。とくに難しくはないが、手間はかかる。


  1. Microsoftから「Windows Vista SP1およびWindows Server 2008用の自動インストールキット(AIK)」をダウンロードする。これはISOファイルなので、CD/DVDに書き込むか仮想ディスクにマウントするかした上で、インストールする。
  2. 「Windows PE Toolsコマンドプロンプト」を開く。
  3. DiskPartは標準状態で使えるので何も追加する必要はない。したがって、例えば作業フォルダを「c:\bootwork」として「bootwork.iso」というISOファイルを作成するとすれば、以下を実行。
    copype x86 c:\bootwork
    oscdimg -n -b"etfsboot.com" ISO bootwork.iso
  4. 作成されたISOファイルをCD/DVDに書き込み、これからブートすれば自動的にコマンドプロンプトに入るので、後はVista上のDiskPartと同じ。
これらの準備の後、ブータブルメディアビルダを実行すればよい。

ちなみに、「HP USB Disk Storage Format Tool」というツールを使う方法もあるが、Hewlett-Packardのダウンロード条件が不明で、EULAを読む限りHewlett-Packard製品の存在が前提のようなので、除外した。手数もPeToUSBの方が少なくて済む。

2. ブートの基礎


USBメモリからのブートの話に入る前に、フロッピーディスクとHDDの場合のブートについて押さえておくと、
  • フロッピーディスクでは、先頭のセクタ(セクタ0)はブートセクタになっており、ブートコード(呼ばれ方は色々あるが、ブート用の小さなプログラム)がある。ブート時にはブートセクタが読み込まれ、そのブートコードがデータ内のOSを立ち上げる。

  • HDDでは、セクタ0はMBR(Master Boot Record)になっており、ブートコードとパーティションテーブル(パーティションの位置/長さ/Activeか等を記録)がある。一方、ブートセクタは基本パーティションの先頭セクタ(XPまではセクタ63、Vista以降はセクタ1282048)にある。ブート時にはまずMBRが読み込まれ、MBRのブートコードがパーティションテーブルからActiveな基本パーティションを探し、そのパーティションのブートセクタが読み込まれ、以下同上。

    (注)Vista以降で作成したパーティションの先頭セクタは、そのデバイスの容量が8GB以上の場合はセクタ2048になる模様。
したがって、フロッピーディスクとHDDでは以下の違いがある。
  • セクタ0がブートセクタか(フロッピーディスク)、MBRか(HDD)
  • ブートの過程にMBRが入るか(HDD)、否か(フロッピーディスク)

3. 観察


さて、実際のUSBメモリ内がどうなっているかについて、セクタの内容をDisk Probe(Support Toolsに含まれるツール)で直接確認しつつ観察してみた。

対象のUSBメモリはIBMの「128MB USB2.0 高速メモリーキー」。古い製品だが、True Imageのブータブルメディアに入るファイルは50MBぐらいだし、IBMによる「Memory Key Boot Utility」が使える。

PCはThinkPad X61sで、このUSBメモリを挿すと(他のUSBメモリも)USB-HDDとして認識される。

3.1. 成功の場合


まずブータブルUSBメモリの作成に成功する場合、実際に何が行われるかというと、準備段階では、

(PeToUSBの場合、自動的に以下が行われる)
  1. セクタ0をMBRとして、MBRのブートコードを書き込む。
  2. 基本パーティションを作成する(MBRのパーティションテーブルに記録。パーティションの開始セクタはセクタ63)。
  3. パーティションをActiveに設定する(同上)。
  4. パーティションをFATでフォーマットする(OSのライブラリを使うらしい)。
  5. フォーマットの際、パーティションのブートセクタにそのOSのブートセクタが書き込まれる(XP上ではXPの、Vista上ではVistaのブートコード)。
(VistaのDiskPartの場合、以下を行う)
  1. 「clean」で既存データ/パーティションを削除する。この際に、自動的にセクタ0をMBRとして、MBRのブートコードが書き込まれる。
  2. 「create partition primary」で基本パーティションを作成する(MBRのパーティションテーブルに記録。パーティションの開始セクタはセクタ1282048)
  3. 「active」でパーティションをActiveに設定する(同上)。
  4. 「format fs=fat32」でパーティションをFAT32でフォーマットする。
  5. フォーマットの際、自動的にパーティションのブートセクタにVistaのブートコードが書き込まれる。
(IBMのMemory Key Boot Utilityの場合、自動的に以下が行われる)
  1. セクタ0をMBRとして、MBRのブートコードを書き込む。
  2. 基本パーティションを作成する(MBRのパーティションテーブルに記録。パーティションの開始セクタはセクタ2)。
  3. パーティションをActiveに設定する(同上)。
  4. パーティションをFATでフォーマットする。
  5. パーティションのブートセクタにPC-DOS(IBM版のDOS)のブートコードを書き込む。パーティション内にPC-DOSの基本ファイル(IBMBIO.COM、IBMDOS.COM、COMMAND.COM)をコピーする(これらのデータは内蔵)。
この後にブータブルメディアビルダを実行すると、自動的に以下が行われる。
  1. 既存のパーティションのブートセクタにLinuxのブートコードを上書きする。
  2. パーティション内にLinuxのカーネル等のファイルをコピーする。
ここまで行うとUSBメモリは以下のようになる。
  • セクタ0にはMBRのブートコードがあり、パーティションテーブルには基本パーティションがActiveに設定された状態で記録されている。
  • パーティションの開始セクタ(準備の方法によって位置は異なるが)にはブートセクタがあり、Linuxのブートコードがある。
つまり、HDDの場合と同じ構成になる。また、準備段階でブートセクタに書き込まれる各OSのブートコードはLinuxのブートコードで上書きされるので、何でもいいことになる。

3.2. 失敗の場合


試しにUSBメモリのセクタ0を消去した(Disk Probeを使って0で埋めた)状態でXPの「ディスクの管理」で見ると、フォーマットしかできない状態になっている。これをFAT32でフォーマットすると、
  1. 自動的にセクタ0をブートセクタとして、XPのブートコードが書き込まれる。
この状態のUSBメモリにブータブルメディアビルダを実行すると、
  1. セクタ0のブートセクタにLinuxのブートコードを上書きする。
  2. Linuxのカーネル等のファイルをコピーする。
こうするとUSBメモリは以下のようになる。
  • セクタ0にファイルシステムがFAT32のブートセクタがあり、Linuxのブートコードがある。
つまり、フロッピーディスクの場合と同じ構成になる。この状態ではブート時にエラーを出してブートできない。

ここまでをまとめると、以下のように言ってよいと思う。
  • (USB-HDDと認識される場合に)USBメモリからブートできるためには、HDDと同様にMBRとActiveな基本パーティションが存在する必要がある。これはUSBメモリのブートにはMBRが必要と言われていることと符合する。


  • ブータブルメディアビルダは、既存のブートセクタへのLinuxのブートコードの上書き、Linuxのファイルのコピーはするが、そのUSBメモリがそもそもブータブルかどうかの面倒は見ない(少なくともこの環境では)。

4. 「ディスクの管理」の責任


観察していて気付いたが、「ディスクの管理」はUSBメモリのセクタ0の状態によって、フロッピーディスクと同様に扱うか、HDDと同様に扱うかを、それと明示せず自動的に切り替えている。

以下は、フロッピーディスクと同様の場合(A)とHDDと同様の場合(B)について、XPの「ディスクの管理」からUSBメモリの部分を切り出したもの。
  • A1は大概のUSBメモリは初期状態でこうなっていると思うが、セクタ0がブートセクタになっており、FAT32でフォーマットされた状態。これではブートできず、セクタ0のブートセクタをMBRに置き換えなければ(中のデータは全て消える)、ブータブルにはできない。
  • A0はMBRを消去した(0で埋めた)状態で、「ディスクの管理」ではフォーマットしかできない。USBメモリを初期化するようなツール(実際は全部0で埋める)を使ってもこうなると思う。これをFAT32でフォーマットするとA1になる。

  • B1はブータブルな状態で、A1にはない「(アクティブ)」が付いている。セクタ0がMBRになっており、FAT32でフォーマットされたActiveな基本パーティションがある。
  • B0-1はMBRはあるがパーティションはない状態で(セクタ0にMBRのブートコードはあるが、パーティションテーブルは空)、このような状態のHDDと同様に「未割り当て」となっている。VistaのDiskPartで「clean」だけを行うとこの状態になる。
  • B0-2はB0-1の状態からパーティションの作成だけを行った状態で、見かけ上はA0と同じになる。これだけなら「ディスクの管理」からも可能。
  • B0-3-aはB0-2の状態からパーティションをActiveにした状態で、「(アクティブ)」が付いている。なお、USBメモリ内のパーティションをActiveにするのは「ディスクの管理」からはできないので、VistaのDiskPart等で。
  • B0-3-bはB0-2の状態からパーティションをFAT32でフォーマットした状態で、見かけ上はA1と同じになる。A1とは違って、パーティションをActiveにすれば、このままブータブルにできる。
したがって、USBメモリを「ディスクの管理」で見ただけでは何がどうなっているのか分からないという状態に陥りがちで、「ディスクの管理」の責任は大きいと思う。なお、これはXPとVistaの「ディスクの管理」に共通で、Windows 7 RCでも変わってないので、当分このままだろう。

5. まとめ


(USB-HDDと認識される場合に)ブータブルメディアビルダによってTrue ImageのブータブルUSBメモリの作成が成功するかは、その前にUSBメモリがブータブルな状態になっているか(MBRとActiveな基本パーティションがあるか)に依るが、
  • その状態が「ディスクの管理」からは分かりにくい(そうと知らなければ全く分からない)
  • 初期状態のUSBメモリにはブータブルな状態のものと、そうでないものが混在している(おそらく)
ことが、成功したり失敗したりする理由のように思う。したがって、はまってしまったときはMBR(セクタ0)を直接覗けるツールで確認してみるのも一つの方法である。

6. その他


作業の過程で発見したこと。

6.1. DOSのブータブルUSBメモリ


自分でも認識してなかったが、USBメモリでブートできるような状態であれば、他のデバイスからDOSをブートしたときもドライバなしでそのUSBメモリが見える。したがって、Windows 98の起動フロッピーディスク(FDISK、FORMAT、SYS入り)があれば、普通にFDISKでの基本パーティション作成とActive指定、FORMAT、SYSによるシステム転送でMS-DOSのブータブルUSBメモリが作成できる。

一方、PC-DOSはといえば、PC-DOSの起動フロッピーディスクを持っている人は多くないだろうから(自分は持っていたが、とっくにフロッピーディスクが死んだ)、IBM/LenovoのUSBメモリでMemory Key Boot Utilityを使うのがほとんど唯一の方法のように思う。これが便利なのは、LenovoとHGSTのツールは今でもPC-DOSベースなので、このフロッピーディスクのファイルをそのまま上書きすればそのブータブルUSBメモリが作成できること(Feature Toolで確認)。

6.2. Syslinux


SyslinuxでMBRの書き込みができるはずだが、Syslinux.exe(3.75)を-maを含めてオプションを色々変えて試したが、セクタ0が既にブートセクタになっている状態でこれを上書きする形でのMBRの書き込みはできなかった(この環境では)。Syslinuxでは対象デバイスの指定にドライブレターが必要で、すなわちセクタ0が空の状態では使えないので、単体ではMBRを作成できず、ブータブルな状態にできないことになる。

6.3. Rescue and RecoveryのブータブルUSBメモリ


現在のThinkPadにはリカバリー/バックアップ用ツールとしてRescue and Recoveryがプリインストールされている。これ自体の良し悪しはあるが、このVista版から作成できるレスキューメディア(ブータブルCD/DVD/内蔵HDD/USB接続HDD)はVistaベースのWindows PE 2.0なので、USBメモリを1.2.のVistaのDiskPartを使う方法で準備し、レスキューメディアのファイルをコピーすれば、そのブータブルUSBメモリを作成できる(4.21で確認。ブート時に少し違うところがあるが)。

なお、Rescue and RecoveryのXP版のレスキューメディアはWindows PE 1.x(正確なバージョンは不明)で、これをUSBメモリに移植する方法は分からない。

6.4. セクタ0の直接編集


あまり勧められる方法ではないが、Disk Probeで直接USBメモリのセクタ0を編集してブータブルな状態にすることも可能。発想としてはHDDのMBRをコピーして修正の上でUSBメモリに書き込むもの。当然ながら間違えると危険なので、予めTrue ImageでHDDをバックアップしておいた方がよいと思う。

一般的にMBRの内容は以下のようになっている。

流れとしては以下のようになる。
  1. Disk Probeを起動し(Vistaでは管理者として)、現在ブートしているHDDをHandleに入れ、Read OnlyのままActiveとし、セクタ0を読み込む。これをファイルに保存し、HDDをHandleから外す。
  2. 保存したファイルを開き、Signatureからパーティションテーブルの終わりまで(01B8から01FDまで)を0で埋め、ファイルに上書きする。
  3. USBメモリをHandleに入れ、Read Onlyを外してActiveとし、セクタ0を読み込む(HDDのセクタ0でないことを確認)。保存していたファイルを開き、USBメモリに上書きする。Disk Probeを終了。
  4. USBメモリを一旦外して挿し直す(Disk Probeによる変更を認識させるため)。
  5. 「ディスクの管理」を開き、USBメモリが「未割り当て」の状態になっているはずなので、パーティションを作成し、フォーマットする。
  6. 再度Disk Probeを起動し、USBメモリのセクタ0を読み込む。最初のパーティションのブートフラグ(01BE)が00になっているはずなので、これを80に修正し、USBメモリに書き込む。
以上の作業で、USBメモリがブータブルの状態になるはず(実際の起動にはOSのファイルが必要)。
  • VistaによるMBRのブートコードでは、この方法で4GBのUSBメモリもブータブルにできた。
  • XPによるMBRのブートコードでは、2GBまでのUSBメモリは問題なかったが、4GB以上のUSBメモリはブータブルにできなかった。ブートコードに微妙な違いがあるらしい。なお、この状態からMBRのブートコードをsyslinux.exeを-maオプションで実行して上書きすればブータブルにできた。

5 件のコメント:

匿名 さんのコメント...

Acronis付属のブータブルメディアビルダとUbuntuのスタートアップUSBの作成ユーティリティを関連させて、読まさせていただきました。目からうろこでしたね。

匿名 さんのコメント...

この記事で、かなり助かりました。
ありがとう!

匿名 さんのコメント...

> Rescue and RecoveryのXP版のレスキューメディアは
> Windows PE 1.x(正確なバージョンは不明)

~R&R 4.21:PE 1.0
R&R 4.23 :PE 1.5

匿名 さんのコメント...

Diskpartを使う方法でHDDに見せかける際にntfsでフォーマットしたところ、Windows 7でシステムイメージをバックアップする先としても選べる、USBメモリにできました。

とても参考になりました。

Windows 7の場合、チェック ディスクを実行した際に、System Volume Informationが作成されれば、そのUSBメモリはFDD風ではなくHDD風になっているようです。

匿名 さんのコメント...

すばらしいです。起動できなかったので助かりました。
ただ、PeToUSBはとても使いやすいのですが、
容量の大きなUSBメモリ(2Gまでらしい)は認識できませんでした。

その場合、rufus なるツールで一旦 Free DOSのブータブルUSB
(つまり、この記事のMBRができるものと思われる)を作った後で
Acronisのブータブルメディアビルダで書き込むと無事、起動しました。

コメントを投稿