Microsoft AzureのLinux仮想マシンへのディスクの追加・拡張・削除の操作をまとめます。Azureの操作ではなくRedhat基本操作の比重が多いですが、fdiskコマンドやpartedコマンドなどの忘れがちなファイルシステム操作含めてまとめています。
参考資料
参考になる公式ドキュメントを以下に示します。
事前準備
以下、仮想ネットワーク等のリソースを作成します。
az group create --name MyResourceGroup --location japaneast az network vnet create \ -g MyResourceGroup \ -n MyVnet \ --address-prefix 172.16.0.0/16 \ --subnet-name MySubnet \ --subnet-prefix 172.16.0.0/24 az network nsg create -g MyResourceGroup -n MyNsg az network nsg rule create \ --resource-group MyResourceGroup \ --nsg-name MyNsg \ --name MyNsgRule0100 \ --priority 100 \ --destination-port-ranges 22 \ --access Allow \ --protocol Tcp az vm create \ --resource-group MyResourceGroup \ --name linux010 \ --image Oracle:Oracle-Linux:ol85-lvm:8.5.4 \ --size Standard_B2s \ --admin-username azureuser \ --authentication-type ssh \ --ssh-key-values ~/.ssh/authorized_keys
ディスクの追加
操作例(1) 新規ディスクを追加する場合
Azureの操作
az vm disk attachコマンドで引数newを与えるとディスクの新規作成を追加を同時に行います。
az vm disk attach \ --resource-group MyResourceGroup \ --vm-name linux010 \ --name linux010-disk01 \ --new \ --size-gb 50
後続の説明の都合上、もう1つディスクを追加します。
az vm disk attach \ --resource-group MyResourceGroup \ --vm-name linux010 \ --name linux010-disk02 \ --new \ --size-gb 50
仮想マシンにログインし、lsblkコマンドやfdiskコマンドでディスクが追加された事を確認します。以下出力例を見ると、確かにsdc, sddの2つのディスクが追加されている事が分かります。
OS再起動なしにディスクの追加は認識されます。
[root@linux010 ~]# lsblk -o NAME,HCTL,SIZE,MOUNTPOINT NAME HCTL SIZE MOUNTPOINT sda 2:0:0:0 30G ├─sda1 800M /boot ├─sda2 28.7G │ ├─rootvg-rootlv 18.7G / │ └─rootvg-crashlv 10G /var/crash ├─sda14 4M └─sda15 495M /boot/efi sdb 3:0:1:0 8G └─sdb1 8G /mnt sdc 5:0:0:0 50G sdd 5:0:0:1 50G sr0 1:0:0:0 628K
さて、sdc, sddのどちらがlinux010-disk01でしょうか。異なるサイズのディスクを追加した場合は50G等のディスクサイズからデバイスファイルを判断できますが、ディスクサイズが同じ場合は、LUNから判断します。前述の出力でHCTLは「Host, Control, Target, Lun」の略称ですので、5:0:0:0ならばLUNは0になります。
追加されたディスクのLUNを調べるには、仮想マシンの情報をaz vm showで調べましょう。調査例は以下の通りです。
$ az vm show \ --resource-group MyResourceGroup \ --name linux010 \ --query "storageProfile.dataDisks" [ { "caching": "None", "createOption": "Empty", "deleteOption": "Detach", "detachOption": null, "diskIopsReadWrite": null, "diskMBpsReadWrite": null, "diskSizeGb": 50, "image": null, "lun": 0, "managedDisk": { "diskEncryptionSet": null, "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/linux010-disk01", "resourceGroup": "MyResourceGroup", "storageAccountType": "Premium_LRS" }, "name": "linux010-disk01", "toBeDetached": false, "vhd": null, "writeAcceleratorEnabled": null }, { "caching": "None", "createOption": "Empty", "deleteOption": "Detach", "detachOption": null, "diskIopsReadWrite": null, "diskMBpsReadWrite": null, "diskSizeGb": 50, "image": null, "lun": 1, "managedDisk": { "diskEncryptionSet": null, "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/linux010-disk02", "resourceGroup": "MyResourceGroup", "storageAccountType": "Premium_LRS" }, "name": "linux010-disk02", "toBeDetached": false, "vhd": null, "writeAcceleratorEnabled": null } ]
ポータル(GUI)で確認する場合は、仮想マシンのディスクの画面でLUNを確認します。
OSの操作
ここまでの調査が完了したら、後はディスク上で動作するアプリケーションやOSのマニュアルに従って操作します。この先の操作はAzureとは一切関係ありません。以下ディスクをマウントする操作例を示します。
ディスクをフォーマットし、適当なディレクトリにマウントします。
parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100% mkfs.xfs /dev/sdc1 partprobe /dev/sdc1 mkdir /var/lib/mysql mount /dev/sdc1 /var/lib/mysql
ディスクのUUIDを調べます。
[root@linux010 ~]# blkid /dev/sdb1: UUID="2ef459be-57e8-4d3d-9f55-afc3054740dc" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="43389d03-d0ca-4538-9ebc-9fd606c803f8" /dev/sdb2: UUID="pAYVpP-05lu-r3p7-37P2-v01I-Hv02-uaC2z6" TYPE="LVM2_member" PARTUUID="455a34ba-6708-4de8-b9b1-9bb0e3f689db" /dev/sdb15: SEC_TYPE="msdos" UUID="0617-FC0F" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="9c3f245d-0723-47ee-b4db-d6f38cf980c9" /dev/sda1: UUID="bfc9975e-1c29-4580-b0aa-d6011f9eb1cb" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b5ee1715-01" /dev/mapper/rootvg-rootlv: UUID="b3da1ac3-d082-4b9b-a666-c0e34765e30b" BLOCK_SIZE="512" TYPE="xfs" /dev/mapper/rootvg-crashlv: UUID="64c4c734-36ef-4a0c-ac3e-3e36e34bc5eb" BLOCK_SIZE="512" TYPE="xfs" /dev/sdb14: PARTUUID="642772e9-4083-4440-b27c-689d96ba0cf5" /dev/sdc1: UUID="43064e6f-40ac-4602-82c8-5f2b1923f5a1" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="xfspart" PARTUUID="8fa0907f-cd17-4d64-89c1-63be67b65dda"
OS起動後も自動的にマウントされるように、/etc/fstabを編集します。
設定を誤るとOS自体が起動しなくなるので、以下はコピペしないように注意する。
cat << EOF >> /etc/fstab UUID=43064e6f-40ac-4602-82c8-5f2b1923f5a1 /var/lib/mysql xfs defaults 0 0 EOF
操作例(2) 既存ディスクを追加する場合
Azureの操作
前述の操作はディスクの新規作成と追加を同時に行いましたが、ディスク作成と追加を分けて操作したり、既存ディスクを追加したりする事もできます。ディスクを新規作成する操作は以下の通りです。
将来変わる可能性もありますが、az vm disk attachコマンドよりもaz disk createコマンドの方がより詳細なオプションを指定できます。例えば、以下に示すmax-sharesオプションはaz disk createのみ指定可能なオプションです。
az disk create \ --resource-group MyResourceGroup \ --name MySharedDisk \ --size-gb 50 \ --location japaneast \ --max-shares 2
既存ディスクを追加する場合は、引数nameにディスクのIDを指定します。
DISK_ID=$(az disk show \ --resource-group MyResourceGroup \ --name MySharedDisk \ --query 'id' \ --output tsv ) az vm disk attach \ --resource-group MyResourceGroup \ --vm-name linux010 \ --name ${DISK_ID}
OSの操作
ディスクの追加が完了したら、mountコマンド等を用いてディスクをマウントします。以降の操作は、「新規ディスクを追加する場合」と同じですので、説明を省略します。
ディスクの拡張
LiveResizeの有効化
OSの停止なしに仮想ディスクを拡張する機能、俗に言う「オンライン拡張」の機能は、Azureでは「プレビュー」の位置付けでサポート対象外です。使用する場合は、自己責任で使用する必要があります。プレビュー機能を有効にするには以下のような操作をします。
az feature register --namespace Microsoft.Compute --name LiveResize
プレビュー機能を有効にしているか否かを確認するには、以下コマンドを使用します。
az feature show --namespace Microsoft.Compute --name LiveResize
操作例(1) データディスクを拡張する場合
Azureの操作
仮想マシンの割り当て解除
原則、仮想マシンの起動中はディスクの拡張はできません。以下の操作で仮想マシンの割り当てを解除します。
前述のプレビュー機能「LiveResize」を有効にしている場合は、割り当て解除の操作を省略できます。
az vm deallocate \ --resource-group MyResourceGroup \ --name linux010
ディスクの拡張
以下のコマンドでディスクを拡張します。
az disk update \ --resource-group MyResourceGroup \ --name linux010-disk01 \ --size-gb 200
仮想マシンの起動
仮想マシンを起動します。
前述のプレビュー機能「LiveResize」を有効にしている場合は、起動の操作を省略できます。
az vm start \ --resource-group MyResourceGroup \ --name linux010
OSの操作
ディスクの再スキャン
ディスク拡張後、OSがどのようにディスクを認識しているかを確認します。もし、プレビュー機能「LiveResize」を有効にしてOS再起動をしていない場合は、OSはディスクの拡張を認識していません。以下のように200Gに拡張したにも関わらず、50Gと認識したままです。
[root@linux010 ~]# lsblk -o NAME,HCTL,SIZE,MOUNTPOINT NAME HCTL SIZE MOUNTPOINT sda 3:0:1:0 8G └─sda1 8G /mnt sdb 2:0:0:0 30G ├─sdb1 800M /boot ├─sdb2 28.7G │ ├─rootvg-rootlv 18.7G / │ └─rootvg-crashlv 10G /var/crash ├─sdb14 4M └─sdb15 495M /boot/efi sdc 5:0:0:0 50G └─sdc1 50G /var/lib/mysql sdd 5:0:0:1 50G sde 5:0:0:2 50G sr0 1:0:0:0 628K
以下のような操作でディスクを再スキャンします。なお、sdb, sdc, sddなどのデバイス名は適宜の変更をお願いします。
echo 1 > /sys/block/sdc/device/rescan
ディスクサイズが200Gと認識された事を確認します。
[root@linux010 ~]# lsblk -o NAME,HCTL,SIZE,MOUNTPOINT NAME HCTL SIZE MOUNTPOINT sda 3:0:1:0 8G └─sda1 8G /mnt sdb 2:0:0:0 30G ├─sdb1 800M /boot ├─sdb2 28.7G │ ├─rootvg-rootlv 18.7G / │ └─rootvg-crashlv 10G /var/crash ├─sdb14 4M └─sdb15 495M /boot/efi sdc 5:0:0:0 200G └─sdc1 50G /var/lib/mysql sdd 5:0:0:1 50G sde 5:0:0:2 50G sr0 1:0:0:0 628K
パーティションの拡張
拡張するディスクをアンマウントします。
umount /dev/sdc1
partedコマンドなどを用いてパーティションを拡張します。
parted /dev/sdc
partedコマンドは対話式の操作をします。以下、操作例を示します。まず、引数にデバイスファイルを指定して実行します。
[root@linux010 ~]# parted /dev/sdc GNU Parted 3.2 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted)
printコマンドを実行しますと、現在のパーティションの状態を確認できます。/dev/sdcには215GBのディスク容量があり、そのうちパーティション1に53.7BGが割り当てられている事が分かります。
(parted) print Model: Msft Virtual Disk (scsi) Disk /dev/sdc: 215GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 53.7GB 53.7GB xfs xfspart (parted)
resizeコマンドを使用すると、パーティションのサイズを変更できます。対話形式で、パーティション番号と拡張するサイズを聞かれますので、これに返答します。
(parted) resizepart Partition number? 1 End? [53.7GB]? 215GB (parted)
ファイルシステムの拡張
/dev/sdc1をマウントします。
mount /dev/sdc1
ファイルシステムを拡張します。
xfs_growfsコマンドはXFSを拡張する操作です。もし、ファイルシステムがext4等ならばresize2fsコマンドを使用ください。
xfs_growfs /dev/sdc1
/dev/sdc1が拡張された事を確認します。
[root@linux010 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 1.8G 17M 1.8G 1% /run tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup /dev/mapper/rootvg-rootlv 19G 2.6G 17G 14% / /dev/mapper/rootvg-crashlv 10G 104M 9.9G 2% /var/crash /dev/sdb1 794M 305M 490M 39% /boot /dev/sdb15 495M 5.1M 490M 2% /boot/efi /dev/sda1 7.9G 36M 7.4G 1% /mnt tmpfs 365M 0 365M 0% /run/user/1000 /dev/sdc1 200G 1.5G 199G 1% /var/lib/mysql [root@linux010 ~]#
操作例(2) OSディスクを拡張する場合
Azureの操作
仮想マシンの割り当て解除
以下の操作で仮想マシンの割り当てを解除します。
前述のプレビュー機能「LiveResize」を有効にしてもOSディスクは仮想マシン起動中に拡張する事はできません。
az vm deallocate \ --resource-group MyResourceGroup \ --name linux010
ディスクの拡張
OSディスクを拡張するには、OSディスク名を指定してaz disk updateコマンドを実行します。ですので、仮想マシンに対して「storageProfile.osDisk.name」等でクエリをかけてOSディスク名を調査したのちに、これを引数nameに与えます。
OS_DISK_NAME=$(az vm show \ --resource-group MyResourceGroup \ --name linux010 \ --query "storageProfile.osDisk.name" \ --output tsv ) az disk update \ --resource-group MyResourceGroup \ --name ${OS_DISK_NAME} \ --size-gb 200
仮想マシンの起動
仮想マシンを起動します。
az vm start \ --resource-group MyResourceGroup \ --name linux010
OSの操作
OS起動後のディスク認識の確認
OS起動後、どのようにディスクを認識しているかを確認します。
以下/dev/sdeを見ると、「/」や「/var/crash」の領域はLVMとして設定されており拡張可能な事が分かります。Azureで提供される殆どの仮想マシンはLVMとして設定されている事が多く、OSディスク含めて拡張が可能です。
[azureuser@linux010 ~]$ lsblk -o NAME,HCTL,SIZE,MOUNTPOINT NAME HCTL SIZE MOUNTPOINT sda 3:0:1:0 8G └─sda1 8G /mnt sdb 5:0:0:0 200G └─sdb1 200G /var/lib/mysql sdc 5:0:0:1 50G sdd 5:0:0:2 50G sde 2:0:0:0 200G ├─sde1 800M /boot ├─sde2 28.7G │ ├─rootvg-rootlv 18.7G / │ └─rootvg-crashlv 10G /var/crash ├─sde14 4M └─sde15 495M /boot/efi
パーティションの拡張
前述の/dev/sde2は28.7Gの状況で空きはありません。まずはパーティションを拡張する必要があります。データディスクの拡張で示した通り、partedコマンドでパーティションを拡張します。
[root@linux010 ~]# parted /dev/sde GNU Parted 3.2 Using /dev/sde Welcome to GNU Parted! Type 'help' to view a list of commands. (parted)
物理パーティションを確認します。データディスクと時と異なり、以下のような警告が表示されます。Ignoreと入力し強行します。
(parted) print Warning: Not all of the space available to /dev/sde appears to be used, you can fix the GPT to use all of the space (an extra 356515840 blocks) or continue with the current setting? Fix/Ignore? Ignore Model: Msft Virtual Disk (scsi) Disk /dev/sde: 215GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 14 1049kB 5243kB 4194kB bios_grub 15 5243kB 524MB 519MB fat16 EFI System Partition boot, esp 1 525MB 1364MB 839MB xfs 2 1364MB 32.2GB 30.8GB lvm (parted)
パーティションを拡張します。
(parted) resizepart Partition number? 2 End? [200GB]? 210GB (parted)
操作後、/dev/sde2が拡張されている事を確認します。
[root@linux010 ~]# lsblk -o NAME,HCTL,SIZE,MOUNTPOINT NAME HCTL SIZE MOUNTPOINT sda 3:0:1:0 8G └─sda1 8G /mnt sdb 5:0:0:0 200G └─sdb1 200G /var/lib/mysql sdc 5:0:0:1 50G sdd 5:0:0:2 50G sde 2:0:0:0 200G ├─sde1 800M /boot ├─sde2 194.3G │ ├─rootvg-rootlv 18.7G / │ └─rootvg-crashlv 10G /var/crash ├─sde14 4M └─sde15 495M /boot/efi [root@linux010 ~]#
PV(物理ボリューム)の拡張
現在、物理ボリュームには空きはありません。Free PEが0と表示されている事を確認します。
[root@linux010 ~]# pvdisplay --- Physical volume --- PV Name /dev/sde2 VG Name rootvg PV Size <28.73 GiB / not usable 2.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 7354 Free PE 0 Allocated PE 7354 PV UUID pAYVpP-05lu-r3p7-37P2-v01I-Hv02-uaC2z6
以下のような操作で、物理ボリュームを拡張します。
pvresize /dev/sde2
物理ボリュームには空きができた事を確認します。Free PEが0ではない事を確認します。
[root@linux010 ~]# pvdisplay --- Physical volume --- PV Name /dev/sde2 VG Name rootvg PV Size <194.31 GiB / not usable <1.61 MiB Allocatable yes PE Size 4.00 MiB Total PE 49742 Free PE 42388 Allocated PE 7354 PV UUID pAYVpP-05lu-r3p7-37P2-v01I-Hv02-uaC2z6
LV(論理ボリューム)の拡張
以下のような操作で論理ボリュームを拡張します。「-L+150G」は150G拡張するという意味ですので、数字は環境に応じて適宜の変更をお願いします。
lvextend -r -L+150G /dev/mapper/rootvg-rootlv
操作後、「/dev/mapper/rootvg-rootlv」が拡張された事を確認します。
[root@linux010 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 1.8G 17M 1.8G 1% /run tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup /dev/mapper/rootvg-rootlv 169G 3.7G 166G 3% / /dev/mapper/rootvg-crashlv 10G 104M 9.9G 2% /var/crash /dev/sde1 794M 305M 490M 39% /boot /dev/sdb1 200G 1.5G 199G 1% /var/lib/mysql /dev/sde15 495M 5.1M 490M 2% /boot/efi /dev/sda1 7.9G 36M 7.4G 1% /mnt tmpfs 365M 0 365M 0% /run/user/1000
ディスクの取り外し
OSの操作
取り外す対象のディスクをアンマウントします。
umount /var/lib/mysql
取り外したディスクを再起動時に誤ってマウントしないように、/etc/fstabを更新します。
sed -i '/var\/lib\/mysql/d' /etc/fstab
Azureの操作
az vm disk detachコマンドでディスクの取り外しができます。
az vm disk detach \ --resource-group MyResourceGroup \ --vm-name linux010 \ --name linux010-disk01