格式化和装载托管磁盘

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

本文介绍如何在 Azure Linux 虚拟机(VM)上格式化、装载和保存托管磁盘。 托管磁盘是附加到 VM 的永久性存储,可以使用 SCSI 或 NVMe 接口,具体取决于 VM 大小。

先决条件

在格式化和装载数据磁盘之前,请确保:

警告

在设置格式之前,请始终验证你是否正在使用正确的磁盘。 格式化错误的磁盘可能会导致数据丢失。

格式化磁盘

使用适用于您的发行版的最新版本的 parted。 如果磁盘大小为 2 TB(TiB)或更大,请使用 GPT 分区。 如果磁盘大小低于 2 TiB,则可以使用 MBR 或 GPT 分区。

确定正确的磁盘(例如, /dev/nvme0n2 数据磁盘)后,可以设置其格式:

以下示例使用 parted/dev/sdc,其中第一个数据磁盘通常位于大多数 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,则blkidlsblk命令不会立即返回新文件系统的 UUID。

装载磁盘

现在,创建一个目录来挂载文件系统 mkdir。 以下示例在以下位置创建目录 /datadrive

sudo mkdir /datadrive

然后,使用mount装载文件系统。 以下示例将 /dev/sdc1 (for SCSI) 或 /dev/nvme0n2p1 (for NVMe) 分区装载到 /datadrive 装入点:

# Mount the disk identified earlier (replace sdc1 with your identified disk's partition)
sudo mount /dev/sdc1 /datadrive

还可以使用 Azure 设备路径:

sudo mount /dev/disk/azure/scsi1/lun0-part1 /datadrive

保持挂载

若要确保在重新启动后自动重新装载驱动器,请将其添加到 /etc/fstab 文件。

强烈建议使用 /etc/fstab UUID(通用唯一标识符)来引用驱动器,而不是设备路径(如 /dev/sdc1)。 设备路径不会持久且在重新启动时发生更改。 若要查找新驱动器的 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 文本编辑器中打开该文件。 使用前面步骤中创建的磁盘的 UUID 值和装入点 /datadrive,将一行添加到文件的末尾。 使用本文中的示例,新行如下所示:

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

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

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

# For SCSI disks
UUID=$(sudo blkid -s UUID -o value /dev/sdc1)
echo "UUID=$UUID   /datadrive   xfs   defaults,nofail   1   2" | sudo tee -a /etc/fstab

# For NVMe disks
UID=$(sudo blkid -s UUID -o value /dev/nvme1n1p1)
echo "UUID=$UUID   /datadrive   xfs   defaults,nofail   1   2" | sudo tee -a /etc/fstab

注释

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

nofail 选项可确保即使文件系统已损坏或磁盘在启动时不存在,VM 也会启动。 如果没有此选项,可能会遇到由于 FSTAB 错误而无法通过 SSH 连接到 Linux VM 的行为

如果修改 fstab 会导致启动失败,则 Azure VM 串行控制台可用于对 VM 的控制台访问。 串行控制台文档中提供了更多详细信息。

在 Azure 中对 Linux 的 TRIM/UNMAP 支持

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

在 Linux VM 中启用 TRIM 支持有两种方法。 像往常一样,请参考您的发行版以了解推荐的方法:

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

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

• 在某些情况下,该 discard 选项可能具有性能影响。 或者,可以从命令行手动运行 fstrim 命令,或将其添加到 crontab 以定期运行:

sudo apt install util-linux
sudo fstrim /datadrive

Troubleshooting

将数据磁盘添加到 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 中是否存在磁盘。