Может ли кто-нибудь сказать мне, почему после перезагрузки экземпляра Google Compute Engine у меня истекает время ожидания подключения ssh. Я перезагружаю экземпляр с помощью sudo reboot и консоли Google Compute Engine, и оба делают то же самое.
Время ожидания подключения ssh после перезагрузки экземпляра GCE
Ответы (5)
Когда ОС выключается для перезагрузки, все сетевые соединения закрываются, включая соединения SSH. Со стороны клиента это может выглядеть как тайм-аут соединения.
Когда вы используете gcutil resetinstance, он делает то же самое, что и нажатие кнопки питания на физическом хосте. Это отличается от, например, sudo reboot, потому что первый не дает операционной системе возможности выполнить какое-либо завершение работы (например, закрытие открытых сокетов, сброс буферов и т. д.), а второй выполняет упорядоченное завершение работы.
Вы, вероятно, предпочтете войти в экземпляр для перезагрузки, а не использовать gcutil resetinstance, если хост все еще поддерживает ssh; resetinstance (или кнопка «Перезагрузить экземпляр» в графическом интерфейсе) — это аппаратный сброс, позволяющий восстановиться после сбоя ядра или сбоя SSH.
Подробнее:
Во время перезагрузки, инициированной ОС (например, sudo reboot), операционная система выполняет ряд шагов очистки, а затем переходит на уровень запуска 6 (перезагрузка). Это приводит к запуску всех сценариев в /etc/init.d, а затем корректному завершению работы. Во время корректного завершения работы sshd будет уничтожен; sshd может поймать сигнал уничтожения, чтобы закрыть все свои открытые сокеты. Закрытие сокета приведет к отправке TCP-пакета FIN, что приведет к упорядоченному разрыву TCP (сообщение «Соединение закрыто» в вашем ssh-клиенте). В качестве альтернативы, если sshd просто завершается, ядро отправляет пакет RST (сброс) на все открытые сокеты TCP, что вызовет сообщение «Сброс соединения» на вашем ssh-клиенте. Как только все процессы будут остановлены, ядро удостоверится, что все грязные страницы в кэше страниц сброшены на диск, а затем выполнит один из двух или трех механизмов, чтобы вызвать перезагрузку BIOS. (ACPI, контроллер клавиатуры или тройная ошибка.)
При запуске внешнего сброса (например, через вызов API resetinstance или графический интерфейс) виртуальная машина немедленно перейдет к последнему шагу, и операционная система не сможет выполнить ни один из описанных выше шагов корректного завершения работы. Это означает, что ваш ssh-клиент не получит пакет FIN или RST, как указано выше, и заметит, что соединение закрыто только тогда, когда удаленный сервер перестанет отвечать. ("Время соединения истекло")
Спасибо Брайану Дорси, Э. Андерсону и vgt за ответы на мой вопрос. Проблема была в другом. Каждый раз, когда я сбрасывал соединение ранее, я поднимался по мосту Ethernet с утилитой brigde-util между интерфейсом «eth0» и новым интерфейсом brigde, называемым «br0». После сброса экземпляра с помощью sudo reboot или консоли GCE соединение ssh перестало работать.
Но если я не подключу Ethernet-мост, экземпляр перезапустится нормально обоими способами.
Если образ вашего экземпляра — CentOS, попробуйте удалить selinux.
sudo yum remove selinux*
Немного ортогональный ответу Брайана. Чтобы изящно перезагрузить виртуальную машину GCE, вы можете использовать:
gcutil resetinstance <instancename>