I had a go at trying to implement the “cloud.conf in gadget snap” option, and am not having much luck. My model is set to grade: dangerous.
I can see that the cloud.conf from my gadget snap has been copied to /etc/cloud/cloud.cfg.d/80_device_gadget.cfg, but it isn’t obvious that any of the directives have been run (I tried using runcmd and write_files).
On the first boot (after the initial unpack/setup boot), the only reference to “cloud” I see in the journal is:
Mar 29 02:33:04 ubuntu snapd[1880]: devicemgr.go:891: System initialized, cloud-init reported to be in disabled state, disabled permanently
i cant find a referenc for this anymore (probably someone told it to me on IRC) but i happen to remember that the filename needs to be cloud.cfg in the gadget case and that you need a “nocloud” section in it (i could mis-remember or it might be outdated info tough) …
I’d originally tried with cloud.cfg, which doesn’t work. When I switched to cloud.conf (as documented in @ijohnson’s post), I could see that the config file was being copied out of my gadget snap. And the snapd code is definitely looking for that file name:
I’ll have to look more into the nocloud thing. From a brief read of the docs, that seemed to be about feeding cloud-init data into the system from some external source. Here, the config has already been copied to /etc/cloud by snapd.
The write_files stanza is to a location that is made writable in the boot file system. The runcmd command references a script shipped inside one of the snaps required by the model definition.
Perhaps you need to include datasource_list: [NoCloud] in your config? I don’t know how cloud-init internally decides if it’s used or not, but all snapd does to decide if cloud-init should be disabled or not is by querying if there is a datasource being used or not.
Thanks @ijohnson for the confirmation. When ubuntu-image runs, can we copy the file to ubuntu-seed directory, <ubuntu-seed>/data/etc/cloud/cloud.cfg.d/ with filenames ending with .cfg as you mentioned here, Ubuntu-image command crashed?
Hi @ijohnson
I’m building an UC20 image at the moment and try to use a cloud-init config-file for some basic setup on a fresh install (adding some users, creating some files, etc.) as I did previously with a UC18 image.
For testing I basically went along this tutorial: https://ubuntu.com/core/docs/custom-images
Since I don’t want to create my own gadget.snap at the moment, I’m trying out your option 2, but it doesn’t seem to work for me. I build the UC20 image using ubuntu-image, then mount the ubuntu-seed partition of the finished image, create a directory <seed>/data/etc/cloud/cloud.cfg.d/ and copy a simple cloud.cfg (I tried cloud.conf as well) in there:
My problem is, that this file doesn’t seem to be used when I later boot up the image (no user is created) and I’m not sure where to look for log-files in UC20.
Also the table you wrote into post Ubuntu-image command crashed confused me a bit. Is it possible the “Methodes” in this table are in the wrong order?
In order to use cloud.conf on ubuntu-seed with UC20, you need to have grade: dangerous in your model assertion as indicated by the table above. The work for enabling this to work for grade: signed is not yet complete.
I think I was a bit confused by that table. If I understand it right, I’m going for “Option 2” in your post which is described as
Put it in the ubuntu-seed partition at <ubuntu-seed>/data/etc/cloud/cloud.cfg.d/ with filenames ending with .cfg"
which says is allowed under these conditions:
Option 2 is allowed only with model assertion grade dangerous and signed (so this does not work for secured).
The table on the other hand has this option in the first line (named “Ubuntu-seed”, I guess), with different allowed grade. If this is a mistake in the post, maybe you could update it?
I have recently hit some other issue when using ubuntu-image on 22.04 (jammy) lxd vm.
The python3 version is 3.10.4
It is strange that it shows using …/214/usr/lib/python3.5/
Here is the error:
ERROR:ubuntu-image:COMMAND FAILED: sudo mount -oloop work/volumes/kria/part1.img /tmp/tmp7w2joncy/root-mount
ERROR:ubuntu-image:
ERROR:ubuntu-image:sudo: account validation failure, is your account locked?
sudo: a password is required
ERROR:ubuntu-image:uncaught exception in state machine step: [11] populate_filesystems
Traceback (most recent call last):
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/state.py”, line 82, in next
step()
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/common_builder.py”, line 529, in populate_filesystems
self._populate_one_volume(name, volume)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/common_builder.py”, line 477, in _populate_one_volume
part.filesystem_label, preserve_ownership=True)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/helpers.py”, line 256, in mkfs_ext4
with mount(img_file) as mountpoint:
File “/snap/ubuntu-image/214/usr/lib/python3.5/contextlib.py”, line 59, in enter
return next(self.gen)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/helpers.py”, line 208, in mount
run(‘sudo mount -oloop {} {}’.format(img, mountpoint))
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/helpers.py”, line 123, in run
proc.check_returncode()
File “/snap/ubuntu-image/214/usr/lib/python3.5/subprocess.py”, line 659, in check_returncode
self.stderr)
subprocess.CalledProcessError: Command ‘[‘sudo’, ‘mount’, ‘-oloop’, ‘work/volumes/kria/part1.img’, ‘/tmp/tmp7w2joncy/root-mount’]’ returned non-zero exit status 1
ERROR:ubuntu-image:Crash in state machine
Traceback (most recent call last):
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/main.py”, line 393, in main
list(state_machine)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/state.py”, line 82, in next
step()
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/common_builder.py”, line 529, in populate_filesystems
self._populate_one_volume(name, volume)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/common_builder.py”, line 477, in _populate_one_volume
part.filesystem_label, preserve_ownership=True)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/helpers.py”, line 256, in mkfs_ext4
with mount(img_file) as mountpoint:
File “/snap/ubuntu-image/214/usr/lib/python3.5/contextlib.py”, line 59, in enter
return next(self.gen)
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/helpers.py”, line 208, in mount
run(‘sudo mount -oloop {} {}’.format(img, mountpoint))
File “/snap/ubuntu-image/214/lib/python3/site-packages/ubuntu_image/helpers.py”, line 123, in run
proc.check_returncode()
File “/snap/ubuntu-image/214/usr/lib/python3.5/subprocess.py”, line 659, in check_returncode
self.stderr)
subprocess.CalledProcessError: Command ‘[‘sudo’, ‘mount’, ‘-oloop’, ‘work/volumes/kria/part1.img’, ‘/tmp/tmp7w2joncy/root-mount’]’ returned non-zero exit status 1
finish
local ret=1
‘[’ 1 -eq 0 ‘]’
echo ‘Build failed …’
Build failed …
Sorry if this is not relevant here, and if necessary I can create another issue.
Thanks.