[lxc-devel] fixing restoring of tty mode after lxc-start

Michael Tokarev mjt at tls.msk.ru
Sat Nov 21 09:27:57 UTC 2009


Michel Normand wrote:
> Michael Tokarev a e'crit :
>> Hello.
>>
>> While trying to fix the tty mode after lxc-start, I come across
>> lxc_close_all_inherited_fd() routine.  Which closes all fds which
>> were inherited when lxc-start started.
>>
>> It's called this way:
>>
>>   lxc_start.c:main():
>>     lxc_start():
>>      lxc_spawn();
>>      lxc_close_all_inherited_fd()
>>      lxc_poll()
>>
>> The question is why lxc_close_all_inherited() is needed here.
>> And why it is ever needed _outside_ of the container to start
>> with.
>>
>> This call to close_all_inherited_fd() is the reason why tty
>> modes are not restored after lxc-start: because stdin is now
>> closed and hence nothing to restore.
>>
>> It looks like the whole inherited_fd thing is only needed in
>> lxc_init helper binary, 
> 
> In fact the lxc_close_all_inherited_fd function was defined
> to cover the case of a user appli creating pipes before to fork
> the lxc-start, and to use these pipes to communicate with the appli
> started inside the container.

There's no need to close these pipes in lxc_start itself.  For that,
it is enough to close them in the child of lxc_start, the one which
becomes container's init process.  Which is exactly what I'm talking
about here.

> For that purpose it was required for lxc to not keep a reference
> on these fds while lxc code is waiting for the appli to run up to its end.
> This is the reason why this function is called in two places
> in lxc_init.c and start.c

Note that lxc_init, like lxc_start's child, runs inside the container.

Thanks!

/mjt




More information about the lxc-devel mailing list