You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Cloud-init successfully reads user-data and meta-data from a NoCloud datasource specified via ds=nocloud;s=file:///.... However, there is no corresponding log evidence that network-config is read from the same seed source. Cloud-init subsequently applies fallback networking, and the resulting network configuration does not match the supplied network-config.
The identical seed files function correctly when provided via CIDATA USB or ISO media.
Key Observations
The evidence collected indicates:
meta-data is read from the seedfrom path.
user-data is read from the seedfrom path.
network-config is not observed being read from the seedfrom path.
The effective network configuration does not match the supplied network-config.
The identical files work when presented as CIDATA media (USB or ISO).
Description
When cloud-init is configured to use the NoCloud datasource via kernel command line:
ds=nocloud;s=file:///path/to/config/
cloud-init successfully discovers and applies both user-data and meta-data from the specified seed directory. However, a valid network-config file located in the same directory is not applied.
The seed directory contains all three expected files:
user-data
meta-data
network-config
and cloud-init successfully consumes the user-data and meta-data content from that location.
As a comparison, the exact same set of seed files works correctly when provided through a CIDATA-labeled ISO or USB device, where user-data, meta-data, and network-config are all applied as expected.
As a sanity check, the network-config file was validated using:
cloud-init devel net-convert
which successfully generated the corresponding Netplan configuration, confirming the file is syntactically valid.
Based on this behavior, there appears to be an inconsistency between NoCloud seed discovery using a file:// seedfrom path and NoCloud seed discovery using traditional CIDATA media.
Expected Behavior
When a NoCloud datasource is configured using:
ds=nocloud;s=file:///path/to/config/
cloud-init should discover and process all supported seed files located in the specified directory, including:
user-data
meta-data
network-config
Actual Behavior
user-data -> processed
meta-data -> processed
network-config -> not applied
The same network-config file is successfully applied when provided via CIDATA media, indicating the issue is specific to the seedfrom-based NoCloud workflow rather than the network configuration itself.
Steps to Reproduce
Create a NoCloud seed directory containing:
user-data
meta-data
network-config
Populate network-config with a valid cloud-init network configuration:
A complete cloud-init collect-logs archive is attached. cloud-init.tar.gz
The attached logs show that cloud-init reads meta-data and user-data from the configured seed source (file:///var/lib/snapd/seed/cidata/). However, there is no corresponding log entry showing network-config being read from the same location.
# grep -RE "(Reading.*(user-data|meta-data|network-config)|fallback)"
2026-09-12 14:45:44,800 - util.py[DEBUG]: Reading from /var/lib/cloud/seed/nocloud/user-data (quiet=False)
2026-09-12 14:45:44,800 - util.py[DEBUG]: Reading from /var/lib/cloud/seed/nocloud/meta-data (quiet=False)
2026-09-12 14:45:44,800 - util.py[DEBUG]: Reading from /var/lib/cloud/seed/nocloud/network-config (quiet=False)
2026-09-12 14:45:44,800 - util.py[DEBUG]: Reading from /var/lib/cloud/seed/nocloud-net/user-data (quiet=False)
2026-09-12 14:45:44,800 - util.py[DEBUG]: Reading from /var/lib/cloud/seed/nocloud-net/meta-data (quiet=False)
2026-09-12 14:45:44,800 - util.py[DEBUG]: Reading from /var/lib/cloud/seed/nocloud-net/network-config (quiet=False)
2026-09-12 14:45:44,820 - util.py[DEBUG]: Reading from /var/lib/snapd/seed/cidata/meta-data (quiet=False)
2026-09-12 14:45:44,820 - util.py[DEBUG]: Reading 336 bytes from /var/lib/snapd/seed/cidata/meta-data
2026-09-12 14:45:44,821 - util.py[DEBUG]: Reading from /var/lib/snapd/seed/cidata/user-data (quiet=False)
2026-09-12 14:45:44,821 - util.py[DEBUG]: Reading 1943 bytes from /var/lib/snapd/seed/cidata/user-data
2026-09-12 14:45:44,879 - stages.py[INFO]: Applying network configuration from fallback bringup=False
Both meta-data and user-data are explicitly read from the seed source:
Reading from /var/lib/snapd/seed/cidata/meta-data
Reading 336 bytes from /var/lib/snapd/seed/cidata/meta-data
Reading from /var/lib/snapd/seed/cidata/user-data
Reading 1943 bytes from /var/lib/snapd/seed/cidata/user-data
However, there is no corresponding:
Reading from /var/lib/snapd/seed/cidata/network-config
Reading <bytes> from /var/lib/snapd/seed/cidata/network-config
Even though the file exists in the seed directory and the same artifact is successfully processed when delivered via CIDATA USB or ISO media.
Appendix: Additional Evidence and Suspected Root Cause Analysis
Note
The observations in this appendix are based on local inspection of the cloud-init state and runtime artifacts collected from the affected system. This analysis was performed against the installed cloud-init instance and its serialized datasource state (/var/lib/cloud/instance/obj.pkl). It is not intended to represent a review of the upstream cloud-init source repository or to assert a definitive root cause.
Additional Evidence That network-config Is Not Retained By The Datasource
Datasource object inspection after first boot shows that no network configuration is present on the initialized NoCloud datasource object.
At the completion of datasource initialization, ds._network_config is None despite a network-config file being present in the seed directory. This suggests that no network configuration was retained by the datasource from the supplied seed data.
Source Code Review
During investigation, the NoCloud datasource implementation was reviewed to compare the standard seed discovery path with the seedfrom=file:// path.
Standard NoCloud Discovery Path
The standard NoCloud discovery logic includes support for network-config:
The fourth return value from util.read_seeded() is assigned to:
_
and is not subsequently assigned to:
mydata["network-config"]
Why This Appears Relevant
The observed runtime behavior appears consistent with this implementation path:
meta-data is processed successfully.
user-data is processed successfully.
network-config is not reflected in the effective configuration.
ds._network_config is None.
Cloud-init applies fallback networking.
The resulting network configuration differs significantly from the supplied network-config.
Suspected Root Cause
This source review suggests that the NoCloud seedfrom=file:// code path may not retain or propagate the network configuration returned from util.read_seeded(), resulting in fallback networking being applied.
This is a hypothesis based on code review and observed runtime behavior. Additional confirmation from cloud-init maintainers would be appreciated.
Bug Report
Summary
Cloud-init successfully reads
user-dataandmeta-datafrom a NoCloud datasource specified viads=nocloud;s=file:///.... However, there is no corresponding log evidence thatnetwork-configis read from the same seed source. Cloud-init subsequently applies fallback networking, and the resulting network configuration does not match the suppliednetwork-config.The identical seed files function correctly when provided via CIDATA USB or ISO media.
Key Observations
The evidence collected indicates:
meta-datais read from theseedfrompath.user-datais read from theseedfrompath.network-configis not observed being read from theseedfrompath.network-config.Description
When cloud-init is configured to use the NoCloud datasource via kernel command line:
cloud-init successfully discovers and applies both
user-dataandmeta-datafrom the specified seed directory. However, a validnetwork-configfile located in the same directory is not applied.The seed directory contains all three expected files:
and cloud-init successfully consumes the
user-dataandmeta-datacontent from that location.As a comparison, the exact same set of seed files works correctly when provided through a CIDATA-labeled ISO or USB device, where
user-data,meta-data, andnetwork-configare all applied as expected.As a sanity check, the
network-configfile was validated using:which successfully generated the corresponding Netplan configuration, confirming the file is syntactically valid.
Based on this behavior, there appears to be an inconsistency between NoCloud seed discovery using a
file://seedfrom path and NoCloud seed discovery using traditional CIDATA media.Expected Behavior
When a NoCloud datasource is configured using:
cloud-init should discover and process all supported seed files located in the specified directory, including:
Actual Behavior
The same
network-configfile is successfully applied when provided via CIDATA media, indicating the issue is specific to theseedfrom-based NoCloud workflow rather than the network configuration itself.Steps to Reproduce
network-configwith a valid cloud-init network configuration:Boot a clean system and allow cloud-init to complete first-boot initialization.
Verify that
user-dataandmeta-dataare applied.Verify whether the supplied
network-configwas applied.Repeat the test with the identical files delivered through a CIDATA USB or ISO.
Observed Results
With:
user-datais applied.meta-datais applied.network-configis not applied.With the same files provided via CIDATA media:
user-datais applied.meta-datais applied.network-configis applied.Environment
Linux Distribution: Ubuntu Core 24
Platform: NoCloud (Physical and Hyper-V)
Effective Network Configuration
The supplied configuration contains:
dhcp6: falseoneth0eth1ignore-carrierHowever, cloud-init ultimately produces:
{ "ethernets": { "eth0": { "dhcp4": true, "dhcp6": true, "match": { "macaddress": "00:15:5d:c2:d7:2c" }, "set-name": "eth0" } }, "version": 2 }Notable differences:
dhcp6: falsebecomesdhcp6: trueeth1is missingignore-carrieris missingRelevant Log Evidence
A complete
cloud-init collect-logsarchive is attached.cloud-init.tar.gz
The attached logs show that cloud-init reads
meta-dataanduser-datafrom the configured seed source (file:///var/lib/snapd/seed/cidata/). However, there is no corresponding log entry showingnetwork-configbeing read from the same location.Both
meta-dataanduser-dataare explicitly read from the seed source:However, there is no corresponding:
Even though the file exists in the seed directory and the same artifact is successfully processed when delivered via CIDATA USB or ISO media.
Appendix: Additional Evidence and Suspected Root Cause Analysis
Note
The observations in this appendix are based on local inspection of the cloud-init state and runtime artifacts collected from the affected system. This analysis was performed against the installed cloud-init instance and its serialized datasource state (
/var/lib/cloud/instance/obj.pkl). It is not intended to represent a review of the upstream cloud-init source repository or to assert a definitive root cause.Additional Evidence That
network-configIs Not Retained By The DatasourceDatasource object inspection after first boot shows that no network configuration is present on the initialized NoCloud datasource object.
Output:
Datasource origin:
Output:
Observation:
Source Code Review
During investigation, the NoCloud datasource implementation was reviewed to compare the standard seed discovery path with the
seedfrom=file://path.Standard NoCloud Discovery Path
The standard NoCloud discovery logic includes support for
network-config:Later, the datasource conditionally loads the network configuration:
This code path explicitly supports and loads
network-configwhen present.Alternate
seedfrom=file://PathWhen cloud-init processes a datasource configured via:
execution appears to follow a different code path:
Later:
The fourth return value from
util.read_seeded()is assigned to:_and is not subsequently assigned to:
Why This Appears Relevant
The observed runtime behavior appears consistent with this implementation path:
meta-datais processed successfully.user-datais processed successfully.network-configis not reflected in the effective configuration.ds._network_configisNone.network-config.Suspected Root Cause
This source review suggests that the NoCloud
seedfrom=file://code path may not retain or propagate the network configuration returned fromutil.read_seeded(), resulting in fallback networking being applied.This is a hypothesis based on code review and observed runtime behavior. Additional confirmation from cloud-init maintainers would be appreciated.