VMware仮想ディスク(vmdk)の拡張方法



●仮想ディスクの拡張方法

 仮想ディスクの拡張方法には2通りの方法があります。以下のコマンドを使用します。

 1.qume-img
 2.vmware-vdiskmanager.exe(ホストOSがWindowsの場合)

 どちらの方法で行う前に、必ずバックアップを取ってください。
 今回は、ホストOSがWindows XP、ゲストOSがFedora(Linux)となっています。

●qume-imgを使用

 コマンドプロンプトを起動し、オリジナルのディスクイメージ(・・・.vmdk)をrawフォーマットに変換します。
> qemu-img convert -f vmdk foo.vmdk -O raw foo.raw
 追加するディスクイメージをrawフォーマットで作成します。
> qemu-img create -f raw add.raw 5G ← 5Gbの追加用ディスクを作成
 結合します。
> copy /b foo.raw + add.raw foobig.raw
 変換して元のフォーマット(vmdk)に戻します。
> qemu-img convert -f raw foobig.raw -O vmdk foobig.vmdk
 foo.vmxを編集してfoobig.vmxを作成するか、vmxファイルはそのままでfoobig.vmdkのファイル名をfoo.vmdkに変更します。
 GParted-LiveCDでfoobigを起動して、パーティションを編集する。
 VMwareでfoobigを起動して動作確認。
 ただし、vmdkへ戻す際、そのサイズが2GByte以上の場合、qemu-imgのバージョンによっては「error while writing」と表示されコンバートすることが出来ませんので注意してください。最新のバージョンはこちらからダウンロード出来ます。2011年6月14日現在、最新のバージョンはQEMU on Windows Ver 0.13.0となっています。
 Windows版のGParted-LiveCDがないため上記で作成した大きなvmdkファイルをコピーするわけにもいかないので、下記のvmware-vdiskmanager.exeを使用したほうがいいかもしれない。

●vmware-vdiskmanager.exeを使用(ホストOSがWindowsの場合)

 まず、vmware-vdiskmanager.exeを入手する必要があります。これはフリーのVMware Serverに含まれていますので、VMware Playerをインストールしている場合
  • VMware Playerをアンインストール → VMware Serverをインストール → vmware-vdiskmanager.exeを取り出す → VMware Serverをアンインストール → VMware Playerをインストール
という手順で取り出す必要があります。フリーのVMware Serverは以下の場所からダウンロードできます。

 Download VMware Server

 VMware Serverに含まれているvmware-vdiskmanager.exeは
C:\Program files\VMware\VMware GSX Serve\vmware-vdiskmanager.exe
に存在します。
 vmware-vdiskmanager.exeはvmdkファイルと同じフォルダに置いてください。
 foo.vmdkの容量を10Gb増やしたい場合10Gbに拡張したい場合は、コマンドプロントで以下を実行します。
> vmware-vdiskmanager.exe -x 10Gb foo.vmdk
 完了するのに30分以上かかります。

 正常に完了しない場合は、下記にログが出力されますので参考するといいでしょう。
  C:¥Documents and Settings¥********¥Local Settings¥Temp¥vmware-********

 仮想ディスクを拡張しようとしたときに下記のようなエラーが出力されました。
  Failed to expand the disk 'FedoraCore13.vmdk': One of the parameters supplied is invalid (1).
 何故表示されるのか理由がわからなかったのですが、ログを確認すると下記のように出力されていました。

