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メモリを認識できないので無理。
[参考]
Create a Bootable Flashdrive Using Vista's DISKPART Program
@IT: diskpartを使ってWindows Vista/7のインストールUSBメモリを作る
Create a Bootable Flashdrive Using Vista's DISKPART Program
@IT: diskpartを使ってWindows Vista/7のインストールUSBメモリを作る
- 管理者としてコマンドプロンプトを開き、「diskpart」と実行。するとDiskPartが起動する(カレントがDISKPARTになる)。
- 「list disk」と実行(認識されているディスクを表示)。
- 対象のUSBメモリを容量等から判断し、例えば「Disk 1」であれば「select disk 1」と実行(ディスクを対象として選択)。
- 「clean」を実行(対象ディスクの既存データ/パーティションを削除)。
- 「create partition primary」を実行(全容量で基本パーティションを作成)。
- 「active」を実行(作成した基本パーティションをアクティブにする)。
- 「format fs=fat32」を実行(FAT32でフォーマットする。これはFATでも構わない。なお、フォーマットは「ディスクの管理」から行っても同じ)。
- 「list partition」を実行し、アクティブな基本パーティション(Typeが「プライマリ」で左端に「*」が付く)が作成されていることを確認(これは必須ではない)。
- 「exit」でDiskPartを終了。
1.3. Windows PE 2.0を使う(XPの場合に)
やることはVistaのDiskPartと同じで、VistaベースのWindows PE 2.0のブータブルCD/DVDをXP上で作成し、そこからブートしてVistaのDiskPartを使う方法。とくに難しくはないが、手間はかかる。
- Microsoftから「Windows Vista SP1およびWindows Server 2008用の自動インストールキット(AIK)」をダウンロードする。これはISOファイルなので、CD/DVDに書き込むか仮想ディスクにマウントするかした上で、インストールする。
- 「Windows PE Toolsコマンドプロンプト」を開く。
- DiskPartは標準状態で使えるので何も追加する必要はない。したがって、例えば作業フォルダを「c:\bootwork」として「bootwork.iso」というISOファイルを作成するとすれば、以下を実行。
copype x86 c:\bootwork
oscdimg -n -b"etfsboot.com" ISO bootwork.iso - 作成された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になる模様。
- セクタ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の場合、自動的に以下が行われる)
- セクタ0をMBRとして、MBRのブートコードを書き込む。
- 基本パーティションを作成する(MBRのパーティションテーブルに記録。パーティションの開始セクタはセクタ63)。
- パーティションをActiveに設定する(同上)。
- パーティションをFATでフォーマットする(OSのライブラリを使うらしい)。
- フォーマットの際、パーティションのブートセクタにそのOSのブートセクタが書き込まれる(XP上ではXPの、Vista上ではVistaのブートコード)。
- 「clean」で既存データ/パーティションを削除する。この際に、自動的にセクタ0をMBRとして、MBRのブートコードが書き込まれる。
- 「create partition primary」で基本パーティションを作成する(MBRのパーティションテーブルに記録。パーティションの開始セクタはセクタ
1282048) - 「active」でパーティションをActiveに設定する(同上)。
- 「format fs=fat32」でパーティションをFAT32でフォーマットする。
- フォーマットの際、自動的にパーティションのブートセクタにVistaのブートコードが書き込まれる。
- セクタ0をMBRとして、MBRのブートコードを書き込む。
- 基本パーティションを作成する(MBRのパーティションテーブルに記録。パーティションの開始セクタはセクタ2)。
- パーティションをActiveに設定する(同上)。
- パーティションをFATでフォーマットする。
- パーティションのブートセクタにPC-DOS(IBM版のDOS)のブートコードを書き込む。パーティション内にPC-DOSの基本ファイル(IBMBIO.COM、IBMDOS.COM、COMMAND.COM)をコピーする(これらのデータは内蔵)。
- 既存のパーティションのブートセクタにLinuxのブートコードを上書きする。
- パーティション内にLinuxのカーネル等のファイルをコピーする。
- セクタ0にはMBRのブートコードがあり、パーティションテーブルには基本パーティションがActiveに設定された状態で記録されている。
- パーティションの開始セクタ(準備の方法によって位置は異なるが)にはブートセクタがあり、Linuxのブートコードがある。
3.2. 失敗の場合
試しにUSBメモリのセクタ0を消去した(Disk Probeを使って0で埋めた)状態でXPの「ディスクの管理」で見ると、フォーマットしかできない状態になっている。これをFAT32でフォーマットすると、
- 自動的にセクタ0をブートセクタとして、XPのブートコードが書き込まれる。
- セクタ0のブートセクタにLinuxのブートコードを上書きする。
- Linuxのカーネル等のファイルをコピーする。
- セクタ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にすれば、このままブータブルにできる。
5. まとめ
(USB-HDDと認識される場合に)ブータブルメディアビルダによってTrue ImageのブータブルUSBメモリの作成が成功するかは、その前にUSBメモリがブータブルな状態になっているか(MBRとActiveな基本パーティションがあるか)に依るが、
- その状態が「ディスクの管理」からは分かりにくい(そうと知らなければ全く分からない)
- 初期状態のUSBメモリにはブータブルな状態のものと、そうでないものが混在している(おそらく)
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の内容は以下のようになっている。
流れとしては以下のようになる。
- Disk Probeを起動し(Vistaでは管理者として)、現在ブートしているHDDをHandleに入れ、Read OnlyのままActiveとし、セクタ0を読み込む。これをファイルに保存し、HDDをHandleから外す。
- 保存したファイルを開き、Signatureからパーティションテーブルの終わりまで(01B8から01FDまで)を0で埋め、ファイルに上書きする。
- USBメモリをHandleに入れ、Read Onlyを外してActiveとし、セクタ0を読み込む(HDDのセクタ0でないことを確認)。保存していたファイルを開き、USBメモリに上書きする。Disk Probeを終了。
- USBメモリを一旦外して挿し直す(Disk Probeによる変更を認識させるため)。
- 「ディスクの管理」を開き、USBメモリが「未割り当て」の状態になっているはずなので、パーティションを作成し、フォーマットする。
- 再度Disk Probeを起動し、USBメモリのセクタ0を読み込む。最初のパーティションのブートフラグ(01BE)が00になっているはずなので、これを80に修正し、USBメモリに書き込む。
- 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のブータブルメディアビルダで書き込むと無事、起動しました。
コメントを投稿