Иногда какой-нибудь хост ESXi может заблокировать виртуальную машину и "забыть" разблокировать. Причины бывают разные, но исправлять всё равно нам.
После неудачного резервного копирования виртуальная машина попросила выполнить консолидацию дисков.
Virtual machine disks consolidation is needed
Запускаю консолидацию.
Подтверждаю. YES.
И получаю ошибку.
Unable to access file since it is locked
Не работает примус. Нужно попасть в консоль гипервизора. Для удобства запускаю SSH.
Авторизируюсь по SSH на гипервизоре с "больной" виртуалкой.
По опыту уже знаю что могло послужить причиной запроса консолидации, блокировки виртуальной машины и описываемой ошибки. Банальная нехватка места в директории /tmp. Уже были статьи про такую проблему, но в каждом конкретном случае результат переполнения /tmp вызывал разные ошибки. Примеры устранения проблемы есть здесь:
ESXi — 503 Service Unavailable
Ошибка "The ramdisk 'tmp' is full" на серверах HPE ProLiant с кастомным образом ESXi
Проверяем:
vdf
Действительно, диск переполнен.
Прежде чем разбираться с заблокированной виртуалкой следует почистить /tmp.
cd /tmp
ls -FlS
Всё место занял файл ams-bbUsg.txt. Это известная проблема. Ошибка в пакете HPE Agentless Management (AMS) версии 11.4.0:
Сначала освободим место.
cd /tmp
rm ams-bbUsg.txt
Место появилось. Но причина не устранена. Пробую обновить пакет AMS.
esxcli software vib install -v "http://vibsdepot.hpe.com/hpe/may2019/esxi-600-vibs/ams/amsd-600.11.4.2-4.2494585.vib"
Причину проблемы устранили, правда, нужно будет запланировать перезагрузку гипервизора.
Теперь разберёмся с заблокированной виртуалкой. Нам нужно определить, который гипервизор эту виртуальную машину заблокировал и перезапустить на нём службы. Если виртуальная машина находится на локальном диске и доступ к ней имеет только один хост, то просто выполняем:
services.sh restart
Если же хостов может быть несколько, то переходим в каталог с файлами виртуальной машины и смотрим vmware.log:
cd /vmfs/volumes/имя_DATASTORE/виртуалка
cat vmware.log | grep lock
Нам нужно найти название заблокированного файла.
2021-02-25T07:48:06.947Z| vcpu-0| I125: ConsolidateItemCombine: Failed to open disk '/vmfs/volumes/5964b01b-b59d4f02-3fe6-1402ec8e9224/fs-office/fs-office-000001.vmdk' for consolidate: Failed to lock the file (5)
2021-02-25T07:48:06.983Z| vcpu-0| I125: ConsolidateItemComplete: Online consolidation failed for disk node 'scsi0:0': Failed to lock the file (5).
Заблокирован файл fs-office-000001.vmdk. Определим flat или delta файл.
vmkfstools -qv10 fs-office-000001.vmdk
Получили путь к файлу delta.
/vmfs/volumes/5964b01b-b59d4f02-3fe6-1402ec8e9224/fs-office/fs-office-000001-delta.vmdk
Утилита vmfsfilelockinfo поможет определить хост. Утилиту можно запускать, зная файл VMDK flat, delta, esparse для VMFS или .UUID. lck для vSAN.
vmfsfilelockinfo -p /vmfs/volumes/5964b01b-b59d4f02-3fe6-1402ec8e9224/fs-office/fs-office-000001-delta.vmdk
Получаем MAC адрес хоста, который заблокировал виртуальную машину. По MAC адресу определяем хост. Можно вывести ARP таблицу и получить IP и MAC адреса всех соседних серверов ESXi:
esxcli network ip neighbor list
Я же просто пробегаюсь глазами по всем хостам в vCenter:
На найденном хосте выполняем:
services.sh restart
Блокировка с виртуальной машины снимается, теперь консолидация выполнится успешно.