Moment of enlightenment: It occurred to me to check /proc/cmdline, and I discovered that the ; character in the cloud-init config string was causing a problem: When typed directly into the grub console (as packer does), it needs to be escaped to avoid being interpreted as a line feed. This is obviously not necessary when executed via KVM. Probably worth noting in the docs for people who forget that grub’s console is a shell-like environment and passing the kernel command line through that environment represents a(nother) level of escaping.
I am now at least to the point that the config is downloading into the VM and failing schema validation (
), so I think my noteworthy issues are resolved and the rest is just development work. Thanks for the help everyone.