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 形式のものに付け替え。

(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!