On Wed, Apr 22, 2020 at 11:28:36AM +0200, Thomas Lamprecht wrote: > On 4/22/20 10:30 AM, Fabian Ebner wrote: > > Turns out that this alone doesn't make starting containers with an > > unmounted zfs subvolume working. But "pct clone" and "pct mount" can still > > benefit from this patch. The problem for starting a container is that when > > we call PVE::Storage::activate_volumes, it happens inside the > > lxc-pve-prestart-hook where the kernel/apparmor will block the "zfs mount" > > operation. And this seems to be the case even for a privileged container > > and/or adding "lxc.apparmor.profile: unconfined" (I guess because the > > relevant apparmor profile is always "lxc-start" which is not affected by > > those changes?) > > > > This sounds wrong, Wolfgang can you check this out?
lxc-start and any hooks run by it are restricted to mounting only within the paths lxc uses for setting up the container. Particularly it uses these rules: mount -> /usr/lib*/*/lxc/{**,}, mount -> /usr/lib*/lxc/{**,}, mount -> /usr/lib/x86_64-linux-gnu/lxc/rootfs/{,**}, (There are more mount rules, but they're for special cases.) The only thing we *can* do is check whether there's a zfs mount point there before bind-mounting and erroring out if that's not the case. (My personal favorite would've been using `mountpoint=legacy` for container subvols, though, which would be mounted only to the destination.) With this patch we might at least get better errors than without? > > Calling activate_volumes directly in vm_start would work around this, > > but if we remove it from lxc-pve-prestart-hook then it can break things for > > somebody using "systemctl start pve-container@ID" directly (depending on > > the storage) and if we don't remove it, it's code/work duplication. Is > > modifying the lxc-start profile viable? > > > > On 21.04.20 14:00, Fabian Ebner wrote: > >> This makes containers work even if the subvolumes are not already > >> mounted beforehand for some reason. Without this patch, container > >> could quietly fail for e.g. start and full clone, because > >> bind-mounting still "worked" on the empty directory. > >> > >> Signed-off-by: Fabian Ebner <f.eb...@proxmox.com> > >> --- > >> > >> This can be seen as an alternative to [0], which hasn't been applied > >> AFAICT. And this approach even works when the subvolume is not mounted > >> for a different reason than the one described in [0]. For example, I > >> ran into the problem by having a non-empty '/myzpool', causing 'myzpool' > >> to be not mountable, but 'myzpool/subvol-123-disk-0' would still be > >> mountable. > >> > >> [0]: https://pve.proxmox.com/pipermail/pve-devel/2020-March/042089.html > >> > >> PVE/Storage/ZFSPoolPlugin.pm | 11 ++++++++--- > >> 1 file changed, 8 insertions(+), 3 deletions(-) > >> > >> diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm > >> index 10354b3..4a85732 100644 > >> --- a/PVE/Storage/ZFSPoolPlugin.pm > >> +++ b/PVE/Storage/ZFSPoolPlugin.pm > >> @@ -546,9 +546,14 @@ sub activate_volume { > >> my (undef, undef, undef, undef, undef, undef, $format) = > >> $class->parse_volname($volname); > >> - return 1 if $format ne 'raw'; > >> - > >> - $class->zfs_wait_for_zvol_link($scfg, $volname); > >> + if ($format eq 'raw') { > >> + $class->zfs_wait_for_zvol_link($scfg, $volname); > >> + } elsif ($format eq 'subvol') { > >> + my $mounted = $class->zfs_get_properties($scfg, 'mounted', > >> "$scfg->{pool}/$volname"); > >> + if ($mounted !~ m/^yes$/) { > >> + $class->zfs_request($scfg, undef, 'mount', > >> "$scfg->{pool}/$volname"); > >> + } > >> + } > >> return 1; > >> } > >> > > > > _______________________________________________ > > pve-devel mailing list > > pve-devel@pve.proxmox.com > > https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel