【VirtualBox】VMDK形式の容量拡張（contos7）

# はじめに

VMDK形式のストレージが容量いっぱいで困ったので拡張しました。
いろいろググったのですが、情報がちりばめられていたため、まとめることに。
正直、このあたりはそんなに知識もなかったので、検索ワードとかも悩んで迷いました。


## バージョン
- Windows 10 の VirtualBoxのバージョンは 5.2.12 r122591 (Qt5.6.2) 
- 仮想マシンのOSは CentOS Linux release 7.3.1611 (Core)

## 状態

/ が狭くて何かするのが辛い。
/dev/mapper/cl-rootを増やしたい。

```
[root@localhost ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root   6.2G  6.0G  225M   97% /
devtmpfs              1.9G     0  1.9G    0% /dev
tmpfs                 1.9G     0  1.9G    0% /dev/shm
tmpfs                 1.9G  8.4M  1.9G    1% /run
tmpfs                 1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1            1014M  182M  833M   18% /boot
tmpfs                 380M     0  380M    0% /run/user/0
```

# 容量拡張

大きく分けて3つの手順を行うことで容量拡張ができました。各所のポイントでそれぞれ悩みました。

## 1. VBoxManage コマンドを使って拡張

最初、対象の仮想マシンをシャットダウンします。
対象の仮想マシンに割り当てられているストレージを確認し、vmdk形式のファイルの保存場所を確認します。
次にコマンドプロンプトを開いてVBoxManageコマンドがある場所に移動します。

```
> cd C:\Program Files\Oracle\VirtualBox
```

現状のvmdk形式ファイルをvdi形式にしてクローンします。(``--format vdi``オプションを使います)

```
> VBoxManage clonehd "D:\VirtualBox VMs\xxxx\xxxx-disk001.vmdk" "D:\VirtualBox VMs\xxxx\xxxx-disk001_resize.vdi" --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

クローンしたvdi形式ファイルのリサイズを行います。(8Gを20Gに拡張)

```
> VBoxManage modifyhd "D:\VirtualBox VMs\scp_dev\scp_dev-disk001_resize.vdi" --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
```

リサイズしたvdi形式をvmdk形式に戻します。

```
> VBoxManage clonehd "D:\VirtualBox VMs\xxxx\xxxx-disk001_resize.vdi" "D:\VirtualBox VMs\xxxx\xxxx-disk001_resize.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vmdk'. UUID: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

それから、仮想メディアマネージャーを起動してハードディスクのタブを見てみると、クローンしたvdi形式とvmdk形式のファイルが追加され、仮想サイズが20Gに増えたものが確認できます。その後、対象の仮想マシンの設定にある「ストレージ」を選択し、容量を拡張した``xxxx-disk001_resize.vmdk``に変更します。容量の小さいほうは「-」を押して、マウントを外すだけでいいです。（なぜなら、ミスったとき元に戻れなくなるので）

### ちなみに仮想メディアマネージャーで容量変更を試みると。。
**VBOX_E_NOT_SUPPORTED**というようなエラーが出力されます。
> Resizing to new size 17179869184 is not yet supported for medium 'D:\VirtualBox VMs\xxxxxx\xxxxxx-disk001.vmdk'.

容量変更ができません。ここで出来ればすぐ終わる話なのに....

## 2. 「GNOME Partition Editor」を使って容量再割り当て
さて、入れ物の大きさは20Gに調整しました。しかし、これでは既存のパーティション``/dev/mapper/cl-root``は6.2Gのままです。これを器いっぱいにしたいので、「GNOME Partition Editor」というもので広げます。

