VirtualBoxで仮想HDDを追加して Linuxのディスク空き容量を増やす

VirtualBox上のCentOS7にあれやこれや入れてたら、仮想HDDの2GBでは少な過ぎたようで、ルートパスの使用率が96%に。

```
$ df
ファイルシス            1K-ブロック    使用 使用可 使用% マウント位置
/dev/mapper/centos-root     1361920 1306184  55736   96% /
devtmpfs                     242508       0 242508    0% /dev
tmpfs                        251028       0 251028    0% /dev/shm
tmpfs                        251028    4408 246620    2% /run
tmpfs                        251028       0 251028    0% /sys/fs/cgroup
/dev/sda1                    508588  136960 371628   27% /boot
```
なにも考えず、とりあえず仮想HDDをもう2GB追加してルートパス `/`を拡張してみます。


#VirtualBoxで新しい仮想HDDを追加
追加するVMのストレージ設定画面を開きます。
「コントローラー： SATA」を選択するとの右のほうにHDD追加ボタン![HDD追加アイコン.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/7942460c-982f-291a-327a-df897b8663a1.png)
がでるので、それをクリックします。

![DiskADD01.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/1812529a-b396-bcc9-3381-c88141759cba.png)

「新規ディスクの作成」をクリックします。

![DiskADD02.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/f01470c0-cc1d-920d-7af1-edda6930d49f.png)

私の場合は、既存のディスクがVHDだったので同じVHDを選択しました。
デフォルトのVDIでも結構です。

![DiskADD03.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/a16a36ec-1f74-0190-39a3-5f532cf13eeb.png)

可変サイズを選択。固定でも大丈夫です。
（固定だといきなり指定サイズのファイルが作成される）

![DiskADD04.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/57b9600c-8cb3-d1bb-3212-a3cef982fb73.png)

仮想ディスクイメージのファイル名と、サイズを設定します。

![DiskADD05.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/7c6c8557-fd26-73eb-7b96-fa0dfde8f4ed.png)

最後に作成をクリックするとDiskが追加されます。

![DiskADD06.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/f354353c-46e0-a1b3-9e4f-a004a9a8fa9b.png)
#追加した仮想HDDをLinuxのボリュームへ追加
ルート `/` の空きを増やすには以下の作業が必要です。

1. 追加した仮想HDDにパーティションを作成
2. 作成したパーティションで物理ボリュームを作成
3. / にマウントしている論理ボリュームが割当てられているボリュームグループへ、物理ボリュームを追加
4. 論理ボリュームを拡張
5. ファイルシステムを拡張

CentOS7に加えて、Ubuntu Server 14.04LTSでも試しています。
Ubuntuのrootボリュームグループ名はホスト名によって変るので、`hostname`コマンドで確認して置き換えて下さい。

##パーティション作成

まずは、認識されているHDDを探します。
デバイス名はsd?（もしくはhd?）を探します。

```bash:CentOS
$ ll /dev/sd*
brw-rw----. 1 root disk 8,  0  2月 00 00:00 /dev/sda
brw-rw----. 1 root disk 8,  1  2月 00 00:00 /dev/sda1
brw-rw----. 1 root disk 8,  2  2月 00 00:00 /dev/sda2
brw-rw----. 1 root disk 8, 16  2月 00 00:00 /dev/sdb
```
```bash:Ubuntu
$ ll /dev/sd*
brw-rw----. 1 root disk 8,  0  2月 00 00:00 /dev/sda
brw-rw----. 1 root disk 8,  1  2月 00 00:00 /dev/sda1
brw-rw----. 1 root disk 8,  2  2月 00 00:00 /dev/sda2
brw-rw----. 1 root disk 8,  5  2月 00 00:00 /dev/sda5
brw-rw----. 1 root disk 8, 16  2月 00 00:00 /dev/sdb
```
まだパーティションが作成されていない　/dev/sdb　が見つかりました。
fdiskを使用して、/dev/sdb に新しいパーティションを追加します。

```bash:CentOS
$ sudo fdisk /dev/sdb
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.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x1c46cb44.

コマンド (m でヘルプ):
```

```bash:Ubuntu
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xf591a1f7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help):
```
`p`コマンドで現在のパーティションを確認します。

```bash:fdisk
コマンド (m でヘルプ): p

Disk /dev/sdb: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x1c46cb44

デバイス ブート      始点        終点     ブロック   Id  システム
```
初期状態なので何もありません。

`n`コマンド新しいプライマリ・パーティションを作成します。
パーティション番号は1、2GiB全て割当てるために、セクターは全て（2048-4194303）使用します。 

※2048開始なのは、あらゆるRAIDでストライプ・サイズの倍数になっているから、セクタ位置合せで都合がよいのだとか。

