diff --git a/boot/boot-stage-1-init.sh b/boot/boot-stage-1-init.sh index 391c24e7b3f..3b1d4d6a9fa 100644 --- a/boot/boot-stage-1-init.sh +++ b/boot/boot-stage-1-init.sh @@ -73,6 +73,13 @@ udevd --daemon udevtrigger udevsettle +if type -p dmsetup > /dev/null; then + echo "dmsetup found, starting device mapper and lvm" + dmsetup mknodes + vgscan --ignorelockingfailure + vgchange -ay --ignorelockingfailure +fi + if test -n "$debug1devices"; then fail; fi diff --git a/system/options.nix b/system/options.nix index 2379fa0aaf0..da07cd1011d 100644 --- a/system/options.nix +++ b/system/options.nix @@ -177,6 +177,14 @@ "; } + { + name = ["boot" "initrd" "lvm"]; + default = false; + description = " + Whether to include lvm in the initial ramdisk. You should use this option + if your ROOT device is on lvm volume. + "; + } { name = ["boot" "initrd" "enableSplashScreen"]; diff --git a/system/system.nix b/system/system.nix index a5a44f04015..c094cdf2676 100644 --- a/system/system.nix +++ b/system/system.nix @@ -52,10 +52,18 @@ rec { inherit (pkgsStatic) utillinux; inherit (pkgsDiet) udev; e2fsprogs = pkgs.e2fsprogsDiet; + devicemapper = if config.get ["boot" "initrd" "lvm"] then pkgs.devicemapperStatic else null; + lvm2 = if config.get ["boot" "initrd" "lvm"] then pkgs.lvm2Static else null; allowedReferences = []; # prevent accidents like glibc being included in the initrd } " ensureDir $out/bin + if [ -n $devicemapper ]; then + cp $devicemapper/sbin/dmsetup.static $out/bin/dmsetup + cp $lvm2/sbin/lvm.static $out/bin/lvm + ln -s lvm $out/bin/vgscan + ln -s lvm $out/bin/vgchange + fi cp $utillinux/bin/mount $utillinux/bin/umount $utillinux/sbin/pivot_root $out/bin cp -p $e2fsprogs/sbin/fsck* $e2fsprogs/sbin/e2fsck $out/bin cp $udev/sbin/udevd $udev/sbin/udevtrigger $udev/sbin/udevsettle $out/bin diff --git a/upstart-jobs/default.nix b/upstart-jobs/default.nix index 6e12233c97b..4a47034be74 100644 --- a/upstart-jobs/default.nix +++ b/upstart-jobs/default.nix @@ -36,7 +36,7 @@ import ../upstart-jobs/gather.nix { # Makes LVM logical volumes available. (import ../upstart-jobs/lvm.nix { inherit modprobe; - inherit (pkgs) lvm2; + inherit (pkgs) lvm2 devicemapper; }) # Activate software RAID arrays. diff --git a/upstart-jobs/lvm.nix b/upstart-jobs/lvm.nix index ee6e842564c..d860224685e 100644 --- a/upstart-jobs/lvm.nix +++ b/upstart-jobs/lvm.nix @@ -1,4 +1,4 @@ -{modprobe, lvm2}: +{modprobe, lvm2, devicemapper}: { name = "lvm"; @@ -12,9 +12,10 @@ script # Load the device mapper. ${modprobe}/sbin/modprobe dm_mod || true + ${devicemapper}/sbin/dmsetup mknodes # Scan for block devices that might contain LVM physical volumes # and volume groups. - #${lvm2}/sbin/vgscan + ${lvm2}/sbin/vgscan --mknodes # Make all logical volumes on all volume groups available, i.e., # make them appear in /dev. diff --git a/upstart-jobs/xserver.nix b/upstart-jobs/xserver.nix index edd224bcfa4..beb50eac45d 100644 --- a/upstart-jobs/xserver.nix +++ b/upstart-jobs/xserver.nix @@ -60,6 +60,7 @@ let xorg.xf86inputmouse ] ++ optional (videoDriver == "vesa") xorg.xf86videovesa + ++ optional (videoDriver == "sis") xorg.xf86videosis ++ optional (videoDriver == "i810") xorg.xf86videoi810 ++ optional (videoDriver == "intel") xorg.xf86videointel;