Jun 14 16:20:40: app| Log for VMware Server pid=2100 version=1.0.6 build=build-91891 option=Release
Jun 14 16:20:40: app| DISKLIB-DSCPTR: Unrecognized ddb entry. ID='isNativeSnapshot' Val='no'
Jun 14 16:20:40: app| DISKLIB-DSCPTR: Opened [0]: "FedoraCore13.vmdk" (0x18)
Jun 14 16:20:40: app| DISKLIB-LINK : Opened 'FedoraCore13.vmdk' (0x18): monolithicSparse, 41943040 sectors / 20480 Mb.
Jun 14 16:20:40: app| DISKLIB-LIB : Opened "FedoraCore13.vmdk" (flags 0x18).
Jun 14 16:20:40: app| Scanning directory of file FedoraCore13.vmdk for vmx files.
Jun 14 16:20:40: app| DISKLIB-DSCPTR: Unrecognized ddb entry. ID='isNativeSnapshot' Val='no'
Jun 14 16:20:40: app| DISKLIB-DSCPTR: Opened [0]: "FedoraCore13.vmdk" (0)
Jun 14 16:20:40: app| DISKLIB-LINK : Opened 'FedoraCore13.vmdk' (0): monolithicSparse, 41943040 sectors / 20480 Mb.
Jun 14 16:20:40: app| DISKLIB-LIB : Opened "FedoraCore13.vmdk" (flags 0).
Jun 14 16:20:40: app| DISKLIB-LIB : Growing disk 'FedoraCore13.vmdk' : createType = monolithicSparse
Jun 14 16:20:40: app| DISKLIB-LIB : Growing disk 'FedoraCore13.vmdk' : capacity = 41943040 sectors - 20.0 Gb
Jun 14 16:20:40: app| DISKLIB-LIB : Growing disk 'FedoraCore13.vmdk' : new capacity = 41943040 sectors - 20.0 Gb
Jun 14 16:20:40: app| DISKLIB-LIB : capacity needs to be bigger than : 41943040 (41943040)
Jun 14 16:20:40: app| .DISKLIB-LIB : Failed to grow disk 'FedoraCore13.vmdk' : One of the parameters supplied is invalid (1).
Jun 14 16:20:40: app| AIOMGR-U : stat o=1 r=44 w=2 i=0 br=2629632 bw=1024
Jun 14 16:20:40: app| AIOMGR-S : stat o=3 r=50 w=2 i=0 br=2655232 bw=1024
 ようするに、
> vmware-vdiskmanager.exe -x 5Gb FedoraCore13.vmdk
とか
> vmware-vdiskmanager.exe -x 10Gb FedoraCore13.vmdk
と入力し拡張しようとしたため、既に20.0Gbまでは拡張されているのでそれ以上のサイズ指定してくださいとのことでした。
 完了しところで●LVMパーティションの拡張を参照して拡張してください。

●vmware-vdiskmanagerを使用(ホストOSがLinuxの場合)

 まず、vmware-vdiskmanagerを入手する必要があります。これはフリーのVMware Serverに含まれていますので、VMware Playerをインストールしている場合
  • VMware Playerをアンインストール → VMware Serverをインストール → vmware-vdiskmanagerを取り出す → VMware Serverをアンインストール → VMware Playerをインストール
という手順で取り出す必要があります。フリーのVMware Serverは以下の場所からダウンロードできます。

 Download VMware Server

 VMware Serverに含まれているvmware-vdiskmanagerは
/usr/bin/vmware-vdiskmanager
に存在します。コピーするなどして保存します。
 foo.vmdkの容量を10Gb増やしたい場合は、コマンドプロントで以下を実行します。
> vmware-vdiskmanager -x 10Gb foo.vmdk
 しかし、下記のようなエラーが表示されました。
Using log file /tmp/vmware-root/vdiskmanager.log
Failed to analyze snapshot chain '/root/anaconda-ks.cfg'. 
Will not be able to make an informed decision based on partial information.
 一時的に、/root/anaconda-ks.cfgを別名保存します。再度実行します。完了するのに30分以上かかります。

●パーティションの拡張

 パーティションを拡張には、フリーソフトであるGParted Live CDを使用します。以下からダウンロードできます。

 GParted Live CD Downloads

 isoをダウンロードし、CDに焼き込みます。
 拡張したい仮想ディスク用のvmxファイルを編集し、VMware起動時にGParted Live CDを読み込むようにします。
 GPartedを使用して、パーティションを結合し拡張します。GPartedの使用方法は、下記を参照してください。

 GPartedでパーティションを操作するには
 パーティション操作専用のLinux GParted LiveCD

 ただし、GPartedではLVMパーティションを認識せず拡張することができません。

●LVMパーティションの拡張

 拡張前の情報を取得しておきます(拡張した仮想ディスクを起動後確認しても同内容が表示されます)。
# fdisk -l
ディスク /dev/sda: 10.7 GB, 10737418240 バイト
ヘッド 255, セクタ 63, シリンダ 1305, 合計 20971520 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00007e1b

デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 20971519 9972736 8e Linux LVM

ディスク /dev/dm-0: 9126 MB, 9126805504 バイト
ヘッド 255, セクタ 63, シリンダ 1109, 合計 17825792 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

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

ディスク /dev/dm-1: 1073 MB, 1073741824 バイト
ヘッド 255, セクタ 63, シリンダ 130, 合計 2097152 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

ディスク /dev/dm-1 は正常なパーティションテーブルを含んでいません
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      8.4G  6.0G  2.0G  76% /
tmpfs                 249M  100K  249M   1% /dev/shm
/dev/sda1             485M   75M  385M  17% /boot
 拡張を行っていない場合は、VMwareををshutdownしvmware-vdiskmanager.exeを使って仮想ディスクを拡張します。
> vmware-vdiskmanager.exe -x 20Gb FedoraCore13.vmdk
 Windows版ではなく、Linux版のVMware Workstation、VMware Serverでもvmware-vdiskmanagerというコマンドが使えます。
 次に、通常通りVMwareを立ち上げて(正確には以降の作業はSingle User Modeでやった方がよいでしょう)、fdiskでパーティションを切ります。
# fdisk /dev/sda -l
ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610, 合計 41943040 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00007e1b
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20971519     9972736   8e  Linux LVM
 拡張されていることが分かります。
# fdisk /dev/sda
コマンド (m でヘルプ): n
コマンドアクション e 拡張
p 基本パーティション (1-4)
p(リターンキー押下)
パーティション番号 (1-4, 初期値 3): (デフォルトのままリターンキー押下)
初期値 3 を使います
最初 セクタ (20971520-41943039, 初期値 20971520): (デフォルトのままリターンキー押下)
初期値 20971520 を使います
Last セクタ, +セクタ数 or +size{K,M,G} (20971520-41943039, 初期値 41943039): (デフォルトのままリターンキー押下)
初期値 41943039 を使います

コマンド (m でヘルプ): t
パーティション番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 3 から 8e (Linux LVM) に変更しました

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

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

警告: パーティションテーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。
# shutdown -r now ← 再起動
# fdisk -l
ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610, 合計 41943040 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00007e1b

デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 20971519 9972736 8e Linux LVM
/dev/sda3 20971520 41943039 10485760 8e Linux LVM ← 新たに作成されている

ディスク /dev/dm-0: 9126 MB, 9126805504 バイト
ヘッド 255, セクタ 63, シリンダ 1109, 合計 17825792 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

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

ディスク /dev/dm-1: 1073 MB, 1073741824 バイト
ヘッド 255, セクタ 63, シリンダ 130, 合計 2097152 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

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

 /dev/sda3を元にPhysical Volumeを作り、Volume Group(VolGroup)に追加し、VolGroupのLogical Volume(lv_root)を拡張します。dfコマンドを使用して表示された/dev/mapper/VolGroup-lv_rootの名称がポイントになります。
(物理ボリュームの作成)
# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created
(ボリュームグループの作成)
# vgextend VolGroup /dev/sda3
  Volume group "VolGroup" successfully extended
 Volume Groupの空き容量を確認します。Local Volumeに割当てるためのFreeのPEがないとLogical Volumeを増やすことは出来ません。
# vgdisplay VolGroup
  --- Volume group ---
  VG Name               VolGroup
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0		←VG内に構築できるLVの最大数
  Cur LV                2		←現在構築されているLVの数
  Open LV               2		←現在使用されているLVの数
  Max PV                0		←VGに接続できるPVの最大数(HDD数)
  Cur PV                2		←VGに接続されているPVの数(HDD数)
  Act PV                2		←VGに接続されている使用可能なPVの数(HDD数)
  VG Size               19.47 GiB	←VGに接続されている使用可能な容量
  PE Size               32.00 MiB	←extentのサイズ
  Total PE              623		←トータルのextent数(PE数)
  Alloc PE / Size       304 / 9.50 GiB	←LVに割り当てられているPE/サイズの量
  Free  PE / Size       319 / 9.97 GiB
  VG UUID               iXfA6j-MDFj-qeo0-rxXg-GaKB-XDdz-7CWdLM
 ボリュームグループVolGroupはこれからサイズを変更するLVが構築されているVGです。Free PEが0より大きければLVを増やすことが可能です。LVのサイズを増やす際には各種単位でサイズ指定も出来るのでFree Sizeの確認も忘れずに。
 論理ボリュームの拡張にはlvextendを使用します。fdisk -lを実行時に「21.5GB」と表示されたので、下記のように実行しましたが
