Alibaba Cloud Diskの容量をどうやって拡張するの

## はじめに
昔のオンプレミス時代ならば、計算能力やストレージ容量が柔軟に変更できませんでしたが、クラウド時代に入っていたら、リソースをエラスチックに追加・削除が可能になりました。他のクラウドベンダーと同様に、Alibaba Cloudではデータ容量を必要に応じて「オンライン変更」が可能です。

「できるならば、喋るだけしないで見せようよ」ということなので、この記事では容量の拡張手順について書きたいと思います。

## 拡張手順

### クラウドディスクの構成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74420/a3f06359-7b24-ae56-7ddb-47481810a7e1.png)

物理ディスクからLinuxファイルシステムまでの構成は、上記の図の通りだと思います。一番したは物理ディスクで、その上に[マスターブートレコード](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%96%E3%83%BC%E3%83%88%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89) (MBR)で、複数のパーティションの情報を保存するディスクの最初のセクターです。MBRのすぐの次はパーティション領域です。パーティションの上に、もし[LVM](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3) を使用されるのであれば、LVMが入ります。LVMが使用されなければ、ファイルシステムが入ります。Linuxの一般的に使われるファイルシステムは`ext4`です。

この構成では、容量を拡張するために以下のステップを実行しなければなりません。

1. 物理ディスクの容量を追加します
2. MBRのパーティション情報を変更し、パーティションを伸ばします
3. ファイルシステムのサイズを伸ばします

次の手順は、上記のそれぞれのステップ(オレンジが変更必要) の詳細の操作やコマンドについてまとめます。

### 手順

#### 0. 拡張前の構成

容量を拡張する前に、現状の構成を確認します。`/dev/vdc1`の`20GB`パーティションがあり、`/data`にマウントされています。`/data`にはデータは存在しています。

```
[root@iz6we1wnd6d278oj46chawz ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   40G  0 disk
└─vda1 253:1    0   40G  0 part /
vdc    253:32   0   20G  0 disk
└─vdc1 253:33   0   20G  0 part /data
[root@iz6we1wnd6d278oj46chawz ~]#
[root@iz6we1wnd6d278oj46chawz ~]# ll /data
total 18840
-rw-r--r-- 1 root root     5166 May 18 13:22 Advertising.csv
-rw-r--r-- 1 root root 10792301 May 18 13:23 ALL-2views.zip
drwxr-xr-x 2 root root     4096 May 18 13:23 Aloe
-rw-r--r-- 1 root root    18079 May 18 13:23 Auto.csv
-rw-r--r-- 1 root root    30293 May 18 13:23 Auto.data
...
```

`/data`の直下にあるデータを維持しながら、`/dev/vdc1`容量を拡張することが目標です。

#### 1. 物理容量を拡張する

容量を拡張したいディスクのIDを確認します。Alibaba Cloud ECSコンソール画面の【インスタンスディスク】で確認できます。そして、作業を実施する前に「スナップショット」でデータバックアップを取ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74420/a7e3b82c-edb2-bf9b-3ad9-3e321e185c76.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74420/d2eef24d-ffc7-f840-007b-932464592ea4.png)


