[libvirt] [PATCH 3/3] Tweak container initialization to make upstart/init happier

Daniel P. Berrange berrange at redhat.com
Thu Mar 4 11:27:19 UTC 2010


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",
-- 
1.6.6.1




More information about the libvir-list mailing list