</binary>
<source dir='/path'/>
<target dir='mount_tag'/>
+ <idmap>
+ <uid start='0' target='100000' count='65535'/>
+ <gid start='0' target='100000' count='65535'/>
+ </idmap>
</filesystem>
<filesystem type='mount'>
<driver type='virtiofs' queue='1024'/>
Where the ``source`` can be accessed in the guest. For most drivers this is
an automatic mount point, but for QEMU/KVM this is merely an arbitrary string
tag that is exported to the guest as a hint for where to mount.
+``idmap``
+ For ``virtiofs``, an ``idmap`` element can be specified to map IDs in the user
+ namespace. See the `Container boot`_ section for the syntax of the element.
+ :since:`Since 10.0.0`
``readonly``
Enables exporting filesystem as a readonly mount for guest, by default
read-write access is given (currently only works for QEMU/KVM driver; not
virObjectUnref(def->privateData);
g_free(def->binary);
g_free(def->sock);
+ g_free(def->idmap.uidmap);
+ g_free(def->idmap.gidmap);
g_free(def);
}
xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt);
xmlNodePtr binary_sandbox_node = virXPathNode("./binary/sandbox", ctxt);
+ ssize_t n;
+ g_autofree xmlNodePtr *uid_nodes = NULL;
+ g_autofree xmlNodePtr *gid_nodes = NULL;
if (queue_size && virStrToLong_ull(queue_size, NULL, 10, &def->queue_size) < 0) {
virReportError(VIR_ERR_XML_ERROR,
VIR_XML_PROP_NONZERO,
&def->sandbox) < 0)
goto error;
+
+ if ((n = virXPathNodeSet("./idmap/uid", ctxt, &uid_nodes)) < 0)
+ return NULL;
+
+ if (n) {
+ def->idmap.uidmap = virDomainIdmapDefParseXML(ctxt, uid_nodes, n);
+ if (!def->idmap.uidmap)
+ return NULL;
+
+ def->idmap.nuidmap = n;
+ }
+
+ if ((n = virXPathNodeSet("./idmap/gid", ctxt, &gid_nodes)) < 0)
+ return NULL;
+
+ if (n) {
+ def->idmap.gidmap = virDomainIdmapDefParseXML(ctxt, gid_nodes, n);
+ if (!def->idmap.gidmap)
+ return NULL;
+
+ def->idmap.ngidmap = n;
+ }
}
if (source == NULL && def->type != VIR_DOMAIN_FS_TYPE_RAM
virXMLFormatElement(buf, "driver", &driverAttrBuf, &driverBuf);
virXMLFormatElement(buf, "binary", &binaryAttrBuf, &binaryBuf);
+ if (def->idmap.uidmap) {
+ size_t i;
+
+ virBufferAddLit(buf, "<idmap>\n");
+ virBufferAdjustIndent(buf, 2);
+ for (i = 0; i < def->idmap.nuidmap; i++) {
+ virBufferAsprintf(buf,
+ "<uid start='%u' target='%u' count='%u'/>\n",
+ def->idmap.uidmap[i].start,
+ def->idmap.uidmap[i].target,
+ def->idmap.uidmap[i].count);
+ }
+ for (i = 0; i < def->idmap.ngidmap; i++) {
+ virBufferAsprintf(buf,
+ "<gid start='%u' target='%u' count='%u'/>\n",
+ def->idmap.gidmap[i].start,
+ def->idmap.gidmap[i].target,
+ def->idmap.gidmap[i].count);
+ }
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</idmap>\n");
+ }
+
switch (def->type) {
case VIR_DOMAIN_FS_TYPE_MOUNT:
case VIR_DOMAIN_FS_TYPE_BIND: