A cloud virtual machine can be configured during its first boot using a YAML file of just eleven lines: a hostname, a timezone, a user with an SSH key, and two packages. On Debian 13, the cloud-init service requires 46 additional packages and 61.2 MiB of installed space on top of a minimal system with the OpenSSH server. FreeBSD, by contrast, includes its own alternative, nuageinit, in the base system and can read the same configuration without adding dependencies.
The key facts about cloud-init and FreeBSD in 20 seconds
- Debian 13 needs 46 additional packages and 61.2 MiB to install cloud-init 25.1.4 on top of the base system used in the measurement.
- More than half of the additional space is taken up by Python and its libraries.
- FreeBSD has included nuageinit since version 14.1. It is written in Lua and relies on components already present in the base system.
- In a test measuring program startup, cloud-init took 206 milliseconds, while nuageinit took 5 milliseconds.
- FreeBSD’s alternative handles common first-boot configuration tasks, although it supports fewer metadata sources.
What Debian installs to read a YAML file
Vivian Voss’s comparison uses a specific scenario: Debian 13 for the amd64 architecture, with all required and important packages and the OpenSSH server. Resolving the dependencies of cloud-init 25.1.4 on top of that base adds 46 packages, occupying 61.2 MiB.
The set includes 26 Python libraries, among them python3-requests, python3-jinja2, python3-cryptography and python3-jsonschema. Another seven packages are related to Python 3.13 and its standard library, alongside other components needed to complete the installation. Python and its libraries account for 33.4 MiB in total, more than half of the additional space.
The difference goes beyond disk usage. Each package brings its own maintenance requirements, updates and security advisories. On a server dedicated to a narrow task, that additional maintenance burden can matter as much as the storage footprint, although the actual cost depends on the system, its installed services and how the machine is used.
Cloud-init also has a substantial codebase. According to the analysis, version 25.1.4 contains 69,102 lines of Python code, 31 datasources and 59 modules. Datasources know where to retrieve configuration from each cloud platform, while modules carry out tasks such as creating users, installing packages, configuring network interfaces and writing files.
That breadth reflects its goal: providing a common initialization mechanism across different cloud providers. The same configuration can be reused in different environments as long as the image includes cloud-init and the program knows how to retrieve metadata from the relevant platform.
The article also highlights a less obvious dependency: netcat-openbsd. Its presence is linked to a change introduced in cloud-init 24.3 in 2024. Previously, the initialization process launched four separate Python processes at each boot, one for each stage. Every process loaded the interpreter and its libraries independently. The project consolidated them into a single process that waits on a Unix socket for systemd to tell it when to begin each stage.
The change was intended to speed up boot times, but it introduced a dependency on the OpenBSD implementation of netcat. It illustrates how a design decision intended to reduce execution overhead can add another component to a Linux server’s package list.
FreeBSD includes its alternative in the base system
FreeBSD takes a different approach. Since version 14.1, released in June 2024, the base system has included nuageinit, a tool written in Lua that processes configurations compatible with the cloud-init format. Its name comes from nuage, the French word for cloud.
Rather than adding a Python interpreter and a collection of libraries, nuageinit uses flua, the Lua interpreter FreeBSD already includes for its own tools, and lyaml, a binding for the libyaml library. Both components are part of the base system.
An analysis of the FreeBSD 15.1 source code counts 1,685 lines of Lua across nuageinit, of which 809 belong to the main program. The tool can configure users, SSH keys, groups, sudo and doas rules, files, network interfaces, packages and commands that must run during the first boot.
Its integration also changes when it runs. FreeBSD startup scripts use the firstboot keyword and check for the existence of the /firstboot marker file. Configuration is processed in several stages: one before the network comes up, another afterwards for tasks that require connectivity, and a final stage for user-defined scripts. When the first boot finishes, the marker file is removed, so those scripts do not run again on subsequent starts.
Official FreeBSD 15.0 images identified as BASIC-CLOUDINIT enable nuageinit in rc.conf. According to the article, the image build process adds just one package, firstboot-freebsd-update, to fetch security updates during the first boot. The configuration reader and its main components are already present.
The advantage, therefore, is not that FreeBSD can do everything cloud-init can. Its approach is to handle common initialization tasks using components that already belong to the operating system, without adding another stack of dependencies.
The performance test and its limitations
To compare startup times, Voss conducted a test in a FreeBSD 15.0 jail running on a machine with an Intel Core i5-13500 processor. Cloud-init 25.2 was installed from the FreeBSD ports collection, using Python 3.12, and each program was run twenty times.
The cloud-init --version command loads the program and prints its version without processing a configuration. Twenty executions took 4.13 seconds, averaging 206 milliseconds per startup. Nuageinit, run without arguments, completed twenty executions in 0.10 seconds, averaging 5 milliseconds each.
That means cloud-init took roughly 41 times longer to start in this particular test. It does not mean that a Debian virtual machine automatically takes forty times longer to boot, nor that a complete configuration process will finish forty times faster on FreeBSD. The measurement compares program startup, not the entire provisioning process.
Downloading packages, waiting for the network and accessing package repositories can account for a substantial share of total initialization time on either system. The comparison also used different cloud-init versions: 25.2 on FreeBSD for the startup test and 25.1.4 for the Debian dependency calculation. The results describe the tested setup, not an exhaustive performance comparison across every possible configuration.
The difference is also related to the scope of each tool. Cloud-init supports 31 metadata sources, including those used by Amazon and Microsoft Azure, and includes modules for additional functions such as Chef, Puppet, LXD and disk partitioning. Nuageinit supports a narrower range of sources: it can read configuration from disks labelled cidata or config-2, as well as from OpenStack’s metadata service.
When a FreeBSD installation needs to work with other platforms or modules, cloud-init can still be installed from the ports collection. The article reports that version 25.2 is available for FreeBSD through its package system. Nuageinit covers common requirements, but it does not replace every capability provided by Canonical’s tool.
The comparison reflects two different priorities. Cloud-init aims to provide a consistent experience across many clouds and systems, even at the cost of carrying a broad set of dependencies. FreeBSD integrates a smaller solution into the base system and limits its execution to first-time initialization. For cloud image builders, the first option reduces platform-specific work. For system administrators, the second avoids maintaining an additional software stack when its features are sufficient.
Frequently asked questions
What is cloud-init?
Cloud-init is a tool that configures virtual machines during startup using metadata and configuration files. It can create users, install packages, set network parameters and execute commands, among other tasks.
What is nuageinit in FreeBSD?
Nuageinit is FreeBSD’s tool for processing cloud-init-compatible configurations. It is written in Lua and uses components included in the base system, such as flua and lyaml.
How much space does cloud-init use on Debian 13?
In the published measurement, cloud-init 25.1.4 adds 46 packages and 61.2 MiB of installed size on top of a base system containing all required and important packages and the OpenSSH server. The figure applies to that specific package selection.
Is nuageinit forty times faster than cloud-init?
In the reported test, nuageinit took 5 milliseconds to start, compared with 206 milliseconds for cloud-init --version. The comparison measures program startup, not the total time required to configure a virtual machine, and does not establish that FreeBSD completes the entire process forty times faster.
