diff --git a/modules/config/system-path.nix b/modules/config/system-path.nix index d989ddf4b91..ce27eb35dd9 100644 --- a/modules/config/system-path.nix +++ b/modules/config/system-path.nix @@ -17,7 +17,6 @@ let requiredPackages = [ config.system.sbin.modprobe # must take precedence over module_init_tools - config.system.sbin.mount # must take precedence over util-linux config.system.build.upstart config.environment.nix pkgs.acl diff --git a/modules/module-list.nix b/modules/module-list.nix index 7d42571d0fa..5a1459f5226 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -114,6 +114,7 @@ ./services/networking/cntlm.nix ./services/networking/ddclient.nix ./services/networking/dhclient.nix + #./services/networking/dhcpcd.nix ./services/networking/dhcpd.nix ./services/networking/dnsmasq.nix ./services/networking/ejabberd.nix @@ -198,6 +199,10 @@ ./system/upstart/upstart.nix ./tasks/cpu-freq.nix ./tasks/filesystems.nix + ./tasks/filesystems/btrfs.nix + ./tasks/filesystems/ext.nix + ./tasks/filesystems/nfs.nix + ./tasks/filesystems/reiserfs.nix ./tasks/kbd.nix ./tasks/lvm.nix ./tasks/network-interfaces.nix diff --git a/modules/profiles/base.nix b/modules/profiles/base.nix index d67e7ca6734..d6412e09a5f 100644 --- a/modules/profiles/base.nix +++ b/modules/profiles/base.nix @@ -31,7 +31,6 @@ # Tools to create / manipulate filesystems. pkgs.ntfsprogs # for resizing NTFS partitions - pkgs.btrfsProgs pkgs.dosfstools pkgs.xfsprogs pkgs.jfsutils @@ -50,4 +49,8 @@ pkgs.bvi # binary editor pkgs.joe ]; + + # Include support for various filesystems. + boot.supportedFilesystems = [ "btrfs" "reiserfs" ]; + } diff --git a/modules/services/misc/autofs.nix b/modules/services/misc/autofs.nix index eb3105e3a09..e55c213ed21 100644 --- a/modules/services/misc/autofs.nix +++ b/modules/services/misc/autofs.nix @@ -6,8 +6,6 @@ let cfg = config.services.autofs; - mount = config.system.sbin.mount; - autoMaster = pkgs.writeText "auto.master" cfg.autoMaster; in @@ -114,7 +112,7 @@ in unescapeSpaces(){ sed 's/\\040/ /g'; } sed -n 's@^\s*\(\([^\\ ]\|\\ \)*\)\s.*@\1@p' ${autoMaster} | sed 's/[\\]//' | while read mountPoint; do sed -n "s@[^ ]\+\s\+\($(echo "$mountPoint"| escapeSpaces)[^ ]*\).*@\1@p" /proc/mounts | sort -r | unescapeSpaces| while read smountP; do - ${mount}/bin/umount -l "$smountP" || true + ${pkgs.utillinux}/bin/umount -l "$smountP" || true done done ''; diff --git a/modules/services/network-filesystems/nfs-kernel.nix b/modules/services/network-filesystems/nfs-kernel.nix index 8ed22edf01e..1ebc268ecf8 100644 --- a/modules/services/network-filesystems/nfs-kernel.nix +++ b/modules/services/network-filesystems/nfs-kernel.nix @@ -151,7 +151,7 @@ in ${config.system.sbin.modprobe}/sbin/modprobe nfsd || true ${pkgs.sysvtools}/bin/mountpoint -q /proc/fs/nfsd \ - || ${config.system.sbin.mount}/bin/mount -t nfsd none /proc/fs/nfsd + || ${pkgs.utillinux}/bin/mount -t nfsd none /proc/fs/nfsd ${optionalString cfg.server.createMountPoints '' diff --git a/modules/system/boot/kernel.nix b/modules/system/boot/kernel.nix index c8ed496d8ae..ea5a300fbce 100644 --- a/modules/system/boot/kernel.nix +++ b/modules/system/boot/kernel.nix @@ -148,9 +148,6 @@ let kernel = config.boot.kernelPackages.kernel; in "ide_disk" "ide_generic" - # Filesystems. - "ext2" "ext3" "ext4" - # Support USB keyboards, in case the boot fails and we only have # a USB keyboard. "uhci_hcd" diff --git a/modules/system/boot/stage-1.nix b/modules/system/boot/stage-1.nix index bc27c9f80ff..5a74ea84f38 100644 --- a/modules/system/boot/stage-1.nix +++ b/modules/system/boot/stage-1.nix @@ -153,17 +153,6 @@ let cp -v ${pkgs.coreutils}/bin/sleep $out/bin cp -v ${pkgs.coreutils}/bin/ln $out/bin - # Copy e2fsck and friends. - cp -v ${pkgs.e2fsprogs}/sbin/e2fsck $out/bin - cp -v ${pkgs.e2fsprogs}/sbin/tune2fs $out/bin - cp -v ${pkgs.reiserfsprogs}/sbin/reiserfsck $out/bin - ln -sv e2fsck $out/bin/fsck.ext2 - ln -sv e2fsck $out/bin/fsck.ext3 - ln -sv e2fsck $out/bin/fsck.ext4 - ln -sv reiserfsck $out/bin/fsck.reiserfs - - cp -pdv ${pkgs.e2fsprogs}/lib/lib*.so.* $out/lib - # Copy dmsetup and lvm. cp -v ${pkgs.lvm2}/sbin/dmsetup $out/bin/dmsetup cp -v ${pkgs.lvm2}/sbin/lvm $out/bin/lvm @@ -189,11 +178,6 @@ let cp ${kernelPackages.splashutils}/${kernelPackages.splashutils.helperName} $out/bin/splash_helper ''} - # Copy nfsmount if there is any NFS mounts required for boot. - ${optionalString (filter (fs: fs.fsType == "nfs" && (fs.mountPoint == "/" || fs.neededForBoot)) fileSystems != []) '' - cp -v ${pkgs.klibc}/lib/klibc/bin.static/nfsmount $out/bin - ''} - ${config.boot.initrd.extraUtilsCommands} # Run patchelf to make the programs refer to the copied libraries. @@ -223,13 +207,10 @@ let export LD_LIBRARY_PATH=$out/lib $out/bin/mount --version | grep "mount from" $out/bin/umount --version | grep "umount " - $out/bin/e2fsck -V 2>&1 | grep "e2fsck " - $out/bin/tune2fs 2> /dev/null | grep "tune2fs " $out/bin/udevadm --version $out/bin/blkid -v 2>&1 | tee -a $out/log | grep "blkid from util-linux" $out/bin/dmsetup --version 2>&1 | tee -a $out/log | grep "version:" LVM_SYSTEM_DIR=$out $out/bin/lvm version 2>&1 | tee -a $out/log | grep "LVM" - $out/bin/reiserfsck -V $out/bin/mdadm --version $out/bin/basename --version $out/bin/modprobe --version diff --git a/modules/tasks/filesystems.nix b/modules/tasks/filesystems.nix index 59e1137852a..75cec61fd6c 100644 --- a/modules/tasks/filesystems.nix +++ b/modules/tasks/filesystems.nix @@ -2,37 +2,6 @@ with pkgs.lib; -let - usingSome = fsname: any (fs: fs.fsType == fsname) config.fileSystems; - usingSomeStage1 = fsname: any (fs: fs.fsType == fsname && - (fs.mountPoint == "/" || fs.neededForBoot)) config.fileSystems; - - usingBtrfs = usingSome "btrfs"; - usingBtrfsStage1 = usingSomeStage1 "btrfs"; - - usingReiserfs = usingSome "reiserfs"; - usingReiserfsStage1 = usingSomeStage1 "reiserfs"; - - # Packages that provide fsck backends. - fsPackages = [ pkgs.e2fsprogs pkgs.dosfstools ] - ++ optional usingReiserfs pkgs.btrfsProgs - ++ optional usingBtrfs pkgs.btrfsProgs; - - fsKernelModules = optional usingBtrfsStage1 [ "btrfs" "crc32c" ] - ++ optional usingReiserfsStage1 [ "reiserfs" ]; - - fsExtraUtilsCommands = optionalString usingBtrfsStage1 '' - cp -v ${pkgs.btrfsProgs}/bin/btrfsck $out/bin - cp -v ${pkgs.btrfsProgs}/bin/btrfs $out/bin - ln -sv btrfsck $out/bin/fsck.btrfs - ''; - - fsPostDeviceCommands = optionalString usingBtrfsStage1 '' - btrfs device scan - ''; - -in - { ###### interface @@ -54,7 +23,7 @@ in } ]; - description = " + description = '' The file systems to be mounted. It must include an entry for the root directory (mountPoint = \"/\"). Each entry in the list is an attribute set with the following fields: @@ -72,7 +41,7 @@ in autocreate forces mountPoint to be created with mkdir -p . - "; + ''; type = types.nullOr (types.list types.optionSet); @@ -81,36 +50,28 @@ in mountPoint = mkOption { example = "/mnt/usb"; type = types.uniq types.string; - description = " - Location of the mounted the file system. - "; + description = "Location of the mounted the file system."; }; device = mkOption { default = null; example = "/dev/sda"; type = types.uniq (types.nullOr types.string); - description = " - Location of the device. - "; + description = "Location of the device."; }; label = mkOption { default = null; example = "root-partition"; type = types.uniq (types.nullOr types.string); - description = " - Label of the device (if any). - "; + description = "Label of the device (if any)."; }; fsType = mkOption { default = "auto"; example = "ext3"; type = types.uniq types.string; - description = " - Type of the file system. - "; + description = "Type of the file system."; }; options = mkOption { @@ -124,10 +85,10 @@ in autocreate = mkOption { default = false; type = types.bool; - description = " + description = '' Automatically create the mount point defined in . - "; + ''; }; noCheck = mkOption { @@ -138,12 +99,24 @@ in }; }; - system.sbin.mount = mkOption { + system.fsPackages = mkOption { internal = true; - default = pkgs.utillinux; - description = " - Package containing mount and umount. - "; + default = [ ]; + description = "Packages supplying file system mounters and checkers."; + }; + + boot.supportedFilesystems = mkOption { + default = [ ]; + example = [ "btrfs" ]; + type = types.list types.string; + description = "Names of supported filesystem types."; + }; + + boot.initrd.supportedFilesystems = mkOption { + default = [ ]; + example = [ "btrfs" ]; + type = types.list types.string; + description = "Names of supported filesystem types in the initial ramdisk."; }; }; @@ -153,10 +126,19 @@ in config = { + boot.supportedFilesystems = + map (fs: fs.fsType) config.fileSystems; + + boot.initrd.supportedFilesystems = + map (fs: fs.fsType) + (filter (fs: fs.mountPoint == "/" || fs.neededForBoot) config.fileSystems); + # Add the mount helpers to the system path so that `mount' can find them. + system.fsPackages = [ pkgs.dosfstools ]; + environment.systemPackages = - [ pkgs.ntfs3g pkgs.cifs_utils pkgs.nfsUtils pkgs.mountall ] - ++ fsPackages; + [ pkgs.ntfs3g pkgs.cifs_utils pkgs.mountall ] + ++ config.system.fsPackages; environment.etc = singleton { source = pkgs.writeText "fstab" @@ -183,10 +165,6 @@ in target = "fstab"; }; - boot.initrd.extraUtilsCommands = fsExtraUtilsCommands; - boot.initrd.postDeviceCommands = fsPostDeviceCommands; - boot.initrd.kernelModules = fsKernelModules; - jobs.mountall = { startOn = "started udev" # !!! The `started nfs-kernel-statd' condition shouldn't be @@ -198,12 +176,12 @@ in task = true; + path = [ pkgs.utillinux ] ++ config.system.fsPackages; + script = '' exec > /dev/console 2>&1 echo "mounting filesystems..." - export PATH=${config.system.sbin.mount}/bin:${makeSearchPath "sbin" ([pkgs.utillinux] ++ fsPackages)}:$PATH - ${optionalString usingBtrfs "${pkgs.btrfsProgs}/bin/btrfs device scan"} ${pkgs.mountall}/sbin/mountall ''; }; diff --git a/modules/tasks/filesystems/btrfs.nix b/modules/tasks/filesystems/btrfs.nix new file mode 100644 index 00000000000..c526b9677cf --- /dev/null +++ b/modules/tasks/filesystems/btrfs.nix @@ -0,0 +1,38 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let + + inInitrd = any (fs: fs == "btrfs") config.boot.initrd.supportedFilesystems; + +in + +{ + config = mkIf (any (fs: fs == "btrfs") config.boot.supportedFilesystems) { + + system.fsPackages = [ pkgs.btrfsProgs ]; + + boot.initrd.kernelModules = mkIf inInitrd [ "btrfs" "crc32c" ]; + + boot.initrd.extraUtilsCommands = mkIf inInitrd + '' + cp -v ${pkgs.btrfsProgs}/bin/btrfsck $out/bin + cp -v ${pkgs.btrfsProgs}/bin/btrfs $out/bin + ln -sv btrfsck $out/bin/fsck.btrfs + ''; + + boot.initrd.postDeviceCommands = mkIf inInitrd + '' + btrfs device scan + ''; + + # !!! This is broken. There should be a udev rule to do this when + # new devices are discovered. + jobs.udev.postStart = + '' + ${pkgs.btrfsProgs}/bin/btrfs device scan + ''; + + }; +} diff --git a/modules/tasks/filesystems/ext.nix b/modules/tasks/filesystems/ext.nix new file mode 100644 index 00000000000..93cdef4c664 --- /dev/null +++ b/modules/tasks/filesystems/ext.nix @@ -0,0 +1,22 @@ +{ config, pkgs, ... }: + +{ + config = { + + system.fsPackages = [ pkgs.e2fsprogs ]; + + boot.initrd.kernelModules = [ "ext2" "ext3" "ext4" ]; + + boot.initrd.extraUtilsCommands = + '' + # Copy e2fsck and friends. + cp -v ${pkgs.e2fsprogs}/sbin/e2fsck $out/bin + cp -v ${pkgs.e2fsprogs}/sbin/tune2fs $out/bin + ln -sv e2fsck $out/bin/fsck.ext2 + ln -sv e2fsck $out/bin/fsck.ext3 + ln -sv e2fsck $out/bin/fsck.ext4 + cp -pdv ${pkgs.e2fsprogs}/lib/lib*.so.* $out/lib + ''; + + }; +} diff --git a/modules/tasks/filesystems/nfs.nix b/modules/tasks/filesystems/nfs.nix new file mode 100644 index 00000000000..546b6368721 --- /dev/null +++ b/modules/tasks/filesystems/nfs.nix @@ -0,0 +1,25 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let + + inInitrd = any (fs: fs == "nfs") config.boot.initrd.supportedFilesystems; + +in + +{ + config = { + + system.fsPackages = [ pkgs.nfsUtils ]; + + boot.initrd.kernelModules = mkIf inInitrd [ "nfs" ]; + + boot.initrd.extraUtilsCommands = mkIf inInitrd + '' + # !!! Uh, why don't we just install mount.nfs? + cp -v ${pkgs.klibc}/lib/klibc/bin.static/nfsmount $out/bin + ''; + + }; +} diff --git a/modules/tasks/filesystems/reiserfs.nix b/modules/tasks/filesystems/reiserfs.nix new file mode 100644 index 00000000000..f8c6a700004 --- /dev/null +++ b/modules/tasks/filesystems/reiserfs.nix @@ -0,0 +1,25 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let + + inInitrd = any (fs: fs == "reiserfs") config.boot.initrd.supportedFilesystems; + +in + +{ + config = mkIf (any (fs: fs == "reiserfs") config.boot.supportedFilesystems) { + + system.fsPackages = [ pkgs.reiserfsprogs ]; + + boot.initrd.kernelModules = mkIf inInitrd [ "reiserfs" ]; + + boot.initrd.extraUtilsCommands = mkIf inInitrd + '' + cp -v ${pkgs.reiserfsprogs}/sbin/reiserfsck $out/bin + ln -sv reiserfsck $out/bin/fsck.reiserfs + ''; + + }; +}