你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

扩展 Linux VM 上的虚拟硬盘

适用于:✔️ Linux VM ✔️ 灵活规模集

本文介绍如何扩展 Linux 虚拟机(VM)的作系统(OS)磁盘和数据磁盘。 可以 添加数据磁盘 以提供更多的存储空间,还可以扩展现有数据磁盘。 OS 的默认虚拟硬盘大小通常在 Azure 中的 Linux VM 上为 30 GB。 本文介绍如何扩展 OS 磁盘或数据磁盘。 无法扩展条带卷的大小。

OS 磁盘的最大容量为 4,095 GiB。 但许多操作系统默认使用主启动记录 (MBR) 进行分区。 MBR 将可用大小限制为 2 TiB。 如果需要 2 TiB 以上,请考虑为数据存储附加数据磁盘。 如果需要将数据存储在 OS 磁盘上,并且需要额外的空间,请将其转换为 GUID 分区表(GPT)。

警告

始终确保文件系统处于正常状态,磁盘分区表类型(GPT 或 MBR)可以支持新大小。 在执行磁盘扩展作之前备份数据。 有关详细信息,请参阅 Azure 备份快速入门

在操作系统中识别 Azure 数据磁盘对象

在虚拟机上,当你扩展一个存在多个数据磁盘的数据磁盘时,可能会难以将 Azure 逻辑单元号 (LUN) 与 Linux 设备对应起来。 如果 OS 磁盘需要扩展,则会在 Azure 门户中将其明确标记为 OS 磁盘。

首先使用 df 命令识别磁盘利用率、装载点和设备之间的关系。

df -Th
Filesystem                Type      Size  Used Avail Use% Mounted on
/dev/sda1                 xfs        97G  1.8G   95G   2% /
<truncated>
/dev/sdd1                 ext4       32G   30G  727M  98% /opt/db/data
/dev/sde1                 ext4       32G   49M   30G   1% /opt/db/log

例如,在这里你可以看到,文件系统 /opt/db/data 几乎已满,并且位于 /dev/sdd1 分区上。 df 的输出将显示设备路径,无论磁盘是使用设备路径还是 fstab 中的 UUID(首选)装载的。 请注意“类型”列,该列指示文件系统格式。 格式会在后面会有重要影响。

现在,请通过检查 /dev/sdd 的内容找到与 /dev/disk/azure/scsi1 关联的 LUN。 以下命令 ls 的输出显示,当您在 Azure 门户中查看时,Linux 操作系统中名为 /dev/sdd 的设备位于 LUN1

sudo ls -alF /dev/disk/azure/scsi1/
total 0
drwxr-xr-x. 2 root root 140 Sep  9 21:54 ./
drwxr-xr-x. 4 root root  80 Sep  9 21:48 ../
lrwxrwxrwx. 1 root root  12 Sep  9 21:48 lun0 -> ../../../sdc
lrwxrwxrwx. 1 root root  12 Sep  9 21:48 lun1 -> ../../../sdd
lrwxrwxrwx. 1 root root  13 Sep  9 21:48 lun1-part1 -> ../../../sdd1
lrwxrwxrwx. 1 root root  12 Sep  9 21:54 lun2 -> ../../../sde
lrwxrwxrwx. 1 root root  13 Sep  9 21:54 lun2-part1 -> ../../../sde1

扩展 Azure 托管磁盘

在不停机的情况下扩展

你可以在不解除分配虚拟机的情况下扩展托管磁盘。 磁盘的主机缓存设置不会更改你是否可以在不解除分配虚拟机的情况下扩展数据磁盘。

此功能存在以下限制。

重要

此限制不适用于高级 SSD v2 或超级磁盘。

如果标准 HDD、标准 SSD 或高级 SSD 磁盘为 4 TiB 或更少,请解除分配 VM 并分离磁盘,然后再将其扩展到 4 TiB 以上。 如果上述某个磁盘类型已经大于 4 TiB,则可以在不解除分配 VM 和拆离磁盘的情况下对其进行扩展。

使用超级磁盘和高级 SSD v2 进行扩展

