Chrome OSのディスクをサイズアップする

fdiskで仮想ディスクのセクタ数、ヘッダ数、シリンダ数の設定は必要なかったので、その部分を削除した。仮想ディスクの方で定義してあるのでfdiskではその値が使われる。(2009/11/28)

ダウンロードしたChrome OSのバイナリ(chromeos-image-999.999.32309.211410-a1.vmdk.bz2
)ではベースとなるLinuxUbuntu)のルートファイルシステムの大きさが960MB程度しかなく、Chrome OS自身が600MBを使っているので、残りは約300MBしかない。これでは、追加でソフトウェアを入れようとしても足りない場合もある。また、配布されているvmdk(仮想ディスク)ファイルは約3GBで構成されていて(ルート:約1GB、スワップ:約1GB、ステートフル:約1GB)で4GBのUSBメモリに入れると1GB程、未使用となってしまう。

そこで、chromeos-image-999.999.32309.211410-a1.vmdkを4GBのvmdkに入れ替えサイズアップした。

この手法は、別にChrome OSに限らず、LinuxシステムのHDD(やパーティション)が窮屈になった場合にHDD(やパーティション)を引っ越すにも使えるのでメモを取っておく。また、最後のところで触れるが、ディスクのサイズアップだけでなくサイズダウンも可能で、実際650MB程度の仮想ディスクにChrome OSを入れて動作させている。

今回はいつものように、作業が簡単なのでVMware仮想マシン環境を使って行ったが、物理的なHDDやUSBメモリを使って直接作業することも可能である。

手順とすれば以下の5ステップとなる。

  1. コピー先の空の仮想ファイルを作成する:今回は机の中で眠っているエレコムのMF-AU204GGTという4GBのUSBメモリに最終的にコピーすることを考えて、それと同じ大きさの仮想ディスクを用意した。
  2. パーティションの作成する:今回はルート:約2GB、スワップ:約1GB、ステートフル:約1GBにした。配布されているバイナリはスワップは使っていないのでルート2GB、ステートフル:2GBとかもで可能だろう(未確認。)またWindows PCに挿してUSBメモリとして使えるように、ルート:2GB、ステートフル:1GB、NTFS:1GBなども可能だろう。
  3. パーティションファイルシステムとしてフォーマットする。ext3を使う。
  4. ルートファイルシステムをコピー先のパーティションへコピーする。(ステートフルのファイルシステムは実質的に空なのでそのまま。)
  5. ブートローダをインストールする:Chrome OSではextlinuxというsyslinux系のローダを使っているので、extlinuxをインストールした。(GRUBの場合は“LinuxにおけるgrubによるMBRの修復方法”を参照。)

Chrome OSの外部記憶にはルートファイルシステムを納めるパーティションと、設定情報などを保存するためのステートフル・パーティション(/mnt/stateful_partitionにマウントされる)から構成されている。

 空の仮想ディスクの作成

コピー先として使う4GBの空の仮想ディスクを作成する。作成するのはVMwareの固定形式の仮想ディスク。flash-image.vmdk と flash-image-flat.vmdk。ディスクの大きさは最終的に書き込むUSBメモリと同じ大きさの4,043,308,544バイト。USBメモリの大きさはfdiskコマンド等で確認できる。

root@vmhost:~/tmp# fdisk /dev/sdd

Command (m for help): p

Disk /dev/sdd: 4043 MB, 4043308544 bytes
125 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 7750 * 512 = 3968000 bytes
	:
	:

先ず、この容量と同じ大きさのフラットファイル(flash-image-flat.vmdk)を作成する。

root@vmhost:~/tmp# dd if=/dev/zero of=flash-image-flat.vmdk bs=1010827136 count=4
4+0 records in
4+0 records out
4043308544 bytes (4.0 GB) copied, 56.8931 s, 71.1 MB/s
root@vmhost:~/tmp# ls -l flash-image-flat.vmdk
-rw-r--r-- 1 root root 4043308544 2009-11-27 19:44 flash-image-flat.vmdk
root@vmhost:~/tmp#

(ddのパラメータの設定については“ddが2,147,479,553バイト以上を1回で処理できない話”を参照。)

次にエディタで定義ファイル(flash-image.vmdk)を作成する。作成済みのファイルは以下の通り。

