Перейти к содержимому

Имя touch не распознано как имя командлета

  • автор:

Основы Windows PowerShell

Рассказали, о технологии Windows PowerShell и как начать с ней работать.

Изображение записи

Рассказываем про Windows PowerShell — технологию для автоматизации рутинных задач, пришедшую на смену bat-файлам.

Работа с консолью Microsoft Windows

Ранее мы рассматривали командные интерпретаторы COMMAND.CMD и CMD.EXE, обеспечивающие автоматизацию задач в семействе операционных систем Microsoft Windows. Фактически данные интерпретаторы не получали обновлений с начала 2000-х годов и существуют в современных операционных системах для обеспечения совместимости.

Хотя современные операционные системы предлагают богатый на функции графический интерфейс, ряд однотипных задач быстрее решается через консоль. Более того, серверные редакции ОС не предоставляют графический интерфейс по умолчанию, поэтому интерпретатор командной строки является неотъемлемой частью практически любой операционной системы.

Помимо отсутствия обновлений, CMD.EXE имеет ограниченный функционал. Он не позволяет писать сложную логику и полностью отказаться от использования графического интерфейса. Корпорация Microsoft пыталась решить эти проблемы с помощью инструмента под названием Microsoft Script Host, который имел интеграцию со скриптовыми языками JScript и VBScript.

Однако Microsoft Script Host имел ряд собственных проблем:

  • плохо интегрировался с командной оболочкой операционной системы,
  • сопровождался скудной документацией,
  • разные версии Windows имели командные интерпретаторы с разным набором команд,
  • инструмент становился отличным вектором для атак.

Все это побуждало Microsoft сделать командный интерпретатор с нуля.

Новый командный интерпретатор Windows PowerShell

В 2003 году корпорация Microsoft начала разработку нового инструмента — Microsoft Shell (MSH), или Monad. Спустя три года и три бета-версии Monad была официально выпущена под новым названием Windows PowerShell 1.0 на Windows XP и Windows Vista. По ходу развития командная оболочка меняла свои названия на PowerShell Core и PowerShell.

При создании PowerShell разработчики задались целью создать инструмент, который позволил бы с легкостью использовать множество разнородных интерфейсов, предоставляемых операционной системой. Новый инструмент должен быть консистентным и легким для администратора, несмотря на количество технологий «под капотом». Например, PowerShell предоставляет доступ к API .NET-фреймворка, но не требует от администратора знания .NET.

Как и любой командный интерпретатор, PowerShell умеет запускать исполняемые файлы и имеет встроенные команды. Однако у PowerShell встроенные команды имеют название «командлет», появившееся от английского cmdlet.

Что такое командлет?

В основе взаимодействия с PowerShell лежат объекты, а не текст, как у CMD.EXE и командных интерпретаторов в *nix-системах. Такой подход меняет взгляд на организацию встроенных команд.

Командлет — это встроенная команда в PowerShell, выполняющая одну задачу и реализованная на .NET. Имя командлета соответствует правилу Глагол-Существительное, которое можно читать как Действие-Объект.

Самый важный командлет, о котором необходимо узнать в первую очередь, — Get-Help. Он отображает справочную информацию о PowerShell и командлетах.

# Получить общую справку по PowerShell Get-Help # Получить справку по командлету Get-Content Get-Help Get-Content # Получить справку по командлету Get-Help Get-Help Get-Help 

Если вам кажется, что использовать большие буквы в названии командлетов — это перебор, для вас есть хорошие новости. Все команды в PowerShell являются регистронезависимыми. Иными словами, перечисленные ниже написания эквивалентны:

Get-Help Get-Help get-help get-help GET-HELP GET-HELP GeT-hElP gEt-HeLp 

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

В первой версии PowerShell все командлеты были реализованы на .NET, но начиная с версии 2.0 появилась возможность писать командлеты с использованием синтаксиса PowerShell.

Основы программы PowerShell

Перейдем к практике. PowerShell является кроссплатформенным инструментом и может быть запущена на Linux и macOS, но в данной статье будет рассматриваться только «родное» окружение — Windows.

Как запустить?

Программа в меню

Запуск PowerShell можно произвести из меню поиска около кнопки Пуск, набрав powershell.

PowerShell в меню

Аналогично можно запустить PowerShell через диалоговое окно Выполнить…, которое открывается через сочетание клавиш Windows + R.

Если по каким-то причинам у вас не установлен PowerShell, то необходимо сделать это, следуя инструкции в базе знаний Microsoft.

Установка PowerShell

В случае успеха откроется синее окно. Windows PowerShell готов к вашим командам.

Синтаксис

Синтаксис PowerShell похож на синтаксис других командных интерпретаторов. Сначала команда, а затем аргументы команды. Несколько команд в одной строке разделяются точкой с запятой. Рассмотрим на примере.

Get-Help Get-Command -Online

Данная команда откроет в браузере вкладку с описанием командлета Get-Command в базе знаний Microsoft. Разберем подробнее:

  • Get-Help – команда, в данном случае командлет,
  • Get-Command – первый позиционный аргумент, который передается командлету,
  • -Online – ключ, то есть именованный аргумент.

Обратите внимание, что в CMD.EXE именованные аргументы, то есть ключи, для встроенных команд начинались с символа слэш (/). У командлетов аргументы начинаются со знака минус. Использование знака / в PowerShell недопустимо и будет интерпретировано как ошибка.

Хотя PowerShell во многом похож на CMD.EXE, он имеет несколько существенных отличий. Во-первых, обращение к переменным производится через символ доллар, а не через знак процента. Во-вторых, PowerShell позволяет определять функции. Например:

function Get-Version

Данный код объявит функцию Get-Version, которая обращается к системной переменной (объекту) PSVersionTable и возвращает значение поля PSVersion. Проще говоря, выводит версию PowerShell.

Именование командлетов может быть неочевидным для администраторов с опытом работы с другими командными интерпретаторами. Поэтому рассмотрим основные команды Windows PowerShell.

Основные команды языка Windows PowerShell

В следующей таблице перечислены основные команды PowerShell и их аналоги в *nix-подобных системах и CMD.EXE. В версии PowerShell 7 количество командлетов превышает полторы тысячи!

Командлет (псевдоним) Команда в *nix Команда в CMD.exe Описание
Get-Location (pwd) pwd Выводит путь до текущего каталога
Set-Location (cd) cd cd Меняет текущий каталог
Get-ChildItem (ls) ls dir Выводит содержимое текущего каталога
Get-ChildItem find find Производит поиск файлов по заданным критериям
Copy-Item (cp) cp cp Копирует файл
Remove-Item (rm) rm rm Удаляет файл
New-Item (mkdir) mkdir mkdir Создает каталог
New-Item touch Создает пустой файл
Get-Content (cat) cat Выводит файлы
Get-Content tail Выводит последние 10 строк
Where-Object grep Производит фильтрацию
Create-Volume
Format-Volume
mkfs Форматирует раздел
Test-Connection ping ping.exe Отправляет ICMP-запросы, «пингует»
Get-Help (man) man help Показывает справку

