[libvirt] [RFC] [PATCH v3 2/6] add fuse support for libvirt lxc
Gao feng
gaofeng at cn.fujitsu.com
Mon Oct 8 00:43:28 UTC 2012
于 2012年09月26日 02:37, Daniel P. Berrange 写道:
> On Tue, Sep 11, 2012 at 10:54:48AM +0800, Gao feng wrote:
>> this patch addes fuse support for libvirt lxc.
>> we can use fuse filesystem to generate sysinfo dynamically,
>> So we can isolate /proc/meminfo,cpuinfo and so on through
>> fuse filesystem.
>>
>> we mount fuse filesystem for every container.the mount name
>> is Lxc-containename-fuse,mount point is
>> localstatedir/run/libvirt/lxc/containername.
>>
>> Signed-off-by: Gao feng <gaofeng at cn.fujitsu.com>
>
>> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
>> index e5aea11..c5f4951 100644
>> --- a/src/lxc/lxc_controller.c
>> +++ b/src/lxc/lxc_controller.c
>> @@ -1657,6 +1659,14 @@ int main(int argc, char *argv[])
>> }
>> }
>>
>> + rc = virThreadCreate(&thread, true, lxcRegisterFuse,
>> + (void *)ctrl->def);
>> + if (rc < 0) {
>> + virReportSystemError(-rc, "%s",
>> + _("Create Fuse filesystem failed"));
>> + goto cleanup;
>> + }
>> +
>
> This is the wrong place to start FUSE. At this point the LXC
> controller is still sharing its mount namespace with the host
> OS. This causes the FUSE mount for each container to become
> visible in the host, which is not what we want.
sorry for the delay.
I think it's correct,because host can see container's meminfo
through cgroup too.NOW the container's cgroup can be seen and
modified in container too,I don't know why this is necessary?
>
> We must only start FUSE, after, we have done the unshare()
> call while setting up /dev/pts.
>
>
>> +void lxcRegisterFuse(void *DomainDef)
>
> More conventional naming would be 'void *opaque'
>
will fix this.
>> +{
>> + int argc = 4;
>> + char *argv[argc];
>> + char *path = NULL;
>> + char *name = NULL;
>> + virDomainDefPtr def = (virDomainDefPtr) DomainDef;
>> +
>> + if (virAsprintf(&name, "Lxc-%s-fuse", def->name) < 0) {
>> + virReportOOMError();
>> + goto cleanup;
>> + }
>> +
>> + if (virAsprintf(&path, "%s/%s/", LXC_STATE_DIR, def->name) < 0) {
>> + virReportOOMError();
>> + goto cleanup;
>> + }
>> +
>> + if (virFileMakePath(path) < 0) {
>> + virReportSystemError(errno, _("Cannot create %s"), path);
>> + goto cleanup;
>> + }
>> +
>> + argv[0] = name;
>> + argv[1] = path;
>> + argv[2] = (char *)"-odirect_io";
>> + argv[3] = (char *)"-f";
>> +
>> + if (fuse_main(argc, argv, &lxcProcOper, def) < 0)
>> + virReportSystemError(errno, "%s", _("Cannot start fuse"));
>> +
>> +cleanup:
>> + VIR_FREE(name);
>> + VIR_FREE(path);
>> + return;
>> +}
>> +
>> +void lxcUnregisterFuse(virDomainDefPtr def)
>> +{
>> + char *path = NULL;
>> +
>> + if (virAsprintf(&path, "%s/%s/", LXC_STATE_DIR, def->name) < 0) {
>> + virReportOOMError();
>> + return;
>> + }
>> +
>> + if (umount(path) < 0)
>> + virReportSystemError(errno, "%s",
>> + _("umount fuse filesystem failed"));
>> +
>> + VIR_FREE(path);
>> +}
>> +
>> +#else
>> +void lxcRegisterFuse(void *DomainDef ATTRIBUTE_UNUSED)
>> +{
>> +}
>> +
>> +void lxcUnregisterFuse(virDomainDefPtr def ATTRIBUTE_UNUSED)
>> +{
>> +}
>> +#endif
>
>> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
>> index bcd59cb..d5e1822 100644
>> --- a/src/lxc/lxc_process.c
>> +++ b/src/lxc/lxc_process.c
>> @@ -28,6 +28,7 @@
>> #include "lxc_process.h"
>> #include "lxc_domain.h"
>> #include "lxc_container.h"
>> +#include "lxc_fuse.h"
>> #include "datatypes.h"
>> #include "virfile.h"
>> #include "virpidfile.h"
>> @@ -232,7 +233,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,
>> NULL, xml, NULL);
>> VIR_FREE(xml);
>> }
>> -
>> + lxcUnregisterFuse(vm->def);
>> /* Stop autodestroy in case guest is restarted */
>> virLXCProcessAutoDestroyRemove(driver, vm);
>
> If you delayed starting FUSE until after we do unshare(), then the mount
> point will automatically go away when the LXC controller process exits,
> so we won't need any manual unmount in lxcUnregisterFuse()
>
>
> Daniel
>
More information about the libvir-list
mailing list