Как узнать, какая виртуальная машина использует DVD-привод
Hyper-V всегда был немного привередлив, когда речь шла об использовании DVD-приводов. Например, виртуальные машины поколения 2 вообще не могут использовать физические DVD-приводы. Вы можете эмулировать DVD-привод в виртуальной машине поколения 2, сопоставив SCSI-контроллер виртуальной машины с файлом ISO, но вы не можете связать виртуальную машину с физическим DVD-приводом.
Виртуальные машины поколения 1 — это совсем другая история. Вы можете настроить виртуальную машину поколения 1 для использования физического DVD-привода, но при этом есть одна большая проблема. Только одна виртуальная машина может одновременно использовать дисковод DVD.
Какая виртуальная машина подключена?
Теперь, как правило, это не совсем проблема. В конце концов, виртуальной машине обычно достаточно захватить DVD-привод только на время, достаточное для установки части программного обеспечения с DVD. Однако проблема заключается в том, что как только виртуальная машина захватывает DVD-привод, этот DVD-привод остается захваченным (и, следовательно, недоступным для других виртуальных машин) до тех пор, пока он не будет освобожден. К сожалению, Hyper-V Manager не просто сообщает вам, какая виртуальная машина в данный момент использует DVD-привод. Если вы случайно забудете освободить DVD-привод от виртуальной машины, вам, возможно, придется просмотреть каждую виртуальную машину по одной, пока вы не выясните, какая из них занимает DVD-привод.
К счастью, есть более простой способ выяснить, какая виртуальная машина в данный момент использует DVD-привод. PowerShell дает нам все, что нам нужно.
Для демонстрации я перенес физический DVD-привод на виртуальную машину с именем ReactOSB. Теперь я собираюсь использовать командлет Get-VM PowerShell вместе с Select-Object * для отображения всех свойств этой виртуальной машины, которые вы можете видеть на снимке экрана ниже.
Глядя на снимок экрана выше, обратите внимание на две вещи. Во-первых, информация о DVD-приводе виртуальной машины очень ограничена. Мы можем сказать, что он находится на IDE-контроллере номер 1 в ячейке 0, но это все.
Еще одна вещь, на которую следует обратить внимание, это то, что некоторые свойства виртуальной машины заключены в квадратные скобки, а другие нет. Каждый раз, когда вы видите свойство, заключенное в квадратные скобки, это означает, что свойство можно развернуть, чтобы показать больше деталей. На приведенном выше снимке экрана свойство DVDDrives содержит результат, заключенный в квадратные скобки, поэтому доступна дополнительная информация об использовании DVD виртуальной машиной.
Для просмотра дополнительных сведений используется параметр -ExpandProperty вместе с именем свойства, которое необходимо раскрыть. В данном случае это свойство называется DVDDrives. Следовательно, если мы хотим увидеть подробную информацию об использовании DVD-привода виртуальной машины ReactOSB, мы можем использовать эту команду:
Get-VM ReactOSB | Select-Object -ExpandProperty DVDDrives
Как вы можете видеть на снимке экрана ниже, эта команда показывает, что тип контроллера — IDE и что DVD-привод сопоставлен с контроллером номер 1, местоположение 0. Мы также можем видеть, что это сквозное сопоставление DVD и что виртуальная машина использует физический DVD-привод с буквой диска D:
Одна маленькая проблема
Хорошо, это все хорошо, но есть небольшая проблема. Мы начали с того, что знали, что эта виртуальная машина привязана к физическому DVD-приводу сервера. Проблема, которую я изначально поставил, заключалась в том, что у одной из виртуальных машин подключен физический DVD-привод, и мы не знаем, какой именно.
Чтобы быть полностью честным с вами, существует около миллиона различных способов, которыми мы могли бы использовать PowerShell, чтобы выяснить, какая виртуальная машина сопоставлена с DVD-приводом. Я решил использовать относительно простой цикл ForEach. Вот сценарий, который я придумал:
$Servers = Get-VM
ForEach ($Server в $Servers) {
$DVD = $Сервер | Select-Object -ExpandProperty DVDDrives
Если ($DVD.path -eq 'D:') {$Server.Name, $DVD.path}
}
Первая строка сценария создает переменную с именем $Servers и сопоставляет эту переменную с командлетом Get-VM. Затем мы запускаем цикл ForEach, который позволяет нам исследовать каждую из виртуальных машин по отдельности.
Третья строка скрипта создает переменную с именем $DVD. Цикл просматривает каждую виртуальную машину по одной, и переменная $DVD сопоставляется с информацией о DVD для той виртуальной машины, которая проверяется в данный момент. Наконец, сценарий выполняет проверку, чтобы убедиться, что путь к DVD-приводу равен D:. Если путь сопоставляется с D:, сценарий отображает имя виртуальной машины и путь к DVD. Если путь не равен D:, то скрипт просто игнорирует ВМ и начинает проверку следующей ВМ. Вы можете увидеть вывод скрипта ниже.
Как я сказал минуту назад, есть много разных способов, которыми я мог бы написать этот сценарий. На самом деле, мы можем немного упростить сценарий. Сначала я решил написать сценарий таким образом, чтобы показать вам, откуда берется информация о сопоставлении DVD, но теперь я хочу показать вам ярлык.
Как упоминалось ранее, вы можете отобразить информацию о сопоставлении DVD для виртуальной машины с помощью этой команды:
Get-VM ReactOSB | Select-Object -ExpandProperty DVDDrives
Однако в качестве ярлыка вы можете получить тот же результат, набрав:
Get-VMDVDDrive -VMName ReactOSB
Вы можете увидеть сравнение двух команд на рисунке ниже.
Имея это в виду, сценарий можно упростить следующим образом:
$Servers = Get-VMDVDDrive *
ForEach ($Server в $Servers) {
Если ($Server.path -eq 'D:') {$Server.VMName, $Server.Path}
}
Как видите, использование командлета Get-VMDVDDrive позволило мне сократить сценарий до четырех строк кода.
Менее распространенный, но полезный
Со временем виртуальные машины будут все реже и реже сопоставляться с физическими DVD-приводами. Тем временем может быть удобно иметь простой сценарий, который может сообщить вам, какая виртуальная машина в настоящее время использует DVD-привод.