在不停机的情况下扩展 Ultra Disks 和高级 SSD v2 磁盘还存在以下其他限制:

  • 当该磁盘上同时正在进行后台数据复制时,无法扩展该磁盘。 一个示例是当磁盘正在从快照回填数据时。
  • 可以使用具有超级磁盘或高级 SSD v2 磁盘的 NVMe 控制器来扩展 VM,而无需在此公共预览版中停机。 由于此版本是公共预览版,因此应仅使用它来测试在不停机的情况下扩展的功能。 不要在生产环境中扩展 VM。

在以下区域中,你可以在不停机的情况下扩展使用 NVMe 控制器且搭配 Ultra Disks 或高级 SSD v2 磁盘的虚拟机。 使用 Azure 门户、Azure CLI 或 Azure PowerShell 模块:

  • 东南亚
  • 巴西南部
  • 加拿大中部
  • 德国中西部
  • 印度中部(V6 VM 目前不支持)

在以下区域中,你可以在不停机的情况下扩展使用 NVMe 控制器且搭配 Ultra Disks 或高级 SSD v2 磁盘的虚拟机。 仅使用 Azure CLI 或 Azure PowerShell 模块。 目前无法使用 Azure 门户:

  • 东亚
  • 美国中西部(V6 VM 目前不支持)

预计最多 10 分钟后就会在 Windows VM 和 Linux VM 中反映正确的大小。 对于 Linux VM,必须执行 Linux rescan 函数。 对于没有工作负荷的 Windows VM,必须执行 Windows 重新扫描功能。 可以立即重新扫描,但如果时间在 10 分钟内,可能需要再次重新扫描以显示正确的大小。

扩展 Azure 托管磁盘

确保已安装了最新的 Azure CLI 并已使用 az login 登录到 Azure 帐户。

本文需要 Azure 中的现有 VM 已附加至少一个数据磁盘并且该磁盘已准备就绪。 如果尚无可用的虚拟机,请参阅使用数据磁盘创建和准备虚拟机

在以下示例中,将占位符参数名称(如 myResourceGroupmyVM )替换为自己的值。

重要

如果磁盘满足 Expand 中的要求 而不停机,则可以跳过步骤 1 和步骤 3。

不支持收缩现有磁盘,可能会导致数据丢失。

扩展磁盘后,在操作系统中扩展卷以利用更大的磁盘。

  1. 当 VM 正在运行时,无法在虚拟硬盘上执行操作。 使用 az vm deallocate 解除分配 VM。 以下示例在名为 myResourceGroup 的资源组中解除分配名为 myVM 的 VM:

    az vm deallocate --resource-group myResourceGroup --name myVM
    

    只有释放 VM 才能扩展虚拟硬盘。 使用 az vm stop 停止虚拟机不会释放计算资源。 若要释放计算资源,请使用 az vm deallocate

  2. 使用 az disk list 查看资源组中的托管磁盘列表。 以下示例显示了名为 myResourceGroup 的资源组中的托管磁盘列表:

    az disk list \
        --resource-group myResourceGroup  \
        --query '[*].{Name:name,size:diskSizeGB,Tier:sku.tier}' \
        --output table
    

    使用 az disk update 扩展所需磁盘。 以下示例将名为 myDataDisk 的托管磁盘扩展为 200 GB:

    az disk update \
        --resource-group myResourceGroup \
        --name myDataDisk \
        --size-gb 200
    

    扩展托管磁盘时,更新的大小将向上舍入到最接近的托管磁盘大小。

  3. 使用 az vm start 启动 VM。 以下示例在名为 myResourceGroup 的资源组中启动名为 myVM 的 VM:

    az vm start --resource-group myResourceGroup --name myVM
    

扩展磁盘分区和文件系统

可以使用许多工具来执行分区大小调整。 本文其余部分详述的工具与某些自动化流程使用的相同工具,例如 cloud-init。 如此处所述, growpart 包中的 gdisk 工具提供与 GPT 磁盘的通用兼容性,因为某些工具的较旧版本(如 fdisk 不支持 GPT)。

检测更改的磁盘大小