次には、[`aliyuncli`](http://qiita.com/talzeus/items/28c773f77b40770a8c42)で、容量を拡張します。コマンドはおそらく5秒で終わります。コマンドが実行終わったら、コンソール画面で変更後の容量を確認できます。

```
$ aliyuncli ecs ResizeDisk --DiskId d-6wehb8u47ih5opxlp9p0 --NewSize 40
{
    "RequestId": "7E3FC46C-7606-4756-AAAF-C82509DB7228"
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74420/2e50a8af-a898-18c8-892d-98181b8ae73e.png)

しかし、これだけだとOS側が新しい容量を認識できないため、ディスクを一回デタッチ、アタッチし直す必要があります。

```
[root@iz6we1wnd6d278oj46chawz ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   40G  0 disk
└─vda1 253:1    0   40G  0 part /
vdc    253:32   0   20G  0 disk
└─vdc1 253:33   0   20G  0 part /data
[root@iz6we1wnd6d278oj46chawz ~]# umount /dev/vdc1
```

【デタッチ】→ 【アタッチ】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74420/2ff10e03-4aa4-27ad-be4f-cd0a4a791d94.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74420/3c2617fb-ec0e-01f0-e202-5ea42dff689e.png)

これで、OS側では追加後の容量が認識できるようになります。

```
[root@iz6we1wnd6d278oj46chawz ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   40G  0 disk
└─vda1 253:1    0   40G  0 part /
vdc    253:32   0   40G  0 disk
└─vdc1 253:33   0   20G  0 part
```


#### 2. マスターブートレコード上書き

次には、パーティション`/dev/vdc1`を全容量まで拡張しなければなりません。様々なツールでこの作業を実施できますが、この資料は `gdisk`を使って行います。

**1. まずは`gdisk`で`dev/vdc`を編集するようにし、`p`でパーティション情報を確認します**

```
[root@iz6we1wnd6d278oj46chawz ~]# gdisk /dev/vdc
GPT fdisk (gdisk) version 0.8.6

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/vdc: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 858E9775-CE3F-4B99-BFB2-01984955A4BA
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048        41943006   20.0 GiB    0700  primary
```

`Sector`情報のみを変更するため、他のメタ情報 (GUID、Code) をメモしておきます。上記の場合だと、

* GUID: 858E9775-CE3F-4B99-BFB2-01984955A4BA
* Number: 1
* Start (sector): 2048
* Code: 0700
* Name: primary
 
**2. 既存パーティションが小さいため、既存パーティションを削除し新しいパーティションを作成し直し、サイズを伸ばします**

```
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-83886046, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (2048-83886046, default = 83886046) or {+-}size{KMGTP}: -1
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 0700
Changed type of partition to 'Microsoft basic data'
```

**3. メタ情報を元に戻します**

```
Command (? for help): c
Using 1
Enter name: primary

Command (? for help): x

Expert command (? for help): g
Enter the disk's unique GUID ('R' to randomize): 858E9775-CE3F-4B99-BFB2-01984955A4BA
The new disk GUID is 858E9775-CE3F-4B99-BFB2-01984955A4BA
```

**4. 編集済みのメタ情報を保存**

```
Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/vdc.
The operation has completed successfully.
```

#### 3. ファイルシステムの状態を確認

編集後のファイルシステムが問題はないか確認します。

a. 壊れたファイルが存在しないか確認します

```
[root@iz6we1wnd6d278oj46chawz ~]# file -sL /dev/vdc1
/dev/vdc1: Linux rev 1.0 ext4 filesystem data, UUID=9762842c-febe-4d53-bde7-2c0b3111eeda (extents) (64bit) (large files) (huge files)
```

b. ファイルシステムは壊れないか確認します

```
[root@iz6we1wnd6d278oj46chawz ~]# e2fsck -f /dev/vdc1
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vdc1: 440/1310720 files (0.2% non-contiguous), 139300/5242619 blocks
```

c. 上記で問題はなければ、パーティションを`mount`して確認します

```
[root@iz6we1wnd6d278oj46chawz ~]# mount -t ext4 -rw /dev/vdc1 /data
[root@iz6we1wnd6d278oj46chawz ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   40G  0 disk
└─vda1 253:1    0   40G  0 part /
vdc    253:32   0   40G  0 disk
└─vdc1 253:33   0   40G  0 part /data
[root@iz6we1wnd6d278oj46chawz ~]# ll /data
total 18840
-rw-r--r-- 1 root root     5166 May 18 13:22 Advertising.csv
-rw-r--r-- 1 root root 10792301 May 18 13:23 ALL-2views.zip
drwxr-xr-x 2 root root     4096 May 18 13:23 Aloe
-rw-r--r-- 1 root root    18079 May 18 13:23 Auto.csv
-rw-r--r-- 1 root root    30293 May 18 13:23 Auto.data
...
```

`/dev/vdc1`が`40G`となったことを確認できます。

## 結論

ディスクの容量を柔軟に拡張する手順を書きます。クラウド時代では、リソースがエラスチックに拡張したりできるため、オンプレミス時代の「容量の見積もりがないとインフラ構築できない」問題がなくなりました。

気軽にインフラを構築し、気軽に拡張しましょう