[libvirt] [sandbox][PATCH] config: select specific kernel

Radu Caragea dmns_serp at yahoo.com
Tue Jun 12 13:56:09 UTC 2012


Added parameters to select a kernel through the release version and path to binary.
When setting kernel release version, the module search will be done in  /lib/modules/<release>/kernel . Also, by default, after setting the kernel release version the default kernel image path will be /boot/vmlinuz-<release>
The two default to the running configuration: /lib/modules/`uname -r`/kernel and /boot/vmlinuz-`uname -r`
kver didn't seem suggestive enough; I used kernrelease and kernpath. To be changed if necessary.
Also removed utsname inclusion wherever it wasn't used at all anymore

diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
index 7087459..3f7c5d7 100644
--- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c
+++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
@@ -22,7 +22,6 @@
 
 #include <config.h>
 #include <string.h>
-#include <sys/utsname.h>
 
 #include "libvirt-sandbox/libvirt-sandbox.h"
 
@@ -116,7 +115,6 @@ static void gvir_sandbox_builder_machine_finalize(GObject *object)
 
 
 static gchar *gvir_sandbox_builder_machine_mkinitrd(GVirSandboxConfig *config,
-                                                    const gchar *kver,
                                                     GError **error)
 {
     GVirSandboxConfigInitrd *initrd = gvir_sandbox_config_initrd_new();
@@ -124,7 +122,7 @@ static gchar *gvir_sandbox_builder_machine_mkinitrd(GVirSandboxConfig *config,
     gchar *targetfile = g_strdup_printf("/tmp/libvirt-sandbox-initrd-XXXXXX");
     int fd = -1;
 
-    gvir_sandbox_config_initrd_set_kver(initrd, kver);
+    gvir_sandbox_config_initrd_set_kver(initrd, gvir_sandbox_config_get_kernrelease(config));
     gvir_sandbox_config_initrd_set_init(initrd, LIBEXECDIR "/libvirt-sandbox-init-qemu");
 
     gvir_sandbox_config_initrd_add_module(initrd, "fscache.ko");
@@ -341,19 +340,16 @@ static gboolean gvir_sandbox_builder_machine_construct_os(GVirSandboxBuilder *bu
     gchar *kernel = NULL;
     gchar *initrd = NULL;
     gchar *cmdline = NULL;
-    struct utsname uts;
     GVirConfigDomainOs *os;
 
     if (!GVIR_SANDBOX_BUILDER_CLASS(gvir_sandbox_builder_machine_parent_class)->
         construct_os(builder, config, configdir, cleaner, domain, error))
         return FALSE;
 
-    uname(&uts);
-
-    if (!(initrd = gvir_sandbox_builder_machine_mkinitrd(config, uts.release, error)))
+    if (!(initrd = gvir_sandbox_builder_machine_mkinitrd(config, error)))
         return FALSE;
 
-    kernel = g_strdup_printf("/boot/vmlinuz-%s", uts.release);
+    kernel =  g_strdup(gvir_sandbox_config_get_kernpath(config));
     cmdline = gvir_sandbox_builder_machine_cmdline(config);
 
     gvir_sandbox_cleaner_add_rmfile_post_start(cleaner,
diff --git a/libvirt-sandbox/libvirt-sandbox-config-initrd.c b/libvirt-sandbox/libvirt-sandbox-config-initrd.c
index 327e0bf..5c75fce 100644
--- a/libvirt-sandbox/libvirt-sandbox-config-initrd.c
+++ b/libvirt-sandbox/libvirt-sandbox-config-initrd.c
@@ -22,7 +22,6 @@
 
 #include <config.h>
 #include <string.h>
-#include <sys/utsname.h>
 
 #include "libvirt-sandbox/libvirt-sandbox.h"
 
@@ -161,12 +160,8 @@ static void gvir_sandbox_config_initrd_class_init(GVirSandboxConfigInitrdClass *
 static void gvir_sandbox_config_initrd_init(GVirSandboxConfigInitrd *config)
 {
     GVirSandboxConfigInitrdPrivate *priv = config->priv;
-    struct utsname uts;
     priv = config->priv = GVIR_SANDBOX_CONFIG_INITRD_GET_PRIVATE(config);
-
     priv->init = g_strdup(LIBEXECDIR "/libvirt-sandbox-init-qemu");
-    uname(&uts);
-    priv->kver = g_strdup(uts.release);
 }
 
 
diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-address.c b/libvirt-sandbox/libvirt-sandbox-config-network-address.c
index ad91f77..959bf94 100644
--- a/libvirt-sandbox/libvirt-sandbox-config-network-address.c
+++ b/libvirt-sandbox/libvirt-sandbox-config-network-address.c
@@ -22,7 +22,6 @@
 
 #include <config.h>
 #include <string.h>
-#include <sys/utsname.h>
 
 #include "libvirt-sandbox/libvirt-sandbox.h"
 
diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-route.c b/libvirt-sandbox/libvirt-sandbox-config-network-route.c
index 7962352..6c473d0 100644
--- a/libvirt-sandbox/libvirt-sandbox-config-network-route.c
+++ b/libvirt-sandbox/libvirt-sandbox-config-network-route.c
@@ -22,7 +22,6 @@
 
 #include <config.h>
 #include <string.h>
-#include <sys/utsname.h>
 
 #include "libvirt-sandbox/libvirt-sandbox.h"
 
diff --git a/libvirt-sandbox/libvirt-sandbox-config-network.c b/libvirt-sandbox/libvirt-sandbox-config-network.c
index 5668274..6440642 100644
--- a/libvirt-sandbox/libvirt-sandbox-config-network.c
+++ b/libvirt-sandbox/libvirt-sandbox-config-network.c
@@ -22,7 +22,6 @@
 
 #include <config.h>
 #include <string.h>
-#include <sys/utsname.h>
 
 #include "libvirt-sandbox/libvirt-sandbox.h"
 
diff --git a/libvirt-sandbox/libvirt-sandbox-config.c b/libvirt-sandbox/libvirt-sandbox-config.c
index 2b0a9be..b9cda3d 100644
--- a/libvirt-sandbox/libvirt-sandbox-config.c
+++ b/libvirt-sandbox/libvirt-sandbox-config.c
@@ -46,6 +46,8 @@ struct _GVirSandboxConfigPrivate
     gchar *name;
     gchar *root;
     gchar *arch;
+    gchar *kernrelease;
+    gchar *kernpath;
     gboolean shell;
 
     guint uid;
@@ -72,6 +74,8 @@ enum {
     PROP_ROOT,
     PROP_ARCH,
     PROP_SHELL,
+    PROP_KERNRELEASE,
+    PROP_KERNPATH,
 
     PROP_UID,
     PROP_GID,
@@ -123,6 +127,14 @@ static void gvir_sandbox_config_get_property(GObject *object,
         g_value_set_string(value, priv->arch);
         break;
 
+    case PROP_KERNRELEASE:
+        g_value_set_string(value, priv->kernrelease);
+        break;
+
+    case PROP_KERNPATH:
+        g_value_set_string(value, priv->kernpath);
+        break;
+
     case PROP_SHELL:
         g_value_set_boolean(value, priv->shell);
         break;
@@ -181,6 +193,16 @@ static void gvir_sandbox_config_set_property(GObject *object,
         priv->arch = g_value_dup_string(value);
         break;
 
+    case PROP_KERNRELEASE:
+        g_free(priv->kernrelease);
+        priv->kernrelease = g_value_dup_string(value);
+        break;
+
+    case PROP_KERNPATH:
+        g_free(priv->kernpath);
+        priv->kernpath = g_value_dup_string(value);
+        break;
+
     case PROP_SHELL:
         priv->shell = g_value_get_boolean(value);
         break;
@@ -239,6 +261,8 @@ static void gvir_sandbox_config_finalize(GObject *object)
     g_free(priv->name);
     g_free(priv->root);
     g_free(priv->arch);
+    g_free(priv->kernrelease);
+    g_free(priv->kernpath);
     g_free(priv->secLabel);
 
     G_OBJECT_CLASS(gvir_sandbox_config_parent_class)->finalize(object);
@@ -291,6 +315,28 @@ static void gvir_sandbox_config_class_init(GVirSandboxConfigClass *klass)
                                                         G_PARAM_STATIC_NICK |
                                                         G_PARAM_STATIC_BLURB));
     g_object_class_install_property(object_class,
+                                    PROP_KERNRELEASE,
+                                    g_param_spec_string("kernrelease",
+                                                        "Kernrelease",
+                                                        "The kernel release version",
+                                                        NULL,
+                                                        G_PARAM_READABLE |
+                                                        G_PARAM_WRITABLE |
+                                                        G_PARAM_STATIC_NAME |
+                                                        G_PARAM_STATIC_NICK |
+                                                        G_PARAM_STATIC_BLURB));
+    g_object_class_install_property(object_class,
+                                    PROP_KERNPATH,
+                                    g_param_spec_string("kernpath",
+                                                        "Kernpath",
+                                                        "The kernel image path",
+                                                        NULL,
+                                                        G_PARAM_READABLE |
+                                                        G_PARAM_WRITABLE |
+                                                        G_PARAM_STATIC_NAME |
+                                                        G_PARAM_STATIC_NICK |
+                                                        G_PARAM_STATIC_BLURB));
+    g_object_class_install_property(object_class,
                                     PROP_SHELL,
                                     g_param_spec_string("shell",
                                                         "SHELL",
@@ -388,6 +434,8 @@ static void gvir_sandbox_config_init(GVirSandboxConfig *config)
     priv->name = g_strdup("sandbox");
     priv->root = g_strdup("/");
     priv->arch = g_strdup(uts.machine);
+    priv->kernrelease = g_strdup(uts.release);
+    priv->kernpath = g_strdup_printf("/boot/vmlinuz-%s", priv->kernrelease);
     priv->secLabel = g_strdup("system_u:system_r:svirt_t:s0:c0.c1023");
 
     priv->uid = geteuid();
@@ -474,6 +522,70 @@ const gchar *gvir_sandbox_config_get_arch(GVirSandboxConfig *config)
 
 
 /**
+ * gvir_sandbox_config_set_kernrelease:
+ * @config: (transfer none): the sandbox config
+ * @kernrelease: (transfer none): the host directory
+ *
+ * Set the kernel release version to use in the sandbox. If none is provided,
+ * it will default to matching the current running kernel.
+ * Also sets the default kernel path as /boot/vmlinuz-<release>
+ */
+void gvir_sandbox_config_set_kernrelease(GVirSandboxConfig *config, const gchar *kernrelease)
+{
+    GVirSandboxConfigPrivate *priv = config->priv;
+    g_free(priv->kernrelease);
+    priv->kernrelease = g_strdup(kernrelease);
+    gvir_sandbox_config_set_kernpath(config, g_strdup_printf("/boot/vmlinuz-%s", priv->kernrelease));
+
+}
+
+
+/**
+ * gvir_sandbox_config_get_kernrelease:
+ * @config: (transfer none): the sandbox config
+ *
+ * Retrieves the sandbox kernel release version
+ *
+ * Returns: (transfer none): the current kernel release version
+ */
+const gchar *gvir_sandbox_config_get_kernrelease(GVirSandboxConfig *config)
+{
+    GVirSandboxConfigPrivate *priv = config->priv;
+    return priv->kernrelease;
+}
+/**
+ * gvir_sandbox_config_set_kernpath:
+ * @config: (transfer none): the sandbox config
+ * @kernpath: (transfer none): the host directory
+ *
+ * Set the kernel image path to use in the sandbox. If none is provided,
+ * it will default to matching /boot/vmlinuz-<kernel release>.
+ */
+
+void gvir_sandbox_config_set_kernpath(GVirSandboxConfig *config, const gchar *kernpath)
+{
+    GVirSandboxConfigPrivate *priv = config->priv;
+    g_free(priv->kernpath);
+    priv->kernpath = g_strdup(kernpath);
+}
+
+
+/**
+ * gvir_sandbox_config_get_kernpath:
+ * @config: (transfer none): the sandbox config
+ *
+ * Retrieves the sandbox kernel image path
+ *
+ * Returns: (transfer none): the current kernel image path
+ */
+const gchar *gvir_sandbox_config_get_kernpath(GVirSandboxConfig *config)
+{
+    GVirSandboxConfigPrivate *priv = config->priv;
+    return priv->kernpath;
+}
+
+
+/**
  * gvir_sandbox_config_set_shell:
  * @config: (transfer none): the sandbox config
  * @shell: (transfer none): true if the container should have a shell
@@ -1531,6 +1643,14 @@ static gboolean gvir_sandbox_config_load_config(GVirSandboxConfig *config,
         g_free(priv->arch);
         priv->arch = str;
     }
+    if ((str = g_key_file_get_string(file, "core", "kernrelease", NULL)) != NULL) {
+        g_free(priv->kernrelease);
+        priv->kernrelease = str;
+    }
+    if ((str = g_key_file_get_string(file, "core", "kernpath", NULL)) != NULL) {
+        g_free(priv->kernpath);
+        priv->kernpath = str;
+    }
     b = g_key_file_get_boolean(file, "core", "shell", &e);
     if (e) {
         g_error_free(e);
@@ -1748,6 +1868,8 @@ static void gvir_sandbox_config_save_config(GVirSandboxConfig *config,
     g_key_file_set_string(file, "core", "name", priv->name);
     g_key_file_set_string(file, "core", "root", priv->root);
     g_key_file_set_string(file, "core", "arch", priv->arch);
+    g_key_file_set_string(file, "core", "kernrelease", priv->kernrelease);
+    g_key_file_set_string(file, "core", "kernpath", priv->kernpath);
     g_key_file_set_boolean(file, "core", "shell", priv->shell);
 
     g_key_file_set_uint64(file, "identity", "uid", priv->uid);
diff --git a/libvirt-sandbox/libvirt-sandbox-config.h b/libvirt-sandbox/libvirt-sandbox-config.h
index 3902e40..a6c8ae8 100644
--- a/libvirt-sandbox/libvirt-sandbox-config.h
+++ b/libvirt-sandbox/libvirt-sandbox-config.h
@@ -76,6 +76,12 @@ const gchar *gvir_sandbox_config_get_root(GVirSandboxConfig *config);
 void gvir_sandbox_config_set_arch(GVirSandboxConfig *config, const gchar *arch);
 const gchar *gvir_sandbox_config_get_arch(GVirSandboxConfig *config);
 
+void gvir_sandbox_config_set_kernrelease(GVirSandboxConfig *config, const gchar *kernrelease);
+const gchar *gvir_sandbox_config_get_kernrelease(GVirSandboxConfig *config);
+
+void gvir_sandbox_config_set_kernpath(GVirSandboxConfig *config, const gchar *kernpath);
+const gchar *gvir_sandbox_config_get_kernpath(GVirSandboxConfig *config);
+
 void gvir_sandbox_config_set_shell(GVirSandboxConfig *config, gboolean shell);
 gboolean gvir_sandbox_config_get_shell(GVirSandboxConfig *config);
 
diff --git a/libvirt-sandbox/libvirt-sandbox.sym b/libvirt-sandbox/libvirt-sandbox.sym
index 16cd2ff..424fd98 100644
--- a/libvirt-sandbox/libvirt-sandbox.sym
+++ b/libvirt-sandbox/libvirt-sandbox.sym
@@ -94,6 +94,8 @@ LIBVIRT_SANDBOX_0.0.1 {
 gvir_sandbox_config_set_root;
 gvir_sandbox_config_set_shell;
 gvir_sandbox_config_set_arch;
+gvir_sandbox_config_set_kernrelease;
+gvir_sandbox_config_set_kernpath;
 gvir_sandbox_config_set_userid;
 gvir_sandbox_config_set_groupid;
 gvir_sandbox_config_set_username;




More information about the libvir-list mailing list