From d3bbe992ec33860aedccb26734a7a83d263e7ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 4 Jun 2014 16:22:48 +0200 Subject: [PATCH] system: Tell module-init-tools where to look for modules. * gnu/packages/linux.scm (module-init-tools)[source](patches): New field. * gnu/packages/patches/module-init-tools-moduledir.patch: New file. * gnu-system.am (dist_patch_DATA): Add it. * gnu/system.scm (etc-directory): Add #:kernel parameter. Set 'LINUX_MODULE_DIRECTORY' in bashrc. (operating-system-etc-directory): Pass #:kernel to 'etc-directory'. --- gnu-system.am | 1 + gnu/packages/linux.scm | 4 +- .../patches/module-init-tools-moduledir.patch | 168 ++++++++++++++++++ gnu/system.scm | 9 +- 4 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 gnu/packages/patches/module-init-tools-moduledir.patch 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 +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)