[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