mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
conf: add idmap element to filesystem
Allow the user to manually tweak the ID mapping that will allow virtiofsd to run unprivileged. Signed-off-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
d8904561d9
commit
6de2068dd6
@ -3548,6 +3548,10 @@ A directory on the host that can be accessed directly from the guest.
|
|||||||
</binary>
|
</binary>
|
||||||
<source dir='/path'/>
|
<source dir='/path'/>
|
||||||
<target dir='mount_tag'/>
|
<target dir='mount_tag'/>
|
||||||
|
<idmap>
|
||||||
|
<uid start='0' target='100000' count='65535'/>
|
||||||
|
<gid start='0' target='100000' count='65535'/>
|
||||||
|
</idmap>
|
||||||
</filesystem>
|
</filesystem>
|
||||||
<filesystem type='mount'>
|
<filesystem type='mount'>
|
||||||
<driver type='virtiofs' queue='1024'/>
|
<driver type='virtiofs' queue='1024'/>
|
||||||
@ -3697,6 +3701,10 @@ A directory on the host that can be accessed directly from the guest.
|
|||||||
Where the ``source`` can be accessed in the guest. For most drivers this is
|
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
|
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.
|
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``
|
``readonly``
|
||||||
Enables exporting filesystem as a readonly mount for guest, by default
|
Enables exporting filesystem as a readonly mount for guest, by default
|
||||||
read-write access is given (currently only works for QEMU/KVM driver; not
|
read-write access is given (currently only works for QEMU/KVM driver; not
|
||||||
|
@ -2588,6 +2588,8 @@ void virDomainFSDefFree(virDomainFSDef *def)
|
|||||||
virObjectUnref(def->privateData);
|
virObjectUnref(def->privateData);
|
||||||
g_free(def->binary);
|
g_free(def->binary);
|
||||||
g_free(def->sock);
|
g_free(def->sock);
|
||||||
|
g_free(def->idmap.uidmap);
|
||||||
|
g_free(def->idmap.gidmap);
|
||||||
|
|
||||||
g_free(def);
|
g_free(def);
|
||||||
}
|
}
|
||||||
@ -8771,6 +8773,9 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
|
|||||||
xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
|
xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
|
||||||
xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt);
|
xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt);
|
||||||
xmlNodePtr binary_sandbox_node = virXPathNode("./binary/sandbox", 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) {
|
if (queue_size && virStrToLong_ull(queue_size, NULL, 10, &def->queue_size) < 0) {
|
||||||
virReportError(VIR_ERR_XML_ERROR,
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
@ -8816,6 +8821,28 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
|
|||||||
VIR_XML_PROP_NONZERO,
|
VIR_XML_PROP_NONZERO,
|
||||||
&def->sandbox) < 0)
|
&def->sandbox) < 0)
|
||||||
goto error;
|
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
|
if (source == NULL && def->type != VIR_DOMAIN_FS_TYPE_RAM
|
||||||
@ -23233,6 +23260,29 @@ virDomainFSDefFormat(virBuffer *buf,
|
|||||||
virXMLFormatElement(buf, "driver", &driverAttrBuf, &driverBuf);
|
virXMLFormatElement(buf, "driver", &driverAttrBuf, &driverBuf);
|
||||||
virXMLFormatElement(buf, "binary", &binaryAttrBuf, &binaryBuf);
|
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) {
|
switch (def->type) {
|
||||||
case VIR_DOMAIN_FS_TYPE_MOUNT:
|
case VIR_DOMAIN_FS_TYPE_MOUNT:
|
||||||
case VIR_DOMAIN_FS_TYPE_BIND:
|
case VIR_DOMAIN_FS_TYPE_BIND:
|
||||||
|
@ -888,6 +888,7 @@ struct _virDomainFSDef {
|
|||||||
virTristateSwitch flock;
|
virTristateSwitch flock;
|
||||||
virDomainFSSandboxMode sandbox;
|
virDomainFSSandboxMode sandbox;
|
||||||
int thread_pool_size;
|
int thread_pool_size;
|
||||||
|
virDomainIdMapDef idmap;
|
||||||
virDomainVirtioOptions *virtio;
|
virDomainVirtioOptions *virtio;
|
||||||
virObject *privateData;
|
virObject *privateData;
|
||||||
};
|
};
|
||||||
|
@ -3120,6 +3120,9 @@
|
|||||||
</choice>
|
</choice>
|
||||||
<empty/>
|
<empty/>
|
||||||
</element>
|
</element>
|
||||||
|
<optional>
|
||||||
|
<ref name="idmap"/>
|
||||||
|
</optional>
|
||||||
<ref name="filesystemCommon"/>
|
<ref name="filesystemCommon"/>
|
||||||
</interleave>
|
</interleave>
|
||||||
</group>
|
</group>
|
||||||
|
@ -34,6 +34,10 @@
|
|||||||
<lock posix='off' flock='off'/>
|
<lock posix='off' flock='off'/>
|
||||||
<thread_pool size='16'/>
|
<thread_pool size='16'/>
|
||||||
</binary>
|
</binary>
|
||||||
|
<idmap>
|
||||||
|
<uid start='0' target='100000' count='65535'/>
|
||||||
|
<gid start='0' target='100000' count='65535'/>
|
||||||
|
</idmap>
|
||||||
<source dir='/path'/>
|
<source dir='/path'/>
|
||||||
<target dir='mount_tag'/>
|
<target dir='mount_tag'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
||||||
|
Loading…
Reference in New Issue
Block a user