Я пишу это после того, как сам нашел решение, потому что это была такая странная "загвоздка", что она заслуживает быть задокументированной.
Хотя я столкнулся с этой проблемой во время восстановления, возможно, она может возникнуть и в других случаях загрузки в другую операционную систему, когда загрузочный диск установки ESXi подключен к системе, особенно если размер диска изменился.
Совсем недавно я восстановил загрузочный диск установки VMware ESXi, содержащий также хранилище данных с большинством виртуальных машин и их виртуальными загрузочными/системными дисками, только чтобы обнаружить, что это предположительно хорошее состояние было каким-то образом нарушено.
Судя по отображению на локальной консоли сервера, ESXi загружался нормально, но он демонстрировал множество проблемных симптомов:
Невозможно было войти в систему с помощью vSphere Client, который выдавал сообщение: "vSphere Client не смог подключиться к хосту. Произошла неизвестная ошибка подключения. (Запрос не удался из-за сбоя подключения. (Невозможно подключиться к удаленному серверу))".
В журнале vSphere Client появилась ошибка:
System.Net.Sockets.SocketException: No connection could be made because the target machine active refused it
При попытке войти на сервер с помощью веб-браузера, браузер сообщил, что соединение было отклонено.
Не удалось подключиться к серверу по SSH даже после включения этой функции на локальной консоли.
Перезапуск сети управления и агентов управления через локальную консоль не помог.
На локальной консоли обнаружено, что hostd
не запущен, перезагрузка не помогла.
Команды esxcli
всегда давали: Connect to localhost failed: Connection failure
Под /vmfs/volumes
было меньше каталогов, чем ожидалось, и ни один из них не был ни одним из моих хранилищ данных.
Даже "Сброс конфигурации системы" в локальном пользовательском интерфейсе не помог. (Я попробовал это только потому, что у меня был известный хороший образ, из которого можно было восстановить систему, что я и сделал после решения проблемы, хотя я не уверен, что это что-то изменило)
Резервная копия, из которой я восстанавливался, была низкоуровневым образом логического диска RAID, сделанным при выключенном сервере. После удаления потенциально поврежденного RAID-массива и его воссоздания я использовал отдельный диск, подключенный через HBA для загрузки физической установки Windows Server, чтобы скопировать образ на новый RAID. Я использовал HDD Raw Copy Tool с сайта hddguru.com, который, по сути, является менее загадочной и кусачей альтернативой команде Linux dd
.
(Это, конечно, варварский, хотя и довольно полный способ резервного копирования VMware, но на этом диске в основном хранятся только загрузочные/системные диски VM, а не данные, поэтому резервное копирование производится нечасто, в любом случае, за исключением крупных изменений. Для основных данных у нас есть гораздо лучшие системы резервного копирования.)
Я сделал новый логический диск RAID больше, чем тот, который был забэкаплен, поскольку мы перешли на более емкие диски в RAID, и хранилище данных было немного переполнено. Я планировал увеличить хранилище данных после подтверждения того, что резервная копия работает.
Не успел я сделать необработанную копию, как загрузился в ESXi и обнаружил, что она не работает. Что случилось?!
Это довольно старый ESXi 5.0 U3. (Он прекрасно удовлетворяет наши текущие потребности, и у нас нет штатного ИТ-персонала, который бы управлял обновлениями ради обновлений, исправлял проблемы, которые они часто вызывают, и т. д.)
В моем случае повреждение могло быть вызвано Windows, но другое программное обеспечение могло вызвать ту же проблему.
Это определенно относится к ESXi 5.0 U3 и, вероятно, к любому ESXi 5.x, и я предполагаю, что возможно к любому ESXi 6.x. Это вряд ли применимо к ESXi 7, в котором используется другая, более простая структура разделов.
Я был очень близок к выполнению новой установки, когда, наконец, начал разбираться в ней.
Покопавшись в / vmfs / volume
, я заметил одну странную вещь: во всех из них были каталоги $ RECYCLE.BIN
, и они содержали DESKTOP. INI
файлы, содержимое которых соответствует расширениям оболочки Windows Explorer. Это немного странно найти в системных разделах гипервизора, который не основан и никогда не был основан на Windows.
У меня сразу возникло подозрение, что операционная система Windows, которую я использовал для копирования образа диска, что-то с этим сделала. ESXi использует несколько разделов FAT на своем загрузочном диске, поэтому, возможно, Windows может с ними играть. Учитывая, что образ диска был взят из заведомо исправного состояния, но произошел сбой без каких-либо действий в ESXi, это казалось наиболее многообещающим направлением исследования.
Сначала я был встревожен, когда с помощью шестнадцатеричного редактора обнаружил, что эти каталоги $ RECYCLE.BIN
также появляются в образе диска. Сначала я решил, что это означает, что ущерб был нанесен еще до того, как изображение было снято - также в Windows Server. Однако они оказались добрыми, хотя и привели меня в правильном направлении.Скорее всего, Windows добавила их, как только увидела исходный логический диск, размер которого еще не был увеличен, и несмотря на то, что диск все время находился в автономном режиме.
Дальнейшее копание в шестнадцатеричном редакторе ( HxD - Hex Editor and Disk Editor , действительно хороший инструмент) выявило одну странную небольшую разницу между таблицей разделов GPT в образе диска и таблицей, живущей на новом. RAID-диск. Это не та разница, которую мог бы показать редактор разделов, потому что , насколько мне известно, на самом деле не имеет никакого значения логически . Это то, что вам нужно будет найти в необработанном шестнадцатеричном дампе.
В обоих случаях в массиве разделов было семь непустых записей. Однако, как и при первоначальной записи массива в ESXi, после первых трех записей был пробел в одну пустую запись (все 128 байтов были обнулены), так что последние четыре действительных записи попадали в свой собственный 512-байтовый сектор. На живом диске, где был запущен ESXi, последние четыре действительных записи были сдвинуты на одну запись вверх, чтобы закрыть пробел. В остальном записи были идентичны.
Я не знаю, кто это сделал, Windows или HDD Raw Copy Tool, но подозреваю Windows. Я проверил его снова, и это изменение будет присутствовать сразу после завершения копирования, даже если логический диск RAID находится в состоянии «Offline» в оснастке Disk Management MMC во время и после копирования. Это явно преднамеренное изменение, потому что все CRC верны, и резервный GPT также изменен.
Моя теория заключается в том, что тот, кто это делает, переписывает GPT, потому что он не соответствует размеру диска, и что вместо того, чтобы просто копировать существующий массив в точности, он запоминает разделы как список в некоторой внутренней структуре и затем просто переписываете массив, что, конечно же, не создает пробелов.
В качестве примечания, записи в массиве, записанные ESXi, не были в том же порядке, что и разделы физически расположены на диске, но какая бы программа ни закрывала пробел, по крайней мере, не позволяла сортировать записи. Тоже к счастью!
Я не знаю простого способа воссоздать этот пробел, потому что обычно любой редактор разделов будет делать то же самое: преобразовать существующую таблицу во внутреннее представление, используемое инструментом, выполнить изменения, которые вы запрашиваете в этом представлении, а затем снова запишите таблицу в формате GPT, чтобы в ней были правильные данные. Насколько я знаю, точное расположение записей массива на диске не должно иметь отношения к делу и поэтому не будет частью упомянутых «правильных данных», которые он записывает обратно.
Однако у меня было подозрение, что ESXi может быть привередливым к точному расположению массива, поэтому я решил исправить это вручную, чтобы посмотреть, что произойдет. Процедура была следующей:
Вы можете обратиться к статье Википедии для получения основных технических деталей формата GPT.
Вот как выглядела часть «сломанного» массива GPT; обратите внимание, что действительные записи заканчиваются на 77Fh и до этого времени нет длинных серий нулей:
Вот как я это исправил; обратите внимание, что действительные записи теперь заканчиваются на 7FFh:
Я не ожидал, что это сработает. Я не изучал это, но ожидал, что спецификация UEFI не придает значения порядку или интервалу записей массива. Фактически, каждый раздел имеет уникальный идентификатор GUID , а именно , так что вам не придется полагаться на такую хрупкую эвристику. Таким образом, в зависимости от того, какие индексы массива были бы такими же, как при написании таблицы, было бы плохой идеей.
(Опять же, это не первый раз, когда я вижу, как программное обеспечение и микропрограммное обеспечение корпоративного уровня выдвигает плохие идеи. Кажется, каждый раз, когда я надеваю шляпу системного администратора, я сталкиваюсь с одной еще одна ослепительно глупая часть программирования ... но позвольте мне не разглагольствовать.)
Итак, я осторожно сохранил измененную таблицу, загрузился обратно на RAID, запустился ESXi, подключился клиент vSphere и все вернулось к норме.
В идеале обычно лучше использовать что-то вроде Veeam Backup, но в некоторых ситуациях могут подойти и другие специальные решения, и в этом случае вы можете столкнуться с этой ошибкой.