После работы в консоли *nix командлет для популярного действия, смены каталога, выглядит громоздко и непривычно. К счастью, командлеты имеют псевдонимы (алиасы), которые могут не следовать правилу именования командлетов. Список известных псевдонимов можно получить с помощью командлета Get-Alias.

Хотя таблица, представленная выше, значительно облегчит назначение командлетов, не стоит ожидать от командлетов поведения как в *nix-системах. Так, например, в PowerShell командлет Get-Content создан для вывода содержимого одного файла на экран, в то время как на *nix-системах утилита cat изначально использовалась для конкатенации (процесса соединения) нескольких файлов с последующим выводом на экран.

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

Утилита ping

Отдельно хочется отметить командлет Test-Connection, который делает то же самое, что утилита ping, но не имеет такого алиса. Разница между утилитой и командлетом в формате вывода: утилита выводит текст, а командлет возвращает объект, который можно использовать в конвейерах.

Конвейер PowerShell: особенности и параметры

По своей задумке конвейеры в PowerShell не отличаются от конвейеров в *nix-системах: они перенаправляют вывод одной команды на ввод другой. Как отмечалось ранее, в PowerShell происходит взаимодействие не с текстом, а с объектами. При выводе на экран объект трансформируется в таблицу, чтобы человеку было удобнее читать, но не всегда таблица выводит все поля объекта.

Особенность конвейеров PowerShell заключается в том, что конвейер передает результат не целиком, а по одному объекту. Командлет Test-Connection выводит четыре объекта: по одному на каждый ICMP-запрос. Если подключить командлет к конвейеру, то можно увидеть подтверждение этому тезису. Воспользуемся командлетом Select-Object, чтобы выбрать колонку со временем запроса.

Test-Connection selectel.ru | Select-Object ‘Time(ms)’

После запуска данной команды можно наблюдать, как с некоторой задержкой печатаются пустые строки по одной.

Test-connection

Но как же так? Дело в том, что отображение объекта при выводе на экран не всегда соответствует имени поля в объекте. Чтобы получить полный список полей в объекте, необходимо вызвать командлет Get-Member.

PS C:\Users\sun> Test-connection selectel.ru | Get-Member TypeName: System.Management.ManagementObject#root\cimv2\Win32_PingStatus Name MemberType Definition ---- ---------- ---------- PSComputerName AliasProperty PSComputerName = __SERVER Address Property string Address BufferSize Property uint32 BufferSize NoFragmentation Property bool NoFragmentation PrimaryAddressResolutionStatus Property uint32 PrimaryAddressResolutionStatus ProtocolAddress Property string ProtocolAddress ProtocolAddressResolved Property string ProtocolAddressResolved RecordRoute Property uint32 RecordRoute ReplyInconsistency Property bool ReplyInconsistency ReplySize Property uint32 ReplySize ResolveAddressNames Property bool ResolveAddressNames ResponseTime Property uint32 ResponseTime ResponseTimeToLive Property uint32 ResponseTimeToLive RouteRecord Property string[] RouteRecord RouteRecordResolved Property string[] RouteRecordResolved SourceRoute Property string SourceRoute SourceRouteType Property uint32 SourceRouteType StatusCode Property uint32 StatusCode Timeout Property uint32 Timeout TimeStampRecord Property uint32[] TimeStampRecord TimeStampRecordAddress Property string[] TimeStampRecordAddress TimeStampRecordAddressResolved Property string[] TimeStampRecordAddressResolved TimestampRoute Property uint32 TimestampRoute TimeToLive Property uint32 TimeToLive TypeofService Property uint32 TypeofService __CLASS Property string __CLASS __DERIVATION Property string[] __DERIVATION __DYNASTY Property string __DYNASTY __GENUS Property int __GENUS __NAMESPACE Property string __NAMESPACE __PATH Property string __PATH __PROPERTY_COUNT Property int __PROPERTY_COUNT __RELPATH Property string __RELPATH __SERVER Property string __SERVER __SUPERCLASS Property string __SUPERCLASS ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime(); ConvertToDateTime ScriptMethod System.Object ConvertToDateTime(); IPV4Address ScriptProperty System.Object IPV4Address  

Можно визуально оценить список и найти поле ResponseTime. Также в начале указан тип данного объекта, Win32_PingStatus, информацию о котором можно поискать в базе знаний Microsoft. В документации не только перечислены поля, но и их назначение. Таким образом, конечный вид конвейера будет таким:

Test-connection selectel.ru | Select-Object ResponseTime

Хотя PowerShell побуждает к интерактивной работе, его основное предназначение — автоматизировать рутинные задачи. Значит, необходимо писать скрипты.

Используйте PowerShell в работе с выделенным сервером

Соберите сервер в конфигураторе под свои задачи. Или выберите из более 100 готовых.

Интегрированная среда разработки

Среда разработки

Если вы запускали PowerShell через поиск, вероятно, вы могли заметить приложение Windows PowerShell ISE.

PowerShell-скрипты — это текстовые файлы с расширением .ps1.

Windows PowerShell ISE — это интегрированная среда сценариев PowerShell, включающая в себя:

  • редактор PowerShell-скриптов с автодополнением,
  • окно для интерактивного выполнения командлетов в скрипте,
  • список доступных командлетов с поиском.

Перечень команд

Справка Test-Connection

Обратите внимание, что модуль ISE предоставляет графический интерфейс для генерации аргументов командлета. Помимо генерации команд, в функции модуля также входит вызов «справочника» по командлетам, аналогичного Get-Help, только в графическом интерфейсе.

После написания своего первого PowerShell-скрипта вы столкнетесь с некоторыми ограничениями. Во-первых, файл с расширением ps1 нельзя запустить «двойным кликом» по файлу. Необходимо открыть контекстное меню с помощью правой клавиши мыши и выбрать Запустить с помощью PowerShell.

Во-вторых, скрипт не запустится со следующей ошибкой:

Невозможно загрузить файл C:\Users\sun\Documents\HelloWorld.ps1, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см. about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/ ?LinkID=135170. + CategoryInfo : Ошибка безопасности: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnauthorizedAccess 

По умолчанию запуск PowerShell-скриптов ограничен соответствующей политикой безопасности. Посмотреть текущее значение политики безопасности можно с помощью командлет Get-ExecutionPolicy:

PS C:\Users\sun> Get-ExecutionPolicy Restricted 

Список возможных значений:

  • Restricted — запуск запрещен,
  • AllSigned — разрешен только запуск подписанных доверенным разработчиком скриптов,
  • RemoteSigned — разрешен запуск подписанных и собственных скриптов,
  • Unrestricted — разрешен запуск любых скриптов.

