[lxc-devel] [PATCH] [RFC] Complete rewrite of lxc-attach functionality

Serge Hallyn serge.hallyn at ubuntu.com
Mon May 20 22:08:16 UTC 2013


Quoting Christian Seiler (christian at iwakd.de):
> Hi,
> 
> as discussed previously on this list, I've reimplemented the lxc-attach
> functionality as an API function. The patchset consists of two parts:
> 
>  1. Four minor patches that just fix some bugs, shuffle definitions
>     around and implement some small utility functions that I need for
>     the attach functionality, but which also may be useful generally.
> 
>     These patches are trivial and I've signed off on them, I don't see
>     any reason not for applying them anyway.
> 
>  2. One major patch that actually reimplements the lxc-attach
>     functionality in form of a function lxc_attach(). Since I want some
>     feedback here, I haven't added the Signed-off-by tag to the commit
>     message yet and I don't think it's quite ready to be committed yet.
> 
> Rationale behind the design of the new functionality:
> 
>  - We have a ton of knobs one could want to do while attaching, my idea
>    was to give the API user the largest possible control over all of these
>    knobs. But since I didn't want to run into the trap of creating a
>    function that accepts 100 parameters, I thought the best idea would
>    be to have a structure (lxc_attach_options_t) where one specifies
>    precisely all of the options and just passes this structure to the
>    function. This way, lxc_attach only has 4 parameters and is called
>    like this:
> 
>       ret = lxc_attach(container_name, lxcpath, &options_struct, &pid);

It's a tough line to draw.  We also don't want to have unwieldy blobs of
structs to manipulate for simple operations.  But I like your patch

>  - In 0.9, we have a three-process hierarchy:
> 
>       lxc-attach
>         +- lxc-attach [does setns() before spawning further]
>             +- attached process
> 
>    This is due to user namespaces. The patch introduces a flat

And pid ns right?  Otherwise the task which did setns would look
funky inside the container.  iiuc.

>    hierarchy thanks to CLONE_PARENT:
> 
>       lxc-attach
>         +- lxc-attach [does setns(), dies after creating next process]
>         +- attached process
> 
>    That way, once attach is complete, there are two proceses running:
>    lxc-attach (supervising) and the attached process itself.
> 
>  - In order to be able to do attach safely from a threaded program, we
>    have to make sure that all fds (including ipc sockets) that we open
>    do not conflict with other threads. For this reason, I use O_CLOEXEC
>    for all fds. That way, if another thread fork()s off while an attach
>    is in progress, as soon as that other process exec()s, the fd will
>    be closed and thus not leak. However, if a process that has been
>    forked from another thread does not exec(), then we run into the
>    problem that the process calling attach usually notices that error
>    by means of detecting that the IPC socket was closed unexpectedly.
>    Since another process that forked away at the wrong time from a
>    diffrerent thread may still hold an open fd of the child process's
>    socket, the child will call shutdown() on its socket before closing
>    it in order to make sure the parent still notices the end of the
>    socket. [1]
> 
> The functionality itself is tested, lxc-attach still works the same as
> before.
> 
> Now for the part that I don't like about my current implementation: Once
> I was done with adding the lxc_attach() function, I wanted to update the
> "general purpose" LXC API, including Python bindings etc.. But for this
> I would also have to have the struct lxc_attach_options_t in lxc_attach,
> which would mean including attach.h from lxccontainer.h. But attach.h
> contains all sorts of very low-level functions and lxccontainer.h is
> supposed to be a high-level API.
> 
> Now I'm not quite sure what to do:
> 
>  a) Add a really dumbed-down high-level API function that just accepts
>     the name of a program to start. (Kind of defeats the purpose of
>     having the container API.)
> 
>  b) Really do include attach.h from lxccontainer.h (which currently
>     does not include any other lxc header!)
> 
>  c) Move lxc_attach_options_t from attach.h to lxccontainer.h, include
>     lxccontainer.h from attach.h, add a function with the respective
>     signature to the container API and let that call lxc_attach()
>     internally. (My current favorite.)
> 
>  d) Something else?

I think d).  Create a new attach_struct.h which you #include from both
lxccontainer.h and attach.h.

> 
> Thoughts? On this specific issue and also on the general
> implementation?
> 
> -- Christian
> 
> [1] Note that this is still not safe from an interruption by a signal,
>     I will provide a separate patch that addresses that once the main
>     functionality has been merged into staging.
> 
> 
> ------------------------------------------------------------------------------
> AlienVault Unified Security Management (USM) platform delivers complete
> security visibility with the essential security capabilities. Easily and
> efficiently configure, manage, and operate all of your security controls
> from a single console and one unified framework. Download a free trial.
> http://p.sf.net/sfu/alienvault_d2d
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel




More information about the lxc-devel mailing list