Могу ли я использовать сокет как stdin / stdout в lxc (контейнеры linux)? - PullRequest
4 голосов
/ 09 мая 2011

Я заинтересован в запуске демона внутри контейнера lxc с его stdin / stdout в качестве сокета, передаваемого от хоста, в стиле inetd.Возможно ли это?

Ответы [ 3 ]

1 голос
/ 25 июля 2013

inetd - это демон, который запускает (не демонические) программы, которые используют stdin / stdout для прослушивания / разговора с вами

Утилиты LXC lxc-start и lxc-executeнастаивайте на закрытии всех открытых файловых дескрипторов (включая stdin / stdout), делая их бесполезными с inetd.Однако в конце концов они вызывают clone(2), и вы тоже можете написать свою собственную оболочку C следующим образом:

#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);
}

Эта оболочка может быть запущена в inetd.

1 голос
/ 02 августа 2014

При использовании клона «снимок» LXC с хранилищем резервных копий каталога (которое, таким образом, использует overlayfs), каналы Unix FIFO в настоящий момент прерываются. См:

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

1 голос
/ 25 июля 2013

Я не думаю, LXC имеет встроенную поддержку, но вы всегда можете просто запустить команду lxc в xinetd, чтобы получить то, что вы хотите. Или напишите свой собственный сервер, который сообщает сокеты с одной стороны и LXC (через popen () или что-то еще) с другой стороны.

...