首先,强调一个概念,在线扩容系统盘扩的是容量,不是分区,对云平台来说,分区不可控,容量可控,扩容能产品化,扩展分区需要自己来。
这篇文档需要修改:
即便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
下面先图文说下过程:
对多台机器扩容系统盘大小,完事后就可以给多台机器下发扩展卷的指令了。
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
#stop-service mpssvc 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
Set-Item WSMan:localhost\client\trustedhosts -value * -Force
如果上面这段代码配置winrm报错-2147024894 0x80070002就是得装补丁,参考我整理的文档https://cloud.tencent.com/developer/article/2043723
先打全补丁,参考我这篇文档里微软的更新脚本来更新:https://cloud.tencent.com/developer/article/2345790
然后检查注册表,删掉HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WinRM
Registry Path:HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WinRM
powershell:reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM" /f 2>&1 >$null
cmd:reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM" /f 2>&1 >nul
如果上面都操作了,还是无法通过winrm访问,在服务端和客户端
参考https://developer.hashicorp.com/packer/docs/communicators/winrm#examples 启用winrm
#密码换成自己的
#密码换成自己的
#密码换成自己的
net user Administrator "密码"
#适用2008R2/2012R2/2016/2019/2022
sc.exe stop mpssvc 2>&1 >$null
start-sleep 5
sc.exe config mpssvc start= disabled
#reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM" /f 2>&1 >$null
Remove-Item "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM" -Recurse -ErrorAction SilentlyContinue
wmic useraccount where "name='Administrator'" set PasswordExpires=FALSE
Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force -EA 0
#Don't set this before Set-ExecutionPolicy as it throws an error
#$ErrorActionPreference = "stop"
# Remove listener
Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse -EA 0
$OSVersion = [System.Environment]::OSVersion.Version
if (($OSVersion.Major -gt 6) -or ($OSVersion.Major -eq 6 -and $OSVersion.Minor -gt 1)) {
# 如果操作系统版本大于 Windows Server 2008 R2 或 Windows 7,执行以下操作
Write-Host "操作系统版本大于 Windows Server 2008 R2 或 Windows 7"
# 在此处添加您要执行的操作
# Create a self-signed certificate to let ssl work
$Cert = New-SelfSignedCertificate -CertstoreLocation Cert:\LocalMachine\My -DnsName "packer"
New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address * -CertificateThumbPrint $Cert.Thumbprint -Force
} else {
# 如果操作系统版本为 Windows Server 2008 R2 或 Windows 7 或更低版本,执行以下操作
Write-Host "操作系统版本为 Windows Server 2008 R2 或 Windows 7 或更低版本"
# 在此处添加您要执行的操作
#2008R2配winrm http,https暂不支持
}
# WinRM
write-output "Setting up WinRM"
write-host "(host) setting up WinRM"
# Configure WinRM to allow unencrypted communication, and provide the
# self-signed cert to the WinRM listener.
cmd.exe /c winrm quickconfig -q
cmd.exe /c winrm set "winrm/config/service" '@{AllowUnencrypted="true"}'
cmd.exe /c winrm set "winrm/config/client" '@{AllowUnencrypted="true"}'
cmd.exe /c winrm set "winrm/config/service/auth" '@{Basic="true"}'
cmd.exe /c winrm set "winrm/config/client/auth" '@{Basic="true"}'
cmd.exe /c winrm set "winrm/config/service/auth" '@{CredSSP="true"}'
if (($OSVersion.Major -gt 6) -or ($OSVersion.Major -eq 6 -and $OSVersion.Minor -gt 1)) {
# 如果操作系统版本大于 Windows Server 2008 R2 或 Windows 7,执行以下操作
Write-Host "操作系统版本大于 Windows Server 2008 R2 或 Windows 7"
# 在此处添加您要执行的操作
cmd.exe /c winrm set "winrm/config/listener?Address=*+Transport=HTTPS" "@{Port=`"5986`";Hostname=`"packer`";CertificateThumbprint=`"$($Cert.Thumbprint)`"}"
#Make sure appropriate firewall port openings exist
#cmd.exe /c netsh advfirewall firewall set rule group="remote administration" new enable=yes
#cmd.exe /c netsh firewall add portopening TCP 5986 "Port 5986"
} else {
# 如果操作系统版本为 Windows Server 2008 R2 或 Windows 7 或更低版本,执行以下操作
Write-Host "操作系统版本为 Windows Server 2008 R2 或 Windows 7 或更低版本"
# 在此处添加您要执行的操作
#2008R2配winrm http,暂不支持https
winrm quickconfig -q 2>&1 > $null
winrm quickconfig -q -force 2>&1 > $null
restart-service winrm 2>&1 > $null
winrm set winrm/config/client '@{TrustedHosts="*"}' 2>&1 > $null
netstat -ato|findstr :5985
Set-Item WSMan:localhost\client\trustedhosts -value * -force 2>&1 > $null
}
# Restart WinRM, and set it so that it auto-launches on startup.
cmd.exe /c net stop winrm
cmd.exe /c sc config winrm start= auto
cmd.exe /c net start winrm
netstat -ato|findstr ":5985 :5986"
#Remove-Item $MyInvocation.MyCommand.Path -force 2>$null
#执行完这段Powershell后要重启机器
#执行完这段Powershell后要重启机器
#执行完这段Powershell后要重启机器
#shutdown -r -t 0
$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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有