如何使用cloud init在azure中的ubuntu VM上加载数据磁盘

如何使用cloud init在azure中的ubuntu VM上加载数据磁盘,azure,cloud-init,Azure,Cloud Init,我一直在尝试使用cloud init在azure的Ubuntu虚拟机上分区和装载数据磁盘。大多数联机示例都显示了如何对临时磁盘执行此操作,但对数据磁盘则没有。我试着随便玩玩,但运气不好。请让我知道我是否在下面的代码中做了错误的事情,或者如果不能用cloud init来做 #cloud-config device_aliases: {'ephemeral0': '/dev/sdb','datadisk': '/dev/sdc1'} disk_setup: ephemeral0:

我一直在尝试使用cloud init在azure的Ubuntu虚拟机上分区和装载数据磁盘。大多数联机示例都显示了如何对临时磁盘执行此操作,但对数据磁盘则没有。我试着随便玩玩,但运气不好。请让我知道我是否在下面的代码中做了错误的事情,或者如果不能用cloud init来做

#cloud-config
device_aliases: {'ephemeral0': '/dev/sdb','datadisk': '/dev/sdc1'}

disk_setup:
    ephemeral0:
         table_type: mbr
         layout: True
         overwrite: False
    /dev/sdc1:
         table_type: mbr
         layout: True
         overwrite: False

fs_setup:
    - label: ephemeral0
      filesystem: ext4
      device: ephemeral0.1
      replace_fs: ntfs
    - cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s
      label: '/dev/sdc1/'
      filesystem: ext4
      device: '/dev/sdc1/'
      replace_fs: ntfs

mounts:
    - ["ephemeral0.1", "/mnt"]
    - ["/dev/sdc1/", "/datadisk"]
我同意——这种常见情况的例子不多。我认为您在上面遇到的部分问题是,在disk\u设置中引用的是分区而不是磁盘

在Azure中,连接到VM的第一个数据磁盘通常被标识为
/dev/sdc
,第二个数据磁盘将被标识为
/dev/sdd
,依此类推。然而,这并不能保证。文档表明,在某些情况下,可能会分配不同的驱动器号。因此,我们将使用内置别名引用磁盘。保证始终使用ARM模板(或磁盘定义)中分配的LUN映射此别名。这些别名的格式为
/dev/disk/azure/scsi1/lun
(分区别名为
/dev/disk/azure/scsi1/lun 35;-part#

如果您使用的是ARM,模板将在VM定义中包含对驱动器的引用。作为该定义的一部分,您将指定LUN值。您可以在cloud init中引用该赋值。例如,以下ARM代码片段将创建
/dev/disk/azure/scsi1/lun0

"dataDisks": [
{
    "lun": 0,
    "name": "[concat(variables('vmName'),'-datadisk0')]",
    "createOption": "Attach",
    "managedDisk":
    {
        "id": "[resourceId('Microsoft.Compute/disks/', 
                concat(variables('vmName'),'-datadisk0'))]"
    }
},
知道了这一点,我们可以为云配置构建内容。首先,我们定义数据磁盘。我建议使用GPT作为的表类型,以支持大于2TB的磁盘和分区

disk_setup:
    /dev/disk/azure/scsi1/lun0:
        table_type: gpt
        layout: True
        overwrite: True
接下来,我们指定磁盘的文件系统设置。我们引用每个分区并声明要使用的文件系统

fs_setup:
    - device: /dev/disk/azure/scsi1/lun0
      partition: 1
      filesystem: ext4
最后,我们装载分区。cloud init使用的进程将创建文件夹并装载指定的分区。我使用的是推荐的
nofail
(确保VM在出现问题或驱动器分离时可以启动)以及
noexec
(防止在该分区上执行二进制文件)。由于我们已将文件系统放置在lun0的第一个分区上,因此需要装载
lun0-part1

mounts:
    - ["/dev/disk/azure/scsi1/lun0-part1", "/datadisk", auto, "defaults,noexec,nofail"]

谢谢,写得很好。你有类似的关于安装Azure文件系统而不是磁盘的记录吗?让我知道如果你想让我发布一个关于它的问题,我会投迪福的票:)写得很棒!你知道如果我重新部署了虚拟机,并且数据磁盘已经有了分区,这将如何工作吗?我使用Terraform,有时我们会为了一个干净的构建测试而破坏服务器,但我们希望保留数据磁盘。