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 ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs