パブリックプレビューの Azure Managed Disk ライブ拡張（ディスクをマウントしたまま容量を増やすやつ）をやってみた

## 背景と目的

私の場合、仮想マシンのディスク容量は基本的にデフォルト設定のまま使い始めて、足りなくなったら拡張するというパターンです。冗長構成で切り替えながらサービスに影響が出ないように順番に仮想マシンを停止してディスク容量を拡張するか、LVM パーティションに後から仮想マシンに追加したディスクを加える、という方法が考えられます。そもそも冗長構成にするまでもない仮想マシンであったり、冗長構成や LVM など面倒なことはせずに仮想マシンを起動したままサービスに影響なくディスクを拡張できるのは、とっても有難いことです。

## 前提条件

パブリックプレビューでは、次の制約があるそうです。

* 当初は米国中西部のみ（後から東日本等のリージョンもパブリックプレビューに追加されました）
* データディスクのみ
* 4TiB をまたがるディスク拡張には未対応（和訳では 4TiB 未満は未対応と読み取れますが間違いです）

加えてドキュメントには書いていませんが、私の環境では Standard_LRS では出来ず、StandardSSD_LRS なら出来ました。

コマンドの実施環境は、Mac + Azure CLI です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.2.1
BuildVersion:   21D62

$ az version
{
  "azure-cli": "2.32.0",
  "azure-cli-core": "2.32.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## ダウンタイムなしでディスクサイズを変更するプレビュー機能を有効にする

```bash:bash
# パブリックプレビューの LiveResize を登録します
az feature register \
  --namespace Microsoft.Compute \
  --name LiveResize

# 変更を伝達するために実行します
az provider register \
  --name Microsoft.Compute

# Registered になるまで待ちます（私の環境では 15 分くらいかかりました）
az feature show \
  --namespace Microsoft.Compute \
  --name LiveResize \
  --query properties.state
```

## 検証用の仮想マシンを作る

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrlivedisk

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# SSH キーペアをファイル名を指定して作成します
ssh-keygen -m PEM -t rsa -b 4096 \
  -f ${prefix}

# 検証用の仮想マシンを作成します
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image CentOS \
  --size Standard_B1ls \
  --admin-username azureuser \
  --ssh-key-value ${prefix}.pub \
  --nsg-rule NONE \
  --public-ip-address-dns-name ${prefix} \
  --storage-sku Standard_LRS

# データディスクを仮想マシンに追加します
az vm disk attach \
  --resource-group ${prefix}-rg \
  --vm-name ${prefix}-vm \
  --name ${prefix}-vmDataDisk \
  --new \
  --sku StandardSSD_LRS \
  --size-gb 4

# NSG に自分の IP アドレスから SSH 接続出来るようにします
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name Allow-SSH \
  --nsg-name ${prefix}-vmNSG \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp

# 仮想マシンに SSH 接続します
ssh -i ${prefix} azureuser@${prefix}.$region.cloudapp.azure.com
```

## データディスクをフォーマットしてマウントする

```bash:bash
# ディスク情報を確認します
lsblk -p /dev/sdc

# 未使用の /dev/sdc にパーティションを作成します
sudo parted /dev/sdc -s mklabel gpt mkpart primary xfs 0% 100%

# xfs フォーマットします
sudo mkfs.xfs /dev/sdc1

# マウントするディレクトリを作成します
sudo mkdir /datadrive

# /dev/sdc1 をマウントします
sudo mount /dev/sdc1 /datadrive

# /dev/sdc1 が 4G で /datadrive にマウントされていることを確認します
lsblk -p /dev/sdc

# 動作確認用のファイルを作成します
date | sudo tee /datadrive/date.txt

# 仮想マシンから一旦抜けます
exit
```

## マウント済みのディスク容量をライブ拡張する

```bash:bash
# データディスクを 8GiB に増やします（私の環境では 5 分くらいかかりました）
az disk update \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vmDataDisk \
  --size-gb 8

# 仮想マシンに SSH 接続します
ssh -i ${prefix} azureuser@${prefix}.$region.cloudapp.azure.com

# /dev/sdc が 4G であることを確認します
lsblk -p /dev/sdc

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sdc      8:32   0   4G  0 disk 
└─/dev/sdc1   8:33   0   4G  0 part /datadrive

# 対象ディスクのデバイス ID を確認します
lsscsi

[0:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda 
[2:0:0:0]    cd/dvd  Msft     Virtual CD/ROM   1.0   /dev/sr0 
[3:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb 
[5:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sdc 

# 対象のディスクをリスキャンします
echo 1 | sudo tee /sys/class/scsi_disk/5\:0\:0\:0/device/rescan 

# /dev/sdc が 8G になったことを確認します
lsblk -p /dev/sdc

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sdc      8:32   0   8G  0 disk 
└─/dev/sdc1   8:33   0   4G  0 part /datadrive

# ファイルが開けるか確認します
cat /datadrive/date.txt

# growpart と gdisk をインストールします
sudo yum install cloud-utils-growpart gdisk -y

# パーティションを拡張します
sudo growpart /dev/sdc 1

# /dev/sdc1 が 8G になったことを確認します
lsblk -p /dev/sdc

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sdc      8:32   0   8G  0 disk 
└─/dev/sdc1   8:33   0   8G  0 part /datadrive

# ファイルシステムを拡張します
sudo xfs_growfs /datadrive

# ファイルシステムのサイズが 8.0G になったことを確認します
df -h /datadrive

ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sdc1        8.0G   33M  8.0G    1% /datadrive

# ファイルが開けるか確認します
cat /datadrive/date.txt

# VM から抜けます
exit
```

## 参考

作成したリソースを削除します。

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes

# 作成した SSH キーペアを削除します
rm -f ${prefix}*
```

下記は、参考サイトです。

<https://azure.microsoft.com/ja-jp/updates/live-resize-of-azure-disk-storage-in-public-preview/>

<https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/expand-disks#expand-an-azure-managed-disk>

<https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/add-disk>

<https://blog.idcf.jp/entry/cloud/diskcapacity/>