diff --git a/internal/server/device/tpm.go b/internal/server/device/tpm.go index 71314e8c99c..8162c13b23f 100644 --- a/internal/server/device/tpm.go +++ b/internal/server/device/tpm.go @@ -202,6 +202,9 @@ func (d *tpm) startVM() (*deviceConfig.RunConfig, error) { }, } + // Delete any leftover socket. + _ = os.Remove(socketPath) + proc, err := subprocess.NewProcess("swtpm", []string{"socket", "--tpm2", "--tpmstate", fmt.Sprintf("dir=%s", tpmDevPath), "--ctrl", fmt.Sprintf("type=unixio,path=swtpm-%s.sock", d.name)}, "", "") if err != nil { return nil, err @@ -227,6 +230,21 @@ func (d *tpm) startVM() (*deviceConfig.RunConfig, error) { return nil, fmt.Errorf("Failed to save swtpm state for device %q: %w", d.name, err) } + // Wait for the socket to be available. + exists := false + for i := 0; i < 20; i++ { + if util.PathExists(socketPath) { + exists = true + break + } + + time.Sleep(100 * time.Millisecond) + } + + if !exists { + return nil, fmt.Errorf("swtpm socket didn't appear within 2s") + } + revert.Success() return &runConf, nil