首先,强调一个概念,在线扩容系统盘扩的是容量,不是分区,对云平台来说,分区不可控,容量可控,扩容能产品化,扩展分区需要自己来。
https://cloud.tencent.com/document/product/213/34068#.E6.9F.A5.E7.9C.8B.E5.AE.9E.E4.BE.8B-cloudinit-.E9.85.8D.E7.BD.AE
这篇文档需要修改:
即便cloudbase-init没问题,也需要重启机器cloudbase-init才会自动扩展卷把C分区后面的空白空间加到C分区,前提条件是C分区和空白空间之间无其他分区干扰。注意:并不会对数据盘起作用。
如果C分区和空白空间之间无其他分区、且不想重启,那就手动执行powershell命令:
$DiskOps="@
select disk 0
select volume c
extend
exit
@"
$DiskOps | diskpart.exe | Out-Null
在线扩容系统盘扩的是容量,扩展分区是文件系统级别的,没法承诺,为什么没法承诺?比如有的客户C分区后面有个隐藏的recovery分区,阻挡在C分区和后面新增的空白空间之间,这种就相对麻烦一些,重启机器后cloudbase-init也处理不了这种,就得评估下是否需要那个隐藏的recovery分区,不需要的话手动删掉,然后再对C分区做扩展卷操作
参考这篇文档描述:https://woshub.com/extend-volume-blocked-by-windows-recovery-partition/
站长素材网改进点:文档写得不细致,细节没有描述到位
另外,有时候cloudbase-init有问题,重启了也不一定实现扩展卷,比如禁止了cloudbase-init服务开机启动或者安装了第三方安全软件影响了cloudbase-init的功能(我自己有台2008R2就是这样,安装了360杀毒和360安全卫士,影响了重启机器后cloudbase-init自动扩展卷)。
要么手动扩展卷,要么执行命令扩展卷,相对保险一些(都是人为)。
总有各种特殊情况,人为check是必要的。
命令扩展卷的好处就是可以通过WinRM批量操作,可参考我这篇文档https://cloud.tencent.com/developer/article/1907025
批量扩展卷的具体实现,我这里录了个视频方便大家参考(录屏里的密码已改、机器已销毁):https://cloud.tencent.com/developer/video/76337
下面先图文说下过程:
对多台机器扩容系统盘大小,完事后就可以给多台机器下发扩展卷的指令了。
https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=ResizeInstanceDisks
ResizeDisk接口目前是扩容弹性云盘的(所谓弹性,就是可以从cvm上解绑下来的云盘),系统盘因为无法解绑,所以此接口不适用扩容系统盘。
ResizeInstanceDisks接口目前是扩容非弹性云盘的,包括云系统盘(早年一些云盘机器,数据盘跟cvm一起买的,是无法解绑的,叫做非弹性云盘;当然,云系统盘自然是非弹性云盘)。
上图圈出的地方,文档开头那里描述错误,ResizeInstanceDisk接口是支持扩容云系统盘和非弹性云数据盘的。
接口只能一台一台操作,api explorer操作的话只需要选定地域后指定3个参数(cvm实例id、系统盘目标大小、在线扩容)
当然,如果写代码的话,搞个简单的循环,就可以实现多台机器的操作(如果系统盘目标大小一样,地域一样,只是调系统盘大小,意味着每次只需要换cvm intanceid,也就是说搞个记录cvm intanceid的数组,每次传数组的一个值来调用接口即可)
在线扩容一般没有风险,可以先拿一台机器做个验证(注意提交扩容后等一会儿,然后重新扫描磁盘才会看到C分区后面的空间,一些高版本系统可能会自动刷出来,无需重新扫描磁盘,但最好操作一下)
在多个实例全部扩容系统盘后,就可以批量扩展卷实现多台机器自动扩容C分区了
找一台机器做客户端下发命令,用的是Windows自己的WinRM,端口是5985
首先,在客户端上执行netstat -ato|findstr :5985看下端口在不在,不在的话执行如下代码:
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM" /f 2>&1 >$null
winrm quickconfig -q 2>&1 > $null
winrm quickconfig -q -force 2>&1 > $null
restart-service winrm 2>&1 > $null
#Set-Item WSMan:localhost\client\trustedhosts -value * -force 2>&1 > $null
winrm set winrm/config/client '@{TrustedHosts="*"}' 2>&1 > $null
netstat -ato|findstr :5985
$Username = 'Administrator'
$Password = '密码'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
#多台机器的内网ip
$iparray = @('172.16.4.4','172.16.4.14','172.16.4.2','172.16.4.5','172.16.4.12')
#循环下发扩展卷的命令
for($i=0;$i -lt $iparray.Length;$i++){
"`$iparray["+$i+"]="+$iparray[$i]+"`n"
#扩展卷的代码
Invoke-Command -ComputerName $iparray[$i] -Credential $Cred -ScriptBlock {
$DiskOps="@
select disk 0
select volume c
extend
exit
@";
$DiskOps | diskpart.exe | Out-Null;
}
}
注意:cloudbase-init的extend_volume只是针对系统盘的。前面介绍的都是扩展系统盘C分区,如果是扩展数据盘的最后一个分区,可以参考我这篇文档:https://cloud.tencent.com/developer/article/1885062