提交 10a8b1f9 编写于 作者: D Daniel P. Berrange

Add support for forcing a private network namespace for LXC guests

If no <interface> elements are included in an LXC guest XML
description, then the LXC guest will just see the host's
network interfaces. It is desirable to be able to hide the
host interfaces, without having to define any guest interfaces.

This patch introduces a new feature flag <privnet/> to allow
forcing of a private network namespace for LXC. In the future
I also anticipate that we will add <privuser/> to force a
private user ID namespace.

* src/conf/domain_conf.c, src/conf/domain_conf.h: Add support
  for <privnet/> feature. Auto-set <privnet> if any <interface>
  devices are defined
* src/lxc/lxc_container.c: Honour request for private network
  namespace
上级 59d0c980
...@@ -897,6 +897,7 @@ ...@@ -897,6 +897,7 @@
&lt;acpi/&gt; &lt;acpi/&gt;
&lt;apic/&gt; &lt;apic/&gt;
&lt;hap/&gt; &lt;hap/&gt;
&lt;privnet/&gt;
&lt;/features&gt; &lt;/features&gt;
...</pre> ...</pre>
...@@ -924,6 +925,12 @@ ...@@ -924,6 +925,12 @@
<dd>Enable Viridian hypervisor extensions for paravirtualizing <dd>Enable Viridian hypervisor extensions for paravirtualizing
guest operating systems guest operating systems
</dd> </dd>
<dt><code>privnet</code></dt>
<dd>Always create a private network namespace. This is
automatically set if any interface devices are defined.
This feature is only relevant for container based
virtualization drivers, such as LXC.
</dd>
</dl> </dl>
<h3><a name="elementsTime">Time keeping</a></h3> <h3><a name="elementsTime">Time keeping</a></h3>
......
...@@ -2632,6 +2632,11 @@ ...@@ -2632,6 +2632,11 @@
<empty/> <empty/>
</element> </element>
</optional> </optional>
<optional>
<element name="privnet">
<empty/>
</element>
</optional>
</interleave> </interleave>
</element> </element>
</optional> </optional>
......
...@@ -106,7 +106,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, ...@@ -106,7 +106,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
"apic", "apic",
"pae", "pae",
"hap", "hap",
"viridian") "viridian",
"privnet")
VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST, VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST,
"destroy", "destroy",
......
...@@ -1298,6 +1298,7 @@ enum virDomainFeature { ...@@ -1298,6 +1298,7 @@ enum virDomainFeature {
VIR_DOMAIN_FEATURE_PAE, VIR_DOMAIN_FEATURE_PAE,
VIR_DOMAIN_FEATURE_HAP, VIR_DOMAIN_FEATURE_HAP,
VIR_DOMAIN_FEATURE_VIRIDIAN, VIR_DOMAIN_FEATURE_VIRIDIAN,
VIR_DOMAIN_FEATURE_PRIVNET,
VIR_DOMAIN_FEATURE_LAST VIR_DOMAIN_FEATURE_LAST
}; };
......
...@@ -261,7 +261,8 @@ int lxcContainerWaitForContinue(int control) ...@@ -261,7 +261,8 @@ int lxcContainerWaitForContinue(int control)
* *
* Returns 0 on success or nonzero in case of error * Returns 0 on success or nonzero in case of error
*/ */
static int lxcContainerRenameAndEnableInterfaces(unsigned int nveths, static int lxcContainerRenameAndEnableInterfaces(bool privNet,
unsigned int nveths,
char **veths) char **veths)
{ {
int rc = 0; int rc = 0;
...@@ -289,7 +290,7 @@ static int lxcContainerRenameAndEnableInterfaces(unsigned int nveths, ...@@ -289,7 +290,7 @@ static int lxcContainerRenameAndEnableInterfaces(unsigned int nveths,
} }
/* enable lo device only if there were other net devices */ /* enable lo device only if there were other net devices */
if (veths) if (veths || privNet)
rc = virNetDevSetOnline("lo", true); rc = virNetDevSetOnline("lo", true);
error_out: error_out:
...@@ -1343,7 +1344,9 @@ static int lxcContainerChild( void *data ) ...@@ -1343,7 +1344,9 @@ static int lxcContainerChild( void *data )
VIR_DEBUG("Received container continue message"); VIR_DEBUG("Received container continue message");
/* rename and enable interfaces */ /* rename and enable interfaces */
if (lxcContainerRenameAndEnableInterfaces(argv->nveths, if (lxcContainerRenameAndEnableInterfaces(!!(vmDef->features &
(1 << VIR_DOMAIN_FEATURE_PRIVNET)),
argv->nveths,
argv->veths) < 0) { argv->veths) < 0) {
goto cleanup; goto cleanup;
} }
...@@ -1458,7 +1461,8 @@ int lxcContainerStart(virDomainDefPtr def, ...@@ -1458,7 +1461,8 @@ int lxcContainerStart(virDomainDefPtr def,
cflags |= CLONE_NEWUSER; cflags |= CLONE_NEWUSER;
} }
if (def->nets != NULL) { if (def->nets != NULL ||
(def->features & (1 << VIR_DOMAIN_FEATURE_PRIVNET))) {
VIR_DEBUG("Enable network namespaces"); VIR_DEBUG("Enable network namespaces");
cflags |= CLONE_NEWNET; cflags |= CLONE_NEWNET;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册