```bash:fdisk
コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
パーティション番号 (1-4, default 1): 1
最初 sector (2048-4194303, 初期値 2048): 2048
Last sector, +sectors or +size{K,M,G} (2048-4194303, 初期値 4194303): 4194303
Partition 1 of type Linux and of size 2 GiB is set

コマンド (m でヘルプ): p

Disk /dev/sdb: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x1c46cb44

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1            2048     4194303     2096128   83  Linux
```
新しいパーティション /dev/sdb1 が作成されました。
`w`コマンドでパーティションを書込みます。

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

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```

ファイルシステムからも /dev/sdb1　が確認できます。

```bash:CentOS
$ ll /dev/sd*
brw-rw----. 1 root disk 8,  0  2月 00 00:00 /dev/sda
brw-rw----. 1 root disk 8,  1  2月 00 00:00 /dev/sda1
brw-rw----. 1 root disk 8,  2  2月 00 00:00 /dev/sda2
brw-rw----. 1 root disk 8, 16  2月 00 00:00 /dev/sdb
brw-rw----. 1 root disk 8, 17  2月 00 00:00 /dev/sdb1
```

```bash:Ubuntu
$ ll /dev/sd*
brw-rw----. 1 root disk 8,  0  2月 00 00:00 /dev/sda
brw-rw----. 1 root disk 8,  1  2月 00 00:00 /dev/sda1
brw-rw----. 1 root disk 8,  2  2月 00 00:00 /dev/sda2
brw-rw----. 1 root disk 8,  5  2月 00 00:00 /dev/sda5
brw-rw----. 1 root disk 8, 16  2月 00 00:00 /dev/sdb
brw-rw----. 1 root disk 8, 17  2月 00 00:00 /dev/sdb1
```


##ボリューム拡張
冒頭の`df`コマンドで確認した通り、/dev/mapper/centos-root がルートにマウントされています。（Ubuntuは /dev/mapper/ホスト名--vg-root)
ボリュームグループ centos に物理ボリュームとして/dev/sdb1を追加して、論理ボリュームrootの容量を拡張します。

###ボリュームグループ拡張
`vgdisplay`コマンドで現在のボリュームグループを確認します。

```bash:CentOS
$ sudo vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  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               1.51 GiB
  PE Size               4.00 MiB
  Total PE              386
  Alloc PE / Size       386 / 1.51 GiB
  Free  PE / Size       0 / 0
  VG UUID               UPHnYU-zXwc-1L3w-LxQu-1uEP-K1wO-vCUXwc
```

```bash:Ubuntu
$ sudo vgdisplay
  --- Volume group ---
  VG Name               ホスト名-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  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               7.76 GiB
  PE Size               4.00 MiB
  Total PE              1986
  Alloc PE / Size       1978 / 7.73 GiB
  Free  PE / Size       8 / 32.00 MiB
  VG UUID               JkiHt9-3wvZ-dJYz-qhPp-xGxd-QRWq-5HsliN
```
VG Sizeが1.51GiBになっています。（Ubuntuは7.76GiB）

`pvcreate`コマンドでパーティション /dev/sdb1 の物理ボリュームを作成して、ボリュームグループ centos へ追加します。（Ubuntuはボリュームグループ　ホスト名-vg）

```bash:CentOS
$ sudo pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
$ sudo vgextend centos /dev/sdb1
  Volume group "centos" successfully extended
$ sudo vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               3.50 GiB
  PE Size               4.00 MiB
  Total PE              897
  Alloc PE / Size       386 / 1.51 GiB
  Free  PE / Size       511 / 2.00 GiB
  VG UUID               UPHnYU-zXwc-1L3w-LxQu-1uEP-K1wO-vCUXwc
```

```bash:Ubuntu
$ sudo pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
$ sudo vgextend ホスト名-vg /dev/sdb1
  Volume group "ホスト名-vg" successfully extended
$ sudo vgdisplay
  --- Volume group ---
  VG Name               ホスト名-vg
  System ID
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               9.75 GiB
  PE Size               4.00 MiB
  Total PE              2497
  Alloc PE / Size       1978 / 7.73 GiB
  Free  PE / Size       519 / 2.03 GiB
  VG UUID               JkiHt9-3wvZ-dJYz-qhPp-xGxd-QRWq-5HsliN
