Шаблон ОС Windows для репозитория должен содержать:
- образ диска ОС;
- скрипт первоначальной настройки;
- файл с метаданными.
Статья описывает этапы подготовки шаблона.
Образ диска ОС
Подготовка образа
Для подготовки образа вы можете:
- установить нужную версию ОС Windows на физический сервер;
- использовать ВМ в платформе.
Чтобы подготовить образ из ВМ:
- Создайте ВМ без операционной системы.
- Измените тип подключения диска ВМ на IDE: раздел Виртуальные машины → выберите ВМ → кнопка Параметры → раздел Виртуальные диски → меню → Редактировать диск → выберите Тип подключения ide → кнопка Изменить и перезапустить.
- Установите на ВМ ОС Windows из ISO-образа. После установки ОС отключите ISO-образ. Подробнее о работе с ISO-образами см. Подключение ISO-образа.
- Чтобы подготовить ВМ к установке драйверов virtio, создайте диск размером 1 ГБ с типом подключения virtio и подключите его к ВМ: раздел Виртуальные машины → выберите ВМ → кнопка Параметры → раздел Виртуальные диски → Подключить еще диск → Создать диск и подключить → выберите Размер 1 ГБ и Тип подключения virtio → кнопка Подключить диск.
- Скачайте и установите на ВМ драйверы Virtio.
- Скачайте и установите на ВМ ПО QEMU Guest Agent.
- Измените тип подключения основного диска ВМ на Virtio: раздел Виртуальные машины → выберите ВМ → кнопка Параметры → раздел Виртуальные диски → меню → Редактировать диск → выберите Тип подключения virtio → кнопка Изменить и перезапустить.
- Подключитесь к ВМ по VNC или SPICE и проверьте, что всё оборудование в диспетчере устройств установлено корректно.
Настройка образа
При первом запуске ОС из шаблона на ней должен выполниться скрипт первоначальной настройки. Для хранения этого скрипта VMmanager создаёт отдельный виртуальный диск. Загрузка скрипта с виртуального диска осуществляется с помощью утилиты dd. Чтобы настроить запуск скрипта:
- Создайте в ОС директорию C:\vmmgr\.
-
Создайте в директории C:\vmmgr\ скрипты firstrun.cmd, firstrun.ps1, ddwrap.cmd:
Файлы скриптов должны быть в формате Windows. Переводы строк должны выполняться с помощью управлящих символов CR LF.firstrun.cmd@echo off powershell.exe C:\vmmgr\firstrun.ps1 >NUL
firstrun.ps1$ddout = C:\vmmgr\ddwrap.cmd $ddout $list = $ddout | select-string "size is 1048576 bytes" -Context 3,0 $list $context = $list.Context.PreContext | select-string Part $str = $context.Line $str C:\vmmgr\dd.exe if=$str of=C:\vmmgr\vmmgr.cmd bs=512 count=2048 C:\vmmgr\vmmgr.cmd
ddwrap.cmdc:\vmmgr\dd.exe --list 2>&1
- Скачайте утилиту dd, распакуйте архив и скопируйте файл dd.exe в директорию C:\vmmgr\ .
-
Разрешите в PowerShell выполнение неподписанных скриптов. Для этого зайдите в PowerShell и выполните команду:
Set-ExecutionPolicy RemoteSigned
- Добавьте скрипт C:\vmmgr\firstrun.cmd в автозагрузку. Для этого создайте в планировщике задание с именем vmmgr_firstrun, которое нужно выполнить при запуске системы. Включите для задания параметр безопасности "Выполнять вне зависимости от регистрации пользователя".
- Завершите работу ОС.
Создание образа
Если вы подготовили образ на физическом сервере:
- Загрузитесь с любого Live CD.
-
Cоздайте образ диска ОС. Это можно сделать с помощью утилиты dd или virt-sparsify.
Пример создания образа с помощью dddd.exe if=\\?\Device\Harddisk0\DR0 of=c:\vmmgr\tempdisk1.img bs=8M
Пояснения к командеПример создания образа с помощью virt-sparsifyvirt-sparsify /path/to/device disk.img
Пояснения к команде
Если вы подготовили образ с помощью VMmanager, порядок создания образа зависит от типа хранилища:
- файловое, NAS:
- Подключитесь к узлу кластера VMmanager по SSH. Подробнее о подключении по SSH см. в статье Настройка рабочего места.
-
Конвертируйте файл диска ВМ в формат RAW:
qemu-img convert -f qcow2 -O raw <qcow_input> <raw_output>
Пояснения к команде
- LVM:
- Подключитесь к узлу кластера VMmanager по SSH. Подробнее о подключении по SSH см. в статье Настройка рабочего места.
-
Экспортируйте файл диска ВМ:
qemu-img convert -f raw -O raw <path_to_vm/raw_input> <raw_output>
Пояснения к команде
- Ceph:
- Подключитесь к серверу-монитору Ceph с исходной ВМ.
-
Экспортируйте файл диска ВМ:
rbd export <pool_name>/<disk_name> <raw_output>
Пояснения к команде
Скрипт первоначальной настройки
Для первоначальной настройки ОС вы можете использовать скрипт, приведённый ниже. Чтобы включить русский язык в настройках ОС, раскомментируйте строки 117-125.
@echo off
setlocal EnableDelayedExpansion
set logfile=C:\setup.log
del /f c:\ifacename.txt
for /f "skip=2 tokens=2,4*" %%A in ('netsh interface show interface') do (
if "%%A" == "Connected" (
echo %%B %%C>> c:\ifacename.txt
)
)
set /P IFACENAME=< c:\ifacename.txt
echo Trimming
set IFACENAME=%IFACENAME%##
set IFACENAME=%IFACENAME: ##=##%
set IFACENAME=%IFACENAME: ##=##%
set IFACENAME=%IFACENAME: ##=##%
set IFACENAME=%IFACENAME:##=%
del /f c:\ifacename.txt
echo --- Interface name: %IFACENAME% >> %logfile%
echo --- set Administartor password >> %logfile%
net user Administrator ($PASS) >> %logfile%
echo ------Set static IP-------------------------------------[%DATE%-%TIME%] > %logfile%
echo --- IP/NM=($IP)/($NETMASK) GW=($GATEWAY) >> %logfile%
echo --- NS1=($NAMESERVER) >> %logfile%
set "nexthop=($NEXTHOPIPv4)"
IF "%nexthop%"=="()" (
set "nexthop=NONE"
)
echo %nexthop% | findstr /c:( 1>nul
IF NOT ERRORLEVEL 1 (
set "nexthop=NONE"
)
IF (%nexthop%) == () (
set "nexthop=NONE"
)
if (%nexthop%) == (NONE) (
netsh interface ip set address "%IFACENAME%" static ($IP) ($NETMASK) ($GATEWAY) >> %logfile%
) ELSE (
netsh interface ip set address "%IFACENAME%" static ($IP) 255.255.255.255 ($NEXTHOPIPv4) >> %logfile%
)
netsh interface ip add dnsservers "%IFACENAME%" ($NAMESERVER) >> %logfile%
set "nslist=($NAMESERVERS)"
IF "%nslist%"=="()" (
set "nslist=NEX"
)
echo %nslist% | findstr /c:( 1>nul
IF NOT ERRORLEVEL 1 (
set "nslist=NEX"
)
if NOT "%nslist%"=="" (
IF NOT "%nslist%"=="NEX" (
set flist=%nslist:"=%
echo NAMESERVERS: !flist! >> %logfile%
REM netsh interface ip delete dnsservers "%IFACENAME%" all >> %logfile%
FOR %%i IN (!flist!) DO (
echo %%i >> %logfile%
echo %%i | findstr /c:: 1>nul
if ERRORLEVEL 1 (
echo ipv4 >> %logfile%
netsh interface ip add dnsservers "%IFACENAME%" %%i >> %logfile%
) ELSE (Related topics echo ipv6 >> %logfile%
netsh interface ipv6 add dnsservers "Ethernet" %%i >> %logfile%
)
)
) ELSE (
echo BRACERS >> %logfile%
)
) ELSE (
echo EMPTY >> %logfile%
)
set extendfile=C:\vmmgr\extend.txt
echo --- resize disk >> %logfile%
echo select volume 1 > %extendfile%
echo extend noerr >> %extendfile%
diskpart.exe /s %extendfile% >> %logfile%
set "pkey=($PRODUCTKEY)"
IF NOT "%pkey%" == "" (
IF NOT "%pkey%" == "()" (
echo "PKEY is not null. Activating license"
echo activate windows >> %logfile%
cscript %windir%\system32\slmgr.vbs -ipk %pkey%
cscript %windir%\system32\slmgr.vbs -ato
) ELSE (
echo "PKEY is bracers" >> %logfile%
)
) ELSE (
echo "PKEY is EMPTY" >> %logfile%
)
echo remove task vmmgr_firstrun >> %logfile%
schtasks /Delete /TN "vmmgr_firstrun" /F >> %logfile%
echo restart OS >> %logfile%
echo ------END--------------------------------------------------[%DATE%-%TIME%] >> %logfile%
REM Russian language
REM echo $lang = "ru-RU" >> C:\vmmgr\lang.ps1
REM echo $langpack = Get-ChildItem "C:\vmmgr\langs\*language*$lang.cab" >> \vmmgr\lang.ps1
REM echo Dism /Online /Add-Package /PackagePath:"$langpack" >> C:\vmmgr\lang.ps1
REM echo Set-WinSystemLocale $lang >> c:\vmmgr\lang.ps1
REM echo Set-WinUILanguageOverride $lang >> c:\vmmgr\lang.ps1
REM echo $oldList = Get-WinUserLanguageList >> c:\vmmgr\lang.ps1
REM echo $oldList.Add($lang) >> c:\vmmgr\lang.ps1
REM echo Set-WinUserLanguageList $oldList -force >> c:\vmmgr\lang.ps1
REM powershell.exe c:\vmmgr\lang.ps1 >> %logfile%
REM Enable RDP
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
netsh firewall set service remotedesktop enable
echo RMDIR /s /Q C:\vmmgr >> c:\del.cmd
echo shutdown /r >> c:\del.cmd
cmd /c c:\del.cmd
Файл с метаданными
Файл метаданных metainfo.xml содержит информацию о шаблоне:
- <osname> — название ОС;
- <limit> — ограничения шаблона. Если ВМ не удовлетворяет ограничениям, то она не будет создана. Параметры ограничений:
- <elem name="ipv4"> — использование IPv4-адреса в качестве основного. Возможные значения: yes — поддерживается, no — не поддерживается;
- <elem name="ipv6"> — использование IPv6-адреса в качестве основного. Возможные значения: yes — поддерживается, no — не поддерживается;
- <elem name="mem"> — минимальный объём RAM в МиБ;
- <elem name="disk"> — минимальный объём дискового пространства в МБ;
- <support> — ПО, которое поддерживает шаблон. Для VMmanager укажите <elem>VMmgr</elem>;
- <tags> — теги шаблона. Используются для совместимости со скриптами;
- <version> — версия шаблона;
- <hddimage> — имя файла образа;
- <type> — тип шаблона. Для шаблона ОС укажите <type>ostemplate</type>;
- <installdrive> — имя скрипта первоначальной настройки;
- <virtionet>yes</virtionet> — поддержка работы с virtio-сетью;
- <virtiodisk>yes</virtiodisk> — поддержка работы с virtio-дисками;
- <macro> — макросы для передачи в шаблон. Для передачи значения лицензионного ключа укажите <elem name="($PRODUCTKEY)"/>.
<?xml version="1.0"?>
<doc>
<osname>Windows-Server-2019</osname>
<limit>
<elem name="ipv4">yes</elem>
<elem name="ipv6">no</elem>
<elem name="mem">1024</elem>
<elem name="disk">15000</elem>
</limit>
<support>
<elem>VMmgr</elem>
</support>
<tags>windows,windows2019</tags>
<version>5</version>
<hddimage>win2019.hddimage</hddimage>
<type>ostemplate</type>
<installdrive>windows.cmd</installdrive>
<virtiodisk>yes</virtiodisk>
<virtionet>yes</virtionet>
<macro>
<elem name="($PRODUCTKEY)"/>
</macro>
</doc>
Загрузка шаблона в репозиторий
Чтобы загрузить шаблон:
- Создайте архив формата .tar.gz, включающий образ диска ОС, скрипт первоначальной настройки и файл с метаданными.
- Скопируйте архив в директорию репозитория.
- Добавьте информацию о шаблоне в файл описания репозитория metadata.json. Подробнее см. в статье Репозитории.