GNOME Partition Editorのダウンロードはこちらで行います。
[「GNOME Partition Editor」](https://gparted.sourceforge.io/download.php)
**Stable Releases**にある「Download gparted-live-0.32.0-1-i686.iso」をダウンロードします。

落として来たら仮想マシンの設定にある「ストレージ」を選択し、光学ドライブの「空」にgparted-live-0.32.0-1-i686.isoをセットします。セットしたら、仮想マシンの電源を入れて、通常起動を行います。通常起動したらCD扱いのisoを読み込むために急いでF12キーをおしてcd-romを選択すると次のような画面が表示されるので、「GParted Live」を選択。
![gparted-live.png](https://qiita-image-store.s3.amazonaws.com/0/59954/db5f3344-96af-17d4-ab7a-2cb042d599f4.png)

- don't touch keymap を選択
- Loading language settings を 15に
- Continue to start X to use GParted automatically を選択（そのままEnterで）

次のように12Gが未割当領域として表示されています。
![gparted-live2.png](https://qiita-image-store.s3.amazonaws.com/0/59954/71ed5014-57ba-c25a-d11a-144f61edd13f.png)

増やしたいボリュームをクリックして「リサイズ／移動」を選択し新しいサイズを表示されている最大サイズに変更し、後方の空き領域を０にします。

![gparted-live3.png](https://qiita-image-store.s3.amazonaws.com/0/59954/c24a9469-c607-18dd-f175-cbdf4130e081.png)

「リサイズ」ボタンを押して、サイズを変更します。しかしまだ確定されていません。
上のほうにある「Apply」ボタンを押して本当の確定になります。

![gparted-live4.png](https://qiita-image-store.s3.amazonaws.com/0/59954/d0534808-f118-14db-6817-457c37befcb7.png)

容量がでっかくなりました。もう、ここに用は無いので、この後いったんこの仮想マシンを閉じます。（仮想マシンの電源オフ）

## 3. lvextend コマンドで論理ボリュームを拡張する

まずは、仮想マシンを通常起動します。
さて、これでもまだ容量は広くありません。

```
[root@localhost ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root   6.2G  6.0G  224M   97% /
devtmpfs              1.9G     0  1.9G    0% /dev
tmpfs                 1.9G     0  1.9G    0% /dev/shm
tmpfs                 1.9G  8.4M  1.9G    1% /run
tmpfs                 1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1            1014M  182M  833M   18% /boot
tmpfs                 380M     0  380M    0% /run/user/0
[root@localhost ~]#
```

lvdisplayでみると/dev/mapper/cl-rootは次のように6.20Gです。（/dev/cl/rootとう場所みたい。）

```
[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/cl/swap
  LV Name                swap
  VG Name                cl
  LV UUID                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-07-03 13:12:20 +0900
  LV Status              available
  # open                 2
  LV Size                820.00 MiB
  Current LE             205
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-07-03 13:12:20 +0900
  LV Status              available
  # open                 1
  LV Size                6.20 GiB
  Current LE             1586
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
```

vgdisplayというコマンドで見てみると19Gあるけど7G使ってます。。的な雰囲気を感じ取れます。

```
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               cl
  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               19.00 GiB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       1791 / 7.00 GiB
  Free  PE / Size       3072 / 12.00 GiB
  VG UUID               xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1
```

今回は確保した12Gすべてを(トータル約20G)割り当てたいのでパーセンテージ指定で実行します。
ずばりの容量指定や、＋〇G追加とかもできます。
では、100%指定でlvextendコマンドを実行します。
```
> lvextend -l +100%FREE /dev/cl/root
  Size of logical volume cl/root changed from 6.20 GiB (1586 extents) to 18.20 GiB (4658 extents).
  Logical volume cl/root successfully resized.
```

これでサイズ変更は完了しました！そこでdfコマンドで見てみると

```
[root@localhost ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root   6.2G  6.0G  224M   97% /
devtmpfs              1.9G     0  1.9G    0% /dev
tmpfs                 1.9G     0  1.9G    0% /dev/shm
tmpfs                 1.9G  8.4M  1.9G    1% /run
tmpfs                 1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1            1014M  182M  833M   18% /boot
tmpfs                 380M     0  380M    0% /run/user/0
```

まだでっかくなっていません。。正しく適用するためにxfs_growfsコマンドを実行します。(centos7以降のコマンドみたいです。)
data blockが変更され容量確保が行われます。

```
[root@localhost ~]# xfs_growfs /dev/cl/root
meta-data=/dev/mapper/cl-root    isize=512    agcount=4, agsize=406016 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1624064, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1624064 to 4769792
```

## 拡張結果

再度dfコマンドで容量確認します。

```
[root@localhost ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root    19G  6.0G   13G   33% /
devtmpfs              1.9G     0  1.9G    0% /dev
tmpfs                 1.9G     0  1.9G    0% /dev/shm
tmpfs                 1.9G  8.4M  1.9G    1% /run
tmpfs                 1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1            1014M  182M  833M   18% /boot
tmpfs                 380M     0  380M    0% /run/user/0
```

無事容量確保できました。とても長い道のりでした。

# まとめ

そんなに難しいことではないにしても、知らない事ばかりで不安でしたがなんとか容量確保できました。
この手の情報は時間の経過とともにやり方が変わっていくので、せめて1年おきに再確認が必要かもしれませんね。