2.01.2014

VirtualBox: How to Increase the Virtual Hard Disk Size

VirtualBox: CentOS 仮想ディスクの容量拡張について

 

VirtualBox で立てた Docker ホストの中でコンテナを作り続けていたら、いつしか仮想ディスクの容量が
full になってしまっていた。

VirtualBox のゲストOSで使っているストレージ容量を増やす手順をメモしておく。

 

環境

  • ホストOS: Mac OS X 10.9 (Mavericks)
  • VirtualBox: 4.3.6
  • ゲストOS: CentOS 6.5

こちらの Dockerfile で構築した CentOS (ベースは opscode 提供イメージ) のディスクを
40GB から 80GB へ拡張する。

尚、物理ディスクの空き容量は十分にあるものとする。

 

手順

こちらのブログポストの内容に従って作業。

 

(1) 仮想OS の停止
$ vagrant halt

 

(2) フォーマット変換

ストレージが VMDK 形式の場合、VBoxManage コマンドで直接その容量を変えることはできない。(※1)
いったん VDI 形式のクローンを作ってから、その容量を拡張する。

以下は packer-centos-6.5-x86_64-disk1 というストレージの場合の例。

$ cd ~/VirtualBox\ VMs/ゲストOSの名前
$ VBoxManage clonehd packer-centos-6.5-x86_64-disk1.vmdk packer-centos-6.5-x86_64-disk1.vdi --format VDI
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: 32e9d2f1-d30c-4dfc-84dd-24ba96e3be31
$ VBoxManage modifyhd packer-centos-6.5-x86_64-disk1.vdi --resize 81920
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

clonehd コマンドの所要時間は実ディスクの使用量やI/O性能に依存。数十分かかる場合もある。

変換し終わったらVMDK形式のファイルは削除してよいが、バックアップとして暫く残しておくことをお勧めする。

 

(3) ストレージ差し替え

VirtualBox の GUI 上で作業した。

設定画面を開いて、IDE Controller 配下の Primary Master ディスクを VDI 形式のものに付け替え。

Docker host1 Storage 4

 

(4) 仮想OS の起動
$ Vagrantfileのあるディレクトリ
$ vagrant up
$ vagrant ssh

fdisk コマンドで 80GB (+α) が認識されていることを確認。

$ sudo fdisk -l |head -20

ディスク /dev/sda: 85.9 GB, 85899345920 バイト
ヘッド 255, セクタ 63, シリンダ 10443
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0004a286

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1          64      512000   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2              64        5222    41430016   8e  Linux LVM

ディスク /dev/mapper/VolGroup-lv_root: 41.4 GB, 41448112128 バイト
ヘッド 255, セクタ 63, シリンダ 5039
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

 

(5) パーティションの拡張

fdisk または parted で実行。以下は parted の例。
最初に unit cyl でシリンダ単位で操作するようにしている。ハイライトした行が parted 内での入力。

$ sudo parted
(parted) unit cyl
(parted) p
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 10443cyl
セクタサイズ (論理/物理): 512B/512B
BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63.  1シリンダは 8225kB。
パーティションテーブル: msdos

番号  開始   終了     サイズ   タイプ   ファイルシステム  フラグ
 1    0cyl   63cyl    63cyl    primary  ext4              boot
 2    63cyl  5221cyl  5157cyl  primary                    lvm

(parted) rm 2
警告: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です).  As a result, it may not reflect all of your changes until after reboot.
(parted) p
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 10443cyl
セクタサイズ (論理/物理): 512B/512B
BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63.  1シリンダは 8225kB。
パーティションテーブル: msdos

番号  開始  終了   サイズ  タイプ   ファイルシステム  フラグ
 1    0cyl  63cyl  63cyl   primary  ext4              boot

(parted) mkpart primary 63 10443
警告: 63cyl から 10443cyl までのパーティションを指定されました。
可能な中で最も近いものは 63cyl から 10443cyl になります。
それでもかまいませんか?
はい(Y)/Yes/いいえ(N)/No? y
警告: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です).  As a result, it may not reflect all of your changes until after reboot.
(parted) p
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 10443cyl
セクタサイズ (論理/物理): 512B/512B
BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63.  1シリンダは 8225kB。
パーティションテーブル: msdos

番号  開始   終了      サイズ    タイプ   ファイルシステム  フラグ
 1    0cyl   63cyl     63cyl     primary  ext4              boot
 2    63cyl  10443cyl  10379cyl  primary

(parted) set 2 lvm on
警告: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です).  As a result, it may not reflect all of your changes until after reboot.
(parted) p
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 10443cyl
セクタサイズ (論理/物理): 512B/512B
BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63.  1シリンダは 8225kB。
パーティションテーブル: msdos

番号  開始   終了      サイズ    タイプ   ファイルシステム  フラグ
 1    0cyl   63cyl     63cyl     primary  ext4              boot
 2    63cyl  10443cyl  10379cyl  primary                    lvm

(parted) q
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。

設定が終わったら、ssh から抜けてリブート(vagrant halt; vagrant up)する。

 

(6) LVM 物理ボリューム (physical volume) サイズの拡張

pvscan で確認、pvresize で変更。

$ sudo pvscan
  PV /dev/sda2   VG VolGroup   lvm2 [39.51 GiB / 0    free]
  Total: 1 [39.51 GiB] / in use: 1 [39.51 GiB] / in no VG: 0 [0   ]
$ sudo pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized
$ sudo pvscan
  PV /dev/sda2   VG VolGroup   lvm2 [79.51 GiB / 40.00 GiB free]
  Total: 1 [79.51 GiB] / in use: 1 [79.51 GiB] / in no VG: 0 [0   ]

vgdisplay コマンドで状態を確認。

$ sudo vgdisplay
  --- Volume group ---
  VG Name               VolGroup
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               79.51 GiB
  PE Size               4.00 MiB
  Total PE              20354
  Alloc PE / Size       10114 / 39.51 GiB
  Free  PE / Size       10240 / 40.00 GiB
  VG UUID               Iv3nnF-GabP-gmv5-sU9W-iGtb-y5yg-9MA68g

Total PE 20354 に対して、Alloc PE が 10114 であることがわかった。

 

(7) LVM 論理ボリューム (logical volume) サイズの拡張

lvdisplay で確認、lvextend で変更。
空き領域を全て使用する場合には -l +100%FREE オプションが便利だ。

$ sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/VolGroup/lv_root
(略)
  LV Size                38.60 GiB
(略)
$ sudo lvextend -l +100%FREE /dev/VolGroup/lv_root
  Extending logical volume lv_root to 78.60 GiB
  Logical volume lv_root successfully resized
$ sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/VolGroup/lv_root
(略)
  LV Size                78.60 GiB
(略)

 

(8) ファイルシステムのサイズ拡張

最後に、resize2fs で対象のファイルシステムのサイズを変更。

$ sudo 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 = 3, new_desc_blocks = 5
Performing an on-line resize of /dev/VolGroup/lv_root to 20604928 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 20604928 blocks long.

$ df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   78G   38G   36G  52% /

無事、ファイルシステム上で使えるディスク容量を 40GB 増やすことに成功した。

 

 

 

※1 現バージョンでは対応していないフォーマットだと表示される。

$ VBoxManage modifyhd packer-centos-6.5-x86_64-disk1.vmdk --resize 81920
0%...
Progress state: VBOX_E_NOT_SUPPORTED
VBoxManage: error: Resize hard disk operation for this format is not implemented yet!

0 件のコメント:

コメントを投稿