```

Free Sizeが2.00GiBに増えて、VG Sizeが3.50GiBになりました。(
Ubuntuは9.75GiBに）

この2.00GiBをすべて論理ボリューム root に割当てます。

###論理ボリューム拡張
`lvdisplay`コマンドで現在のLV SizeとLV Pathを確認します。

```bash:CentOS
$ sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                T2yPcS-nfFm-QNQF-NXK9-IiOM-ZUz4-c4GY3V
  LV Write Access        read/write
  LV Creation host, time localhost, 2015-02-00 00:00:00 +0900
  LV Status              available
  # open                 2
  LV Size                204.00 MiB
  Current LE             51
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                NhZmMs-2PF4-Izbl-glMg-Pm26-GPh0-cPnP0s
  LV Write Access        read/write
  LV Creation host, time localhost, 2015-02-00 00:00:00 +0900
  LV Status              available
  # open                 1
  LV Size                1.31 GiB
  Current LE             335
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
```
```bash:Ubuntu
$ sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/ホスト名-vg/root
  LV Name                root
  VG Name                ホスト名-vg
  LV UUID                wfJe7W-SFJC-y3oK-2Qz2-fgR5-n8D2-8Jvb1a
  LV Write Access        read/write
  LV Creation host, time ホスト名, 2014-09-00 00:00:00 +0900
  LV Status              available
  # open                 1
  LV Size                7.23 GiB
  Current LE             1851
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Path                /dev/ホスト名-vg/swap_1
  LV Name                swap_1
  VG Name                ホスト名-vg
  LV UUID                5lMqR5-0r5b-WfRz-21Rs-sF4z-foms-H3VYmY
  LV Write Access        read/write
  LV Creation host, time ホスト名, 2014-09-00 00:00:00 +0900
  LV Status              available
  # open                 2
  LV Size                508.00 MiB
  Current LE             127
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1
```

`lvextend`コマンドでLV Path /dev/centos/root を指定し、論理ボリュームrootを拡張します（CentOSで、なんか2Gを指定したらエクステントが一個足らんって怒られたので、1.99Gにしました）

```bash:CentOS
$ sudo lvextend -L+1.99G /dev/centos/root
  Rounding size to boundary between physical extents: 1.99 GiB
  Extending logical volume root to 3.30 GiB
  Logical volume root successfully resized
$ sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                T2yPcS-nfFm-QNQF-NXK9-IiOM-ZUz4-c4GY3V
  LV Write Access        read/write
  LV Creation host, time localhost, 2015-02-19 10:44:47 +0900
  LV Status              available
  # open                 2
  LV Size                204.00 MiB
  Current LE             51
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                NhZmMs-2PF4-Izbl-glMg-Pm26-GPh0-cPnP0s
  LV Write Access        read/write
  LV Creation host, time localhost, 2015-02-19 10:44:47 +0900
  LV Status              available
  # open                 1
  LV Size                3.30 GiB
  Current LE             845
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
```

```bash:Ubuntu
$ sudo lvextend -L+2G /dev/ホスト名-vg/root
  Extending logical volume root to 9.23 GiB
  Logical volume root successfully resized
```
rootのLV Sizeが3.30GiBに増えました。（Ubuntuは9.23GiB）

###ファイルシステム拡張(xfs)
最後にファイルシステムを拡張します。
CentOS7の場合、デフォルトのファイルシステムはxfsになっています。（Ubuntuはext4）
`df -T`でファイルシステムタイプを確認してみます。

```bash:CentOS
$ df -T
ファイルシス            タイプ   1K-ブロック    使用 使用可 使用% マウント位置
/dev/mapper/centos-root xfs          1361920 1306176  55744   96% /
devtmpfs                devtmpfs      242508       0 242508    0% /dev
tmpfs                   tmpfs         251028       0 251028    0% /dev/shm
tmpfs                   tmpfs         251028    4440 246588    2% /run
tmpfs                   tmpfs         251028       0 251028    0% /sys/fs/cgroup
/dev/sda1               xfs           508588  136960 371628   27% /boot
```

```bash:Ubuntu
$ df -T
Filesystem                    Type     1K-blocks    Used Available Use% Mounted on
/dev/mapper/ubuntu01--vg-root ext4       7331536 1841792   5094276  27% /
none                          tmpfs            4       0         4   0% /sys/fs/cgroup
udev                          devtmpfs    239652      12    239640   1% /dev
tmpfs                         tmpfs        50180     436     49744   1% /run
none                          tmpfs         5120       0      5120   0% /run/lock
none                          tmpfs       250892       0    250892   0% /run/shm
none                          tmpfs       102400       0    102400   0% /run/user
/dev/sda1                     ext2        240972   37074    191457  17% /boot
```
xfsの拡張は`xfs_growfs`コマンドを使用します。

```bash:CentOS
$ sudo xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=85760 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=343040, 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 343040 to 865280

$ df
ファイルシス            1K-ブロック    使用  使用可 使用% マウント位置
/dev/mapper/centos-root     3450880 1306424 2144456   38% /
devtmpfs                     242508       0  242508    0% /dev
tmpfs                        251028       0  251028    0% /dev/shm
tmpfs                        251028    4408  246620    2% /run
tmpfs                        251028       0  251028    0% /sys/fs/cgroup
/dev/sda1                    508588  136960  371628   27% /boot
```
無事にルートの空きが増えて、使用率が38%へ落ちました。

ext4の拡張は`resize2fs`コマンドを使用します。

```bash:Ubuntu
$ sudo resize2fs /dev/ホスト名-vg/root
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/ubuntu01-vg/root is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/ubuntu01-vg/root is now 2419712 blocks long.
$ df
Filesystem                    1K-blocks    Used Available Use% Mounted on
/dev/mapper/ホスト名--vg-root   9395856 1841792   7075532  21% /
none                                  4       0         4   0% /sys/fs/cgroup
udev                             239652      12    239640   1% /dev
tmpfs                             50180     436     49744   1% /run
none                               5120       0      5120   0% /run/lock
none                             250892       0    250892   0% /run/shm
none                             102400       0    102400   0% /run/user
/dev/sda1                        240972   37074    191457  17% /boot
```