We have been using Proxmox for many years, customizing it to our needs to facilitate the deployment and management of the Virtual Machines.

Cloud-Init is something that we heavily rely on to automate the initialization process of our cloud instances during system boot.

Unfortunately we couldn't have the same option for the VMs running Microsoft Windows, even if there were third party solutions like Cloudbase-Init, they are not natively supported by the actual Proxmox version.

And these were our motivation to patch Proxmox to Windows work with cloud-init, with some help of the Proxmox forum members and forum member Kenzim who showed the possibility of such implementation.


It is an open-source project provided by Cloudbase Solutions to enable initialization of a new instance on Windows machines. The purpose is to be the equivalent of the Cloud-Init project which is used on Linux images.

Cloudbase-Init works with different services to provide the meta data that will be used to parse information needed to below functionalities. In our case the service that will be used is the OpenStack Config Drive service which parses information from the cloud-init drive that is already generated by Proxmox but misses the needed data in its actual state.

It is deployed as a service in Windows to take care of all guest initialization actions, such as :

  • Disk volume expansion
  • User creation
  • Password generation and injection
  • Custom script execution with Powershell,CMD,Bash or Python
  • Static network configurations
  • Hostname modification
  • Public SSH key deployment

and other functionalities that you can see at Cloudbase-Init documentation.

We have found a few missing functionalities that we think should be included in the product. Which are the DHCP network configuration when we want to modify a static adapter back to DHCP and the activation of the Administrator user if we provide it's name in the meta data. So we included in this document two python scripts to deploy alongside Cloudbase-Init to do those actions.

Let's patch Proxmox

As we have told before the meta data configuration file provided by cloud-init service of Proxmox cannot be used by Cloudbase-Init. As we have understood Cloudbase-Init doesnt support working with User_Data yet and by design it also cannot use hashed passwords on the meta data.

Proxmox also generates a META_DATA.json file that includes the UUID and the network config path. We will patch Proxmox to include all the other necessary variables inside that META_DATA file so Cloudbase-Init can happily work after.

You can see the drive's content as below;

    └── CONTENT
        └── 0000 #File including network configuration
    └── LATEST
        ├── META_DATA.json # We will patch this file's generation process to use it with Cloudbase-Init
        └── USER_DATA # File that is not yet supported by Cloudbase-Init

There are two files that we need to modify;

  • Qemu.pm to get password as cleartext in meta_data drive when it is a Windows VM.
  • Cloudinit.pm to generate a metadata json file with variables that are compatible with Cloudbase-Init.

We have provided patch files for two different versions( 6.4-2 and 7.1-4), if you are on those versions you can simply download it and apply the patch by doing;

# Check the version of your qemu-server
apt show qemu-server |grep "Version"
# If your version is 6.4-2 or 7.1-4 download the corresponding patch from this repo and continue, if not continue manual patching below.
# Launch below as a test to see if you can apply the patch file, change path to where you downloaded the files and run this for two .patch files.
patch --force --forward --backup -p0 --directory / --input "/absolute/path/to/patchfile.pm.patch" --dry-run && echo "You can apply patch" || { echo "Can't apply patch!";}
# If the result is "Can't apply patch!", you can type "apt reinstall qemu-server" to reinstall the qemu-server files(If you have made changes to qemu-server source files they will be lost!)
# Apply the patch if the result is "You can apply patch"
patch --force --forward --backup -p0 --directory / --input "/absolute/path/to/patchfile.pm.patch"

If you want to revert the patch:

patch --force --reverse --backup -p0 --directory / --input "/absolute/path/to/patchfile.pm.patch"

Dont forget to restart the Proxmox Node or the PveDaemon Services in order to let proxmox use the new version of the patched files.

systemctl restart pvedaemon.service

If you want to apply the patch manually or you want more explanation on the patch you can follow this: Manual Patching

  • Create a Windows VM in proxmox. (Don't for get to choose Guest OS Type : Microsoft Windows)
  • Go to Hardware section of your VM, add Cloud-Init Drive and Serial Port 0
  • Login as Administrator, configure Windows to your needs and proceed to Cloudbase-Init installation.

Install Cloudbase-Init Continous Build from the official website.

Why Continous Build? Because the stable build dates from 2020 and doesn’t include functionalities we use.

We have three scripts that do some functionality that Cloudbase-Init doesnt have;

  • Enabling administrator user when it’s name is given to the Cloudbase-Init.
  • Enabling DHCP on the network adapters.
  • Ejectin the metadata drive when the init process is finished.

Move those scripts into Cloudbase Solutions\Cloudbase-Init\LocalScripts\ in your program files of your Windows VM.

Copy these two conf files to C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf.

Inside those files you will find the default Administrator name and the user group that will be used while user creation. You can launch our ModifyConf.ps1 script to modify that file to get the correct username and group of your Windows language.

This powershell script has a few uses.

  • Delete the “cloudbase-init” user, delegates “cloudbase-init” service to local Systeme user and modifies execution path of the script also to use local system user.
  • Installs OpenSSH-Server from optional features of Windows.
  • Removes a store language package that causes an error when generelazing for sysprep.

Right click and run this script after installing and configuring Cloudbase-Init Continous Build.

When everything is installed simply run below in powershell to launch sysprep:

cd ‘C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf’
C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

Make a template from the virtual machine we just created and full clone a copy of it to test the cloud-init!

All we need is to launch the first test, is to fill the cloud-init informations:

And run the machine !

You can monitor the logs by launching a xterm.js console on your machine once it is started.

I hope I could've helped you on how to use Cloudbase-Init with Proxmox. There is really no limitation for Cloudbase-Init since it includes multiple services and dozens of plugins with the option to do your own scripting. We will also be using this product in future for lots of solutions where the automation will be needed on a Windows machine. This product opens the way for us to enable infrastructure as a code. Such solutions are already in developpement in geco using Docker and Ansible. We like to give back to community as Geco-iT since without a community we wouldn't have anything to find in Google. :)

