LXC rootfs can be either a directory or a block device or an image
file. The first two types have been implemented, but the image file is
still to be done since LXC auto-guesses the file format at mount time
and the LXC driver doesn't support the 'auto' format.
---
src/lxc/lxc_native.c | 69 ++++++++++++++++++++++++++++
tests/lxcconf2xmldata/lxcconf2xml-simple.xml | 4 ++
2 files changed, 73 insertions(+)
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 723ebcf..86d0dd3 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -31,6 +31,72 @@
#define VIR_FROM_THIS VIR_FROM_LXC
+
+static virDomainFSDefPtr
+lxcCreateFSDef(int type, char *src, char* dst)
+{
+ virDomainFSDefPtr def;
+
+ if (VIR_ALLOC(def) < 0)
+ return NULL;
+
+ def->type = type;
+ def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH;
+ def->src = src;
+ def->dst = dst;
+
+ return def;
+}
+
+static int
+lxcAddFSDef(virDomainDefPtr def, int type, char *src, char *dst)
+{
+ virDomainFSDefPtr fsDef = NULL;
+
+ if (!(fsDef = lxcCreateFSDef(type, src, dst)))
+ goto error;
+
+ if (VIR_EXPAND_N(def->fss, def->nfss, 1) < 0)
+ goto error;
+ def->fss[def->nfss - 1] = fsDef;
+
+ return 0;
+
+error:
+ virDomainFSDefFree(fsDef);
+ return -1;
+}
+
+static int
+lxcSetRootfs(virDomainDefPtr def,
+ virConfPtr properties)
+{
+ char *fssrc = NULL;
+ char *fsdst = NULL;
+ int type = VIR_DOMAIN_FS_TYPE_MOUNT;
+ virConfValuePtr value;
+
+ if (!(value = virConfGetValue(properties, "lxc.rootfs")) ||
+ !value->str ||
+ (VIR_STRDUP(fssrc, value->str) < 0) ||
+ VIR_STRDUP(fsdst, "/") < 0)
+ goto error;
+
+ if (STRPREFIX(fssrc, "/dev/"))
+ type = VIR_DOMAIN_FS_TYPE_BLOCK;
+
+
+ if (lxcAddFSDef(def, type, fssrc, fsdst) < 0)
+ goto error;
+
+ return 0;
+
+error:
+ VIR_FREE(fssrc);
+ VIR_FREE(fsdst);
+ return -1;
+}
+
virDomainDefPtr
lxcParseConfigString(const char *config)
{
@@ -73,6 +139,9 @@ lxcParseConfigString(const char *config)
if (!vmdef->name && (VIR_STRDUP(vmdef->name, "unnamed") <
0))
goto error;
+ if (lxcSetRootfs(vmdef, properties) < 0)
+ goto error;
+
goto cleanup;
error:
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
b/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
index 641e624..eebcb4e 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
+++ b/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
@@ -13,5 +13,9 @@
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
+ <filesystem type='mount' accessmode='passthrough'>
+ <source dir='/var/lib/lxc/migrate_test/rootfs'/>
+ <target dir='/'/>
+ </filesystem>
</devices>
</domain>
--
1.8.5.2