root@vmhost:~/tmp# cat flash-image.vmdk
# Disk DescriptorFile
version=1
CID=11111111
parentCID=ffffffff
createType="monolithicFlat"

# Extent description
RW 7897087 FLAT "flash-image-flat.vmdk" 0

# The Disk Data Base
#DDB

ddb.virtualHWVersion = "4"
ddb.encoding = "UTF-8"
ddb.uuid = "11 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11"
ddb.geometry.cylinders = "491"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.adapterType = "ide"
ddb.toolsVersion = "8227"
root@vmhost:~/tmp# 

ここで、ちゃんと定義しないといけないのは、中程の“Extent description”。RWの後の値はディスクの総セクタ数(総容量÷512)。FLATの後はフラットファイルのファイル名。
セクタ数、ヘッダ数、シリンダ数は必ずしも上のfdiskで調べたUSBのジオメトリに合わせる必要ない。決め方については“VMwareの仮想ディスクをLinuxでマウントして使う”を参照のこと。ここではシリンダ数とヘッダ数をLinuxの論理ディスクで使う63、255として、総容量から逆算してシリンダ数を491している。

その他のパラメータに関しては利用しているVMwareの環境に合わせて“適当に”設定しておく。(既にあるフラットディスクの定義ファイルをコピーして来て、それに変更を加える形で作れば、大抵は動作する筈。)

参考までに、最終的にUSBに書き込むと次のようになる。

root@vmhost:~/tmp# fdisk /dev/sdd

Command (m for help): p

Disk /dev/sdd: 4043 MB, 4043308544 bytes
255 heads, 63 sectors/track, 491 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x7d78abf7

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1         122      979933+  83  Linux
/dev/sdd2             123         244      979965   82  Linux swap / Solaris
/dev/sdd3   *         245         491     1984027+  83  Linux

Command (m for help): q

root@vmhost:~/tmp# 

 パーティションの作成

空の4GB仮想ディスクが出来たので、これをパーティショニングする。今回は

  1. ルート:2GB
  2. スワップ:1GB
  3. ホーム:1GB

とする。仮想ディスクのパーティショニングはホストマシンで

root@vmhost:~/tmp# fdisk flash-image-flat.vmdk

とする方法と、適当な仮想マシン作って空の仮想ディスク(flash-image.vmdk)を仮想マシンに追加し、仮想マシンの中で

root@ubuntu:~/tmp# fdisk /dev/sdc

とする方法がある。(パーティショニングだけでなく、以降の作業を仮想マシンを使わずにLinux上で行う方法と仮想マシン上で行う方法がある。)Linuxに慣れていれば、仮想マシンを使わずにお手軽に作業できるが、仮想マシンを使った方が安全だろう。(ターゲット・ディスクのMBRを書きかえる作業等があるので、ミスをするとLinux自身が起動出来なくなってしまう。)
以下の例では仮想マシンを使って設定する方法を載せておく。

仮想マシンを利用して作業する場合は、新規に使い捨て仮想マシンを作る。仮想マシンのOSはLinuxであれば、どれでも構わないと思うが、私はUbuntu 9.10をインストールした。(大した理由もないが、Chrome OSカーネルが2.6.30であり、Ubuntu 9.10は 2.6.31なので一番近いかな、と思って。)
以下の記述を分かり易くするためにIDEディスクを使い、

とする。
OSをインストールしたら一旦仮想マシンをShutdownして、Chrome OSの仮想ディスクとコピー先の空の仮想ディスクを接続する。

  • IDE 0:1 Chrome OSの仮想ディスク(chromeos-image-999.999.32309.211410-a1.vmdk)
  • IDE 1:1 コピー先の空の仮想ディスク(flash-image.vmdk)

この様に構成にすることで、仮想マシンの中では次の様にディスクを使い分けることになる。

準備ができたら仮想マシンを立ち上げ、ターミナル・ウィンドウ開き、“sudo -s”でrootになっておく。準備が出来たら、コピー先の仮想ディスクのパーティショニングにfdiskコマンドを使う。
まず、参考のためにオリジナルの仮想ディスクのパーティションを確認する。

root@ubuntu:~# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 2988 MB, 2988442112 bytes
255 heads, 63 sectors/track, 363 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         122      972800   83  Linux
/dev/sdb2             122         243      972800   82  Linux swap / Solaris
/dev/sdb3   *         243         364      972800   83  Linux