Can SOYLU 12/01/2022/ 15:51


A Geco-iT Nous utilisons l'hyperviseur Proxmox depuis de nombreuses années, en l'adaptant à nos besoins pour faciliter le déploiement et la gestion des Machines Virtuelles.

Cloud-Init est quelque chose sur lequel nous comptons beaucoup pour automatiser le processus d'initialisation de nos instances cloud linux pendant le démarrage du système.

Malheureusement, nous ne pouvions pas avoir la même option pour les machines virtuelles exécutant Microsoft Windows, même s'il existait des solutions tierces comme Cloudbase-Init, elles ne sont pas prises en charge nativement par la version actuelle de Proxmox.

Et c'était notre motivation de patcher Proxmox pour que Windows fonctionne avec cloud-init, avec l'aide des membres du forum Proxmox et du membre du forum Kenzim qui nous a montré la possibilité d'une telle implémentation.


Il s'agit d'un projet open source fourni par Cloudbase Solutions pour permettre l'initialisation d'une nouvelle instance executant Windows. Le but est d'être l'équivalent du projet Cloud-Init qui est utilisé sur les images Linux.

Cloudbase-Init fonctionne avec différents services pour fournir les métadonnées nécessaires aux fonctionnalités ci-dessous. Dans notre cas, le service qui sera utilisé est le service OpenStack Config Drive qui récupère les informations du lecteur cloud-init déjà généré par Proxmox mais dans lequel il manque certaines données nécessaires dans son état actuel.

Il est déployé en tant que service dans Windows pour prendre en charge toutes les actions d'initialisation des utilisateurs, telles que :

  • Extension de volume de disque
  • Création d'utilisateur
  • Génération et injection de mots de passe
  • Exécution de scripts personnalisés avec Powershell, CMD, Bash ou Python
  • Configurations réseau statiques
  • Modification du nom d'hôte
  • Déploiement de clé SSH publique

et d'autres fonctionnalités que vous pouvez voir sur la documentation Cloudbase-Init.

Nous avons trouvé quelques fonctionnalités manquantes qui, selon nous, devraient être incluses dans le produit. Lesquelles sont la configuration du réseau DHCP lorsque nous voulons modifier un adaptateur réseau statique vers DHCP et l'activation de l'utilisateur Administrateur si nous fournissons son nom dans les métadonnées. Nous avons donc inclus dans ce document deux scripts python à déployer avec Cloudbase-Init pour effectuer ces actions.

Patchons Proxmox!

Comme nous l'avons déjà dit, le fichier métadonnées fourni par le service cloud-init de Proxmox ne peut pas être utilisé par Cloudbase-Init. Nous avons compris que Cloudbase-Init ne prend pas encore en charge l'initialisation avec User_Data et, de par sa conception, il ne peut pas non plus utiliser de mots de passe hachés provenant des métadonnées.

Proxmox génère également un fichier META_DATA.json qui inclut l'UUID et le chemin de configuration réseau. Nous allons patcher Proxmox pour inclure toutes les autres variables nécessaires dans ce fichier META_DATA afin que Cloudbase-Init puisse fonctionner avec plaisir par la suite.

Vous pouvez voir le contenu du lecteur comme ci-dessous ;

    └── CONTENT
        └── 0000 #Fichier incluant la configuration réseau
    └── LATEST
        ├── META_DATA.json #Nous allons patcher le processus de génération de ce fichier pour l'utiliser avec Cloudbase-Init
        └── USER_DATA #Fichier qui n'est pas encore pris en charge par Cloudbase-Init

Il y a deux fichiers que nous devons modifier;

  • Qemu.pm pour obtenir le mot de passe en clair dans le fichier META_DATA lorsqu'il s'agit d'une machine virtuelle Windows.
  • Cloudinit.pm pour générer un fichier Json de META_DATA avec des variables compatibles avec Cloudbase-Init.

Nous avons fourni des fichiers de correctifs pour deux versions différentes( 6.4-2 et 7.1-4), si vous utilisez ces versions de Qemu-Server, vous pouvez simplement les télécharger et appliquer les correctifs en faisant;

