开发者

Can I use a socket as stdin/stdout in lxc (linux containers)?

开发者 https://www.devze.com 2023-03-03 20:07 出处:网络
I am interested in starting a daemon inside an lxc container with its stdin/stdout as a socke开发者_运维技巧t passed from the host, inetd style. Is this possible?Be advised, if using an LXC \"snapshot

I am interested in starting a daemon inside an lxc container with its stdin/stdout as a socke开发者_运维技巧t passed from the host, inetd style. Is this possible?


Be advised, if using an LXC "snapshot" clone, with a directory backing store (which thus uses overlayfs), then Unix FIFO pipes are currently broken. See:

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1214500


I don't think LXC has native support, but you could always just run your lxc command under xinetd to get what you want. Or write your own server that talks sockets on one side and talks LXC (via popen() or something) on the other side.


inetd is a daemon that starts (non-daemonic) programs that use stdin/stdout to listen/talk to you

The LXC utilities lxc-start and lxc-execute insist on closing all open file descriptors (including stdin/stdout) making them useless with inetd. They eventually call clone(2), however, and so can you, writing your own C wrapper like this:

#define STACKSIZE 409600
/* choose your favourite brand of isolationism below */
#define SPLENDID_ISOLATION (CLONE_NEWPID|CLONE_NEWNS|CLONE_NEWNET)


int exec_command(void* arg) {
  /* don't close stdin/stdout here! */
  execl("command", "command", arg, NULL);
  return 1; 
}

void main(int  argc, char **argv) {
  void *stack = malloc(STACKSIZE) + STACKSIZE - 1; /* grows downwards */
  clone(&exec_command, stack, SIGCHLD|CLONE_VFORK|SPLENDID_ISOLATION, argv[1]);
  wait(NULL);
}

This wrapper can then be run under inetd.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号