将磁盘添加到 Linux VM
适用于:✔️ Linux VM ✔️ 灵活规模集
本文介绍了如何将持久性磁盘附加到 VM 以便持久保存数据 - 即使 VM 由于维护或调整大小而重新预配。
注意
在可以在由世纪互联运营的 Microsoft Azure 中使用 Azure CLI 之前,请先运行 az cloud set -n AzureChinaCloud
来更改云环境。 若要切换回 Azure 公有云,请再次运行 az cloud set -n AzureCloud
。
将新磁盘附加到 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
),则看不到性能改进。 无需执行除调用显式附加命令以外的任何操作即可查看此改进。
附加现有磁盘
若要附加现有磁盘,请查找磁盘 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
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 以定期运行:
故障排除
将数据磁盘添加到 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 位置是否有磁盘。
后续步骤
- 为确保正确配置 Linux VM,请查看有关优化 Linux 计算机性能的建议。
- 可以添加更多的磁盘来扩展存储容量,并配置 RAID 来提高性能。