I've updated the SRU template providing one that should work.
The original config provided did not have any way to create a partitioned
device , but tried to put a filesystem on the first partition.
** Description changed:
+ === Begin SRU Template ===
+ [Impact]
+ If the user specifies cloud-config with a 'fs_setup' entry containing
+ a 'cmd', then warning will appear in cloud-init.log and expected filesystem
+ will not be created.
+
+ This is because cloud-init would essentially try to execute a name like:
+ "mkfs -t TYPE -L LABEL DEVICE"
+ rather than a name 'mkfs' with arguments '-t', TYPE, ...
+ No split was done on space. The fix was to enable
+ shell intrepretation so that the split would be done.
+
+ [Test Case]
+ This test case assumes a disk will be attached named '/dev/vdb'.
+ You can change the 'dev=' to be 'sdb' if that will be the device name.
+ The test cases boots an instance, ads proposed and then 'cleans' the
+ instance, but similarly this will work if the config is provided
+ in user-data.
+
+ $ dev=vdb
+ $ sudo tee /etc/cloud/cloud.cfg.d/disk-setup.cfg <<EOF
+ #cloud-config
+ disk_setup:
+ /dev/$dev:
+ table_type: gpt
+ layout: [[100, 83]]
+
+ fs_setup:
+ - cmd: mkfs -F -t %(filesystem)s -L %(label)s %(device)s
+ filesystem: ext4
+ device: /dev/$dev
+ partition: 1
+ label: repro
+
+ mounts:
+ - [/dev/${dev}1, /mnt]
+ EOF
+
+ $ sudo rm -Rf /var/lib/cloud /var/log/cloud-init*
+ ## remove the old entry in /etc/fstab, which can cause LP: #1691489
+ $ sudo sed -i.dist '/comment=cloudconfig/d' /etc/fstab
+
+ ## wipe the disk so that we make sure we format it.
+ $ sudo python3 -c "import sys;
+ buf = b'\\0' * 1024 * 1024 * 8
+ with open(sys.argv[1], 'wb+') as fp:
+ fp.write(buf)
+ fp.seek(-(len(buf)), 2)
+ fp.write(buf)" /dev/$dev
+
+ $ sudo reboot
+
+
+ ## Now ssh back in, and expect to have a filesystem on /dev/vdb1
+ ## that is mounted at /mnt
+
+ [Regression Potential]
+ Regression could occur if a user had provided a string to the 'cmd'
+ argument that had special shell characters in it.
+ For example:
+ cmd: "/my/cmd *foo*"
+
+ That would previously have executed the command "/mnt/cmd *foo*", but
+ will now execute the command /mnt/cmd with argument shell filename
+ expansion of *foo*
+
+ [Other Info]
+ Upstream commit at
+ https://git.launchpad.net/cloud-init/commit/?id=4f0f171c2
+
+ === End SRU Template ===
+
+
This reproduces on Azure, but it should fail similarly elsewhere.
Consider repro.yml:
#cloud-config
fs_setup:
- - special:
- cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s
- filesystem: ext4
- device: /dev/sdb1
- label: repro
+ - special:
+ cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s
+ filesystem: ext4
+ device: /dev/sdb1
+ label: repro
- Create a VM with this cloud config:
+ Create a VM with this cloud config:
$ az vm create -g $rg -l westus2 --custom-data @repro.yml --image UbuntuLTS
-n repro2
Then cloud-init will fail with:
Failed to exec of 'mkfs -t ext4 -L repro /dev/sdb1':
Unexpected error while running command.
Command: mkfs -t ext4 -L repro /dev/sdb1
Exit code: -
Reason: [Errno 2] No such file or directory: 'mkfs -t ext4 -L repro /dev/sdb1'
$ dpkg-query -W -f='${Version}' cloud-init
0.7.9-48-g1c795b9-0ubuntu1~16.04.1
Bug is in mkfs() in cc_disk_setup.py, which creates a shell-like string
in the case that cmd was specified and a exec-like array in the other
case (around line 913).
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1687712
Title:
cc_disk_setup: fs_setup with cmd doesn't work
To manage notifications about this bug go to:
https://bugs.launchpad.net/cloud-init/+bug/1687712/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs