ConoHaの追加SSDをLVMでルートファイルシステムに割り当てる

[ConoHa](https://www.conoha.jp/)は標準で50GBのSSDが仮想サーバーに付いてきます。そしてオプションで250GBや500GBのSSDを追加することができます。この追加したストレージは、仮想サーバーからは別のドライブと見なされます(Linuxでは/dev/vdaと/dev/vdbになる)。

「50GBで運用していて、足りなくなったので250GBを追加したい」といったケースでは、合わせて300GBの1ドライブとして扱いたくなるでしょう。幸いConoHaのCentOS7系のイメージはLVMが使われているので、以下の手順で2つのドライブをまとめて1ドライブとして扱うことができます。

*(注) ConoHaのCentOS 7.3以降のイメージは、LVMではなくext4ファイルシステムが使われているようなので、この記事の手順を使うことはできません*

## やり方

ConoHaのCentOS7イメージアは以下のようなパーティション構成になっていて、ファイルシステムはxfsです。ほぼデフォルトのインストールです。そして、追加したSSDはマウントされていません。

```shell-session
# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        48G  1.4G   47G   3% /
devtmpfs                devtmpfs  487M     0  487M   0% /dev
tmpfs                   tmpfs     497M     0  497M   0% /dev/shm
tmpfs                   tmpfs     497M   13M  484M   3% /run
tmpfs                   tmpfs     497M     0  497M   0% /sys/fs/cgroup
/dev/vda1               xfs       497M  170M  328M  35% /boot
tmpfs                   tmpfs     100M     0  100M   0% /run/user/0
```

LVMは下記のようなレイアウトになっています。一つの物理ボリューム(PV)。そしてcentosと言う名前の一つのボリュームグループ(VG)です。論理ボリューム(LV)は2つあって、ルートファイルシステムとスワップに割り当てられています(VG Nameは環境によって異なる場合があります)。

```
# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  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               49.51 GiB
  PE Size               4.00 MiB
  Total PE              12674
  Alloc PE / Size       12663 / 49.46 GiB
  Free  PE / Size       11 / 44.00 MiB
  VG UUID               YwWgHt-3qRA-0VNA-mwx8-4T8Z-SJWq-bX2kuC

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               centos
  PV Size               49.51 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              12674
  Free PE               11
  Allocated PE          12663
  PV UUID               OQ0g7d-2BeQ-PXOr-B9lK-hfmU-8F2K-ZR4h8m
```


## パーティショニング

まず追加SSD全体をLVMの物理ボリュームとしてパーティショニングします。fdiskでも良いですが、ここではpartedを使います。

```shell-session
# parted /dev/vdb
```

**print** で現在の状況を表示します。

```shell-session
# parted /dev/vdb
GNU Parted 3.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Error: /dev/vdb: unrecognised disk label
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
(parted)
```

そして、
* **mklabel**でラベルを与えて
* **mkpart**で領域の確保を行い
* **set** でLVMフラグを立てます。

mkpartの第3引数は、0以下の値を渡すとディスクの最終セクターを指定したことになります。

```shell-session
(parted) mklabel gpt
(parted) mkpart primary 1 -1
(parted) set 1 lvm on
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  215GB  215GB               primary  lvm
```

そして、**quit**でpartedを終了します。これで/dev/vdb1ができているはずです。

## 物理ボリュームの作成

作成したパーティションに物理ボリュームを作成します。

```shell-session
# pvcreate /dev/vdb1
  Physical volume "/dev/vdb1" successfully created
```

## ボリュームグループの作成 

作成した物理ボリュームを既存のcentosボリュームグループに追加します。その後vgdisplayを実行すると、容量が増えていることが確認できます。出力が長くなるので載せませんが、vgdisplayに **-v** オプションを付けると、2つの物理ボリュームが見えるはずです。

```
# vgextend centos /dev/vdb1
  Volume group "centos" successfully extended
# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  6
  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               249.50 GiB
  PE Size               4.00 MiB
  Total PE              63873
  Alloc PE / Size       12663 / 49.46 GiB
  Free  PE / Size       51210 / 200.04 GiB
  VG UUID               YwWgHt-3qRA-0VNA-mwx8-4T8Z-SJWq-bX2kuC
```

## 論理ボリュームの拡張

次にボリュームグループの新しい空き領域を、既存の論理ボリュームに割り当てます。以下のコマンドは空き領域を全てルートファイルシステムに割り当てています。lvdisplayを実行すると、ディスクサイズ容量が増えていることが確認できます。

```
# lvextend -l +100%FREE /dev/centos/root
  Size of logical volume centos/root changed from 47.46 GiB (12151 extents) to 247.50 GiB (63361 extents).
  Logical volume root successfully resized.
# lvdisplay /dev/centos/root
  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                YcfoSu-M0o7-cvWK-Op2I-LxyG-0gHK-ffypmV
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-12-24 14:02:13 +0900
  LV Status              available
  # open                 1
  LV Size                247.50 GiB
  Current LE             63361
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
```

## xfsファイルシステムを拡張する

最後にxfsファイルシステムを拡張して、空き領域をファイルシステムに認識させます。これには **xfs_growfs** コマンドを使います。

```shell-session
# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=3110656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=12442624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=6075, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 12442624 to 64881664
#
```

dfなどで空き容量が増えていることが確認できれば完了です。

```shell-session
# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  248G  1.4G  247G   1% /
devtmpfs                 487M     0  487M   0% /dev
tmpfs                    497M     0  497M   0% /dev/shm
tmpfs                    497M   13M  484M   3% /run
tmpfs                    497M     0  497M   0% /sys/fs/cgroup
/dev/vda1                497M  170M  328M  35% /boot
tmpfs                    100M     0  100M   0% /run/user/0
```