Windows Image Guide - TekMonksGitHub/kloudust GitHub Wiki

๐ŸชŸ Building Windows Images for Kloudust โ€“ Step-by-Step Guide

This guide walks you through creating a Windows image optimized for Tekmonks Kloudust, using cloudbase-init and other preparation steps including sysprep, disk preparation, and final image conversion.


โœ… Prerequisites

  • Windows OS (e.g., Windows 11) installed from an ISO image. Kloudust can be used to create this via the ISO image option in the createVM command.
  • Administrator access
  • Internet access to download tools
  • QEMU tools installed (for qemu-img)
  • Sysprep compatibility (BitLocker must be handled)

1. Install Cloudbase-Init

Download and install the 64-bit Cloudbase-Init MSI package.

  • Ensure that the user running the installation is part of the Administrators group.
  • Choose default options during installation.
  • Do not select the โ€œLocalSystem serviceโ€ option.

2. Configure Cloudbase-Init

Modify the following configuration files:

๐Ÿ“„ cloudbase-init.conf

[DEFAULT]
username=Admin
groups=Administrators
inject_user_password=true
config_drive_raw_hhd=false
config_drive_cdrom=true
config_drive_vfat=false
bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe
mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\
verbose=true
debug=true
log_dir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
log_file=cloudbase-init.log
default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN
mtu_use_dhcp_config=true
ntp_use_dhcp_config=true
local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\
check_latest_version=false
metadata_services=cloudbaseinit.metadata.services.nocloudservice.NoCloudConfigDriveService
plugins=cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin,cloudbaseinit.plugins.common.userdata.UserDataPlugin,cloudbaseinit.plugins.windows.createuser.CreateUserPlugin,cloudbaseinit.plugins.common.mtu.MTUPlugin,cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin

๐Ÿ“„ cloudbase-init-unattend.conf

[DEFAULT]
username=Admin
groups=Administrators
inject_user_password=true
config_drive_raw_hhd=false
config_drive_cdrom=true
config_drive_vfat=false
bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe
mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\
verbose=true
debug=true
log_dir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
log_file=cloudbase-init-unattend.log
default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN
logging_serial_port_settings=COM1,115200,N,8
mtu_use_dhcp_config=true
ntp_use_dhcp_config=true
local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\
check_latest_version=false
metadata_services=cloudbaseinit.metadata.services.nocloudservice.NoCloudConfigDriveService
plugins=cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin,cloudbaseinit.plugins.common.userdata.UserDataPlugin,cloudbaseinit.plugins.windows.createuser.CreateUserPlugin,cloudbaseinit.plugins.common.mtu.MTUPlugin,cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin
stop_service_on_exit=false
allow_reboot=false

3. Disk Preparation

๐Ÿ”“ Disable BitLocker (Required for Sysprep)

manage-bde -off C:

Wait until the decryption process is complete:

manage-bde -status

Reference: Dell KB: BitLocker prevents Sysprep in 24H2


๐Ÿ’ฝ Delete Recovery Partition

To avoid issues with disk resizing in the cloud:

Follow the guide on OpenMetal documentation to safely delete the recovery partition.


4. System Settings

๐Ÿ›ก๏ธ Set Execution Policy

Open PowerShell as Administrator:

Set-ExecutionPolicy Unrestricted

๐Ÿ—‘๏ธ Remove Problematic Appx Packages

These packages may block sysprep. Remove them:

Remove-Appxpackage -AllUsers Microsoft.LanguageExperiencePacken-GB_26100.24.38.0_neutral__8wekyb3d8bbwe
Remove-Appxpackage -AllUsers Microsoft.WidgetsPlatformRuntime_1.6.2.0_x64__8wekyb3d8bbwe
Remove-Appxpackage -AllUsers Microsoft.WidgetsPlatformRuntime_1.6.8.0_x64__8wekyb3d8bbwe
Remove-Appxpackage -AllUsers Microsoft.OneDriveSync_25075.420.2.0_neutral__8wekyb3d8bbwe

๐Ÿ›  Edit Unattend.xml

Ensure the following entry is set to avoid device reinstalls:

<PersistAllDeviceInstalls>false</PersistAllDeviceInstalls>

5. Account Cleanup

๐Ÿ‘ค Remove Custom Accounts

You can either use lusrmgr.msc to delete custom accounts or run:

@echo off
set LOGDIR=%~dp0\..\log
net user [username] /delete > "%LOGDIR\rmdefacct.log" 2>&1
rmdir /s/q c:\users\[username] >> "%LOGDIR\rmdefacct.log" 2>&1

6. Sysprep the Image

Navigate to the Cloudbase config directory:

cd 'C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\'

Run Sysprep:

C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

7. Convert the Final Image

Use qemu-img to compress the image into QCOW2 format:

qemu-img convert -O qcow2 ./win11master.qcow2 ./win11master.img

This compressed image is now ready to be uploaded to Kloudust.


โœ… Summary

Step Description
Install Cloudbase-Init Use default settings, avoid LocalSystem
Disk Prep Disable BitLocker, delete recovery partition
Configure Init Files cloudbase-init.conf and unattend.conf as above
Cleanup Remove Appx packages, custom users
Sysprep With Unattend.xml and generalize the image
Convert Create compressed .qcow2 format