Command (m for help): q

root@ubuntu:~# 

(実際には、パーティションの物理セクタと論理セクタが異なっているので、警告メッセージが出るが、知りたい情報のエッセンスは上記の内容となる。)sdb1がステートフル、sdb2がスワップ、そしてsdb3がルート・ファイルシステム

コピー先の仮想ディスクはステートフルとスワップはそのままにして、残りを全てルート・ファイルシステムに割り当てるようにする。fdiskを起動し、パーティションテーブルを設定する。

root@ubuntu:~# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xbb5e3dd9.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-491, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-491, default 491): 122

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (123-491, default 123): 123
Last cylinder, +cylinders or +size{K,M,G} (123-491, default 491): 244

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (245-491, default 245): 245
Last cylinder, +cylinders or +size{K,M,G} (245-491, default 491): 491

Command (m for help): p

Disk /dev/sdc: 4043 MB, 4043308544 bytes
255 heads, 63 sectors/track, 491 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xbb5e3dd9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         122      979933+  83  Linux
/dev/sdc2             123         244      979965   83  Linux
/dev/sdc3             245         491     1984027+  83  Linux

Command (m for help): 

次にsdc2のシステムIDをスワップに変更し、sdc3にbootableフラグを設定して、HDD(仮想ディスク)に書き出す。なお、bootableフラグはChrome OSブートローダとして使っているextlinuxがbootableフラグのあるパーティションから起動するらしいので設定する(ソースコードとこ見ていないが、bootableフラグを設定しないとブートしなかった。)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)

Command (m for help): a
Partition number (1-4): 3

Command (m for help): p

Disk /dev/sdc: 4043 MB, 4043308544 bytes
255 heads, 63 sectors/track, 491 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xbb5e3dd9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         122      979933+  83  Linux
/dev/sdc2             123         244      979965   82  Linux swap / Solaris
/dev/sdc3   *         245         491     1984027+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
root@ubuntu:~# 

これでコピー先のHDDのパーティショニングは終了。

root@ubuntu:~# ls /dev/sdc*
/dev/sdc  /dev/sdc1  /dev/sdc2  /dev/sdc3
root@ubuntu:~# 

 ファイルシステムのフォーマット

/dev/sdc1と/dev/sdc3をext3ファイルシステムとしてフォーマットする。この時、各ファイルシステムにラベルを付ける必要がある。Linuxカーネルが立ち上がる際、ステートフルをマウントする際、このラベルでパーティションを識別している。オリジナルのディスクでは次のようになっている。

root@ubuntu:~# e2label /dev/sdb1
C-STATE
root@ubuntu:~# e2label /dev/sdb3
C-ROOT
root@ubuntu:~# 

このラベル名に合わせて、各パーティションをフォーマットする。

root@ubuntu:~# mkfs -t ext3 -L C-STATE /dev/sdc1
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=C-STATE
OS type: Linux
	:
	:
root@ubuntu:~# 
root@ubuntu:~# mkfs -t ext3 -L C-ROOT /dev/sdc3
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=C-ROOT
OS type: Linux
	:
	:
root@ubuntu:~# 
root@ubuntu:~# e2label /dev/sdc1
C-STATE
root@ubuntu:~# e2label /dev/sdc3
C-ROOT
root@ubuntu:~# 

 ファイルシステムのコピー

オリジナルのルート・ファイルシステム(/dev/sdb3)をコピー先のルート・ファイルシステム(/dev/sdc3)にコピーする。ステートフルのファイルシステムは初期状態では空(lost+foundだけ)なので、何もしなくてOK。

まず、それぞれのファイルシステムをマウントする。

root@ubuntu:~# mkdir src dst
root@ubuntu:~# mount /dev/sdb3 src
root@ubuntu:~# mount /dev/sdc3 dst
root@ubuntu:~# ls src
bin   dev  home  lost+found  mnt  postinst  root  selinux  sys  trunk  var
boot  etc  lib   media       opt  proc      sbin  srv      tmp  usr
root@ubuntu:~# ls dst
lost+found
root@ubuntu:~# 

rsyncコマンド使ってコピーする。

root@ubuntu:~# ls dst/
lost+found
root@ubuntu:~# rsync -axAXH src/ dst/
root@ubuntu:~# ls dst/
bin   dev  home  lost+found  mnt  postinst  root  selinux  sys  trunk  var
boot  etc  lib   media       opt  proc      sbin  srv      tmp  usr
root@ubuntu:~# 

(ファイルのシステムのコピーにはdump+restoreを使う方法もある。昔“PXEによるディスクレス・クライアント(総集編)”で調べた頃はrsyncではSELinuxACL(Account Control List)を正確にコピーできなかったが、その後、rsyncのバージョンが上がってACLもコピーできるようになっている。それにUbuntuベースのLinuxであれば標準でSELinuxは使っていないので。dump+restoreよりはrsyncの方がお手軽だろう。)

コピーしたファイルシステムのサイズ等を確認する。

root@ubuntu:~# df src/ dst/
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sdb3               957496    591136    317720  66% /home/ubuntu/src
/dev/sdc3              1952808    609476   1244132  33% /home/ubuntu/dst
root@ubuntu:~# df -i src/ dst/
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sdb3              60800   20720   40080   35% /home/ubuntu/src
/dev/sdc3             124160   20720  103440   17% /home/ubuntu/dst
root@ubuntu:~# 

オリジナルに比べてサイズが若干大きくなっているのは、ファイルのサイズだけ割り当てて実際にはファイルの内容が書かれていないようなファイルをコピーする際にサイズ分のファイルとしてコピーするためだろう。例えば、次のようなファイルがある。

root@ubuntu:~# ls -l src/var/log/lastlog dst/var/log/lastlog 
-rw-rw-r-- 1 root utmp 292292 2009-11-20 06:15 dst/var/log/lastlog
-rw-rw-r-- 1 root utmp 292292 2009-11-20 06:15 src/var/log/lastlog
root@ubuntu:~# du src/var/log/lastlog dst/var/log/lastlog 
12	src/var/log/lastlog
292	dst/var/log/lastlog
root@ubuntu:~# 

この様にファイルサイズの若干の違いは出てくるが、iノードの数は全く同じなので、ちゃんとファイルシステム全体はコピーされている。

 ブートローダのインストール

最後に、BIOSからシステムをブートできるようにブートローダをインストールする。Chrome OSで使われているブートローダはextlinuxなので、次のような操作になる。
ブートするカーネルイメージのあるディレクトリを指定してextlinuxというコマンド実行すると“extlinux.sys”というファイルが生成される。

root@ubuntu:~# ls -l dst/boot/extlinux.sys
-r--r--r-- 1 root root 14336 2009-11-20 06:16 dst/boot/extlinux.sys
root@ubuntu:~# extlinux -i dst/boot/
dst/boot/ is device /dev/sdc3
root@ubuntu:~# ls -l dst/boot/extlinux.sys
-r--r--r-- 1 root root 12800 2009-11-27 20:09 dst/boot/extlinux.sys
root@ubuntu:~# 

extlinuxの実行前後でextlnux.sysの作成日時が変わっている。また、同時にパーティション(この場合は/dev/sdc3)の先頭セクタにブートローダのプログラムの一部が書き込まれる。参考までにダンプを載せておく。

