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

将磁盘添加到 Linux VM

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

本文介绍了如何将持久性磁盘附加到 VM 以便持久保存数据 - 即使 VM 由于维护或调整大小而重新预配。

将新磁盘附加到 VM

如果只需要在 VM 上添加新的空数据磁盘,请使用 az vm disk attach 命令以及 --new 参数。 如果 VM 位于某个可用性区域中,则会自动在与 VM 相同的区域中创建磁盘。 有关详细信息,请参阅可用性区域概述。 以下示例创建一个名为“myDataDisk”且大小为 50 GB 的磁盘:

az vm disk attach \
   -g myResourceGroup \
   --vm-name myVM \
   --name myDataDisk \
   --new \
   --size-gb 50

降低延迟

在选定区域中,磁盘附加延迟已减少,因此你将看到高达 15% 的改进。 如果你在 VM 之间进行了计划内/计划外故障转移、正在缩放工作负载或正在运行大规模有状态工作负载(例如 Azure Kubernetes 服务),这将非常有用。 但是,此改进仅限于显式磁盘附加命令 az vm disk attach。 如果调用可能隐式执行附加的命令(例如 az vm update),则看不到性能改进。 无需执行除调用显式附加命令以外的任何操作即可查看此改进。

每个公共区域目前都提供较低的延迟,但以下各项除外:

  • 加拿大中部
  • 美国中部
  • 美国东部
  • 美国东部 2
  • 美国中南部
  • 美国西部 2
  • 德国北部
  • Jio 印度西部
  • 北欧
  • 西欧

附加现有磁盘

若要附加现有磁盘,请查找磁盘 ID 并将该 ID 传递到 az vm disk attach 命令。 以下示例查询 myResourceGroup 中名为 myDataDisk 的磁盘,然后将其附加到名为 myVM 的 VM:

diskId=$(az disk show -g myResourceGroup -n myDataDisk --query 'id' -o tsv)

az vm disk attach -g myResourceGroup --vm-name myVM --name $diskId

格式化磁盘和装载磁盘

若要对新磁盘进行分区、格式化和装载,以便 Linux VM 可以使用它,请通过 SSH 登录到 VM。 有关详细信息,请参阅如何在 Azure 中将 SSH 用于 Linux。 以下示例使用用户名“azureuser”连接到使用公共 IP 地址 10.123.123.25 的 VM :

ssh azureuser@10.123.123.25

找到磁盘

连接到 VM 后,找到磁盘。 在此示例中,我们使用 lsblk 来列出磁盘。

lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

输出类似于以下示例:

sda     0:0:0:0      30G
├─sda1             29.9G /
├─sda14               4M
└─sda15             106M /boot/efi
sdb     1:0:1:0      14G
└─sdb1               14G /mnt
sdc     3:0:0:0      50G

这里的 sdc 是我们所需的磁盘,因为它是 50G。 如果添加多个磁盘,但只根据大小无法确定是哪块磁盘,可转到门户中的 VM 页面,选择“磁盘”,然后在“数据磁盘”下检查磁盘的 LUN 编号。 将门户中的 LUN 编号与输出的 HTCL 部分的最后一个数字(也就是 LUN)进行比较。 另一个选项是列出 /dev/disk/azure/scsi1 目录的内容:

ls -l /dev/disk/azure/scsi1

输出应如以下示例所示:

lrwxrwxrwx 1 root root 12 Mar 28 19:41 lun0 -> ../../../sdc

格式化磁盘

请使用 parted 对磁盘进行格式化,如果磁盘大小大于等于 2TiB,必须使用 GPT 分区,如果小于 2TiB,则可以使用 MBR 或 GPT 分区。

注意

建议使用适用于你的发行版的最新版 parted。 如果磁盘大于或等于 2 TiB,必须使用 GPT 分区。 如果磁盘小于 2 TiB,则可以使用 MBR 或 GPT 分区。

以下示例在 /dev/sdc 上使用 parted,那里是大多数 VM 上第一块数据磁盘通常所在的位置。 将 sdc 替换为磁盘的正确选项。 我们还使用 XFS 文件系统对其进行格式设置。

sudo parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%
sudo partprobe /dev/sdc
sudo mkfs.xfs /dev/sdc1

请使用 partprobe 实用程序以确保内核知晓新分区和文件系统。 若无法使用 partprobe,则可能导致 blkid 或 lsblk 命令不立即返回新文件系统的 UUID。

装载磁盘

现在,使用 mkdir 创建一个目录来装载文件系统。 以下示例在 /datadrive 处创建一个目录:

sudo mkdir /datadrive

然后,使用 mount 来装载文件系统。 以下示例将 /dev/sdc1 分区装载到 /datadrive 装入点:

sudo mount /dev/sdc1 /datadrive

持久保留装载

