From 144f0fc0c8a5e2f6b72179e2b5fb992474da24ad Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 22 Apr 2012 14:48:21 +0200 Subject: [PATCH] nspawn: add --uuid= switch to allow setting the machine id for the container --- TODO | 6 +----- man/systemd-nspawn.xml | 11 +++++++++++ src/nspawn/nspawn.c | 24 ++++++++++++++++++++---- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 2569b41bd..e38c1105a 100644 --- a/TODO +++ b/TODO @@ -43,8 +43,6 @@ Features: * cg_shorten_controllers() misuses alloca() -* suspend/hibernate/hybrid support, auto-suspend logic with idle hint - * udev systemd unify: - strpcpy(), strpcpyl(), strscpy(), strscpyl() - utf8 validator code @@ -80,8 +78,6 @@ Features: * add man page documenting all kernel cmdline options, including stuff like fsck.mode= -* show getty in container mode, not sulogin - * support container_ttys= * journald: make configurable "store-on-var", "store-on-run", "dont-store", "auto" @@ -109,7 +105,7 @@ Features: * add command to systemctl to plot dependency graph as tree (see rhbz 795365) -* make logind reserve tty10 or so for text logins, so that gdm never picks it up +* make logind reserve tty9 or so for text logins, so that gdm never picks it up * add option to sockets to avoid activation. Instead just drop packets/connections, see http://cyberelk.net/tim/2012/02/15/portreserve-systemd-solution/ diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml index 28e50359f..5bf43e853 100644 --- a/man/systemd-nspawn.xml +++ b/man/systemd-nspawn.xml @@ -164,6 +164,17 @@ + + + + Set the specified uuid + for the container. The init system + will initialize + /etc/machine-id + from this if this file is not set yet. + + + diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 7050c05ec..bf3a84471 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -55,6 +55,7 @@ static char *arg_directory = NULL; static char *arg_user = NULL; static char **arg_controllers = NULL; +static char *arg_uuid = NULL; static bool arg_private_network = false; static bool arg_boot = false; @@ -67,6 +68,7 @@ static int help(void) { " -b --boot Boot up full system (i.e. invoke init)\n" " -u --user=USER Run the command under specified user or uid\n" " -C --controllers=LIST Put the container in specified comma-separated cgroup hierarchies\n" + " --uuid=UUID Set a specific machine UUID for the container\n" " --private-network Disable network in container\n", program_invocation_short_name); @@ -76,7 +78,8 @@ static int help(void) { static int parse_argv(int argc, char *argv[]) { enum { - ARG_PRIVATE_NETWORK = 0x100 + ARG_PRIVATE_NETWORK = 0x100, + ARG_UUID }; static const struct option options[] = { @@ -86,6 +89,7 @@ static int parse_argv(int argc, char *argv[]) { { "controllers", required_argument, NULL, 'C' }, { "private-network", no_argument, NULL, ARG_PRIVATE_NETWORK }, { "boot", no_argument, NULL, 'b' }, + { "uuid", required_argument, NULL, ARG_UUID }, { NULL, 0, NULL, 0 } }; @@ -140,6 +144,10 @@ static int parse_argv(int argc, char *argv[]) { arg_boot = true; break; + case ARG_UUID: + arg_uuid = optarg; + break; + case '?': return -EINVAL; @@ -912,6 +920,7 @@ int main(int argc, char *argv[]) { NULL, /* HOME */ NULL, /* USER */ NULL, /* LOGNAME */ + NULL, /* container_uuid */ NULL }; @@ -1022,13 +1031,20 @@ int main(int argc, char *argv[]) { } } - if ((asprintf((char**)(envp + 3), "HOME=%s", home? home: "/root") < 0) || - (asprintf((char**)(envp + 4), "USER=%s", arg_user? arg_user : "root") < 0) || - (asprintf((char**)(envp + 5), "LOGNAME=%s", arg_user? arg_user : "root") < 0)) { + if ((asprintf((char**)(envp + 3), "HOME=%s", home ? home: "/root") < 0) || + (asprintf((char**)(envp + 4), "USER=%s", arg_user ? arg_user : "root") < 0) || + (asprintf((char**)(envp + 5), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) { log_error("Out of memory"); goto child_fail; } + if (arg_uuid) { + if (asprintf((char**)(envp + 6), "container_uuid=%s", arg_uuid) < 0) { + log_error("Out of memory"); + goto child_fail; + } + } + setup_hostname(); if (arg_boot) { -- 2.30.2