diff options
-rw-r--r-- | doc/lxc.conf.sgml.in | 32 | ||||
-rw-r--r-- | src/lxc/conf.c | 22 | ||||
-rw-r--r-- | src/lxc/conf.h | 1 | ||||
-rw-r--r-- | src/lxc/confile.c | 31 |
4 files changed, 86 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..8cb8e20 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -40,6 +40,7 @@ #include <sys/mman.h> #include <sys/prctl.h> #include <sys/capability.h> +#include <sys/personality.h> #include <arpa/inet.h> #include <fcntl.h> @@ -655,6 +656,21 @@ out: return 0; } +static int setup_personality(int persona) +{ + if (persona == -1) + return 0; + + if (personality(persona) < 0) { + SYSERROR("failed to set personality to '0x%x'", persona); + return -1; + } + + INFO("set personality to '0x%x'", persona); + + return 0; +} + static int setup_console(const struct lxc_rootfs *rootfs, const struct lxc_console *console) { @@ -1125,6 +1141,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 +1492,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..610ca15 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[4] = { + { "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); |