GRUBハードディスクイメージの作成

HDDイメージファイルを作成する

空のイメージファイルを作成する。

8MBのイメージファイルを作成します。


$ dd if=/dev/zero of=hdd.img bs=512 count=16065

ファイルのサイズは「bs×count」バイトで指定します。

ハードディスクの容量は、パーティションの関係などによりヘッド数やシリンダ数を適切に設定する必要があります。

例えば、16065は「255(ヘッド数)*63(シリンダ数)*1(セクタ数)となります。


ループデバイスに接続する。

ハードディスクデバイスとして扱うためにループデバイスにHDDイメージを接続します


$ sudo losetup /dev/loop1 ./hdd.img

接続を確認します。


$ sudo fdisk -l /dev/loop1

ディスク /dev/loop1: 8 MB, 8225280 バイト
ヘッド 255, セクタ 63, シリンダ 1, 合計 16065 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x00000000

ディスク /dev/loop1 は正常なパーティションテーブルを含んでいません

パーティションを作成する

新パーティション作成とブート可否を切り替えて、パーティション情報を書き込みます。


$ sudo fdisk /dev/loop1
デバイスは正常な DOS パーティションテーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x4f18e62e で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: パーティションテーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4, 初期値 1): 1
最初 セクタ (2048-16064, 初期値 2048): 
初期値 2048 を使います
Last セクタ, +セクタ数 or +size{K,M,G} (2048-16064, 初期値 16064): 
初期値 16064 を使います

コマンド (m でヘルプ): a
パーティション番号 (1-4): 1

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。

警告: パーティションテーブルの再読込みがエラー 22 で失敗しました: 無効な引数です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。

パーティションを確認する。


$ sudo fdisk -l /dev/loop1

ディスク /dev/loop1: 8 MB, 8225280 バイト
ヘッド 255, セクタ 63, シリンダ 1, 合計 16065 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x4f18e62e

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/loop1p1   *        2048       16064        7008+  83  Linux

パーティション上にファイルシステムを作成する。

loop2デバイスに作成したパーティションを接続します。

loop1デバイスはハードディスクイメージ全体を指しておりパーティションを操作できませんので、loop2デバイスに作成したパーティションを接続します。


「-oオプション」でパーティションの先頭を指定することで、ループデバイスにパーティションを接続できます

パーティションの先頭は「始点*セクタ」で計算します。


本例では、作成したパーティションはディスクの「2048セクタ」から「16064セクタ(ディスクの最後)」まで占めていますので「1048576」を指定します。


$ sudo losetup -o 1048576 /dev/loop2 /dev/loop1

ファイルシステムを作成します。


$ sudo mkfs /dev/loop2
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
2000 inodes, 8000 blocks
400 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=8388608
1 block group
8192 blocks per group, 8192 fragments per group
2000 inodes per group

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

HDDイメージにGRUBをインストールする。

GRUB関連ファイルをコピーする。

HDDイメージをマウントします。


$ mkdir mnt
$ sudo mount /dev/loop2 mnt

GRUB関連ファイルをコピーします。


$ sudo mkdir -p ./mnt/boot/grub
$ sudo cp -p /usr/lib/grub/i386-pc/*stage* ./mnt/boot/grub/.

GRUBをインストールする。


$ sudo grub --device-map=/dev/null 

    GNU GRUB  version 0.97-4vl6  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]

grub> device (hd0) hdd.img 
device (hd0) hdd.img 
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  26 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+26 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.

grub> quit
quit

マウントやループデバイスを解除する。


$ sudo umount mnt
$ sudo losetup -d /dev/loop2
$ sudo losetup -d /dev/loop1

関連ページ