# Vérifiez la version de votre qemu-server
apt show qemu-server |grep "Version"
# Si votre version est 6.4-2 ou 7.1-4, téléchargez le correctif correspondant à partir de notre repo git et continuez, sinon continuez le correctif manuel ci-dessous.
# Lancez ci-dessous comme test pour voir si vous pouvez appliquer le fichier de correctif, modifiez le chemin d'accès à l'endroit où vous avez téléchargé les fichiers et exécutez-le pour les deux fichiers de patch.
patch --force --forward --backup -p0 --directory / --input "/absolute/path/to/patchfile.pm.patch" --dry-run && echo "You can apply patch" || { echo "Can't apply patch!";}
# Si le résultat est "Impossible d'appliquer le correctif !", vous pouvez taper "apt reinstall qemu-server" pour réinstaller les fichiers qemu-server (Attention! Si vous avez déjà apporté des modifications aux fichiers qemu-server, ils seront perdus!)
# Appliquez le patch si le résultat est "Vous pouvez appliquer le patch"
patch --force --forward --backup -p0 --directory / --input "/absolute/path/to/patchfile.pm.patch"

Si vous souhaitez rétablir le correctif:

patch --force --reverse --backup -p0 --directory / --input "/absolute/path/to/patchfile.pm.patch"

Si vous souhaitez appliquer le correctif manuellement ou si vous souhaitez plus d'explications sur le correctif, vous pouvez suivre ce lien: Manual Patching

  • Créez une machine virtuelle Windows dans proxmox. (N'oubliez pas de choisir le type de système d'exploitation : Microsoft Windows)
  • Allez dans la section Matériel de votre VM, ajoutez Cloud-Init Drive et Serial Port 0
  • Connectez-vous en tant qu'Administrateur, configurez Windows selon vos besoins et procédez à l'installation de Cloudbase-Init.

Installez Cloudbase-Init Continous Build à partir du site officiel.

Pourquoi le Continous Build? Parce que la version stable date de 2020 et n'inclut pas les fonctionnalités que nous avons besoin.

Nous avons trois scripts qui ajoutent certaines fonctionnalités que Cloudbase-Init n'a pas ;

  • Activation de l'utilisateur Administrateur lorsque son nom est donné à Cloudbase-Init.
  • Activation de DHCP sur les adaptateurs réseau.
  • Éjection du lecteur de métadonnées car il contient un mot de passe en clair

Déplacez ces scripts dans Cloudbase Solutions\Cloudbase-Init\LocalScripts\ dans votre program files de votre machine virtuelle Windows.

Copiez ces deux fichiers de configuration dans C:\Program Files\Cloudbase Solutions \Cloudbase-Init\conf.

Dans ces fichiers, vous trouverez le nom d'administrateur par défaut et le groupe d'utilisateurs qui seront utilisés lors de la création de l'utilisateur. Vous pouvez lancer notre ModifyConf.ps1 script pour modifier ce fichier afin d'obtenir le nom d'utilisateur et le groupe corrects de votre langue Windows.

Ce script powershell a quelques fonctionnalités.

  • Supprime l'utilisateur « cloudbase-init », délègue le service « cloudbase-init » à l'utilisateur Systeme local et modifie le chemin d'exécution du script pour utiliser également l'utilisateur système local.
  • Installe OpenSSH-Server à partir des fonctionnalités optionnelles de Windows.
  • Supprime un package de langue de Microsoft Store qui provoque une erreur lors de la génération de sysprep.

Faites un clic droit et exécutez ce script après avoir installé et configuré Cloudbase-Init Continous Build.

Lorsque tout est installé, exécutez simplement la commande ci-dessous dans powershell pour lancer sysprep :

cd ‘C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf’
C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

Créez un Template à partir de la machine virtuelle que nous venons de créer et clonez-en une Full Clon pour tester le cloud-init!

Pour lancer notre premier test, tout ce que nous avons à faire est de remplir les informations cloud-init comme ceci:

Et lancez la machine!

Vous pouvez surveiller les logs en lançant une console xterm.js sur votre machine une fois celle-ci démarrée.

J'espère avoir pu vous aider à utiliser Cloudbase-Init avec Proxmox. Il n'y a vraiment aucune limitation pour Cloudbase-Init car il comprend plusieurs services et des dizaines de plugins avec la possibilité de créer votre propre script. Nous utiliserons également ce produit à l'avenir pour de nombreuses solutions où l'automatisation sera nécessaire sur une machine Windows. Ce produit nous ouvre la voie pour activer l'infrastructure en tant que code. De telles solutions sont déjà en développement dans geco en utilisant Docker et Ansible. Nous aimons redonner à la communauté en tant que Geco-iT car sans communauté nous n'aurions rien à trouver dans Google. :)

Can SOYLU 12/01/2022/ 15:51

  • public/cloudbase-init.txt
  • Dernière modification: 23/02/2022/ 09:41
  • par c.soylu