diff --git a/test/boot-stage-1-init.sh b/test/boot-stage-1-init.sh index a5957fada5f..f216f05e237 100644 --- a/test/boot-stage-1-init.sh +++ b/test/boot-stage-1-init.sh @@ -26,7 +26,7 @@ mount -t sysfs sys /sys source @makeDevices@ # Load some kernel modules. -export MODULE_DIR=@kernel@/lib/modules/ +export MODULE_DIR=@modules@/lib/modules/ modprobe ide-generic modprobe ide-disk modprobe ide-cd diff --git a/test/boot-stage-1.nix b/test/boot-stage-1.nix index 9fed0020c76..1099fe08a21 100644 --- a/test/boot-stage-1.nix +++ b/test/boot-stage-1.nix @@ -5,17 +5,17 @@ # is supposed to be put into an initial RAM disk (initrd). { genericSubstituter, shell, staticTools -, module_init_tools, utillinux, kernel +, module_init_tools, utillinux, modules }: genericSubstituter { src = ./boot-stage-1-init.sh; isExecutable = true; - inherit shell kernel; + inherit shell modules; path = [ staticTools module_init_tools - utillinux +# utillinux ]; makeDevices = ./make-devices.sh; } diff --git a/test/modules-closure.nix b/test/modules-closure.nix new file mode 100644 index 00000000000..86015a8b182 --- /dev/null +++ b/test/modules-closure.nix @@ -0,0 +1,13 @@ +# Given a kernel build (with modules in $kernel/lib/modules/VERSION), +# produce a module tree in $out/lib/modules/VERSION that contains only +# the modules identified by `rootModules', plus their dependencies. +# Also generate an appropriate modules.dep. + +{stdenv, kernel, rootModules, module_init_tools}: + +stdenv.mkDerivation { + name = kernel.name + "-shrunk"; + builder = ./modules-closure.sh; + inherit kernel rootModules module_init_tools; + allowedReferences = ["out"]; +} diff --git a/test/modules-closure.sh b/test/modules-closure.sh new file mode 100644 index 00000000000..c5fcbba87f1 --- /dev/null +++ b/test/modules-closure.sh @@ -0,0 +1,37 @@ +source $stdenv/setup + +set -o pipefail + +PATH=$module_init_tools/sbin:$PATH + +version=$(cd $kernel/lib/modules && ls -d *) + +echo "kernel version is $version" + +export MODULE_DIR=$kernel/lib/modules/ + +# Determine the dependencies of each root module. +closure= +for module in $rootModules; do + echo "root module: $module" + deps=$(modprobe --set-version "$version" --show-depends "$module" \ + | sed 's/^insmod //') + for i in $deps; do echo $i; done + closure="$closure $deps" +done + +# Remove duplicates. +closure=$(for i in $closure; do echo $i; done | sort | uniq) + +echo "closure:" +ensureDir $out +for module in $closure; do + echo $module + target=$(echo $module | sed "s^$kernel^$out^") + mkdir -p $(dirname $target) + cp $module $target + grep "^$module" $kernel/lib/modules/$version/modules.dep \ + | sed "s^$kernel^$out^g" \ + >> $out/lib/modules/$version/modules.dep +done + diff --git a/test/rescue-system.nix b/test/rescue-system.nix index 9491e8538e5..b42030b659c 100644 --- a/test/rescue-system.nix +++ b/test/rescue-system.nix @@ -11,21 +11,20 @@ rec { allPackages = import ./pkgs/top-level/all-packages.nix; }; - bash = pkgs.bash; - # Determine the set of modules that we need to mount the root FS. modulesClosure = import ./modules-closure.nix { - inherit (pkgs) stdenv kernel; - rootModules = "ide-cd"; + inherit (pkgs) stdenv kernel module_init_tools; + rootModules = ["ide-cd" "ide-disk" "ide-generic"]; }; # The init script of boot stage 1 (loading kernel modules for # mounting the root FS). bootStage1 = import ./boot-stage-1.nix { - inherit (pkgs) genericSubstituter - module_init_tools utillinux kernel; + inherit (pkgs) genericSubstituter utillinux; + inherit (pkgsDiet) module_init_tools; + modules = modulesClosure; shell = stdenvLinuxStuff.bootstrapTools.bash; staticTools = stdenvLinuxStuff.staticTools; };