По умолчанию стоит значение Restricted. В идеале необходимо подписывать скрипты, но для собственных нужд можно ограничиться значением RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Для выполнения данной команды необходимо запустить PowerShell от имени администратора.

Выполнение задач в фоне

Консоль PowerShell

PowerShell позволяет выполнять задачи в фоновом режиме, эту функциональность обеспечивают командлеты с существительным Job:

  • Start-Job — запустить команду или командлет в фоновом режиме,
  • Get-Job — показать состояние фоновых команд,
  • Wait-Job — дождаться завершения выполнения фоновой команды,
  • Receive-Job — получить результат выполнения команды.

Командлет Start-Job возвращает информацию о запущенном фоновом задании. Идентификатор, обозначенный в поле Id, является уникальным для сессии PowerShell.

Настройка удаленного выполнения

PowerShell позволяет реализовать удаленное выполнение командлетов, скриптов, но только на платформе Windows. Для включения возможности удаленного управления необходимо выполнить командлет Enable-PSRemoting с правами администратора.

Командлет Enter-PSSession запустит удаленную интерактивную сессию, а Invoke-Command выполнит команду на одном или нескольких удаленных компьютерах.

PowerShell – актуальные версии программы

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

На момент написания статьи актуальная версия PowerShell — 7.2. Используйте этот текст в качестве краткого справочника по Windows PowerShell, администрирование систем со скриптами в этой программе будет довольно простым.

Подробные инструкции. Создание ключей SSH для аутентификации на виртуальной машине Linux в Azure и управление этими ключами

С помощью пары ключей Secure Shell (SSH) можно создать виртуальную машину Linux, использующую ключи SSH для проверки подлинности. В этой статье показано, как создать и использовать пару файлов открытого и закрытого ключей SSH RSA для клиентских соединений по SSH.

Если вам нужны быстрые команды, а не более подробное описание ключей SSH, см. статью Создание пары открытого и закрытого ключей SSH для виртуальных машин Linux в Azure.

Сведения о создании ключей SSH и их использовании для подключения к виртуальной машине Linux с компьютера Windows см. в статье Использование ключей SSH с ОС Windows в Azure. Вы также можете использовать портал Azure для создания ключей SSH и управления ими при создании виртуальных машин на портале.

Общие сведения о SSH и ключах

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

  • Открытый ключ размещается на виртуальной машине.
  • Закрытый ключ остается в локальной системе. Его нужно защищать и нельзя никому предоставлять.

При использовании клиента SSH для подключения к виртуальной машине (с открытым ключом) удаленная виртуальная машина проверяет, имеется ли у клиента правильный закрытый ключ. Если у клиента есть закрытый ключ, он получает доступ к виртуальной машине.

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

Открытый ключ можно предоставить любому пользователю, но только вы (или ваша локальная инфраструктура безопасности) должны иметь доступ к вашему закрытому ключу.

Поддерживаемые форматы ключей SSH

В настоящее время платформа Azure поддерживает пары из открытого и закрытого ключей SSH-2 RSA длиной не менее 2048 битов. Другие форматы ключей, например ED25519 и ECDSA, не поддерживаются.

Использование ключей SSH и их преимущества

При создании виртуальной машины Azure с открытым ключом платформа Azure копирует его (в формате .pub ) в папку ~/.ssh/authorized_keys на виртуальной машине. Ключи SSH в ~/.ssh/authorized_keys гарантируют, что при подключении клиентов с помощью SSH предоставляется соответствующий закрытый ключ. На виртуальной машине Linux Azure, которая использует ключи SSH для проверки подлинности, Azure отключает систему проверки пароля на сервере SSH и разрешает только проверку подлинности ключа SSH. Создавая виртуальные машины Linux в Azure с использованием ключей SSH, вы защищаете это развертывание и выполняете стандартный шаг настройки после развертывания — отключаете пароли в файле sshd_config .

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

Создание ключей с помощью ssh-keygen

Для создания ключей лучше использовать команду ssh-keygen , которая доступна в служебных программах OpenSSH в Azure Cloud Shell, на узле macOS или Linux и в Windows 10 и 11. Команд ssh-keygen задает несколько вопросов, а затем записывает закрытый ключ и соответствующий открытый ключ.

Ключи SSH по умолчанию хранятся в каталоге ~/.ssh . Если у вас нет каталога ~/.ssh , создайте его с правильными разрешениями с помощью команды ssh-keygen . Ключ SSH создается как ресурс и хранится в Azure для последующего использования.

Можно также создать ключи с Azure CLI с помощью команды az sshkey create, как описано в статье Создание и хранение ключей SSH.

Простой пример

Приведенная ниже команда ssh-keygen создает файлы 4096-разрядных открытого и закрытого ключей SSH RSA в каталоге ~/.ssh по умолчанию. Если в текущем каталоге обнаруживается пара ключей SSH, эти файлы будут перезаписаны.

ssh-keygen -m PEM -t rsa -b 4096 

Подробный пример

В следующем примере показаны дополнительные параметры команды для создания пары ключей SSH RSA. Если в текущем каталоге существует пара ключей SSH, они будут перезаписаны.

ssh-keygen \ -m PEM \ -t rsa \ -b 4096 \ -C "azureuser@myserver" \ -f ~/.ssh/mykeys/myprivatekey \ -N mypassphrase 

Описание команды

ssh-keygen — программа, с помощью которой создаются ключи.

-m PEM — преобразование ключа в формат PEM.

-t rsa — тип создаваемого ключа; в данном случае создается ключ в формате RSA.

-b 4096 — количество битов в ключе; в данном случае ключ содержит 4096 битов.

-C "azureuser@myserver" — комментарий, который будет добавлен в конец файла открытого ключа для идентификации. Обычно в качестве комментария используется адрес электронной почты, но вы можете выбрать для своей инфраструктуры любой удобный метод идентификации.

-f ~/.ssh/mykeys/myprivatekey — имя файла закрытого ключа, если вы решили не использовать имя по умолчанию. В том же каталоге будет создан соответствующий файла открытого ключа с .pub в имени. Этот каталог должен существовать.

-N mypassphrase — дополнительная парольная фраза, используемая для доступа к файлу закрытого ключа.

Пример с ssh-keygen

ssh-keygen -t rsa -m PEM -b 4096 -C "azureuser@myserver" Generating public/private rsa key pair. Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/azureuser/.ssh/id_rsa. Your public key has been saved in /home/azureuser/.ssh/id_rsa.pub. The key fingerprint is: SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver The key's randomart image is: +---[RSA 4096]----+ | .oE=*B*+ | | o+o.*++| | .oo++*| | . .B+.O| | S o=BO.| | . .o++o | | . . . | | .. . | | .. | +----[SHA256]-----+ 
Сохраненные файлы ключей

Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa

