[CRIU] [PATCH] zdtm: add a small program to create a zdtm container

Andrew Vagin avagin at parallels.com
Wed Aug 13 00:13:11 PDT 2014


On Tue, Aug 12, 2014 at 04:33:30PM +0000, Serge Hallyn wrote:
> Quoting Andrey Vagin (avagin at openvz.org):
> > I didn't find a way how to do that with help "unshare".
> > It's simpler to write this program. It looks better than tricks in
> > zdtm.sh.
> > 
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> 
> Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> 
> Would it be worth verifying that the waited-upon process has the expected pid?

Serge, could you look at the attached version. If you will not have
objections, I will send it with your acked-by.

Thanks.

> 
> > ---
> >  test/.gitignore |  1 +
> >  test/Makefile   |  6 ++++++
> >  test/zdtm.sh    | 14 ++------------
> >  test/zdtm_ct.c  | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 64 insertions(+), 12 deletions(-)
> >  create mode 100644 test/zdtm_ct.c
> > 
> > diff --git a/test/.gitignore b/test/.gitignore
> > index 9f00af7..1a6f6d2 100644
> > --- a/test/.gitignore
> > +++ b/test/.gitignore
> > @@ -4,3 +4,4 @@
> >  /dev
> >  /dump
> >  /*.log
> > +/zdtm_ct
> > diff --git a/test/Makefile b/test/Makefile
> > index 5d04805..fdb96ee 100644
> > --- a/test/Makefile
> > +++ b/test/Makefile
> > @@ -28,6 +28,12 @@ fault-injection: .FORCE
> >  zdtm_ns: $(shell echo "$(TST)" | tr ' ' '\n' | grep -P $(EXP))
> >  zdtm_nons: $(shell echo "$(TST)" | tr ' ' '\n' | grep -vP $(EXP))
> >  
> > +zdtm_ct: zdtm_ct.c
> > +
> > +clean:
> > +	rm -rf zdtm_ct
> > +	$(MAKE) -C zdtm $@
> > +
> >  $(TST):
> >  	./zdtm.sh --ct ${ZDTM_ARGS} $(@) &> $(subst /,_,$@).log || \
> >  	{ flock Makefile cat $(subst /,_,$@).log; exit 1; }
> > diff --git a/test/zdtm.sh b/test/zdtm.sh
> > index 395b256..2064866 100755
> > --- a/test/zdtm.sh
> > +++ b/test/zdtm.sh
> > @@ -874,21 +874,11 @@ while :; do
> >  		[ -z "$ZDTM_SH_IN_CT" ] && {
> >  			export ZDTM_SH_IN_CT=1
> >  			shift
> > -			args="$@"
> >  			# pidns is used to avoid conflicts
> >  			# mntns is used to mount /proc
> >  			# net is used to avoid conflicts of parasite sockets
> > -			unshare --pid --mount --ipc --net -- bash -c "
> > -				(
> > -					ip link set up dev lo &&
> > -					mount --make-rprivate / &&
> > -					umount -l /proc &&
> > -					mount -t proc proc /proc/ &&
> > -					umount -l /dev/pts &&
> > -					mount -t devpts zdtm_pts /dev/pts -o newinstance,ptmxmode=666 &&
> > -					mount --bind /dev/pts/ptmx /dev/ptmx &&
> > -					./zdtm.sh $args
> > -				)"
> > +			make zdtm_ct &&
> > +			./zdtm_ct ./zdtm.sh "$@"
> >  			exit
> >  		}
> >  		shift
> > diff --git a/test/zdtm_ct.c b/test/zdtm_ct.c
> > new file mode 100644
> > index 0000000..e3e9508
> > --- /dev/null
> > +++ b/test/zdtm_ct.c
> > @@ -0,0 +1,55 @@
> > +#define _GNU_SOURCE
> > +#include <sched.h>
> > +#include <sys/types.h>
> > +#include <sys/wait.h>
> > +#include <stdlib.h>
> > +#include <stdio.h>
> > +#include <sys/mount.h>
> > +
> > +int main(int argc, char **argv)
> > +{
> > +	pid_t pid;
> > +	int status;
> > +
> > +	/*
> > +	 *pidns is used to avoid conflicts
> > +	 * mntns is used to mount /proc
> > +	 * net is used to avoid conflicts of parasite sockets
> > +	*/
> > +	if (unshare(CLONE_NEWNS | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC))
> > +		return 1;
> > +	pid = fork();
> > +	if (pid == 0) {
> > +		if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL)) {
> > +			fprintf(stderr, "mount(/, S_REC | MS_PRIVATE)): %m");
> > +			return 1;
> > +		}
> > +		umount2("/proc", MNT_DETACH);
> > +		umount2("/dev/pts", MNT_DETACH);
> > +		if (mount("zdtm_proc", "/proc", "proc", 0, NULL)) {
> > +			fprintf(stderr, "mount(/proc): %m");
> > +			return 1;
> > +		}
> > +		if (mount("zdtm_devpts", "/dev/pts", "devpts", 0,
> > +					"newinstance,ptmxmode=0666")) {
> > +			fprintf(stderr, "mount(pts): %m");
> > +			return 1;
> > +		}
> > +		if (mount("/dev/pts/ptmx", "/dev/ptmx", NULL, MS_BIND, NULL)) {
> > +			fprintf(stderr, "mount(ptmx): %m");
> > +			return 1;
> > +		}
> > +		if (system("ip link set up dev lo"))
> > +			return 1;
> > +		execv(argv[1], argv + 1);
> > +		fprintf(stderr, "execve: %m");
> > +		return 1;
> > +	}
> > +
> > +	if (wait(&status) < 0) {
> > +		fprintf(stderr, "wait: %m");
> > +		return 1;
> > +	}
> > +
> > +	return status != 0 ? 1 : 0;
> > +}
> > -- 
> > 1.9.3
> > 
> > _______________________________________________
> > CRIU mailing list
> > CRIU at openvz.org
> > https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list