root@ubuntu:~# hd -n 512 /dev/sdc3
00000000  eb 58 90 45 58 54 4c 49  4e 55 58 00 02 00 00 00  |.X.EXTLINUX.....|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  37 8c 3c 00 00 00 00 00  00 00 00 00 00 00 00 00  |7.<.............|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000050  00 00 00 00 00 00 00 00  00 00 fa fc 31 c0 8e d0  |............1...|
00000060  bc b4 7b 06 57 8e c0 b9  08 00 bf b4 7b f3 a5 8e  |..{.W.......{...|
00000070  d8 bb 78 00 0f b4 37 0f  a0 56 88 16 24 30 20 d2  |..x...7..V..$0 .|
00000080  78 15 b1 06 89 3f 89 47  02 f3 64 a5 8a 0e 18 7c  |x....?.G..d....||
00000090  88 4d f8 cd 13 eb 27 f6  45 f0 7f 75 08 66 8b 45  |.M....'.E..u.f.E|
000000a0  f8 66 a3 1c 7c b4 08 cd  13 72 13 20 e4 75 0f c1  |.f..|....r. .u..|
000000b0  ea 08 42 89 16 1a 7c 83  e1 3f 89 0e 18 7c fb bb  |..B...|..?...|..|
000000c0  aa 55 b4 41 8a 16 24 30  cd 13 72 10 81 fb 55 aa  |.U.A..$0..r...U.|
000000d0  75 0a f6 c1 01 74 05 c6  06 02 7d 00 66 a1 f8 7d  |u....t....}.f..}|
000000e0  bb 00 7e e8 10 00 66 81  3e 2c 7e 6b a2 ce 76 0f  |..~...f.>,~k..v.|
000000f0  85 c3 00 e9 46 02 bd 01  00 66 03 06 1c 7c 66 31  |....F....f...|f1|
00000100  d2 eb 4f 55 e8 d5 00 66  0f b7 fd b9 10 00 66 52  |..OU...f......fR|
00000110  66 50 06 53 57 6a 10 89  e6 66 60 8a 16 24 30 1e  |fP.SWj...f`..$0.|
00000120  16 1f b4 42 cd 13 1f 66  61 8d 64 10 72 10 5d 66  |...B...fa.d.r.]f|
00000130  01 f8 29 fd c1 e7 09 01  fb 21 ed 75 c6 c3 66 60  |..)......!.u..f`|
00000140  31 c0 8a 16 24 30 cd 13  66 61 e2 c2 c6 06 02 7d  |1...$0..fa.....}|
00000150  4f 5d 66 52 66 50 55 53  66 0f b7 36 18 7c 66 0f  |O]fRfPUSf..6.|f.|
00000160  b7 3e 1a 7c 66 f7 f6 31  c9 87 ca 66 f7 f7 e8 6b  |.>.|f..1...f...k|
00000170  00 29 ce 39 f5 76 02 89  f5 c0 e4 06 41 08 e1 88  |.).9.v......A...|
00000180  c5 88 d6 8a 16 24 30 95  b4 02 bd 10 00 66 60 cd  |.....$0......f`.|
00000190  13 66 61 72 17 66 0f b6  c8 c1 e0 09 5b 01 c3 5d  |.far.f......[..]|
000001a0  66 58 66 5a 66 01 c8 29  cd 75 a7 c3 4d 75 de 95  |fXfZf..).u..Mu..|
000001b0  d1 2e fc 7d 75 df 31 f6  8e d6 bc b0 7b 8e de 66  |...}u.1.....{..f|
000001c0  8f 06 78 00 be e7 7d ac  20 c0 74 09 b4 0e bb 07  |..x...}. .t.....|
000001d0  00 cd 10 eb f2 98 cd 16  cd 19 eb fe 3b 2e fc 7d  |............;..}|
000001e0  76 04 8b 2e fc 7d c3 42  6f 6f 74 20 65 72 72 6f  |v....}.Boot erro|
000001f0  72 0d 0a 00 00 00 00 00  00 40 16 00 7f 00 55 aa  |r........@....U.|
00000200
root@ubuntu:~# 

次にextlinux.sysのあるディレクトリにextlinux.confという構成ファイルを作る必要があるが、これはオリジナルのChrome OSのファイルがコピーされているので、そのまま使う。なお、この構成ファイルの中の記述で、ルート・ファイルシステムのマウントオプションを“ro”から“rw”へ変更することでChrome OSのルート・ファイルシステムへ書き込みができる(=設定変更ができる)ようにも出来る。

最後にHDD(この場合は仮想ディスクだが)のMBRに1次ローダのプログラムを書き込む。

root@ubuntu:~# cat /usr/lib/syslinux/mbr.bin > /dev/sdc
root@ubuntu:~# 

参考までにMBRに書き込まれた1次ローダのダンプを載せておく。

root@ubuntu:~# hd -n 512 /dev/sdc
00000000  fa 31 c0 8e d8 8e d0 bc  00 7c 89 e6 06 57 52 8e  |.1.......|...WR.|
00000010  c0 fb fc bf 00 06 b9 00  01 f3 a5 ea 20 06 00 00  |............ ...|
00000020  52 b4 41 bb aa 55 31 c9  30 f6 f9 cd 13 72 13 81  |R.A..U1.0....r..|
00000030  fb 55 aa 75 0d d1 e9 73  09 66 c7 06 8d 06 b4 42  |.U.u...s.f.....B|
00000040  eb 15 5a b4 08 cd 13 83  e1 3f 51 0f b6 c6 40 f7  |..Z......?Q...@.|
00000050  e1 52 50 66 31 c0 66 99  e8 66 00 e8 21 01 4d 69  |.RPf1.f..f..!.Mi|
00000060  73 73 69 6e 67 20 6f 70  65 72 61 74 69 6e 67 20  |ssing operating |
00000070  73 79 73 74 65 6d 2e 0d  0a 66 60 66 31 d2 bb 00  |system...f`f1...|
00000080  7c 66 52 66 50 06 53 6a  01 6a 10 89 e6 66 f7 36  ||fRfP.Sj.j...f.6|
00000090  f4 7b c0 e4 06 88 e1 88  c5 92 f6 36 f8 7b 88 c6  |.{.........6.{..|
000000a0  08 e1 41 b8 01 02 8a 16  fa 7b cd 13 83 c4 10 66  |..A......{.....f|
000000b0  61 c3 e8 c4 ff be be 7d  bf be 07 b9 20 00 f3 a5  |a......}.... ...|
000000c0  c3 66 60 89 e5 bb be 07  b9 04 00 31 c0 53 51 f6  |.f`........1.SQ.|
000000d0  07 80 74 03 40 89 de 83  c3 10 e2 f3 48 74 5b 79  |..t.@.......Ht[y|
000000e0  39 59 5b 8a 47 04 3c 0f  74 06 24 7f 3c 05 75 22  |9Y[.G.<.t.$.<.u"|
000000f0  66 8b 47 08 66 8b 56 14  66 01 d0 66 21 d2 75 03  |f.G.f.V.f..f!.u.|
00000100  66 89 c2 e8 ac ff 72 03  e8 b6 ff 66 8b 46 1c e8  |f.....r....f.F..|
00000110  a0 ff 83 c3 10 e2 cc 66  61 c3 e8 62 00 4d 75 6c  |.......fa..b.Mul|
00000120  74 69 70 6c 65 20 61 63  74 69 76 65 20 70 61 72  |tiple active par|
00000130  74 69 74 69 6f 6e 73 2e  0d 0a 66 8b 44 08 66 03  |titions...f.D.f.|
00000140  46 1c 66 89 44 08 e8 30  ff 72 13 81 3e fe 7d 55  |F.f.D..0.r..>.}U|
00000150  aa 0f 85 06 ff bc fa 7b  5a 5f 07 fa ff e4 e8 1e  |.......{Z_......|
00000160  00 4f 70 65 72 61 74 69  6e 67 20 73 79 73 74 65  |.Operating syste|
00000170  6d 20 6c 6f 61 64 20 65  72 72 6f 72 2e 0d 0a 5e  |m load error...^|
00000180  ac b4 0e 8a 3e 62 04 b3  07 cd 10 3c 0a 75 f1 cd  |....>b.....<.u..|
00000190  18 f4 eb fd 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001b0  00 00 00 00 00 00 00 00  d9 3d 5e bb 00 00 00 01  |.........=^.....|
000001c0  01 00 83 fe 3f 79 3f 00  00 00 bb e7 1d 00 00 00  |....?y?.........|
000001d0  01 7a 82 fe 3f f3 fa e7  1d 00 fa e7 1d 00 80 00  |.z..?...........|
000001e0  01 f4 83 fe 7f ea f4 cf  3b 00 37 8c 3c 00 00 00  |........;.7.<...|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
root@ubuntu:~# 

なお、MBRの構造などについては“LinuxにおけるMBRのまとめとバックアップ方法”を参照のこと。

以上で作業は終了となる。一旦、仮想マシンをshutdownして、改めて今作成した仮想ディスク flash-image.vmdk をシステムディスク(IDE 0:0)として付け替えてブートすればChrome OSが立ち上がる。

 USBメモリに書き出す

最初に書いたように、今回のコピー先の仮想ディスクは実際のUSBメモリと全く同サイズで作ってある。従って作成した仮想マシンのフラットファイルをそのままUSBに書き込めば Chrome OSのブータブルUSBメモリが出来上がる。

root@vmhost:~/tmp# dd if=flash-image-flat.vmdk of=/dev/sdd bs=1010827136
4+0 records in
4+0 records out
4043308544 bytes (4.0 GB) copied, 618.876 s, 6.5 MB/s
root@vmhost:~/tmp#