Имя пары ключей, используемое в этой статье. По умолчанию пара ключей называется id_rsa . Так как некоторые инструменты ищут закрытый ключ в файле id_rsa , имеет смысл создать такой файл. Пары ключей SSH и файл конфигурации SSH по умолчанию располагаются в каталоге ~/.ssh/ . Если не указать полный путь, ssh-keygen создаст ключи в текущем рабочем каталоге, а не в стандартном каталоге ~/.ssh .

Список содержимого каталога ~/.ssh

Чтобы просмотреть существующие файлы в каталоге ~/.ssh , выполните следующую команду. Если файлы в каталоге отсутствуют или отсутствует сам каталог, убедитесь, что все предыдущие команды успешно выполнены. В некоторых дистрибутивах Linux для изменения файлов в этом каталоге может потребоваться корневой доступ.

ls -al ~/.ssh -rw------- 1 azureuser staff 1675 Aug 25 18:04 id_rsa -rw-r--r-- 1 azureuser staff 410 Aug 25 18:04 id_rsa.pub 
Парольная фраза ключа

Enter passphrase (empty for no passphrase):

Мы настоятельно рекомендуем добавить парольную фразу в закрытый ключ. Если не защитить файл ключа парольной фразой, любой пользователь, у которого есть этот файл, сможет использовать его, чтобы войти на любой из серверов, на котором используется соответствующий открытый ключ. Добавив парольную фразу, вы усилите защиту на случай, если другой пользователь получит доступ к файлу закрытого ключа. Это даст вам время, чтобы изменить ключи.

Автоматическое создание ключей во время развертывания

При использовании Azure CLI для создания виртуальных машин можно дополнительно создать файлы открытого и закрытого ключей SSH, выполнив команду az vm create с параметром --generate-ssh-keys . Эти ключи хранятся в каталоге ~/.ssh. Обратите внимание, что этот параметр команды не перезаписывает ключи, если они уже существуют в этом расположении, например как это бывает с некоторыми предварительно настроенными образами Коллекции вычислений.

Предоставление открытого ключа SSH при развертывании виртуальной машины

Чтобы создать виртуальную машину Linux, которая использует ключи SSH для аутентификации, укажите свой открытый ключ SSH при создании виртуальной машины с помощью портала Azure, интерфейса командной строки, шаблонов Resource Manager или других методов. При использовании портала вводится значение открытого ключа. При использовании Azure CLI создания виртуальной машины с использованием существующего открытого ключа укажите значение или расположение этого ключа, выполнив команду az vm create с параметром --ssh-key-value .

Если вам не знаком формат открытого ключа SSH, чтобы просмотреть его, выполните команду cat , заменив параметр ~/.ssh/id_rsa.pub расположением файла собственного открытого ключа.

cat ~/.ssh/id_rsa.pub 

Пример обезличенных выходных данных приведен ниже:

ssh-rsa XXXXXXXXXXc2EAAAADAXABAAABAXC5Am7+fGZ+5zXBGgXS6GUvmsXCLGc7tX7/rViXk3+eShZzaXnt75gUmT1I2f75zFn2hlAIDGKWf4g12KWcZxy81TniUOTjUsVlwPymXUXxESL/UfJKfbdstBhTOdy5EG9rYWA0K43SJmwPhH28BpoLfXXXXXG+/ilsXXXXXKgRLiJ2W19MzXHp8z3Lxw7r9wx3HaVlP4XiFv9U4hGcp8RMI1MP1nNesFlOBpG4pV2bJRBTXNXeY4l6F8WZ3C4kuf8XxOo08mXaTpvZ3T1841altmNTZCcPkXuMrBjYSJbA8npoXAXNwiivyoe3X2KMXXXXXdXXXXXXXXXXCXXXXX/ azureuser@myserver 

Если вы копируете содержимое файла открытого ключа и вставляете его на портале Azure или в шаблон Resource Manager, в этом содержимом не должно быть дополнительных пробелов или символов разрыва строки. Например, при использовании macOS, чтобы скопировать содержимое файла открытого ключа (по умолчанию это ~/.ssh/id_rsa.pub ), вы можете передать его в pbcopy (или другие аналогичные программы Linux, например xclip ).

Если вы предпочитаете использовать открытый ключ в многострочном формате, можно создать ключ в формате RFC4716 в контейнере pem открытого ключа, созданного ранее.

Чтобы создать ключ в формате RFC4716 из существующего открытого ключа SSH, выполните следующую команду:

ssh-keygen \ -f ~/.ssh/id_rsa.pub \ -e \ -m RFC4716 > ~/.ssh/id_ssh2.pem 

Установление SSH-подключения к виртуальной машине с помощью клиента SSH

С помощью открытого ключа, развернутого на виртуальной машине Azure, и закрытого ключа в локальной системе установите SSH-подключение к виртуальной машине, используя ее IP-адрес или DNS-имя. Замените azureuser и myvm.westus.cloudapp.azure.com в приведенной команде, указав имя пользователя администратора и полное доменное имя (или IP-адрес).

ssh azureuser@myvm.westus.cloudapp.azure.com 

Если при создании пары ключей вы указали парольную фразу, введите ее при появлении запроса во время входа в систему. (Сервер добавляется в папку ~/.ssh/known_hosts . Если не изменять открытый ключ на виртуальной машине Azure или не удалять имя сервера из файла ~/.ssh/known_hosts , запрос на подключение повторно не отображается.)

Если виртуальная машина использует политику доступа JIT, запросите доступ, прежде чем подключиться к виртуальной машине. Дополнительные сведения о политике JIT см. в статье Управление доступом к виртуальным машинам с помощью JIT-доступа.

Использование ssh-agent для хранения парольной фразы закрытого ключа

Чтобы не вводить парольную фразу файла закрытого ключа при каждом входе с помощью SSH, вы можете использовать ssh-agent , чтобы сохранить эту фразу в кэше локальной системы. Если вы используете компьютер Mac, при вызове ssh-agent парольная фраза закрытого ключа будет надежно сохранена в цепочке ключей macOS.

С помощью ssh-agent и ssh-add сообщите системе SSH о файлах ключей, чтобы вам не нужно было использовать парольную фразу в интерактивном режиме.

eval "$(ssh-agent -s)" 

Затем добавьте закрытый ключ к ssh-agent с помощью команды ssh-add .

ssh-add ~/.ssh/id_rsa 

Теперь парольная фраза закрытого ключа хранится в ssh-agent .

Копирование ключа на имеющуюся виртуальную машину с помощью ssh-copy-id

Если виртуальная машина Linux уже создана, вы можете добавить для нее новый открытый ключ SSH с помощью ssh-copy-id :

ssh-copy-id -i ~/.ssh/id_rsa.pub azureuser@myserver 

Создание и настройка файла конфигурации SSH

Чтобы ускорить процесс входа и оптимизировать поведение клиента SSH, можно создать и настроить файл конфигурации SSH ~/.ssh/config .

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

