diff --git a/doc/lxc.conf.sgml.in b/doc/lxc.conf.sgml.in index a6454b919..f975d57e7 100644 --- a/doc/lxc.conf.sgml.in +++ b/doc/lxc.conf.sgml.in @@ -75,6 +75,38 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA the line is a comment. + + Architecture + + 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. + + + + + + + + + + Specify the architecture for the container. + + + Valid options are + , + , + , + + + + + + + + Hostname diff --git a/src/lxc/conf.c b/src/lxc/conf.c index c95521365..8cb8e2050 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -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 32135b656..b12a3466e 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 e2c015d7c..610ca154b 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -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);