(論理ボリューム(=パーティショの)の作成)
# lvextend -L 21.5G /dev/VolGroup/lv_root
 ファイルシステム拡張(resize2fs実行)時に拡張されませんでした。
 また、VG Size値を指定しても同様でした。仕方がないので、「Free PE / Size 319 / 9.97 GiB」のサイズ値を利用して論理ボリューム及びファイルシステムの拡張を繰り返しながら試してみました。
(1回目:失敗) 
# lvextend -L +9.97G /dev/VolGroup/lv_root
  Rounding up size to full physical extent 10.00 GiB
  Extending logical volume lv_root to 18.50 GiB
  Insufficient free space: 320 extents needed, but only 319 available
# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
The filesystem is already 2228224 blocks long.  Nothing to do!
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      8.4G  6.1G  2.0G  77% /
tmpfs                 249M  264K  249M   1% /dev/shm
/dev/sda1             485M   75M  385M  17% /boot
拡張されていない。
 何故、拡張されないのか・・。調べてみると単位が異なっていました。1GB≠1GiBなのです。
 1 GB = 230B = 1,000,000,000 B(SI接頭辞)
 1 GiB = 230B = 1,073,741,824 B(2進接頭辞)
 人間が分かりやすいGBを用いると、コンピュータ上では膨れ上がってしまい実際のサイズより大きくなってしまうためでした。
(2回目) 
# lvextend -L +9G /dev/VolGroup/lv_root
  Extending logical volume lv_root to 17.50 GiB
  Logical volume lv_root successfully resized
# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/VolGroup/lv_root to 4587520 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 4587520 blocks long.
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                       18G  6.1G   11G  37% /
tmpfs                 249M  264K  249M   1% /dev/shm
/dev/sda1             485M   75M  385M  17% /boot
# vgdisplay VolGroup
表示結果は抜粋
  Alloc PE / Size       592 / 18.50 GiB
  Free  PE / Size       31 / 992.00 MiB ← 値が減っている
拡張された。まだまだ行けそう。
(3回目) 
# lvextend -L +0.5G /dev/VolGroup/lv_root
  Extending logical volume lv_root to 18.00 GiB
  Logical volume lv_root successfully resized
# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 2
Performing an on-line resize of /dev/VolGroup/lv_root to 4718592 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 4718592 blocks long.
# vgdisplay VolGroup
表示結果は抜粋
  Alloc PE / Size       608 / 19.00 GiB
  Free  PE / Size       15 / 480.00 MiB ← 値が減っている
(4回目) 
# lvextend -L +480M /dev/VolGroup/lv_root
  Extending logical volume lv_root to 18.47 GiB
  Logical volume lv_root successfully resized
# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 2
Performing an on-line resize of /dev/VolGroup/lv_root to 4841472 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 4841472 blocks long.
# vgdisplay VolGroup
表示結果は抜粋
  Alloc PE / Size       623 / 19.47 GiB
  Free  PE / Size       0 / 0 ← 0になった。これ以上拡張は出来ない
(entent数で実施) 
# lvextend -l 623 /dev/VolGroup/lv_root
  Extending logical volume lv_root to 19.47 GiB
  Insufficient free space: 351 extents needed, but only 319 available
これは拡張出来なかった。
# lvextend -l +319 /dev/VolGroup/lv_root
  Extending logical volume lv_root to 18.47 GiB
  Logical volume lv_root successfully resized
# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/VolGroup/lv_root to 4841472 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 4841472 blocks long.
# vgdisplay VolGroup
表示結果は抜粋
  Alloc PE / Size       623 / 19.47 GiB
  Free  PE / Size       0 / 0 ← 0になった。これ以上拡張は出来ない
 最終的には下記のようになりました。
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                       19G  6.1G   12G  36% /
tmpfs                 249M  264K  249M   1% /dev/shm
/dev/sda1             485M   75M  385M  17% /boot
 増えていることが確認できます。