Vagrant on Mac上のCeontOS7のディスク容量を後から増やす

# Vagrant on Mac上のCeontOS7のディスク容量を後から増やす

以下のような教材を作っている時に、Sparkブンブン回してHDFSでディスク食って大変なことになりました。

[【分散型アーキテクチャを試してみる】第2章 〜Apache AmbariHadoop,YARN,Zookeeper,Spark編〜](http://qiita.com/devopsCoordinator/items/d00d50112ddff94db433)

AmazonEMRとか使えばいいじゃんとか、SparkStandAloneで動かせばいいじゃんと意見もごもっとも。
でも何より大事なのは、知見がないところに進むときには、なるべく同じ環境を想定して構築して、早い段階で痛い目にあってみるってことだと思う。

なんだかんだいって経験値がものをいう。

というわけで、今回はさくっとVagrant上で動かしているCentOS7のディスク容量を後から増やしてみるって内容でやります。

はじめからVagrantBoXのイメージをディスク容量増やしてから使えばよかったじゃんって話だったんだけど、Ansibleで構築してあるとはいえ、ノード3台のHadoopClusterを構築するってのは結構時間かかるので、既存のVMのディスクを増やす方向で対応したいなとおもった次第です。

でははじめましょう。



## まずは仮想マシンを止めます

```
$ vagrant halt
```

## 仮想マシンの構成ファイル・ディレクトリに移動

自分の環境ではVagrantfileでマルチ構成にしているので
綺麗なマシン名になっていますが、普通であれば「{仮想マシン名}_1465268965276_63060」のように
数字の羅列がくっついたフォルダになっていると思います。

手元の環境のコマンド結果をほぼそのまま記載しているので
「vagrant-node1」 や 「node1」などは、自分の仮想マシン名などに読み替えてください
 
```
$ cd ~/VirtualBox\ VMs/
$ cd vagrant-node1
```

## VMDK形式からVDI形式にでディスクを複製する

VMDK形式ではなくVDI形式のフォーマットであれば、ディスク容量をリサイズ出来るので
VBoxManageコマンドを利用して、VMDK形式の仮想ディスクの複製を作成します。

```
$ VBoxManage clonehd "box-disk1.vmdk" "clone-disk1.vdi" --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
```

複製したVDI形式の仮想ディスクの情報を見てみましょう。

```
$ VBoxManage showhdinfo clone-disk1.vdi
UUID:           XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/foo/VirtualBox VMs/vagrant-node1/clone-disk1.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       10140 MBytes
Size on disk:   1797 MByt
```

ここではまだ、Capacityという部分でディスク容量が10GBなのが分かりますね。


## ディスク容量を増やす

VDI形式の仮想ディスクをリサイズして見ましょう。
ここでは10GBから20GBに変更しています。

```
$ VBoxManage modifyhd clone-disk1.vdi --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
```

さきほどと同じコマンドで、VDI形式の仮想ディスクの情報を見てみましょう。

```
$ VBoxManage showhdinfo clone-disk1.vdi
UUID:           XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/foo/VirtualBox VMs/vagrant-node1/clone-disk1.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   1797 MBytes
Encryption:     disabled
```
Capacity部分が増えているのが分かりますね。


## VDI形式からVMDK形式に戻す

ここの工程は別に仮想マシンからマウントしている仮想ディスクをVDI形式の仮想ディスクをアタッチしてしまえば要らないのですが、なんか気持ち悪いのでVMDK形式に再度戻しています。

```
$ VBoxManage clonehd "clone-disk1.vdi" "box-disk2.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vmdk'. UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
```

## 仮想ディスクの利用状況を確認する

showvminfoコマンドを使って仮想マシンで使用されている仮想ディスクを確認しましょう。
以下では「vagrant-node1」となっていますが、自分の仮想マシン名に変更してください。

```
$ VBoxManage showvminfo vagrant-node1| grep ".vmdk"
SATA Controller (0, 0): /Users/foo/VirtualBox VMs/vagrant-node1/box-disk1.vmdk (UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
```
仮想ディスクとして「box-disk1.vmdk」が使用されているのが分かりますね。

続いて仮想ディスク自体の利用状況も確認しましょう
```
$ VBoxManage showhdinfo box-disk2.vmdk
UUID:           XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/foo/VirtualBox VMs/vagrant-node1/box-disk2.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   1780 MBytes
Encryption:     disabled
```

## 仮想ディスクを変更する
仮想マシンで元々使っていたbox-disk1.vmdkからbox-disk2.vmdkの仮想ファイルを利用するように変更します。

```
$ VBoxManage storageattach vagrant-node1 --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium box-disk2.vmdk
```

## 仮想ディスクの利用状況を確認する

```
$ VBoxManage showvminfo vagrant-node1| grep ".vmdk"
SATA Controller (0, 0): /Users/foo/VirtualBox VMs/vagrant-node1/box-disk2.vmdk (UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
```
box-disk2.vmdkが利用されていることが確認できましたね。

```
$ VBoxManage showhdinfo box-disk2.vmdk
UUID:           XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/foo/VirtualBox VMs/vagrant-node1/box-disk2.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   1780 MBytes
Encryption:     disabled
In use by VMs:  vagrant-node1 (UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
```
In use by VMsで仮想マシンが利用していることを確認出来ました。


## 仮想マシン起動&仮想マシンへの接続

```
$ vagrant up
$ vagrant ssh
```

## rootユーザーへ変更
```
[vagrant@node1 ~]$ sudo su -
```

## ハード・ディスクのパーティション確認
```
[root@node1 ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000944b9

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20766719     9870336   8e  Linux LVM

Disk /dev/mapper/centos-root: 8996 MB, 8996782080 bytes, 17571840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 1065 MB, 1065353216 bytes, 2080768 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```

## ハード・ディスクのパーティション変更

fdiskコマンドとかはLinux不慣れな人はあまり見たことないかもしれませんが
パーテイション関連コマンドです。対話式で、Comandと聞かれるので、それぞれモードを指定して利用します。以下にコマンド結果をそのまま載せます。
nコマンドを実行をした後にはデフォルトなのでEnterでOKです。

```
[root@node1 ~]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (3,4, default 3):
First sector (20766720-41943039, default 20766720):
Using default value 20766720
Last sector, +sectors or +size{K,M,G} (20766720-41943039, default 41943039):
Using default value 41943039
Partition 3 of type Linux and of size 10.1 GiB is set
```

```
Command (m for help): t
Partition number (1-3, default 3):
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
```

```
Command (m for help): p

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000944b9

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20766719     9870336   8e  Linux LVM
/dev/sda3        20766720    41943039    10588160   8e  Linux LVM
```

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

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
```

## 仮想マシン再起動
```
[root@node1 ~]# reboot
```

## 物理ボリュームを確認

### 仮想マシンへ接続
```
$ vagrant ssh
```

## 確認

```
[vagrant@node1 ~]# sudo su -
[root@node1 ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               9.41 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              2409
  Free PE               10
  Allocated PE          2399
  PV UUID               P0ooC6-nfdy-vZkK-cniC-MG1G-2dIn-t1115F
```

## 物理ボリュームを増やす

### LVMパーティションを物理ボリュームとして登録

```
[root@node1 ~]# pvcreate /dev/sda3
 Physical volume "/dev/sda3" successfully created
[root@node1 ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               9.41 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              2409
  Free PE               10
  Allocated PE          2399
  PV UUID               P0ooC6-nfdy-vZkK-cniC-MG1G-2dIn-t1115F

  "/dev/sda3" is a new physical volume of "10.10 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda3
  VG Name
  PV Size               10.10 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               v9JZTG-wI0T-UP8O-3grT-YvgH-Uone-gg3Go1
```

### 既存のLVMパーティションを拡張

```
[root@node1 ~]# vgextend centos /dev/sda3
  Volume group "centos" successfully extended
```
### 論理ボリュームに未使用領域を追加

```
[root@node1 ~]# lvextend -l +100%FREE /dev/mapper/centos-root
  Size of logical volume centos/root changed from 8.38 GiB (2145 extents) to 18.51 GiB (4739 extents).
  Logical volume root successfully resized.
```

### XFSシステムの領域を拡張

```
[root@node1 ~]# xfs_growfs /
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=549120 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=2196480, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
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 2196480 to 4852736
```


### ディスク容量の確認

```
[root@node1 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   19G  1.8G   17G  10% /
devtmpfs                 1.4G     0  1.4G   0% /dev
tmpfs                    1.4G     0  1.4G   0% /dev/shm
tmpfs                    1.4G  8.4M  1.4G   1% /run
tmpfs                    1.4G     0  1.4G   0% /sys/fs/cgroup
/dev/sda1                497M  106M  391M  22% /boot
tmpfs                    285M     0  285M   0% /run/user/1001
```

## 不必要な仮想ディスクの削除

### 仮想マシン停止
```
$ vagrant halt
```

### 仮想マシンの構成ファイル・ディレクトリ移動
```
$ ｃｄ /Users/foo/VirtualBox VMs/vagrant-node1
```

### 確認

```
$ ls 
Logs/                           box-disk2.vmdk                  vagrant-node1-1.12-macosx.vbox  vagrant-node1.vbox-prev
box-disk1.vmdk                  clone-disk1.vdi                 vagrant-node1.vbox
```

```
$ VBoxManage list hdds
```
box-disk1.vmdk
が表示されている

### Vagrant管理下から解除

```
$ VBoxManage closemedium disk box-disk1.vmdk
```

```
$ VBoxManage list hdds
```
box-disk1.vmdk
が表示されているいない事を確認

### 仮想ディスクを削除

```
$ rm -rf box-disk1.vmdk
$ rm -rf clone-disk1.vdi
```