aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu-system.am1
-rw-r--r--gnu/packages/linux.scm4
-rw-r--r--gnu/packages/patches/module-init-tools-moduledir.patch168
-rw-r--r--gnu/system.scm9
4 files changed, 180 insertions, 2 deletions
diff --git a/gnu-system.am b/gnu-system.am
index e1a8436a98..71af17f060 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -331,6 +331,7 @@ dist_patch_DATA = \
gnu/packages/patches/mhash-keygen-test-segfault.patch \
gnu/packages/patches/mit-krb5-init-fix.patch \
gnu/packages/patches/mpc123-initialize-ao.patch \
+ gnu/packages/patches/module-init-tools-moduledir.patch \
gnu/packages/patches/openssl-CVE-2010-5298.patch \
gnu/packages/patches/openssl-extension-checking-fixes.patch \
gnu/packages/patches/patchelf-page-size.patch \
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 46f2178488..518b0e41b9 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -133,7 +133,9 @@
version ".tar.bz2"))
(sha256
(base32
- "0jxnz9ahfic79rp93l5wxcbgh4pkv85mwnjlbv1gz3jawv5cvwp1"))))
+ "0jxnz9ahfic79rp93l5wxcbgh4pkv85mwnjlbv1gz3jawv5cvwp1"))
+ (patches
+ (list (search-patch "module-init-tools-moduledir.patch")))))
(build-system gnu-build-system)
(arguments
;; FIXME: The upstream tarball lacks man pages, and building them would
diff --git a/gnu/packages/patches/module-init-tools-moduledir.patch b/gnu/packages/patches/module-init-tools-moduledir.patch
new file mode 100644
index 0000000000..68d7988f53
--- /dev/null
+++ b/gnu/packages/patches/module-init-tools-moduledir.patch
@@ -0,0 +1,168 @@
+This patch changes 'modprobe' & co. so they honor the 'LINUX_MODULE_DIRECTORY'
+environment variable, rather than looking for modules exclusively in
+/lib/modules.
+
+Patch by David Guibert, from Nixpkgs; adjusted to use 'LINUX_MODULE_DIRECTORY'
+rather than 'MODULE_DIR' as the variable name.
+
+commit cf2c95edb7918bc658f6cae93793c1949fc9cb6e
+Author: David Guibert <david.guibert@gmail.com>
+Date: Fri Aug 5 14:20:12 2011 +0200
+
+ introduce module-dir
+
+diff --git a/depmod.c b/depmod.c
+index a1d2f8c..9362a35 100644
+--- a/depmod.c
++++ b/depmod.c
+@@ -48,9 +48,6 @@
+
+ #include "testing.h"
+
+-#ifndef MODULE_DIR
+-#define MODULE_DIR "/lib/modules/"
+-#endif
+
+ #ifndef MODULE_BUILTIN_KEY
+ #define MODULE_BUILTIN_KEY "built-in"
+@@ -1516,6 +1513,7 @@ static int parse_config_file(const char *filename,
+ char *line;
+ unsigned int linenum = 0;
+ FILE *cfile;
++ char *module_dir;
+
+ cfile = fopen(filename, "r");
+ if (!cfile) {
+@@ -1525,6 +1523,10 @@ static int parse_config_file(const char *filename,
+ return 0;
+ }
+
++ if((module_dir = getenv("LINUX_MODULE_DIRECTORY")) == NULL) {
++ module_dir = "/lib/modules/";
++ }
++
+ while ((line = getline_wrapped(cfile, &linenum)) != NULL) {
+ char *ptr = line;
+ char *cmd, *modname;
+@@ -1550,7 +1552,7 @@ static int parse_config_file(const char *filename,
+ continue;
+ }
+ nofail_asprintf(&dirname, "%s%s%s/%s", basedir,
+- MODULE_DIR, kernelversion, search_path);
++ module_dir, kernelversion, search_path);
+ len = strlen(dirname);
+ *search = add_search(dirname, len, *search);
+ free(dirname);
+@@ -1565,7 +1567,7 @@ static int parse_config_file(const char *filename,
+ continue;
+
+ nofail_asprintf(&pathname, "%s%s%s/%s/%s.ko", basedir,
+- MODULE_DIR, kernelversion, subdir, modname);
++ module_dir, kernelversion, subdir, modname);
+
+ *overrides = add_override(pathname, *overrides);
+ free(pathname);
+@@ -1737,6 +1739,7 @@ int main(int argc, char *argv[])
+ char *basedir = "", *dirname, *version;
+ char *system_map = NULL, *module_symvers = NULL;
+ int i;
++ char *module_dir;
+ const char *config = NULL;
+
+ if (native_endianness() == 0)
+@@ -1832,7 +1835,11 @@ int main(int argc, char *argv[])
+ if (optind == argc)
+ all = 1;
+
+- nofail_asprintf(&dirname, "%s%s%s", basedir, MODULE_DIR, version);
++ if((module_dir = getenv("LINUX_MODULE_DIRECTORY")) == NULL) {
++ module_dir = "/lib/modules/";
++ }
++
++ nofail_asprintf(&dirname, "%s%s%s", basedir, module_dir, version);
+
+ if (maybe_all) {
+ if (!doing_stdout && !depfile_out_of_date(dirname))
+@@ -1850,7 +1857,7 @@ int main(int argc, char *argv[])
+ size_t len;
+
+ nofail_asprintf(&dirname, "%s%s%s/updates", basedir,
+- MODULE_DIR, version);
++ module_dir, version);
+ len = strlen(dirname);
+ search = add_search(dirname, len, search);
+ }
+diff --git a/modinfo.c b/modinfo.c
+index 1dd8469..67b1041 100644
+--- a/modinfo.c
++++ b/modinfo.c
+@@ -19,9 +19,6 @@
+ #include "zlibsupport.h"
+ #include "testing.h"
+
+-#ifndef MODULE_DIR
+-#define MODULE_DIR "/lib/modules"
+-#endif
+
+ struct param
+ {
+@@ -193,6 +190,11 @@ static struct elf_file *grab_module(const char *name,
+ struct utsname buf;
+ char *depname, *p, *moddir;
+ struct elf_file *module;
++ char *module_dir;
++
++ if((module_dir = getenv("LINUX_MODULE_DIRECTORY")) == NULL) {
++ module_dir = "/lib/modules/";
++ }
+
+ if (strchr(name, '.') || strchr(name, '/')) {
+ module = grab_elf_file(name);
+@@ -207,9 +209,9 @@ static struct elf_file *grab_module(const char *name,
+ kernel = buf.release;
+ }
+ if (strlen(basedir))
+- nofail_asprintf(&moddir, "%s/%s/%s", basedir, MODULE_DIR, kernel);
++ nofail_asprintf(&moddir, "%s/%s/%s", basedir, module_dir, kernel);
+ else
+- nofail_asprintf(&moddir, "%s/%s", MODULE_DIR, kernel);
++ nofail_asprintf(&moddir, "%s/%s", module_dir, kernel);
+
+ /* Search for it in modules.dep. */
+ nofail_asprintf(&depname, "%s/%s", moddir, "modules.dep");
+diff --git a/modprobe.c b/modprobe.c
+index 5464f45..d9fbf9d 100644
+--- a/modprobe.c
++++ b/modprobe.c
+@@ -86,10 +86,6 @@ typedef enum
+
+ } modprobe_flags_t;
+
+-#ifndef MODULE_DIR
+-#define MODULE_DIR "/lib/modules"
+-#endif
+-
+ /**
+ * print_usage - output the prefered program usage
+ *
+@@ -2136,6 +2132,7 @@ int main(int argc, char *argv[])
+ struct modprobe_conf conf = {};
+
+ recursion_depth = 0;
++ char *module_dir = NULL;
+
+ /* Prepend options from environment. */
+ argv = merge_args(getenv("MODPROBE_OPTIONS"), argv, &argc);
+@@ -2233,7 +2230,11 @@ int main(int argc, char *argv[])
+ if (argc < optind + 1 && !dump_config && !list_only)
+ print_usage(argv[0]);
+
+- nofail_asprintf(&dirname, "%s%s/%s", basedir, MODULE_DIR, buf.release);
++ if((module_dir = getenv("LINUX_MODULE_DIRECTORY")) == NULL) {
++ module_dir = "/lib/modules";
++ }
++
++ nofail_asprintf(&dirname, "%s%s/%s", basedir, module_dir, buf.release);
+
+ /* Old-style -t xxx wildcard? Only with -l. */
+ if (list_only) {
diff --git a/gnu/system.scm b/gnu/system.scm
index a224916c0d..4dc6ebd5a7 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -229,6 +229,7 @@ explicitly appear in OS."
This is the GNU system. Welcome.\n")
(define* (etc-directory #:key
+ kernel
(locale "C") (timezone "Europe/Paris")
(issue "Hello!\n")
(skeletons '())
@@ -255,6 +256,11 @@ export LC_ALL=\"" locale "\"
export TZ=\"" timezone "\"
export TZDIR=\"" tzdata "/share/zoneinfo\"
+# Tell 'modprobe' & co. where to look for modules.
+# XXX: The downside of doing it here is that when switching to a new config
+# without rebooting, this variable possibly becomes invalid.
+export LINUX_MODULE_DIRECTORY=" kernel "/lib/modules
+
export PATH=$HOME/.guix-profile/bin:/run/current-system/profile/bin
export PATH=/run/setuid-programs:/run/current-system/profile/sbin:$PATH
export CPATH=$HOME/.guix-profile/include:" profile "/include
@@ -317,7 +323,8 @@ alias ll='ls -l'
(append-map service-pam-services services))))
(profile-drv (operating-system-profile os))
(skeletons (operating-system-skeletons os)))
- (etc-directory #:pam-services pam-services
+ (etc-directory #:kernel (operating-system-kernel os)
+ #:pam-services pam-services
#:skeletons skeletons
#:issue (operating-system-issue os)
#:locale (operating-system-locale os)