更新时间:2022-04-27 09:03:19
默认情况下创建的 ECS 实例只有一个40G 的高效云盘系统盘,通过任何形式(控制台、ECS SDK 等) 方式创建的实例,如果需要使用数据盘,必须先进行额外的格式化数据盘工作。
如果需要批量创建大量的有特定格式化需求数据盘的 ECS 实例,那么单独为每一台实例格式化数据盘肯定是一件浪费运维资源的工作。所以,这里介绍一种比较简单的 ECS 实例数据盘自动挂载和格式化的方式,也许有更好的方法,请各位大神拍砖。
阿里云 ECS 实例对数据盘的使用,由于涉及到用户自己的业务逻辑,对盘的数目、分区方式、文件系统要求等都不尽相同,所以 ECS 服务提供了自主的方式,将数据盘的格式化工作全部交托给用户自行处理,这样就导致了用户需要进行一步的运维工作,才能对数据盘进行正常的使用。如果用户需要创建批量的实例,那么对这些实例分别进行数据盘的初始化操作必然会成为运维中的一项额外的工作。
以 Linux 系统为例,主要的步骤如下:
如果是新购买的数据盘,那么需要先挂载数据盘。如果是和实例一同购买的数据盘,那么可以直接进行数据盘的格式化即可。
我们知道,ECS 提供了自定义镜像的功能,用户可以从现有的实例构建镜像,此后就可以使用该镜像作为新的实例创建的模板,"克隆"业务所需的实例了。那么数据盘的格式化信息是否也能被"录制"到镜像中呢?当然可以。
这里以 Linux 系统(实例基础镜像为 linux_17_01_64_20G_cloudinit_20171222.vhd),挂载 SSD 云盘,创建一个单分区,并挂载文件系统为例。使用 ECS 的 SDK 进行相关的操作。
首先,通过 CreateInstance 创建一个 ECS 实例,注意,创建参数中 DataDisk 参数的内容:
type DataDiskType struct {
Size int
Category DiskCategory //Enum cloud, ephemeral, ephemeral_ssd
SnapshotId string
DiskName string
Description string
Device string
DeleteWithInstance bool
}
在创建时,DataDisk 参数中只有一块 DataDiskType 类型,我们选择使用默认的 Device 。此时创建出来的实例,带有一块数据盘,但是未格式化。如果登录机器,通过 fdisk -l 可以看到对应的数据盘的信息以及挂载点。但是文件系统中是没有任何该数据盘的信息的。
接下来就是自定义机器的业务逻辑,比如,需要如何配置系统、安装什么软件等等,可以通过 SSH Client 相关工具对机器进行自动化操作。比如数据盘格式化的操作,可以生成这样的 shell 文件,通过 SSH Client 拷贝到实例机器上,然后执行就可以了。
set -e
setup_disk() {
tee ./command <<-EOF
n
p
1
w
p
EOF
fdisk -u /dev/vdb < ./command
mkfs.ext4 /dev/vdb1
echo /dev/vdb1 /your_dir ext4 defaults 0 0 >> /etc/fstab
mkdir -p /your_dir
mount /dev/vdb1 /your_dir
}
setup_disk
执行完成之后,你可以看到系统信息已经发生变化:
当然,为了验证磁盘格式化信息正确持久化,你可以对这个实例重启,然后再进行相关的 check,check 逻辑可以简单如下:
set -e
df -h|grep '/your_dir'|grep '/dev/vdb1'
fdisk -l|tail -1|grep '/dev/vdb1'
最后,通过 CreateImage 构建镜像即可。
通过上面的步骤,你应该已经制作了一个带有数据盘格式化信息的镜像了,那么这时你需要通过这个镜像来创建你需要的实例。创建实例的过程和一开始通过 CreateInstance 相同,但是有一些坑需要注意:
这个值和虚拟化的类型相关,所以,请以 DescribeImages 的结果为准。
一个简单的数据盘格式化模板构建方式,小总结一下~~谢谢拍砖。