如果使用上述过程在不停机的情况下扩展数据磁盘,则在重新扫描设备之前,报告磁盘大小不会更改。 仅在启动过程中才会重新扫描。 若要按需调用此重新扫描,请使用以下过程。 使用本文中的方法时,请注意,在此示例中,数据磁盘当前为 /dev/sda,已从 256 GiB 调整为 512 GiB。

  1. 确定 fdisk -l /dev/sda 输出的第一行上当前已识别的大小:

    sudo fdisk -l /dev/sda
    
    Disk /dev/sda: 256 GiB, 274877906944 bytes, 536870912 sectors
    Disk model: Virtual Disk
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: dos
    Disk identifier: 0x43d10aad
    
    Device     Boot Start       End   Sectors  Size Id Type
    /dev/sda1        2048 536870878 536868831  256G 83 Linux
    
  2. 1 字符插入到此设备的重新扫描文件中。 请注意示例中对 sda 的引用。 如果重设了不同磁盘设备的大小,则磁盘标识符会发生变化。

    echo 1 | sudo tee /sys/class/block/sda/device/rescan
    
  3. 验证是否已识别新的磁盘大小。

    sudo fdisk -l /dev/sda
    
    Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors
    Disk model: Virtual Disk
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: dos
    Disk identifier: 0x43d10aad
    
    Device     Boot Start       End   Sectors  Size Id Type
    /dev/sda1        2048 536870878 536868831  256G 83 Linux
    

本文的剩余部分以操作系统磁盘为例,讲述在操作系统级别增加卷大小的过程。 如果扩展的磁盘是数据磁盘,请使用 前面的指南来标识数据磁盘设备。 请将这些说明作为指导方针。 根据需要替换数据磁盘设备(例如 /dev/sda),分区号、卷名称、装入点和文件系统格式。

请将所有 Linux OS 指南视为通用指南,它可能适用于任何发行版,但通常与指定的市场发布者的约定相符。 有关基于 Red Hat 的任何分发或声明 Red Hat 兼容性的包要求,请参阅 Red Hat 文档。

增加 OS 磁盘的大小

以下说明适用于认可的 Linux 发行版。

在继续之前,请创建 VM 的完整备份副本,或者至少创建 OS 磁盘的快照。

在 Ubuntu 16.x 及更新版本上,OS 磁盘和文件系统的根分区会自动展开,以便通过 cloud-init 使用根磁盘上的所有可用连续空间。 必须有少量可用空间才能进行重设大小操作。 在这种情况下,序列是:

  1. 如前所述增加 OS 磁盘的大小。
  2. 重启 VM,然后使用 用户帐户访问 VM。
  3. 验证 OS 磁盘现在是否显示增加的文件系统大小。

如以下示例所示,操作系统磁盘已在门户中调整为 100 GB。 现在装载在/上的/dev/sda1文件系统显示为 97 GB。

df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  314M     0  314M   0% /dev
tmpfs          tmpfs      65M  2.3M   63M   4% /run
/dev/sda1      ext4       97G  1.8G   95G   2% /
tmpfs          tmpfs     324M     0  324M   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     324M     0  324M   0% /sys/fs/cgroup
/dev/sda15     vfat      105M  3.6M  101M   4% /boot/efi
/dev/sdb1      ext4       20G   44M   19G   1% /mnt
tmpfs          tmpfs      65M     0   65M   0% /run/user/1000
user@ubuntu:~#

在不中断服务的情况下扩展经典 VM SKU 的支持

如果使用经典 VM SKU,可能不支持在不停机的情况下扩展磁盘。

使用以下 PowerShell 脚本确定其可用的 VM SKU:

Connect-AzAccount
$subscriptionId="yourSubID"
$location="desiredRegion"
Set-AzContext -Subscription $subscriptionId
$vmSizes=Get-AzComputeResourceSku -Location $location | where{$_.ResourceType -eq 'virtualMachines'}

foreach($vmSize in $vmSizes){
    foreach($capability in $vmSize.Capabilities)
    {
       if(($capability.Name -eq "EphemeralOSDiskSupported" -and $capability.Value -eq "True") -or ($capability.Name -eq "PremiumIO" -and $capability.Value -eq "True") -or ($capability.Name -eq "HyperVGenerations" -and $capability.Value -match "V2"))
        {
            $vmSize.Name
       }
   }
}