[lxc-devel] [patch -lxc] configure container architecture

daniel.lezcano at free.fr daniel.lezcano at free.fr
Mon Sep 13 12:59:13 UTC 2010


From: Daniel Lezcano <daniel.lezcano at free.fr>

When a container is installed with 32bits binaries while we are
running on a 64bits host, inside the container we are seen as
64bits arch. That leads to some problems for the package updates
because the scripts will download 64bits packages instead of 32bits.

This patch defines a configuration variable to set the architecture
of the container.

lxc.arch = i686 | x86 | x86_64 | amd64

Signed-off-by: Daniel Lezcano <dlezcano at fr.ibm.com>
---
 doc/lxc.conf.sgml.in |   32 ++++++++++++++++++++++++++++++++
 src/lxc/conf.c       |   21 +++++++++++++++++++++
 src/lxc/conf.h       |    1 +
 src/lxc/confile.c    |   31 +++++++++++++++++++++++++++++++
 4 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/doc/lxc.conf.sgml.in b/doc/lxc.conf.sgml.in
index a6454b9..f975d57 100644
--- a/doc/lxc.conf.sgml.in
+++ b/doc/lxc.conf.sgml.in
@@ -76,6 +76,38 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     </para>
 
     <refsect2>
+      <title>Architecture</title>
+      <para>
+	Allows to set the architecture for the container. For example,
+	set a 32bits architecture for a container running 32bits
+	binaries on a 64bits host. That fix the container scripts
+	which rely on the architecture to do some work like
+	downloading the packages.
+      </para>
+
+      <variablelist>
+	<varlistentry>
+	  <term>
+	    <option>lxc.arch</option>
+	  </term>
+	  <listitem>
+	    <para>
+	      Specify the architecture for the container.
+	    </para>
+	    <para>
+	      Valid options are
+	      <option>x86</option>,
+	      <option>i686</option>,
+	      <option>x86_64</option>,
+	      <option>amd64</option>
+	    </para>
+	  </listitem>
+	</varlistentry>
+      </variablelist>
+
+    </refsect2>
+
+    <refsect2>
       <title>Hostname</title>
       <para>
 	The utsname section defines the hostname to be set for the
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index c955213..2737f47 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -655,6 +655,21 @@ out:
 	return 0;
 }
 
+static int setup_personality(int persona)
+{
+	if (persona == -1)
+		return 0;
+
+	if (personality(persona)) {
+		SYSERROR("failed to set personality to '0x%x", persona);
+		return -1;
+	}
+
+	INFO("set personality to '0x%x'", personality);
+
+	return 0;
+}
+
 static int setup_console(const struct lxc_rootfs *rootfs,
 			 const struct lxc_console *console)
 {
@@ -1125,6 +1140,7 @@ struct lxc_conf *lxc_conf_init(void)
 	}
 	memset(new, 0, sizeof(*new));
 
+	new->personality = -1;
 	new->console.path = NULL;
 	new->console.peer = -1;
 	new->console.master = -1;
@@ -1475,6 +1491,11 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf)
 		return -1;
 	}
 
+	if (setup_personality(lxc_conf->personality)) {
+		ERROR("failed to setup personality");
+		return -1;
+	}
+
 	if (setup_caps(&lxc_conf->caps)) {
 		ERROR("failed to drop capabilities");
 		return -1;
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 32135b6..b12a346 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -194,6 +194,7 @@ struct lxc_conf {
 	int tty;
 	int pts;
 	int reboot;
+	int personality;
 	struct utsname *utsname;
 	struct lxc_list cgroup;
 	struct lxc_list network;
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index e2c015d..9ed23f0 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -31,6 +31,7 @@
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/utsname.h>
+#include <sys/personality.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <net/if.h>
@@ -43,6 +44,7 @@
 
 lxc_log_define(lxc_confile, lxc);
 
+static int config_personality(const char *, char *, struct lxc_conf *);
 static int config_pts(const char *, char *, struct lxc_conf *);
 static int config_tty(const char *, char *, struct lxc_conf *);
 static int config_cgroup(const char *, char *, struct lxc_conf *);
@@ -74,6 +76,7 @@ struct config {
 
 static struct config config[] = {
 
+	{ "lxc.arch",                 config_personality          },
 	{ "lxc.pts",                  config_pts                  },
 	{ "lxc.tty",                  config_tty                  },
 	{ "lxc.cgroup",               config_cgroup               },
@@ -475,6 +478,34 @@ static int config_network_ipv6(const char *key, char *value,
 	return 0;
 }
 
+static int config_personality(const char *key, char *value,
+			      struct lxc_conf *lxc_conf)
+{
+	struct per_name {
+		char *name;
+		int per;
+	} pername[2] = {
+		{ "x86", PER_LINUX32 },
+		{ "i686", PER_LINUX32 },
+		{ "x86_64", PER_LINUX },
+		{ "amd64", PER_LINUX },
+	};
+
+	int i;
+
+	for (i = 0; i < sizeof(pername); i++) {
+
+		if (strcmp(pername[i].name, value))
+		    continue;
+
+		lxc_conf->personality = pername[i].per;
+		return 0;
+	}
+
+	ERROR("unsupported personality '%s'", value);
+	return -1;
+}
+
 static int config_pts(const char *key, char *value, struct lxc_conf *lxc_conf)
 {
 	int maxpts = atoi(value);
-- 
1.7.0.4





More information about the lxc-devel mailing list