作者:MeshCloud脉时云公有云架构师 陈满
TroubleShoot 清单:
引起 Compute Engine CentOS 7 无法正常SSH的情况
- VM 防火墙规则未正常启用SSH服务
- GCP 防火墙规则未正常放行SSH 端口
- 系统启动盘磁盘损坏或启动磁盘空间已满
- 系统文件打开数修改后无法正常SSH
解决办法:
由于排查过程中,需要对虚拟机进行重启,因此, 如果虚拟机挂载了 local SSD,会导Local SSD 中的数据丢失,请注意。下面的解决方法,更多适用于未挂载SSD的虚拟机无法连接的问题。
1、VM防火墙未正常放行,或是通过Xshell 连接工具进行防火墙配置时,禁用了所有INPUT 流量,导致连接被拒绝。
解决办法:
在GCP上,启用串口登录,添加特权用户,然后修改VM 防火墙策略。
实现过程
1、在GCP 控制台,启用VM 的串口登录方式,编辑【metadata】,添加如下Key-Value
2、通过VM start-script 自启脚本,添加用户,然后通过串口方式登录VM,在自定义元数据【custom medata】,添加新的项,如上所示:
点击【保存】,然后通过reset【重置】实现VM 重启,
连接【串行端口】进行VM 防火墙配置:
## 允许ICMP 协议
$ iptables -I INPUT -p icmp -j ACCEPT
## 允许SSH 服务: #
$iptables -I INPUT -p tcp --dport 22 -j ACCEPT
## 清除所有防火墙策略 #
iptables -F
### 保存防火墙规则
# iptables-save
测试SSH 远程连接:
测试网络连通性:
2、GCP 防火墙规则未正常放行SSH 端口
这种情况是由于GCP 的Global 防火墙导致SSH 请求流量无法正常进入到GCP 网络中导致请求被拒绝,如下错误提示:
解决办法:
登录GCP的控制台添加对应端口的防火墙策略:
3、系统启动盘磁盘损坏或启动磁盘空间已满
如果虚拟机启动磁盘已满,则您可能无法访问虚拟机。此情况可能很难进行问题排查,因为虚拟机连接问题是由于启动磁盘已满导致时,这种情况并不总是显而易见。
- 确认虚拟机的 SSH 故障是否因启动磁盘已满导致,在控制台中找到VM 实例,点击【VM 名称】,然后找到串口:
# 通过gcloud 查看串口日志输出
$ gcloud compute instances tail-serial-port-output VM_NAME
在串口日志中查找No space left on device ,如下所示,意味着启动盘因为日志数据的持续写入或不断产生数据文件,已经将启动盘空间占用满,导致无法正常的SSH 登录
如果启动磁盘已满,则生成的输出将包含消息 No space left on device。
解决办法:
1、创建磁盘的快照,用于将已满的磁盘挂载到其他的VM上进行扩容
2、停止虚拟机,并增加磁盘容量
- 停止虚拟机
gcloud compute instances stop VM_NAME --zone=
VM_NAME:有问题的VM 实例名称
- 增加启动盘容量:重新调整虚拟机启动磁盘的大小后,大多数虚拟机会自动调整根文件系统的大小并重启虚拟机。
- 调整前的磁盘容量:
gcloud compute disks resize BOOT_DISK_NAME --size DISK_SIZE
BOOT_DISK_NAME:虚拟机的启动磁盘的名称
DISK_SIZE:启动磁盘新的更大大小(以 GB 为单位)
- 重新启动虚拟机
gcloud compute instances start VM_NAME
3、尝试通过 SSH 连接到虚拟机
- 可以正常连接,虚拟机自动调整跟文件系统,可以通过串口日志查看,如下所示:
登录虚拟机后 通过 df -Th 来检查是否有可用的磁盘空间,即自动调整文件系统大小成功。
- 仍然无法访问虚拟机,文件系统问题。该虚拟机不支持自动调整根文件系统大小,需要通过上面的快照重新创建新的更大容量的启动盘,然后重新挂载,
a. 为已满的启动盘创建快照:
b. 通过快照创建新的启动盘增加磁盘容量,通过创建好的快照来创建更大容量已满启动盘的副本,然后将创建的磁盘挂载到虚拟机上,
c. 停止虚拟机,移除已满的启动盘,挂载增加容量后新的启动盘
d. 重启虚拟机,登录虚拟机通过 df -Th 检查扩容后的容量。
通过 gcloud 对VM 进行 troubleshot:
$ gcloud beta compute ssh cockpit-1 --zone=us-central1-a --troubleshoot
Starting ssh troubleshooting for instance <https://compute.googleapis.com/compute/beta/projects/yunion-test-286209/zones/us-central1-a/instances/cockpit-1> in zone us-central1-a'
Start time: 2021-12-23 10:10:43.350588
---- Checking network connectivity ----
The troubleshooting tool needs permission to check the VM's network connectivity.
Is it OK to run this test? (Y/n)? y
Enabling service [networkmanagement.googleapis.com] on project [yunion-test-286209]...
Your source IP address is 34.80.131.230
Network Connectivity Test Result: REACHABLE
EndpointInfo <EndpointInfo
destinationIp: '10.1.2.10'
destinationNetworkUri: 'projects/yunion-test-286209/global/networks/default'
destinationPort: 22
protocol: 'TCP'
sourceIp: '34.80.131.230'
sourcePort: 51103>
Initial state: packet originating from Internet.
START_FROM_INTERNET
Forwarding state: arriving at a Compute Engine instance.
ARRIVE_AT_INSTANCE
Config checking state: verify INGRESS firewall rule.
APPLY_INGRESS_FIREWALL_RULE
Final state: packet delivered to instance.
DELIVER
---- Checking user permissions ----
User permissions: 0 issue(s) found.
---- Checking VPC settings ----
VPC settings: 0 issue(s) found.
---- Checking VM status ----
VM status: 0 issue(s) found.
---- Checking VM boot status ----
VM boot: 0 issue(s) found.
参考:
[1] Troubleshooting SSH
[2] Troubleshooting full disks and disk resizing
[3] Troubleshooting using the serial console