Использование PowerShell для отслеживания потерянных виртуальных жестких дисков

Опубликовано: 17 Апреля, 2023
Использование PowerShell для отслеживания потерянных виртуальных жестких дисков

В ходе обычных повседневных действий по управлению виртуальные жесткие диски Hyper-V иногда могут стать бесхозными. Когда вы удаляете виртуальную машину Hyper-V с помощью диспетчера Hyper-V, соответствующий виртуальный жесткий диск не удаляется, и впоследствии легко забыть вернуться и удалить виртуальный жесткий диск. Конечно, эти потерянные виртуальные жесткие диски могут занимать значительный объем дискового пространства, поэтому рекомендуется удалить виртуальные жесткие диски, которые вам больше не нужны.

К сожалению, в PowerShell нет командлета Get-OrphanedVHD. Таким образом, вы должны быть немного изобретательны, когда дело доходит до отслеживания потерянных виртуальных жестких дисков. К счастью, в PowerShell встроено несколько командлетов, связанных с виртуальными жесткими дисками, и вы можете использовать эти командлеты в своих интересах.

Творчество

Можно создать сценарий PowerShell, который создает список всех виртуальных жестких дисков во всей системе, а затем опрашивает виртуальные машины, чтобы узнать, какие виртуальные жесткие диски они используют. Затем сценарий может сопоставить два списка и удалить из списка все виртуальные жесткие диски, которые, как известно, используются, оставив вам список виртуальных жестких дисков.

Это, безусловно, один из способов решения проблемы. К сожалению, я не могу создать такой скрипт из-за ограничений по длине содержимого. Тем не менее, я хочу показать вам несколько более простых методов, которые вы можете использовать.

В Windows есть встроенный командлет Get-VHD. Этот командлет предоставляет информацию об указанном файле VHD. Среди полей информации, которые возвращаются, есть поле с именем Вложенный. Поле «Прикреплено» содержит значение «Истина» или «Ложь», как показано на рисунке ниже.
Изображение 14581

Если в поле «Подключено» отображается значение «Истина», то виртуальный жесткий диск определенно не потерян. Если, с другой стороны, в поле «Подключено» отображается значение False, то виртуальный жесткий диск может или не может быть осиротевшим. Файл виртуального жесткого диска может отображать прикрепленное значение False, если он потерян, но он также будет отображать значение False, если виртуальная машина, использующая файл виртуального жесткого диска, отключена. Если вы посмотрите на рисунок ниже, вы увидите, что в поле «Присоединенное поле» изначально отображалось значение False, но после запуска виртуальной машины оно изменилось на True.

Хотя значение поля «Подключено» может меняться в зависимости от состояния виртуальной машины, это все же хорошее место для начала проверки того, не потерян ли виртуальный жесткий диск, потому что, если значение равно «Истина», вы точно знаете, что виртуальный жесткий диск не является сиротой.

В поисках сироты

Но что, если в поле «Прикреплено» указано значение False? Как узнать, потерян ли виртуальный жесткий диск или он просто принадлежит выключенной виртуальной машине? Что ж, если все ваши виртуальные машины включены, а виртуальный жесткий диск по-прежнему показывает значение «Подключено» False, то виртуальный жесткий диск, вероятно, осиротел.

Еще вы можете посмотреть путь к виртуальному жесткому диску (это один из атрибутов, отображаемых командлетом Get-VHD). В некоторых случаях путь может подсказать, какой виртуальной машине принадлежит виртуальный жесткий диск. Например, на предыдущем рисунке было совершенно очевидно, что этот виртуальный жесткий диск принадлежит виртуальной машине с именем DOS. Однако просмотр пути не всегда дает вам необходимую информацию.

Еще одна вещь, которую вы можете сделать, — это найти на виртуальных машинах ссылки на виртуальный жесткий диск. Как ни странно, командлет Get-VM не отображает список виртуальных жестких дисков, которые использует виртуальная машина. Даже использование командлета Select-All в сочетании с командлетом Get-VM не отобразит необходимую информацию.

Итак, наша проблема заключается в том, что командлет Get-VM выводит информацию о ВМ, но не информацию о виртуальном жестком диске. Точно так же командлет Get-VHD выводит информацию о виртуальном жестком диске, но не отображает имена виртуальных машин, использующих виртуальные жесткие диски. Решение этой проблемы состоит в том, что командлет Get-VHD принимает входные данные конвейера. Вы не можете отправить имя виртуальной машины командлету Get-VHD, но можете использовать идентификатор виртуальной машины.

Имея это в виду, предположим, что вы хотите увидеть имя и путь виртуального жесткого диска, используемого виртуальной машиной с именем DOS. Для этого вы можете использовать эту команду:

Get-VM DOS | VMID выбора объекта | Получить-VHD | Путь к выбранному объекту

Вы можете увидеть вывод этой команды на рисунке ниже.

Какой бы полезной ни была эта команда, она, вероятно, мало что вам даст, если у вас большое количество виртуальных машин. К счастью, одним очень простым изменением вы можете получить список всех виртуальных жестких дисков, которые используются виртуальными машинами, расположенными на сервере. Команда выглядит следующим образом:

Получить виртуальную машину | VMID выбора объекта | Получить-VHD | Путь к выбранному объекту

Как видите, я просто опустил имя ВМ, что фактически сообщает PowerShell, что я хочу просмотреть каждую ВМ на сервере. Конечным результатом является список виртуальных жестких дисков, используемых этими виртуальными машинами. Вы можете увидеть, как это выглядит на рисунке ниже.

Если у вас есть виртуальный жесткий диск, который, как вы подозреваете, потерян, вы можете просмотреть список, чтобы узнать, используется ли виртуальный жесткий диск или нет. Как упоминалось ранее, также можно создать сценарий, который автоматизирует весь процесс и идентифицирует потерянные виртуальные жесткие диски, чтобы вам не приходилось искать их вручную.