Использование PowerShell с виртуальными машинами Hyper-V для массового добавления памяти

Опубликовано: 17 Апреля, 2023
Использование PowerShell с виртуальными машинами Hyper-V для массового добавления памяти

Ни для кого не секрет, что Windows PowerShell можно использовать для перенастройки виртуальной машины Hyper-V. Однако одна из действительно замечательных особенностей PowerShell заключается в том, что он позволяет массово управлять виртуальными машинами. Это может быть особенно полезно, когда для целого класса рабочих нагрузок необходимо выделить дополнительные ресурсы (например, память).

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

Получить виртуальную машину | Get-VMMemory

На рисунке ниже показано, как работают обе команды.

Хотя полезно иметь возможность просматривать объем памяти, выделенной виртуальной машине, также полезно иметь возможность изменять распределение памяти виртуальной машины. Для этого используется командлет PowerShell — Set-VMMemory. Вот полный синтаксис командлета:

Set-VMMemory [-VMMemory] <VMMemory[]> [-Buffer <Int32>] [-DynamicMemoryEnabled <Boolean>]

[-MaximumBytes <Int64>] [-StartupBytes <Int64>] [-MinimumBytes <Int64>] [-Priority <Int32>]

[-MaximumAmountPerNumaNodeBytes <Int64>] [-ResourcePoolName <String>] [-Passthru] [-WhatIf] [-Confirm] [<CommonParameters>]

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

Set-VMMemory TestVM -DynamicMemoryEnabled $true -MinimumBytes 64MB -StartupBytes 256MB -MaximumBytes 2GB -Priority 80 -Buffer 25

Итак, с учетом сказанного, давайте рассмотрим очень простой пример использования PowerShell для перенастройки памяти виртуальной машины. У меня есть виртуальная машина на сервере Hyper-V с именем Linux. Если я воспользуюсь командлетом Get-VMMemory, я увижу, что виртуальной машине Linux в настоящее время выделено 4 ГБ памяти. Если я хочу увеличить эту сумму до 6 ГБ, я могу сделать это с помощью этой команды:

Set-VMMemory Linux -StartupBytes 6GB

На рисунке ниже показано использование этой команды. На рисунке также показано изменение, внесенное командой в объем памяти, выделенной виртуальной машине.

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

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

Если вы хотите включить только определенные виртуальные машины, команда будет выглядеть примерно так:

$VMs=('VM1','VM2','VM3')

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

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

$Temp = Get-ВМ

$VMs = $Temp.Name

Вот как выглядит эта техника:

После того, как вы создали переменную, содержащую имена виртуальных машин, которые вы хотите изменить, следующим шагом в процессе является настройка цикла «для каждого». Цикл будет основан на списке виртуальных машин (переменная $VMs). По сути, он сообщает PowerShell, что для каждой виртуальной машины в списке виртуальных машин необходимо выполнить определенное действие. Это действие, конечно же, является модификацией памяти.

У нас уже есть переменная ($VMs), которая представляет наш список виртуальных машин, но нам также нужна переменная, которая будет представлять одну виртуальную машину. Для этого я буду использовать $VM (без буквы S на конце). Цикл будет выглядеть так:

ForEach ($VM в $VM)

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

$VMs=('Повтор1','Повтор2')

ForEach ($VM в $VM) {

$ВМ

Get-VMMemory $VM

Set-VMMemory $VM -StartupBytes 10 ГБ

Get-VMMemory $VM

}

Итак, как видите, я устанавливаю память для виртуальных машин Repl1 и Repl2 на 10 ГБ. Результат показан на рисунке ниже.

Падение силы PowerShell

PowerShell — это удобный интерфейс для управления виртуальными машинами Hyper-V. Тем не менее, реальная польза от использования PowerShell проявляется только при управлении большим количеством ресурсов, таких как виртуальные машины. Всего с помощью семи строк кода PowerShell смог автоматизировать процесс изменения распределения памяти виртуальной машины. Однако на самом деле это можно было бы сделать с помощью двух строк кода, если бы я написал сценарий по-другому. Я просто решил написать сценарий в развернутой форме, чтобы его было легче понять.