Commit 1741438f authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

ns: add an ability to not dump properties for a specified namespace

Docker requested an option, when network devices and routes are not
dumped and not restored. Instead of this Docker will call libnetwork
hook to tune netns from the setup-namespaces action.

Cc: Saied Kazemi <saied@google.com>
Tested-by: 's avatarRoss Boucher <boucher@gmail.com>
Signed-off-by: 's avatarAndrew Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent b13a132e
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sched.h>
#include "crtools.h" #include "crtools.h"
#include "cr_options.h" #include "cr_options.h"
...@@ -459,6 +460,12 @@ static int setup_opts_from_req(int sk, CriuOpts *req) ...@@ -459,6 +460,12 @@ static int setup_opts_from_req(int sk, CriuOpts *req)
if (req->has_ghost_limit) if (req->has_ghost_limit)
opts.ghost_limit = req->ghost_limit; opts.ghost_limit = req->ghost_limit;
if (req->has_empty_ns) {
opts.empty_ns = req->empty_ns;
if (req->empty_ns & ~(CLONE_NEWNET))
goto err;
}
if (req->n_irmap_scan_paths) { if (req->n_irmap_scan_paths) {
for (i = 0; i < req->n_irmap_scan_paths; i++) { for (i = 0; i < req->n_irmap_scan_paths; i++) {
if (irmap_scan_path_add(req->irmap_scan_paths[i])) if (irmap_scan_path_add(req->irmap_scan_paths[i]))
......
...@@ -67,6 +67,7 @@ void init_opts(void) ...@@ -67,6 +67,7 @@ void init_opts(void)
opts.ps_socket = -1; opts.ps_socket = -1;
opts.ghost_limit = DEFAULT_GHOST_LIMIT; opts.ghost_limit = DEFAULT_GHOST_LIMIT;
opts.timeout = DEFAULT_TIMEOUT; opts.timeout = DEFAULT_TIMEOUT;
opts.empty_ns = 0;
} }
static int parse_ns_string(const char *ptr) static int parse_ns_string(const char *ptr)
...@@ -272,6 +273,7 @@ int main(int argc, char *argv[], char *envp[]) ...@@ -272,6 +273,7 @@ int main(int argc, char *argv[], char *envp[])
{ "lsm-profile", required_argument, 0, 1071 }, { "lsm-profile", required_argument, 0, 1071 },
{ "timeout", required_argument, 0, 1072 }, { "timeout", required_argument, 0, 1072 },
{ "external", required_argument, 0, 1073 }, { "external", required_argument, 0, 1073 },
{ "empty-ns", required_argument, 0, 1074 },
{ }, { },
}; };
...@@ -543,6 +545,14 @@ int main(int argc, char *argv[], char *envp[]) ...@@ -543,6 +545,14 @@ int main(int argc, char *argv[], char *envp[])
if (add_external(optarg)) if (add_external(optarg))
return 1; return 1;
break; break;
case 1074:
if (!strcmp("net", optarg))
opts.empty_ns |= CLONE_NEWNET;
else {
pr_err("Unsupported empty namespace: %s", optarg);
return 1;
}
break;
case 'V': case 'V':
pr_msg("Version: %s\n", CRIU_VERSION); pr_msg("Version: %s\n", CRIU_VERSION);
if (strcmp(CRIU_GITID, "0")) if (strcmp(CRIU_GITID, "0"))
...@@ -792,6 +802,9 @@ usage: ...@@ -792,6 +802,9 @@ usage:
" tty[rdev:dev]\n" " tty[rdev:dev]\n"
" pipe[inode]\n" " pipe[inode]\n"
" socket[inode]\n" " socket[inode]\n"
" --empty-ns {net}\n"
" Create a namespace, but don't restore its properies.\n"
" An user will retore them from action scripts.\n"
"\n" "\n"
"* Logging:\n" "* Logging:\n"
" -o|--log-file FILE log file name\n" " -o|--log-file FILE log file name\n"
......
...@@ -106,6 +106,7 @@ struct cr_options { ...@@ -106,6 +106,7 @@ struct cr_options {
bool lsm_supplied; bool lsm_supplied;
char *lsm_profile; char *lsm_profile;
unsigned int timeout; unsigned int timeout;
unsigned int empty_ns;
}; };
extern struct cr_options opts; extern struct cr_options opts;
......
...@@ -1062,16 +1062,18 @@ int dump_net_ns(int ns_id) ...@@ -1062,16 +1062,18 @@ int dump_net_ns(int ns_id)
return -1; return -1;
ret = mount_ns_sysfs(); ret = mount_ns_sysfs();
if (!ret) if (!(opts.empty_ns & CLONE_NEWNET)) {
ret = dump_netns_conf(fds); if (!ret)
if (!ret) ret = dump_netns_conf(fds);
ret = dump_links(fds); if (!ret)
if (!ret) ret = dump_links(fds);
ret = dump_ifaddr(fds); if (!ret)
if (!ret) ret = dump_ifaddr(fds);
ret = dump_route(fds); if (!ret)
if (!ret) ret = dump_route(fds);
ret = dump_rule(fds); if (!ret)
ret = dump_rule(fds);
}
if (!ret) if (!ret)
ret = dump_iptables(fds); ret = dump_iptables(fds);
if (!ret) if (!ret)
...@@ -1088,21 +1090,23 @@ int dump_net_ns(int ns_id) ...@@ -1088,21 +1090,23 @@ int dump_net_ns(int ns_id)
int prepare_net_ns(int pid) int prepare_net_ns(int pid)
{ {
int ret; int ret = 0;
NetnsEntry *netns = NULL; NetnsEntry *netns = NULL;
ret = restore_netns_conf(pid, &netns); if (!(opts.empty_ns & CLONE_NEWNET)) {
if (!ret) ret = restore_netns_conf(pid, &netns);
ret = restore_links(pid, &netns); if (!ret)
if (netns) ret = restore_links(pid, &netns);
netns_entry__free_unpacked(netns, NULL); if (netns)
netns_entry__free_unpacked(netns, NULL);
if (!ret)
ret = restore_ifaddr(pid); if (!ret)
if (!ret) ret = restore_ifaddr(pid);
ret = restore_route(pid); if (!ret)
if (!ret) ret = restore_route(pid);
ret = restore_rule(pid); if (!ret)
ret = restore_rule(pid);
}
if (!ret) if (!ret)
ret = restore_iptables(pid); ret = restore_iptables(pid);
if (!ret) if (!ret)
......
...@@ -89,6 +89,7 @@ message criu_opts { ...@@ -89,6 +89,7 @@ message criu_opts {
optional uint32 ghost_limit = 35 [default = 0x100000]; optional uint32 ghost_limit = 35 [default = 0x100000];
repeated string irmap_scan_paths = 36; repeated string irmap_scan_paths = 36;
repeated string external = 37; repeated string external = 37;
optional uint32 empty_ns = 38;
} }
message criu_dump_resp { message criu_dump_resp {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment