[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