vzctl provides two descriptors signalfd and waitfd, it's used for apply host-side configuration after creating environment. A signal is send to signalfd after creating environment and an answer is recieved from waitfd.
Signed-off-by: Andrey Vagin <ava...@openvz.org> --- scripts/Makefile.am | 3 ++- scripts/vps-rst-env.in | 44 ++++++++++++++++++++++++++++++++++++++++++++ scripts/vps-rst.in | 4 ++++ src/lib/hooks_ct.c | 33 +++++++++++++++++++++------------ 4 files changed, 71 insertions(+), 13 deletions(-) create mode 100755 scripts/vps-rst-env.in diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 05381f8..e77f19d 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -29,7 +29,8 @@ script_SCRIPTS = \ vzevent-reboot \ vps-pci \ vps-cpt \ - vps-rst + vps-rst \ + vps-rst-env EXTRA_DIST = \ $(script_SCRIPTS:%=%.in) diff --git a/scripts/vps-rst-env.in b/scripts/vps-rst-env.in new file mode 100755 index 0000000..a0ec898 --- /dev/null +++ b/scripts/vps-rst-env.in @@ -0,0 +1,44 @@ +#!/bin/sh +# Copyright (C) 2013, Parallels, Inc. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# This script is called by CRIU (http://criu.org) after creating namespaces. +# +# Parameters are passed in environment variables. +# Required parameters: +# VZCTL_PID - pid of vzctl +# STATUSFD - file descriptor for sending signal to vzctl +# WAITFD - file descriptor for receiving signal from vzctl +# VE_STATE_FILE - file with PID of container init process +# VE_NETNS_FILE - file, which used by ip netns + +[[ "setup-namespaces" == "$CRTOOLS_SCRIPT_ACTION" ]] || exit 0 + +exec 1>&2 +. @SCRIPTDIR@/vps-functions + +vzcheckvar VZCTL_PID +vzcheckvar STATUSFD +vzcheckvar WAITFD +vzcheckvar VE_NETNS_FILE +vzcheckvar VE_STATE_FILE + +pid=$(cat $VE_STATE_FILE) +ln -sf /proc/$pid/ns/net $VE_NETNS_FILE + +echo -ne '\0\0\0\0' > /proc/$VZCTL_PID/fd/$STATUSFD +ret=$(cat /proc/$VZCTL_PID/fd/$WAITFD | xxd -p -l 4) +[ "$ret" = "00000000" ] && exit 0 || exit 1 diff --git a/scripts/vps-rst.in b/scripts/vps-rst.in index 91080b3..7cfe658 100755 --- a/scripts/vps-rst.in +++ b/scripts/vps-rst.in @@ -26,6 +26,8 @@ # VE_DUMP_DIR - directory for saving dump files # VE_STATE_FILE - file to write CT init PID to # VE_VETH_DEVS - pair of veth names (CT=HW\n) +# VE_NS_SCRIPT - script, which will be executed after creating namespaces +# exec 1>&2 . @SCRIPTDIR@/vps-functions @@ -34,6 +36,7 @@ vzcheckvar VE_ROOT vzcheckvar VE_STATE_FILE vzcheckvar VE_DUMP_DIR vzcheckvar VE_VETH_DEVS +vzcheckvar VE_NS_SCRIPT veth_args="" for dev in $VE_VETH_DEVS; do @@ -46,6 +49,7 @@ criu restore --file-locks \ --link-remap \ --root $VE_ROOT \ --restore-detached \ + --action-script $VE_NS_SCRIPT \ -D $VE_DUMP_DIR \ -o restore.log \ -vvvv \ diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c index 18650e0..bf20779 100644 --- a/src/lib/hooks_ct.c +++ b/src/lib/hooks_ct.c @@ -391,6 +391,7 @@ static int ct_env_create_real(struct arg_start *arg) int userns_p[2]; int ret, fd; char pidpath[STR_SIZE]; + char ctpath[STR_SIZE]; stack_size = get_pagesize(); if (stack_size < 0) @@ -478,13 +479,20 @@ static int ct_env_create_real(struct arg_start *arg) close(userns_p[1]); } + snprintf(ctpath, STR_SIZE, "%s/%d", NETNS_RUN_DIR, arg->veid); + snprintf(pidpath, STR_SIZE, "/proc/%d/ns/net", ret); + if (symlink(pidpath, ctpath)) { + logger(-1, errno, "Can't symlink into netns file %s", ctpath); + destroy_container(arg->veid); + return -VZ_RESOURCE_ERROR; + } + return ret; } int ct_env_create(struct arg_start *arg) { int ret; - char procpath[STR_SIZE]; char ctpath[STR_SIZE]; /* non-fatal */ @@ -519,14 +527,6 @@ int ct_env_create(struct arg_start *arg) if (ret < 0) return -ret; - snprintf(procpath, STR_SIZE, "/proc/%d/ns/net", ret); - ret = symlink(procpath, ctpath); - if (ret) { - logger(-1, errno, "Can't symlink into netns file %s", ctpath); - destroy_container(arg->veid); - return VZ_RESOURCE_ERROR; - } - return 0; } @@ -924,7 +924,7 @@ static int ct_chkpnt(vps_handler *h, envid_t veid, static int ct_restore_fn(vps_handler *h, envid_t veid, const vps_res *res, int wait_p, int old_wait_p, int err_p, void *data) { - char *argv[2], *env[5]; + char *argv[2], *env[10]; const char *dumpfile = NULL; const char *statefile = NULL; cpt_param *param = data; @@ -957,8 +957,17 @@ static int ct_restore_fn(vps_handler *h, envid_t veid, const vps_res *res, "%s=%s\n", veth->dev_name_ve, veth->dev_name); } env[3] = strdup(buf); - - env[4] = NULL; + snprintf(buf, sizeof(buf), "VE_NS_SCRIPT=%s", SCRIPTDIR "/vps-rst-env"); + env[4] = strdup(buf); + snprintf(buf, sizeof(buf), "VZCTL_PID=%d", getpid()); + env[5] = strdup(buf); + snprintf(buf, sizeof(buf), "STATUSFD=%d", STDIN_FILENO); + env[6] = strdup(buf); + snprintf(buf, sizeof(buf), "WAITFD=%d", wait_p); + env[7] = strdup(buf); + snprintf(buf, sizeof(buf), "VE_NETNS_FILE=%s/%d", NETNS_RUN_DIR, veid); + env[8] = strdup(buf); + env[9] = NULL; ret = run_script(argv[0], argv, env, 0); free_arg(env); -- 1.8.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel