[libvirt] [PATCH 3/3] Tweak container initialization to make upstart/init happier
Daniel Veillard
veillard at redhat.com
Fri Mar 5 14:20:06 UTC 2010
On Thu, Mar 04, 2010 at 11:27:19AM +0000, Daniel P. Berrange wrote:
> Upstart crashes & burns in a heap if $TERM environment variable
> is missing. Presumably the kernel always sets this when booting
> init on a real machine, so libvirt should set it for containers
> too.
>
> To make a typical inittab / mingetty setup happier, we need to
> symlink the primary console /dev/pts/0 to /dev/tty1.
>
> Improve logging in certain scenarios to make troubleshooting
> easier
>
> * src/lxc/lxc_container.c: Create /dev/tty1 and set $TERM
> ---
> src/lxc/lxc_container.c | 26 ++++++++++++++++++++++----
> 1 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> index c425154..b1e895d 100644
> --- a/src/lxc/lxc_container.c
> +++ b/src/lxc/lxc_container.c
> @@ -105,8 +105,13 @@ static int lxcContainerExecInit(virDomainDefPtr vmDef)
> vmDef->os.init,
> NULL,
> };
> + const char *const envp[] = {
> + "PATH=/bin:/sbin",
> + "TERM=linux",
> + NULL,
> + };
>
> - return execve(argv[0], (char **)argv, NULL);
> + return execve(argv[0], (char **)argv,(char**)envp);
> }
>
> /**
> @@ -488,6 +493,15 @@ static int lxcContainerPopulateDevices(void)
> }
> }
>
> + /* XXX we should allow multiple consoles per container
> + * for tty2, tty3, etc, but the domain XML does not
> + * handle this yet
> + */
> + if (symlink("/dev/pts/0", "/dev/tty1") < 0) {
> + virReportSystemError(errno, "%s",
> + _("Failed to symlink /dev/pts/0 to /dev/tty1"));
> + return -1;
> + }
>
> return 0;
> }
> @@ -822,15 +836,19 @@ int lxcContainerStart(virDomainDefPtr def,
>
> flags = CLONE_NEWPID|CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|SIGCHLD;
>
> - if (userns_supported())
> + if (userns_supported()) {
> + DEBUG0("Enable user namespaces");
> flags |= CLONE_NEWUSER;
> + }
>
> - if (def->nets != NULL)
> + if (def->nets != NULL) {
> + DEBUG0("Enable network namespaces");
> flags |= CLONE_NEWNET;
> + }
>
> pid = clone(lxcContainerChild, stacktop, flags, &args);
> VIR_FREE(stack);
> - DEBUG("clone() returned, %d", pid);
> + DEBUG("clone() completed, new container PID is %d", pid);
>
> if (pid < 0) {
> virReportSystemError(errno, "%s",
ACK, looks fine,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list