touch ~/.ssh/config 

Изменение файла для добавления новой конфигурации SSH

vim ~/.ssh/config 

Добавьте параметры конфигурации для виртуальной машины узла. В этом примере имя виртуальной машины (узла) — myvm, имя учетной записи (пользователь) — azureuser, а IP-адрес или полное доменное имя (имя узла) — 192.168.0.255.

# Azure Keys Host myvm Hostname 192.168.0.255 User azureuser # ./Azure Keys 

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

Теперь, когда у вас есть пара ключей SSH и настроенный файл конфигурации SSH, вы можете пользоваться быстрым и безопасным удаленным доступом для входа на виртуальную машину Linux. При выполнении следующей команды служба SSH находит и загружает все параметры из блока Host myvm в файле конфигурации SSH.

ssh myvm 

При первом входе на сервер с использованием ключа SSH команда запрашивает парольную фразу для этого файла ключа.

Дальнейшие действия

Следующий шаг — создание виртуальных машин Linux Azure с помощью нового открытого ключа SSH. Виртуальные машины Azure, созданные с использованием открытого ключа SSH в качестве данных для входа, защищены лучше, чем виртуальные машины, созданные с помощью метода по умолчанию, предусматривающего использование паролей.

  • Создание виртуальной машины Linux с помощью портала Azure
  • Создание виртуальной машины Linux с помощью Azure CLI
  • Создание виртуальной машины Linux с помощью шаблона Azure

Dockerfile в Windows

Подсистема Docker содержит средства, автоматизирующие создание образов контейнеров. Хотя образы контейнеров можно создавать вручную с помощью команды docker commit , внедрение процесса автоматического создания образа предоставляет множество преимуществ, в том числе:

  • Сохранение образов контейнеров в виде кода.
  • Быстрое и точное воссоздание образов контейнеров для обслуживания и обновления.
  • Непрерывная интеграция между образами контейнеров и циклом разработки.

За такую автоматизацию отвечают два компонента Docker — файл Dockerfile и команда docker build .

Dockerfile — это текстовый файл с инструкциями, необходимыми для создания образа контейнера. Эти инструкции включают идентификацию существующего образа, используемого в качестве основы, команды, выполняемые в процессе создания образа, и команду, которая будет выполняться при развертывании новых экземпляров этого образа контейнера.

Docker build — команда подсистемы Docker, использующая файл Dockerfile и запускающая процесс создания образа.

В этом разделе рассказывается о том, как использовать файлы Dockerfile с контейнерами Windows, а также объясняются наиболее распространенные инструкции и базовый синтаксис таких файлов.

Здесь также рассматривается концепция образов контейнеров и их слоев. Дополнительные сведения об образах и их слоях см. в документации по базовым образам контейнеров.

Полный обзор файлов Dockerfile см. в справке по Dockerfile на странице .

Базовый синтаксис

