diff --git a/src/vmspawn/vmspawn-util.h b/src/vmspawn/vmspawn-util.h index b3d72ede72..ff1cffd13e 100644 --- a/src/vmspawn/vmspawn-util.h +++ b/src/vmspawn/vmspawn-util.h @@ -12,6 +12,12 @@ # define ARCHITECTURE_SUPPORTS_SMBIOS 0 #endif +#if defined(__x86_64__) || defined(__i386__) +# define ARCHITECTURE_SUPPORTS_VMGENID 1 +#else +# define ARCHITECTURE_SUPPORTS_VMGENID 0 +#endif + #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) # define ARCHITECTURE_SUPPORTS_TPM 1 #else diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c index 4b1898ac3f..9e062006ab 100644 --- a/src/vmspawn/vmspawn.c +++ b/src/vmspawn/vmspawn.c @@ -1656,24 +1656,26 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { if (strv_extend_many(&cmdline, "-uuid", SD_ID128_TO_UUID_STRING(arg_uuid)) < 0) return log_oom(); - /* Derive a vmgenid automatically from the invocation ID, in a deterministic way. */ - sd_id128_t vmgenid; - r = sd_id128_get_invocation_app_specific(SD_ID128_MAKE(bd,84,6d,e3,e4,7d,4b,6c,a6,85,4a,87,0f,3c,a3,a0), &vmgenid); - if (r < 0) { - log_debug_errno(r, "Failed to get invocation ID, making up randomized vmgenid: %m"); + if (ARCHITECTURE_SUPPORTS_VMGENID) { + /* Derive a vmgenid automatically from the invocation ID, in a deterministic way. */ + sd_id128_t vmgenid; + r = sd_id128_get_invocation_app_specific(SD_ID128_MAKE(bd,84,6d,e3,e4,7d,4b,6c,a6,85,4a,87,0f,3c,a3,a0), &vmgenid); + if (r < 0) { + log_debug_errno(r, "Failed to get invocation ID, making up randomized vmgenid: %m"); - r = sd_id128_randomize(&vmgenid); - if (r < 0) - return log_error_errno(r, "Failed to make up randomized vmgenid: %m"); + r = sd_id128_randomize(&vmgenid); + if (r < 0) + return log_error_errno(r, "Failed to make up randomized vmgenid: %m"); + } + + _cleanup_free_ char *vmgenid_device = NULL; + if (asprintf(&vmgenid_device, "vmgenid,guid=" SD_ID128_UUID_FORMAT_STR, SD_ID128_FORMAT_VAL(vmgenid)) < 0) + return log_oom(); + + if (strv_extend_many(&cmdline, "-device", vmgenid_device) < 0) + return log_oom(); } - _cleanup_free_ char *vmgenid_device = NULL; - if (asprintf(&vmgenid_device, "vmgenid,guid=" SD_ID128_UUID_FORMAT_STR, SD_ID128_FORMAT_VAL(vmgenid)) < 0) - return log_oom(); - - if (strv_extend_many(&cmdline, "-device", vmgenid_device) < 0) - return log_oom(); - /* if we are going to be starting any units with state then create our runtime dir */ _cleanup_free_ char *runtime_dir = NULL; _cleanup_(rm_rf_physical_and_freep) char *runtime_dir_destroy = NULL; @@ -2039,6 +2041,10 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { r = strv_extend_many(&cmdline, "-device", "scsi-hd,drive=vmspawn,bootindex=1"); if (r < 0) return log_oom(); + + r = grow_image(arg_image, arg_grow_image); + if (r < 0) + return r; } if (arg_directory) { @@ -2334,10 +2340,6 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { return log_error_errno(r, "Failed to parse $SYSTEMD_VMSPAWN_QEMU_EXTRA: %m"); } - r = grow_image(arg_image, arg_grow_image); - if (r < 0) - return r; - if (DEBUG_LOGGING) { _cleanup_free_ char *joined = quote_command_line(cmdline, SHELL_ESCAPE_EMPTY); if (!joined)