任何人都可以告诉我为什么在重新启动Google Compute Engine实例后我的ssh连接超时了。我通过sudo reboot和Google Compute Engine Console重新启动实例,两者都是这样做的。
答案 0 :(得分:5)
当操作系统关闭以重新启动时,所有网络连接都将关闭,包括SSH连接。从客户端来看,这看起来像连接超时。
答案 1 :(得分:2)
当您使用gcutil resetinstance
时,它与按下物理主机上的电源按钮的功能相同。这不同于例如sudo reboot
,因为前者没有给操作系统执行任何关闭的机会(比如关闭打开的套接字,刷新缓冲区等),而后者则有序关闭。
如果主机仍然是ssh-able,您可能更愿意登录到实例进行重新启动而不是使用gcutil resetinstance
; resetinstance
(或GUI中的“重新启动实例”按钮)是硬重置,允许您从内核崩溃或SSH失败中恢复。
更详细:
在OS启动的重新引导期间(如sudo reboot
),操作系统执行许多清理步骤,然后转到运行级别6(重新启动)。这会导致/etc/init.d
中的所有脚本运行,然后正常关闭。在正常关闭期间,sshd
将被杀死; sshd
可以捕获kill信号以关闭所有打开的套接字。关闭套接字将导致发送FIN
TCP数据包,开始有序的TCP拆分(ssh客户端中的“连接已关闭”消息)。或者,如果sshd
只是退出,内核会在所有打开的TCP套接字上发送RST
(重置)数据包,这将导致ssh客户端上出现“连接重置”消息。关闭所有进程后,内核将确保将页缓存中的所有脏页刷新到磁盘,然后执行两个或三个机制中的一个以触发BIOS重新引导。 (ACPI,键盘控制器或三重故障。)
当触发外部重置时(例如通过resetinstance
API调用或GUI),VM将立即进入最后一步,操作系统将无法正常执行任何关闭操作上面的步骤。这意味着您的ssh客户端不会收到如上所述的FIN
或RST
数据包,并且只会在远程服务器停止响应时通知连接已关闭。 (“连接超时”)
答案 2 :(得分:2)
感谢Brian Dorsey,E。Anderson和vgt回答我的问题。问题是其他问题。每次我重新连接以前的连接时,我都会使用“eth0”接口和名为“br0”的新brigde接口之间的brigde-util实用程序建立以太网桥。通过sudo reboot
或GCE控制台重置实例后,ssh连接停止工作。
但是,如果我没有启动以太网桥,则实例会通过两种方法重新启动。
答案 3 :(得分:0)
与Brian的答案略有正交。要正常重新启动GCE VM,您可以使用:
gcutil resetinstance
答案 4 :(得分:0)
如果您的实例图片是CentOS,请尝试删除selinux。
sudo yum remove selinux*