购买cvm时一并加购的数据盘勾选初始化实际就是调用的userdata实现的,现在有些情况勾选了,但数据盘初始化完成不了,我系统分析了下,其中一个原因就是userdata所用的powershell代码里有中文。
多次测试,黄色标记的那几个镜像勾选快速初始化数据盘的按钮买的机器能稳定地复现不能初始化数据盘的情况
我debug了购买cvm时勾选初始化数据盘后自动生成的userdata代码,已经定位问题,黄色标记的8个镜像不能自动初始化数据盘,分3种情况
①2008R2~2022五个中文版,推测是cloudbase-init不支持中文 ,判断匹配不上,导致获取不到磁盘号,从而导致在初始化盘时失败
②2022英文版、2022safe英文版
因为2022镜像系统盘有3个分区(2022之外的其他镜像都是2个分区),英文版正好能匹配前半部分所以正好进入循环,最终TotalVolume=3 正好命中下面≥3的逻辑,这个逻辑认为不上新实例不予初始化,直接exit代码
③2008R2 safe英文版
这个比较特殊,不行是因为磁盘只读,在执行分区命令之前需要处理磁盘只读,而代码里缺少处理只读的逻辑
正确的diskpart这句命令必不可少
attr disk clear readonly NOERR
另外就是默认的簇(unit或者叫cluster)4096有16T的局限,腾讯云数据盘最大32T,考虑在内的话,unit至少应该设置8192
8192是为了保证持续扩容能用到腾讯云最大32T
阿里云同样有初始化数据盘的功能,但也很low。下图是我在阿里云的测试。阿里云默认不管多大盘都是按mbr初始化,超过2T的盘按MBR分区就只能到2T,这肯定没法参考。但阿里云至少都能完成初始化,这点比腾讯云好点。
腾讯云购买界面初始化数据盘我写了个比较健壮的代码(因为是串行来搞的,盘比较大、比较多的情况下,初始化比较慢,要多等一会儿才行,比如购买机器后过5分钟再看效果)。
我下面这个txt里是2段userdata 的对比,绿色圈出的是我自己写的,测试满足腾讯云所有Windows公共镜像,红色那个是腾讯云自动生成的,测试在上面说的8种Windows镜像上不行。