我真的束手无策了,所以我希望有人能帮助我。我有一个运行 Ubuntu Server 9.10 的虚拟机。这只是一个小型开发环境,所以我可以将我的代码与测试和生产环境分开。我在运行 Ubuntu Desktop 9.10 的笔记本电脑上通过 VirtualBox 3.1.6 运行它。我已将其设置为桥接网络连接,并将其桥接到我的笔记本电脑的无线适配器上。我们办公室没有有线连接。
我启动虚拟机,一切都很好。我可以使用 gnome-terminal 通过 SSH 进入虚拟机,一段时间内一切都很正常。然后,SSH 终端会话似乎随机地挂起。没有错误消息,什么都没有;它只是变得没有响应。如果我转到 VirtualBox 终端,我发现虚拟机本身完全正常。它可以 ping 通,我可以用它通过 SSH 退出。如果我重新启动虚拟机上的网络,我的 gnome-terminal 中的 SSH 会话大多数情况下都会再次响应。
这里有一个有趣的点,SSH 会话有时会在我输入某些内容时终止(这表明这不是空闲会话问题),如果我转到 VirtualBox 终端并重新启动网络,然后返回我的 gnome-terminal SSH 会话,我会发现它会恢复,并且我在会话挂起时最初输入的内容会神奇地自动输入到缓冲区中。因此,我的输入被存储在某个地方,直到 VM 上的网络重新启动后才能进入 VM。
我尝试了不同版本的 VirtualBox,并使用了 vmdk 映像和 vdi 映像,但似乎都不起作用。我不知道问题出在我的笔记本电脑、VirtualBox 还是 Ubuntu Server VDI 上。有没有办法调试这个问题?或者有人见过类似的事情吗?
答案1
这是保持 ssh 会话的正确方法
如果你拥有远程服务器端,则编辑 SSH 守护进程配置文件
sudo vi /etc/ssh/sshd_config # on your server
添加以下行
ClientAliveInterval 120 # server sends clients "null packet" every 120 seconds
ClientAliveCountMax 720 # allow clients to stay alive for 720 intervals
720 个间隔 ===(120 秒 * 720 = 86400 秒 = 24 小时)
或者如果你不拥有服务器端,那么请在本地机器(笔记本电脑)上进行此更改
vi ~/.ssh/config # on local host NOT on server
ServerAliveInterval 120
答案2
好的,我找到了问题的根本原因,它非常简单,我有点尴尬:网络 IP 冲突。正如我所猜测的那样,这确实是网络问题,但是,它并不像我想象的那么复杂。
由于我使用的是桥接网络,因此虚拟机与网络上的所有其他计算机一起显示在 DHCP 客户端表中。如果其中任何一台计算机从 DHCP 获取我的虚拟机的 IP(例如在我当天启动虚拟机之前),则每当我的虚拟机上线时都会引发冲突,并可能导致我的虚拟机停止响应 SSH。这解释了为什么当我使用 VirtualBox 终端时,我没有遇到任何问题。
我不太清楚大多数路由器如何处理 IP 冲突,但似乎最后进行网络活动的机器优先。因此,当我在机器上重新启动网络时,一切都很好,直到共享 IP 的机器决定进行网络活动,然后 BOOM ... 我的连接就会挂起。
我将虚拟机的静态网络 IP 重置为我们范围内的相当高的值,因此希望这样可以避免与我的同事的机器发生任何 IP 冲突。
答案3
我不知道桥接连接和无线连接是否可以协同工作 - 至少在我尝试过的大多数虚拟机中是这样。您可能想要/需要使用 nat 或仅主机,看看是否可以使其工作
答案4
您是否在输入Ctrl+ S,这可能会暂停会话(由于遗留原因)?按Ctrl+Q一次,它会冻结,看看它是否会解冻。