mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Add support for guest bind mounts with LXC
Currently you can configure LXC to bind a host directory to a guest directory, but not to bind a guest directory to a guest directory. While the guest container init could do this itself, allowing it in the libvirt XML means a stricter SELinux policy can be written
This commit is contained in:
parent
76b644c362
commit
3b1ddec1ef
@ -1639,6 +1639,11 @@
|
|||||||
which gives the memory usage limit in kibibytes. Only used
|
which gives the memory usage limit in kibibytes. Only used
|
||||||
by LXC driver.
|
by LXC driver.
|
||||||
<span class="since"> (since 0.9.13)</span></dd>
|
<span class="since"> (since 0.9.13)</span></dd>
|
||||||
|
<dt><code>type='bind'></code></dt>
|
||||||
|
<dd>
|
||||||
|
A directory inside the guest will be bound to another
|
||||||
|
directory inside the guest. Only used by LXC driver
|
||||||
|
<span class="since"> (since 0.9.13)</span></dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
The filesystem block has an optional attribute <code>accessmode</code>
|
The filesystem block has an optional attribute <code>accessmode</code>
|
||||||
|
@ -1277,6 +1277,21 @@
|
|||||||
</optional>
|
</optional>
|
||||||
</interleave>
|
</interleave>
|
||||||
</group>
|
</group>
|
||||||
|
<group>
|
||||||
|
<optional>
|
||||||
|
<attribute name="type">
|
||||||
|
<value>bind</value>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
<interleave>
|
||||||
|
<element name="source">
|
||||||
|
<attribute name="dir">
|
||||||
|
<ref name="absFilePath"/>
|
||||||
|
</attribute>
|
||||||
|
<empty/>
|
||||||
|
</element>
|
||||||
|
</interleave>
|
||||||
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<attribute name="type">
|
<attribute name="type">
|
||||||
<value>template</value>
|
<value>template</value>
|
||||||
|
@ -265,7 +265,8 @@ VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
|
|||||||
"block",
|
"block",
|
||||||
"file",
|
"file",
|
||||||
"template",
|
"template",
|
||||||
"ram")
|
"ram",
|
||||||
|
"bind")
|
||||||
|
|
||||||
VIR_ENUM_IMPL(virDomainFSDriverType, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
|
VIR_ENUM_IMPL(virDomainFSDriverType, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
|
||||||
"default",
|
"default",
|
||||||
@ -4264,7 +4265,8 @@ virDomainFSDefParseXML(xmlNodePtr node,
|
|||||||
if (!source &&
|
if (!source &&
|
||||||
xmlStrEqual(cur->name, BAD_CAST "source")) {
|
xmlStrEqual(cur->name, BAD_CAST "source")) {
|
||||||
|
|
||||||
if (def->type == VIR_DOMAIN_FS_TYPE_MOUNT)
|
if (def->type == VIR_DOMAIN_FS_TYPE_MOUNT ||
|
||||||
|
def->type == VIR_DOMAIN_FS_TYPE_BIND)
|
||||||
source = virXMLPropString(cur, "dir");
|
source = virXMLPropString(cur, "dir");
|
||||||
else if (def->type == VIR_DOMAIN_FS_TYPE_FILE)
|
else if (def->type == VIR_DOMAIN_FS_TYPE_FILE)
|
||||||
source = virXMLPropString(cur, "file");
|
source = virXMLPropString(cur, "file");
|
||||||
@ -11353,6 +11355,7 @@ virDomainFSDefFormat(virBufferPtr buf,
|
|||||||
|
|
||||||
switch (def->type) {
|
switch (def->type) {
|
||||||
case VIR_DOMAIN_FS_TYPE_MOUNT:
|
case VIR_DOMAIN_FS_TYPE_MOUNT:
|
||||||
|
case VIR_DOMAIN_FS_TYPE_BIND:
|
||||||
virBufferEscapeString(buf, " <source dir='%s'/>\n",
|
virBufferEscapeString(buf, " <source dir='%s'/>\n",
|
||||||
def->src);
|
def->src);
|
||||||
break;
|
break;
|
||||||
|
@ -657,11 +657,12 @@ struct _virDomainControllerDef {
|
|||||||
|
|
||||||
/* Two types of disk backends */
|
/* Two types of disk backends */
|
||||||
enum virDomainFSType {
|
enum virDomainFSType {
|
||||||
VIR_DOMAIN_FS_TYPE_MOUNT, /* Better named 'bind' */
|
VIR_DOMAIN_FS_TYPE_MOUNT, /* Mounts (binds) a host dir on a guest dir */
|
||||||
VIR_DOMAIN_FS_TYPE_BLOCK,
|
VIR_DOMAIN_FS_TYPE_BLOCK, /* Mounts a host block dev on a guest dir */
|
||||||
VIR_DOMAIN_FS_TYPE_FILE,
|
VIR_DOMAIN_FS_TYPE_FILE, /* Loopback mounts a host file on a guest dir */
|
||||||
VIR_DOMAIN_FS_TYPE_TEMPLATE,
|
VIR_DOMAIN_FS_TYPE_TEMPLATE, /* Expands a OS template to a guest dir */
|
||||||
VIR_DOMAIN_FS_TYPE_RAM,
|
VIR_DOMAIN_FS_TYPE_RAM, /* Mount a RAM filesystem on a guest dir */
|
||||||
|
VIR_DOMAIN_FS_TYPE_BIND, /* Binds a guest dir to another guest dir */
|
||||||
|
|
||||||
VIR_DOMAIN_FS_TYPE_LAST
|
VIR_DOMAIN_FS_TYPE_LAST
|
||||||
};
|
};
|
||||||
|
@ -1025,7 +1025,14 @@ static int lxcContainerMountFS(virDomainFSDefPtr fs,
|
|||||||
if (lxcContainerMountFSTmpfs(fs) < 0)
|
if (lxcContainerMountFSTmpfs(fs) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
case VIR_DOMAIN_FS_TYPE_BIND:
|
||||||
|
if (lxcContainerMountFSBind(fs, "") < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
case VIR_DOMAIN_FS_TYPE_FILE:
|
case VIR_DOMAIN_FS_TYPE_FILE:
|
||||||
|
/* We do actually support this, but the lxc controller
|
||||||
|
* should have associated the file with a loopback
|
||||||
|
* device and changed this to TYPE_BLOCK for us */
|
||||||
lxcError(VIR_ERR_INTERNAL_ERROR,
|
lxcError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Unexpected filesystem type %s"),
|
_("Unexpected filesystem type %s"),
|
||||||
virDomainFSTypeToString(fs->type));
|
virDomainFSTypeToString(fs->type));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user