В исходной форме файл Dockerfile может быть очень простым. Следующий пример создает образ, включающий IIS и сайт "hello world". Этот пример включает комментарии (обозначенные с помощью # ), поясняющие каждый шаг. В последующих разделах этой статьи более подробно рассматриваются правила синтаксиса Dockerfile и инструкции Dockerfile.

Файл Dockerfile необходимо создавать без расширения. Чтобы сделать это в Windows, создайте файл с помощью удобного для вас редактора, а затем сохраните его, используя нотацию "Dockerfile" (вместе с кавычками).

# Sample Dockerfile # Indicates that the windowsservercore image will be used as the base image. FROM mcr.microsoft.com/windows/servercore:ltsc2019 # Metadata indicating an image maintainer. LABEL maintainer="jshelton@contoso.com" # Uses dism.exe to install the IIS role. RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart # Creates an HTML file and adds content to this file. RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html # Sets a command or process that will run each time a container is run from the new image. CMD [ "cmd" ] 

Дополнительные примеры файлов Dockerfile для Windows см. в репозитории файлов Dockerfile для Windows.

Instructions

Инструкции Dockerfile дают подсистеме Docker необходимые указания для создания образа контейнера. Эти инструкции выполняются по очереди, одна за другой. Ниже приведены примеры наиболее часто используемых инструкций в файлах Dockerfile. Полный список инструкций Dockerfile см. в справочнике по файлам Dockerfile.

FROM

Инструкция FROM задает образ контейнера, который будет применяться при создании нового образа. Например, при использовании инструкции FROM mcr.microsoft.com/windows/servercore полученный образ является производным и зависимым от базового образа ОС Windows Server Core. Если указанный образ отсутствует в системе, где выполняется процесс сборки Docker, подсистема Docker попытается скачать его из общедоступного или частного реестра образов.

Формат инструкции FROM выглядит следующим образом:

FROM

Ниже приведен пример команды FROM.

Чтобы загрузить Windows Server Core версии ltsc2019 из Реестра контейнеров (Майкрософт):

FROM mcr.microsoft.com/windows/servercore:ltsc2019 

ВЫПОЛНИТЬ

Инструкция RUN задает команды, которые следует выполнить и поместить в новый образ контейнера. Эти команды могут включать такие элементы, как установка программного обеспечения, создание файлов и папок, а также создание конфигурации среды.

Инструкция RUN выглядит следующим образом:

# exec form RUN ["", "", ""] # shell form RUN

Различие между формой исполняемого файла (exec form) и формой оболочки (shell form) заключается в способе выполнения инструкции RUN . При использовании формы исполняемого файла указанная программа запускается явным образом.

Ниже приведен пример формы исполняемого файла.

FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN ["powershell", "New-Item", "c:/test"] 

Полученный образ выполняет команду powershell New-Item c:/test :

docker history doc-exe-method IMAGE CREATED CREATED BY SIZE COMMENT b3452b13e472 2 minutes ago powershell New-Item c:/test 30.76 MB 

В отличие от предыдущего примера здесь та же операция выполняется с использованием формы оболочки:

FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell New-Item c:\test 

Полученный образ содержит инструкцию RUN cmd /S /C powershell New-Item c:\test .

docker history doc-shell-method IMAGE CREATED CREATED BY SIZE COMMENT 062a543374fc 19 seconds ago cmd /S /C powershell New-Item c:\test 30.76 MB 

Рекомендации по использованию инструкции RUN с Windows

В Windows при использовании инструкции RUN в формате исполняемого файла необходимо экранировать инструкции символы обратной косой черты.

RUN ["powershell", "New-Item", "c:\\test"] 

Если целевая программа является установщиком Windows, чтобы запустить фактическую процедуру (автоматической) установки, необходимо извлечь программу установки, используя флаг /x: . Прежде чем выполнять какие-либо другие действия, необходимо дождаться завершения выполнения команды. В противном случае процесс будет завершен преждевременно и без установки. Дополнительные сведения см. в приведенном ниже примере.

Примеры использования инструкции RUN с Windows

В следующем примере для установки служб IIS в образе контейнера используется система DISM.

RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart 

Этот пример устанавливает распространяемый пакет Visual Studio. Start-Process и параметр -Wait используются для запуска программы установки. Это гарантирует, что установка будет завершена до перехода к следующей инструкции в Dockerfile.

RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait 

Подробные сведения об инструкции RUN см. в справочнике по RUN на странице .

КОПИРОВАТЬ

Инструкция COPY копирует файлы и каталоги в файловую систему контейнера. Эти файлы и каталоги должны иметь путь, являющийся относительным для Dockerfile.

Формат инструкции COPY выглядит следующим образом:

COPY

Если источник или назначение содержит пробел, заключите путь в квадратные скобки и двойные кавычки, как показано в следующем примере:

COPY ["", ""] 
Рекомендации по использованию инструкции COPY с Windows

В Windows для путей назначения необходимо использовать символы косой черты. Например, здесь показаны допустимые инструкции COPY .

COPY test1.txt /temp/ COPY test1.txt c:/temp/ 

При этом следующий формат с обратными косыми чертами работать не будет:

COPY test1.txt c:\temp\ 
Примеры использования инструкции COPY с Windows

В следующем примере содержимое исходного каталога добавляется в каталог с именем sqllite в образе контейнера.

COPY source /sqlite/ 

В следующем примере все файлы, начинающиеся с config, добавляют в каталог c:\temp образа контейнера.

COPY config* c:/temp/ 

Дополнительные сведения об инструкции COPY см. в справочнике по инструкции COPY.

ADD

Инструкция ADD похожа на инструкцию COPY, но с дополнительными возможностями. Кроме копирования файлов с узла в образ контейнера, инструкция ADD также позволяет скопировать файлы из удаленного расположения с помощью задания URL-адреса.

Формат инструкции ADD выглядит следующим образом:

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

Рекомендации по выполнению инструкции ADD с Windows

В Windows для путей назначения необходимо использовать символы косой черты. Например, здесь показаны допустимые инструкции ADD .

ADD test1.txt /temp/ ADD test1.txt c:/temp/ 

При этом следующий формат с обратными косыми чертами работать не будет:

ADD test1.txt c:\temp\ 

Кроме того, в системе Linux во время копирования инструкция ADD распаковывает сжатые пакеты. В Windows эта функция недоступна.

Примеры использования инструкции ADD с Windows

В следующем примере содержимое исходного каталога добавляется в каталог с именем sqllite в образе контейнера.

ADD source /sqlite/ 

В следующем примере все файлы, начинающиеся с "config", добавляют в каталог c:\temp образа контейнера.

ADD config* c:/temp/ 

В этом примере Python для Windows скачивается в каталог c:\temp образа контейнера.

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe 

Дополнительные сведения об инструкции ADD см. в справочнике по инструкции ADD.

WORKDIR

Инструкция WORKDIR задает рабочий каталог для других инструкций Dockerfile, например RUN и CMD , а также рабочий каталог для запущенных экземпляров образа контейнера.

Формат инструкции WORKDIR выглядит следующим образом:

WORKDIR
Рекомендации по использованию инструкции WORKDIR с Windows

Если в Windows рабочий каталог содержит обратную косую черту, ее следует экранировать.

WORKDIR c:\\windows 

Примеры

WORKDIR c:\\Apache24\\bin 

Подробные сведения об инструкции WORKDIR см. в справочнике по WORKDIR.

CMD

Инструкция CMD задает команду по умолчанию, выполняемую при развертывании экземпляра образа контейнера. Например, если в контейнере будет размещен веб-сервер NGINX, CMD может включать инструкции для запуска этого веб-сервера, например с помощью команды nginx.exe . Если в файле Dockerfile указано несколько инструкций CMD , вычисляется только последняя из них.

Формат инструкции CMD выглядит следующим образом:

# exec form CMD [""] # shell form CMD
Рекомендации по использованию инструкции CMD с Windows

В Windows для путей к файлам, указанным в инструкции CMD , следует использовать символы косой черты или экранировать символы обратной косой черты \\ . Допустимы следующие инструкции CMD :

# exec form CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"] # shell form CMD c:\\Apache24\\bin\\httpd.exe -w 

Однако следующий формат без соответствующих косых черт работать не будет:

CMD c:\Apache24\bin\httpd.exe -w 

Дополнительные сведения об инструкции CMD см. в справочнике по инструкции CMD.

Escape-символ

Во многих случаях инструкция Dockerfile должна занимать несколько строк. Для этого можно использовать escape-символ. Escape-символ Dockerfile по умолчанию — обратная косая черта ( \ ). Однако, поскольку обратная косая черта также является разделителем пути к файлу в Windows, использование его для разделения нескольких строк может вызвать проблемы. Чтобы их избежать, можно изменить escape-символ по умолчанию с помощью директивы анализатора. Дополнительные сведения о директивах анализатора см. в этом разделе.

В следующем примере показана инструкция RUN, которая занимает несколько строк и использует escape-символ по умолчанию.

FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell.exe -Command \ $ErrorActionPreference = 'Stop'; \ wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \ Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \ Remove-Item c:\python-3.5.1.exe -Force 

Чтобы изменить escape-символ, поместите директиву Parser для escape-символа на первую строку Dockerfile. Это показано в следующем примере.

В качестве escape-символов можно использовать только символы: \ и ` .

# escape=` FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell.exe -Command ` $ErrorActionPreference = 'Stop'; ` wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; ` Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; ` Remove-Item c:\python-3.5.1.exe -Force 

Дополнительные сведения о директиве анализатора для escape-символа см. в этом разделе.

PowerShell в Dockerfile

Командлеты PowerShell

Командлеты PowerShell можно выполнять в Dockerfile при помощи операции RUN .

FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\ 

Вызовы REST

При сборе данных или файлов из веб-службы удобно использовать командлет PowerShell Invoke-WebRequest . Например, при сборке образа, включающего Python, можно задать для $ProgressPreference значение SilentlyContinue , чтобы ускорить загрузку, как показано в следующем примере.

FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell.exe -Command \ $ErrorActionPreference = 'Stop'; \ $ProgressPreference = 'SilentlyContinue'; \ Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \ Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \ Remove-Item c:\python-3.5.1.exe -Force 

Invoke-WebRequest также работает на сервере Nano Server.

Кроме того, при помощи PowerShell можно скачивать файлы во время создания образа, используя библиотеку .NET WebClient. Это может повысить производительность скачивания. Следующий пример скачивает программное обеспечение Python, используя библиотеку WebClient.

FROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell.exe -Command \ $ErrorActionPreference = 'Stop'; \ (New-Object System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe','c:\python-3.5.1.exe') ; \ Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \ Remove-Item c:\python-3.5.1.exe -Force 

Сейчас Nano Server не поддерживает WebClient.

Сценарии PowerShell

В некоторых случаях удобно скопировать крипт в контейнеры, используемые при создании образа, и затем запустить его из контейнера.

Это ограничивает возможности кэширования слоев образов, а также ухудшает удобочитаемость файла Dockerfile.

Этот пример копирует сценарий с компьютера сборки в контейнер с помощью инструкции ADD . Затем этот сценарий выполняется с помощью инструкции RUN.

FROM mcr.microsoft.com/windows/servercore:ltsc2019 ADD script.ps1 /windows/temp/script.ps1 RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1 

Команда Docker build

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

Формат команды docker build выглядит следующим образом:

docker build [OPTIONS] PATH 

Например, следующая команда создает образ с именем "iis".

docker build -t iis . 

При инициации процесса сборки в выходных данных указывается состояние и выводятся все возникающие ошибки.

C:\> docker build -t iis . Sending build context to Docker daemon 2.048 kB Step 1 : FROM mcr.microsoft.com/windows/servercore:ltsc2019 ---> 6801d964fda5 Step 2 : RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart ---> Running in ae8759fb47db Deployment Image Servicing and Management tool Version: 10.0.10586.0 Image Version: 10.0.10586.0 Enabling feature(s) The operation completed successfully. ---> 4cd675d35444 Removing intermediate container ae8759fb47db Step 3 : RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html ---> Running in 9a26b8bcaa3a ---> e2aafdfbe392 Removing intermediate container 9a26b8bcaa3a Successfully built e2aafdfbe392 

В результате создается новый образ контейнера, который в этом примере носит имя "iis".

docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE iis latest e2aafdfbe392 About a minute ago 207.8 MB windowsservercore latest 6801d964fda5 4 months ago 0 B 

Дополнительные материалы и справочники

  • Оптимизация файлов Dockerfile и сборка команды Docker build для Windows
  • Справочник по Dockerfile

HVBackup - backup виртуальных машин hyper-v

Хочу поделиться с вами простым и быстрым способом бесплатно бэкапить виртуальные машины, работающие под гипервизором hyper-v с помощью утилиты hvbackup. Если в режиме работы полноценного сервера с графическим интерфейсом это может быть не очень актуально, так как присутствует штатное средство для бэкапа, но если вы используете бесплатную версию Hyper-V Server, вопрос становится очень актуальным.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти вступительный тест.

Если вы еще не настроили бесплатный гипервизор hyper-v, рекомендую познакомиться с моим материалом на эту тему - Установка и настройка Windows Hyper-V Server 2019. Если у вас он уже настроен и встал вопрос о том, как быстро, удобно и бесплатно его забэкапить, то я рекомендую воспользоваться бесплатной утилитой HV Backup.

HVBackup описание утилиты для hyper-v

Основной целью проекта HVBackup было создание бесплатного, простого и эффективного решения для резервного копирования виртуальных машин hyper-v, работающих как в одиночном режиме, так и в кластере.

Утилита работает на всех версиях операционной системы, начиная с Windows Server 2008 и далее, как в графическом режиме, так и Server Core установках. Утилита поддерживает в том числе и бесплатную редакцию гипервизора Hyper-V Server.

HVBackup поддерживает app consistent и crash consistent бэкапы hyper-v, используя VSS, встроенный в систему. Существует множество коммерческих решений, основанных на таком же способе бэкапа виртуальных машин, но среди бесплатных мне известен только этот продукт.

Компания codeplex, производитель программы, утверждает, что она регулярно использует HVBackup в своей инфраструктуре, что гарантирует высокое качество работы и своевременные исправления или изменения.

Программа может запускаться из командной строки, вызываться из Powershell скриптов, либо быть встроенной в любое .Net приложение через соответствующую библиотеку.

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

Системные требования:
.Net Framework 3.5

Установка .Net Framework 3.5 в командной строке

Чтобы установить .Net Framework 3.5 необходимо выполнить следующие команды в Powershell.

Windows Server или Hyper-V Server 2012:

Install-WindowsFeature NET-Framework-Core

Windows Server 2008 или 2008 R2 (не core):

ocsetup NetFx3

Windows Server (core) или Hyper-V Server 2008 / 2008 R2:

ocsetup NetFx3-ServerCore

HVBackup пример использования

Выполнить полный VSS backup всех виртуальных машин хоста:

HVBackup -a -o d:\vm-backup

Выполнить полный VSS backup списка виртуальных машин (необходимо использовать кавычки, если имена машин содержат пробелы). Бэкап выполняется на удаленный сервер:

HVBackup -l "VM1,VM2" -o \\backup-server\wm-backup

Сделать полный бэкап виртуальных машин, список которых содержится в текстовом файле (каждая ВМ в отдельной строке):

HVBackup -f list.txt -o d:\wm-backup

Скрипт для автоматического бэкапа

Если вы хотите запланировать автоматическое выполнение резервного копирования, то удобнее всего сделать простой bat файл для этих целей и запланировать его исполнение. Создадим backup-all.cmd следующего содержания:

set BCKPATH="\\backup-server\wm-backup" rem net use %BCKPATH% /user:  pushd %BCKPATH% && forfiles.exe -m *.zip -d -7 -c "cmd /c del @path" popd HVBackup.exe -a -o %BCKPATH% 1> log_out.txt 2> log_err.txt

Этот скрипт перед выполнением бэкапа всех виртуальных машин будет удалять zip файлы старше 7-ми дней в указанной директории. Пути и параметры вы можете подредактировать под свои нужды.

Теперь создадим запланированное задание на сервере для периодического выполнения резервного копирования созданным ранее скриптом:

schtasks.exe /create /tn HVBackup /tr c:\backup-all.cmd /sc DAILY /ru /rp /st 01:00:00

Если необходимо удалить задание:

schtasks.exe /delete /tn HVBackup /f

Немедленное выполнение задания:

schtasks.exe /run /tn HVBackup

Параметры командной строки HVBackup

Использование: HVBackup.exe [options]

-b, --backup
Выполнить backup (по-умолчанию).
-r, --restore
Выполнить восстановление.
-f, --file
Текстовый файл, содержащий список виртуальных машин по одной в каждой строке.
-l, --list
Список виртуальных машин для бэкапа.
-a, --all
Резервное копирование всех виртуальных машин на сервере.
-n, --name
Если указано, то делается бэкап только перечисленных виртуальных машин.
-g, guid
Если указано, то делается бэкап перечисленных виртуальных машин по GUID.
-o, --output
Обязательный параметр. Конечная папка для архивов. Может быть в виде локального или сетевого пути.
--outputformat
Формат имени архива виртуальной машины. имя машины, GUID машины и текущая дата и время. По-умолчанию: "_.zip"
-s, --singlevss
Сделать один snapshot для всех виртуальных машин.
--help
Вывести справку по командам:

hvbackup

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

На этом все. Единственное замечание - я не тестировал падение производительности во время выполнения бэкапа. На глаз я не заметил никаких тормозов в работе виртуальных машин. Но они у меня все ненагруженные были. Время выполнения бэкапа каждой машины значительное. Но, конечно, оно зависит от множества факторов.

Есть хорошая возможность совместить HVBackup и бэкап серверов с rsync. Например, делать архивы локально на сервере с hyper-v, монтировать к linux серверу папку и с помощью rsync забирать zip файлы с виртуальными машинами. Либо сразу делать резервное копирование на линуксовую самбу, к примеру. По приведенной выше ссылки есть пример на эту тему.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите подробнее программу по ссылке.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

37 комментариев

Проблемка!( Программа не видит виртуальные машины! Если в конфиге указать -а, то запускается, не вижу виртуалки, до свидания! Если реально указать лист с названиями! Ворнинг. Виртуальная машина не найдена! Что с эти делать? Сталкивался кто?

К сожалению функция восстановления не работает. Не знаете, как восстановить машину? Ключ -r не работает.

А как на Core установить пакет Visual C++ для Visual Studio?
По ходу никак. Значит теперь этот вариант не для core
А почему никак? Я давно не использовал эту штуку, поэтому не могу подсказать.

Zerox, привет.
По ходу что-то не то сделал и обращаюсь за помощью.
1. Установил .Net Framework 3.5
2. По ссылке скачал утилитку
3. Распаковал на гипервизор 2016 (редакция Core) при попытке запуска файла в повершеле (теперь он называется HyperVBackup.exe) сервер пишет следующее
"HyperVBackup : Имя "HyperVBackup" не распознано как имя командлета, функции, файла сценария или
выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пу
ти, после чего повторите попытку."

Попробуй запустить не в powershell, а в обычном cmd и используй имя файла с .exe - HyperVBackup.exe.
+ Получилось. Теперь все как у всех 🙂 те же ошибки и предупреждения. Читаем дальше

Как правильно установить программу? Я скачал архив с программой, распаковал на сервере c hyper v. Netframework 35 уже был установлен. Запускаю exe-шник с программой, после этого мелькнул экран с командной строкой и закрылся.

Так у меня вся статья на тему того, как пользоваться программой. Вы ее читали, или сразу комментировать пошли?

Статью я читал, но ни где написано что делать со скачанным архивом hvbackup. Ну да ладно проехали, сам разобрался. Другой вопрос, возникает ошибка при создании бэкапа: C:\Windows\system32>C:\HyperVBackup.v3\HyperVbackup.exe -l "Virt2" -o E:\WBADMIN\
HyperVBackup 3
Copyright (C) 2012 Cloudbase Solutions SRL
Copyright (C) 2016/2017 Coliseo Software SRL
[2020-07-22 13:32:11.1244] Info: HyperVBackup started at 22.07.2020 13:32:11 Error: Не удалось загрузить файл или сборку "AlphaVSS.x64.dll" либо одну из их зависимостей. Не найден указанный модуль.
в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.Assembly.Load(AssemblyName assemblyRef)
в Alphaleonis.Win32.Vss.VssUtils.LoadImplementation()
в HyperVBackUp.Engine.BackupManager.BackupSubset(IDictionary`2 vmNamesMapSubset, Options options, ILogger logger)
в HyperVBackUp.Engine.BackupManager.VssBackup(IEnumerable`1 vmNames, VmNameType nameType, Options options, ILogger logger)
в HyperVBackup.Console.Program.Main(String[] args)
[2020-07-22 13:32:11.7806] Error: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "AlphaVSS.x64.dll" либо одну из их зависимостей. Не найден указанный модуль.
Имя файла: 'AlphaVSS.x64.dll'
в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.Assembly.Load(AssemblyName assemblyRef)
в Alphaleonis.Win32.Vss.VssUtils.LoadImplementation()
в HyperVBackUp.Engine.BackupManager.BackupSubset(IDictionary`2 vmNamesMapSubset, Options options, ILogger logger)
в HyperVBackUp.Engine.BackupManager.VssBackup(IEnumerable`1 vmNames, VmNameType nameType, Options options, ILogger logger)
в HyperVBackup.Console.Program.Main(String[] args) В чем может быть проблема?

Судя по всему Visual C++ redist package не хватает.

Добрый день! Можно ли восстанавливать бэкап на другом сервере с Hyper-V? Если можно напишите полную команду восстановления машины или пример восстановления

Можно. Я сейчас точно не помню, в каком формате на выходе бэкап у HVBackup, но вроде бы получается то же самое, что если бы вы сделали экспорт виртуальной машины. Соответственно, на другом сервере вам надо сделать импорт виртуальной машины из распакованного бэкапа от HVBackup. Если это не сработает, то можете просто на новом сервере создать виртуальную машину и указать для нее диск из архива HVBackup.

На windows server 2016 core выдавало ошибку о том что отсутствует библиотека AlphaVSS.x64.dll или связанные с ней зависимости, чтобы решить проблему необходимо поставить пакет Visual C++ для Visual Studio 2015. Удачи!

Пользуюсь благодаря вашей статье HVBackup'ером уже более двух лет. Очень доволен, вначале бекапил виртуалки на Hyper-V 2008 , сейчас развернул виртуалки на Hyper-V 2012, думал что прога не справится, мол старая версия, но всё хорошо. На 2012 все бекапит )))

Да, как простой и бесплатный вариант он неплох. Хотя мне кажется, лучше взять бесплатную редакцию Veeam. Я перестал использовать HVBackup, потому что он очень долго выполняет бэкап. Уж не знаю, почему так получается.

Потому, что он етиегомать использует только одно ядро!! у меня на 24х-ядерном сервере бекап выполняется на 15 часов дольше, чем на i5. И как заставить его использоваться остальныя ядра - я так и не понял.

точнее вот, нашлось:
mt Enable multi-threaded compression (only for 7zip
format)
надо будет испробовать

Спасибо большое. На сайте разработчика что-то для внутреннего пользования.
А экзэшник я тоже искал и. не нашёл.
Попробую юзать.
Ещё раз спасибо большое за статью и за быстрый отклик

Спасибо, что отозвались.
В статье Вы пишите Создадим backup-all.cmd,
а в нем HVBackup.exe.
Чувствую, что вопрос мой очень глупый, но
всё же просветите плиз.
Буду очень благодарен

Моя ошибка в предыдущем комментарии. Давно не настраивал hyper-v. Сейчас посмотрел на своих серверах, там действительно .exe файл. Я почему-то подумал, что это был скрипт. Раньше в архиве был экзешник, а сейчас с сайта разработчиков я вообще не пойму, что скачивается. Похоже, что не скомпилированные источники. Попробую разобраться, если что, выложу ту версию, что есть у меня сейчас.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *