[CRIU] [PATCH] mount: treat non-openable mountpoint as unreachable

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Wed Nov 29 18:34:37 MSK 2017



On 11/20/2017 05:54 PM, Pavel Tikhomirov wrote:
> a) By default systemd creates a separate mount namespace for mysql,
> setups "slave" mount propagation for /run and also mounts tmpfs to
> /run/user in these ns, because of:
> 
> cat /usr/lib/systemd/system/mariadb.service | grep "/run/user" -A1
> ProtectHome=true
> rpm -qf /usr/lib/systemd/system/mariadb.service
> MariaDB-server-10.2.10-1.el7.centos.x86_64
> 
> b) When ssh(root) is connected - systemd mounts tmpfs in container root
> mount namespace to /run/user/0. As /run is slave mount /run/user/0 also
> propagates to mysql's mount namespace and initially is put under
> /run/user - becoming overmounted.
> 
> c) Criu is not yet able to dump overmounted tmpfs
> 
> So we have error when dumping mariadb CT with active ssh inside:
> 
> prlctl suspend mariadb-downloaded
> Suspending the CT...
> ...
> (02.432423) Error (criu/mount.c:1202): mnt: Can't open ./run/user/0: No
> such file or directory
> (02.465827) Error (criu/cr-dump.c:2005): Dumping FAILED.
> 
> To fix these we can just skip these mount_info in dump_one_fs and look
> for a better bind-mount candidate, which, for our case, exists in
> container root mntns.
> 
> note1: I'm not sure how to do a test for these as error depends on
> the order of bindmounts in criu's representation.
> 
> note2: Other options is to support dumping overmounted mounts.

Done 2 in scope of patch series: "[PATCH 0/5] mount: make it possible to 
dump overmounted mount", so these patch can be skipped in case the later 
series will be applied.

> 
> https://jira.sw.ru/browse/PSBM-57362
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
>   criu/mount.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/criu/mount.c b/criu/mount.c
> index ccd3fef2c..d5cd7b535 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -1007,6 +1007,7 @@ int mnt_is_dir(struct mount_info *pm)
>   	return 0;
>   }
>   
> +#define MNT_UNREACHABLE INT_MIN
>   /*
>    * mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
>    * If mnt_fd is -1, the mountpoint will be opened by this function.
> @@ -1026,8 +1027,8 @@ int __open_mountpoint(struct mount_info *pm, int mnt_fd)
>   
>   		mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
>   		if (mnt_fd < 0) {
> -			pr_perror("Can't open %s", pm->ns_mountpoint);
> -			return -1;
> +			pr_warn("Can't open %s", pm->ns_mountpoint);
> +			return MNT_UNREACHABLE;
>   		}
>   	}
>   
> @@ -1097,7 +1098,6 @@ static char *get_clean_mnt(struct mount_info *mi, char *mnt_path_tmp, char *mnt_
>   	return mnt_path;
>   }
>   
> -#define MNT_UNREACHABLE INT_MIN
>   int open_mountpoint(struct mount_info *pm)
>   {
>   	struct mount_info *c;
> 

-- 
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.


More information about the CRIU mailing list