若要确保在重新引导后自动重新装载驱动器,必须将其添加到 /etc/fstab 文件。 此外,强烈建议在 /etc/fstab 中使用 UUID(全局唯一标识符)来引用驱动器而不是只使用设备名称(例如 /dev/sdc1)。 如果 OS 在启动过程中检测到磁盘错误,使用 UUID 可以避免将错误的磁盘装载到给定位置。 然后为剩余的数据磁盘分配这些设备 ID。 若要查找新驱动器的 UUID,请使用 blkid 实用工具:

sudo blkid

输出与以下示例类似:

/dev/sda1: LABEL="cloudimg-rootfs" UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4" PARTUUID="1a1b1c1d-11aa-1234-1a1a1a1a1a1a"
/dev/sda15: LABEL="UEFI" UUID="BCD7-96A6" TYPE="vfat" PARTUUID="1e1g1cg1h-11aa-1234-1u1u1a1a1u1u"
/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4" TYPE="ext4" PARTUUID="1a2b3c4d-01"
/dev/sda14: PARTUUID="2e2g2cg2h-11aa-1234-1u1u1a1a1u1u"
/dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="xfs" PARTLABEL="xfspart" PARTUUID="c1c2c3c4-1234-cdef-asdf3456ghjk"

注意

错误地编辑 /etc/fstab 文件可能会导致系统无法引导。 如果没有把握,请参考分发的文档来获取有关如何正确编辑该文件的信息。 另外,建议在编辑之前创建 /etc/fstab 文件的备份。

接下来,在文本编辑器中打开 /etc/fstab 文件。 使用在前面的步骤中创建的 /dev/sdc1 设备的 UUID 值和 /datadrive 装入点,在文件末尾添加一行。 使用本文中的示例,新行将如下所示:

UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,nofail   1   2

完成文件编辑后,保存并关闭编辑器。

或者,可以运行以下命令,将磁盘添加到 /etc/fstab 文件:

echo "UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,nofail   1   2" >> /etc/fstab

注意

之后,在不编辑 fstab 的情况下删除数据磁盘可能会导致 VM 无法启动。 大多数分发版都提供 nofail 和/或 nobootwait fstab 选项。 这些选项使系统在磁盘无法装载的情况下也能启动。 有关这些参数的详细信息,请查阅分发文档。

即使文件系统已损坏或磁盘在引导时不存在, nofail 选项也能确保 VM 启动。 如果不使用此选项,可能会遇到 Cannot SSH to Linux VM due to FSTAB errors

如果修改 fstab 导致启动失败,可以使用 Azure VM 串行控制台对 VM 进行控制台访问。 有关更多详细信息,请参阅串行控制台文档

Azure 中对 Linux 的 TRIM/UNMAP 支持

某些 Linux 内核支持 TRIM/UNMAP 操作以放弃磁盘上未使用的块。 此功能主要用于通知 Azure 已删除的页不再有效,可以丢弃。 此功能可以节省根据消耗的存储量(例如非托管标准磁盘和磁盘快照)计费的磁盘的费用。

在 Linux VM 中有两种方法可以启用 TRIM 支持。 与往常一样,有关建议的方法,请参阅分发:

  • /etc/fstab 中使用 discard 装载选项,例如:

    UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,discard   1   2
    
  • 在某些情况下,discard 选项可能会影响性能。 此处,还可以从命令行手动运行 fstrim 命令,或将其添加到 crontab 以定期运行:

sudo apt install util-linux
sudo fstrim /datadrive

故障排除

将数据磁盘添加到 Linux VM 时,如果 LUN 0 位置没有磁盘,则你可能会遇到错误。 如果使用 az vm disk attach -new 命令并指定 LUN (--lun) 来手动添加磁盘,而不是让 Azure 平台确定适当的 LUN,则请注意,LUN 0 已经有磁盘或者将有磁盘。

请考虑以下示例,其中显示了 lsscsi 输出的代码片段:

[5:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sdc 
[5:0:0:1]    disk    Msft     Virtual Disk     1.0   /dev/sdd 

两个数据磁盘位于 LUN 0 和 LUN 1(lsscsi 中的第一列输出了详细信息 [host:channel:target:lun])。 两个磁盘都应该可从 VM 内部访问。 如果手动指定了要在 LUN 1 位置添加第一个磁盘并在 LUN 2 位置添加第二个磁盘,则可能无法从 VM 内部正常查看这些磁盘。

注意

在这些示例中,Azure host 值为 5,但此值可能根据所选存储类型的不同而异。

此磁盘行为不是 Azure 的问题,而是因为 Linux 内核遵循了 SCSI 规范。 当 Linux 内核在 SCSI 总线中扫描附加的设备时,必须能够在 LUN 0 位置找到设备,系统才能继续扫描是否有其他设备。 因此:

  • 在添加数据磁盘之后,请查看 lsscsi 的输出,验证 LUN 0 位置是否有磁盘。
  • 如果磁盘未在 VM 内正确显示,请验证 LUN 0 位置是否有磁盘。

后续步骤