Изменяем файл hosts автоматически при старте виртуальной машины Hyper-V с сайтом

Статья последний раз была обновлена 23.01.2026

Сегодня немного дикая задача и не менее дикое исполнение. Все происходит на Windows 11. Значит, у нас есть рабочая станция и виртуальная машина Hyper-V с LAMP на борту и, собственно, разрабатываемым сайтом (все это внезапно расположено на отдельном HDD, подключенном к виртуалке напрямую). Нам необходимо, чтобы при запуске этой виртуальной машины, у которой задан статический IP-адрес в нашей локальной сети, вносились изменения в файл hosts рабочей станции, а при ее остановке — удалялись. Цель проста, нужно чтобы домен сайта в период разработки сопрягался с конкретным IP в сети, и отображался в браузере будто это «настоящий» сайт с прода. После деплоя мы выключаем виртуальную машину и в нашем браузере отображается сайт с «боевого» сервера, пока никакие кэширования еще не мешали этому процессу, даже Redis.

Шаг 1. Ищем триггеры

Для отслеживания статуса виртуальной машины (включение/выключение) потребуется стандартная программа Windows — «Просмотр событий», ее можно запустить через «Win+R» командой eventvwr.msc

просмотр события включения виртуальной машины

Код события журнала Windows (EventID) уникален в рамках одного источника, поэтому его можно смело использовать для наших целей.

Таким образом, я получил код включения (загрузки гостевой операционной системы) — 18601 и выключения — 18508. У вас эти коды будут, естественно, другими. Нас также интересует графа «Источник». Для включения Hyper-V-Chipset, а для выключения Hyper-V-Worker. Можно не углубляться в дебри, с целью осмыслить все эти значения.

  1. Почему включение — Hyper-V-Chipset? Источник Hyper-V-Chipset регистрирует события, связанные с виртуальной «аппаратной» составляющей. Когда вы запускаете ВМ, происходит инициализация виртуального оборудования. Событие 18601 означает, что виртуальный «чипсет» успешно прошел сброс и готов к загрузке гостевой ОС. Это самый близкий к моменту «старта железа» программный маркер.
  2. Почему выключение — Hyper-V-Worker? Источник Hyper-V-Worker (процесс vmwp.exe) отвечает за управление состоянием всей ВМ как процесса в хостовой системе. Когда ВМ завершает работу, именно этот процесс фиксирует закрытие всех дескрипторов, сохранение состояния и фактическую остановку исполнения кода. Событие 18508 генерируется в момент, когда процесс vmwp.exe подтверждает успешный переход ВМ в состояние «выключено».

Шаг 2. Записываем команды в сценарии

Мы получили триггеры, события по которым должны осуществляться определенные действия. В нашем случае, это добавление записи в конец файла hosts (C:\Windows\System32\drivers\etc\hosts) с последующим ее бесследным удалением.

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

Содержимое файла example.com_START.sh

#!/usr/bin/bash
echo -en '\n127.0.0.1 example.com' >> /mnt/c/Windows/System32/drivers/etc/hosts

Содержимое файла example.com_END.sh

#!/usr/bin/bash
sed -i -e 's/127.0.0.1 example.com//g' -e '/^[[:space:]]*$/d' /mnt/c/Windows/System32/drivers/etc/hosts

Оба файла я помещаю в папку C:\Users\kupereal\Desktop\wsl_scripts\, к себе на рабочий стол. Файлы Windows в среде WSL всегда исполняемые (777).

Шаг 3. Настраиваем планировщик

Чтобы все заработало нам потребуется стандартная программа Windows — «Планировщик задач», запускается через «Win+R» командой taskschd.msc

  1. В левом боковом меню на пункте «Библиотека планировщика задач» вызываем контекстное меню и создаем папку с именем change_hosts (любым другим).
  2. Теперь уже на этой папке снова вызываем контекстное меню и создаем задачу.

создание задач по событию в планировщике

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

Теперь разберем первую задачу по скринам без лишних слов.

1 задача вкладка общие
1 задача вкладка триггеры
1 задача вкладка действия

Перечислю значения, вписанные в основные поля на последнем скрине:

  • Программа или сценарий: powershell.exe
  • Добавить аргументы: wsl ./example.com_START.sh
  • Рабочая папка: C:\Users\kupereal\Desktop\wsl_scripts

Вторая задача создается практически полностью идентично первой.

2 задача вкладка общие
2 задача вкладка триггеры
2 задача вкладка действия

Перечислю значения, вписанные в основные поля на последнем скрине:

  • Программа или сценарий: powershell.exe
  • Добавить аргументы: wsl ./example.com_END.sh
  • Рабочая папка: C:\Users\kupereal\Desktop\wsl_scripts

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

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