On Mon, Oct 17, 2022 at 09:39:52AM -0400, Stefan Berger wrote: > > > On 10/14/22 11:28, Daniel P. Berrangé wrote: > > On Thu, Oct 06, 2022 at 04:07:13PM +0200, Michal Prívozník wrote: > > > On 10/6/22 15:47, Daniel P. Berrangé wrote: > > > > On Wed, Oct 05, 2022 at 10:02:00AM -0400, Stefan Berger wrote: > > > > > Introduced VIR_MIGRATE_TPM_SHARED_STORAGE for migrating a TPM across > > > > > shared storage. > > > > > > > > > > At this point do not support this flag in 'virsh', yet. > > > > > > > > > > Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxxxxx> > > > > > --- > > > > > include/libvirt/libvirt-domain.h | 8 ++++++++ > > > > > 1 file changed, 8 insertions(+) > > > > > > > > > > diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h > > > > > index 8357aea797..110929039d 100644 > > > > > --- a/include/libvirt/libvirt-domain.h > > > > > +++ b/include/libvirt/libvirt-domain.h > > > > > @@ -1098,6 +1098,14 @@ typedef enum { > > > > > * Since: 8.5.0 > > > > > */ > > > > > VIR_MIGRATE_ZEROCOPY = (1 << 20), > > > > > + > > > > > + /* Support TPM migration across hosts that have shared storage setup for > > > > > + * the directory structure holding the state of TPMs. Typically this would > > > > > + * mean that the directory /var/lib/libvirt/swtpm is shared. > > > > > + * > > > > > + * Since: 8.9.0 > > > > > + */ > > > > > + VIR_MIGRATE_TPM_SHARED_STORAGE = (1 << 21), > > > > > > > > Why do we need this flag at all. We don't require users to set any flag > > > > when dealing with shared storage for disks, we just make sure we detect > > > > shared storage and "do the right thing" with it. > > > > > > That could work. Until the state is stored on a shared FS but not shared > > > across migration hosts. But I guess our disk migration code would fail > > > then too, wouldn't it? > > > > Exactly, if our existing code is good enough for disks for the last > > NNN years, then its good enough for TPM too. If someone finds a broken > > scenario, then we'll need to fix it for all cases, and that'll require > > something more general than a VIR_MIGRATE_TPM_SHARED_STORAGE flag. > > > > It is basically akin to a "make it work=yes" setting, and actually > > introduces failure scenarios that would not otherwise exist. eg > > if someone sets VIR_MIGRATE_TPM_SHARED_STORAGE when the TPM is on > > local only storage, or fails to set it when using shared storage. > > > I was trying to find out how storage is being copied and whether there > is any testing going on regarding whether storage for storage is shared > or not and how that's done. However, it seems there's an explicit hint > coming from the user encoded in the virsh command line options about > non-shared storage for storage. Or maybe I not dig deep enough? > > if (vshCommandOptBool(cmd, "copy-storage-all")) > flags |= VIR_MIGRATE_NON_SHARED_DISK; > > if (vshCommandOptBool(cmd, "copy-storage-inc")) > flags |= VIR_MIGRATE_NON_SHARED_INC; > > if (vshCommandOptBool(cmd, "copy-storage-synchronous-writes")) { > if (!(flags & VIR_MIGRATE_NON_SHARED_DISK) && > !(flags & VIR_MIGRATE_NON_SHARED_INC)) { > vshError(ctl, "'--copy-storage-synchronous-writes' requires one of '--copy-storage-all', 'copy-storage-inc'"); > goto out; > } > flags |= VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES; > } The key is in qemuMigrationSrcIsSafe(), and how it determines if a migration is safe. * Disk on local storage, no flags => unsafe, migration error * Disk on local storage, VIR_MIGRATE_NON_SHARED_DISK => ok, copies disk storage * Disk on shared storage, no flags => safe * Disk on shared storage, VIR_MIGRATE_NON_SHARED_DISK => ok, but needlessly copies disk storage The key helper methods are virFileIsSharedFS and virFileIsClusterFS which check the filesystem type for the path against a known list of shared/cluster FS. > So we won't do it this way for TPM state migration. Instead we can > try to write on the source migration side > > a) a simple file and detect whether the file is at the destination > b) a file with either a name or content that only the source and > destination libvirts would know at this point > > b) is to prevent stale files from becoming indicators for shared storage. No, please use the virFileIsSharedFS/ClusterFS helpers. With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|