diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix index 1d75a24692c0..d7deb44c407c 100644 --- a/nixos/modules/tasks/filesystems/zfs.nix +++ b/nixos/modules/tasks/filesystems/zfs.nix @@ -11,6 +11,7 @@ with lib; let cfgSpl = config.boot.spl; + cfgZfs = config.boot.zfs; cfgSnapshots = config.services.zfs.autoSnapshot; inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems; @@ -21,8 +22,11 @@ let kernel = config.boot.kernelPackages; + splPkg = if cfgZfs.useGit then kernel.spl_git else kernel.spl; + zfsPkg = if cfgZfs.useGit then kernel.zfs_git else kernel.zfs; + autosnapPkg = pkgs.zfstools.override { - zfs = config.boot.kernelPackages.zfs; + zfs = zfsPkg; }; zfsAutoSnap = "${autosnapPkg}/bin/zfs-auto-snapshot"; @@ -47,6 +51,17 @@ in ''; }; + boot.zfs.useGit = mkOption { + type = types.bool; + default = false; + example = true; + description = '' + Use the git version of the SPL and ZFS packages. + Note that these are unreleased versions, with less testing, and therefore + may be more unstable. + ''; + }; + services.zfs.autoSnapshot = { enable = mkOption { default = false; @@ -111,7 +126,7 @@ in (mkIf enableZfs { boot = { kernelModules = [ "spl" "zfs" ] ; - extraModulePackages = [ kernel.zfs kernel.spl ]; + extraModulePackages = [ splPkg zfsPkg ]; extraModprobeConfig = mkIf (cfgSpl.hostid != "") '' options spl spl_hostid=${cfgSpl.hostid} ''; @@ -121,10 +136,10 @@ in kernelModules = [ "spl" "zfs" ] ; extraUtilsCommands = '' - cp -v ${kernel.zfs}/sbin/zfs $out/bin - cp -v ${kernel.zfs}/sbin/zdb $out/bin - cp -v ${kernel.zfs}/sbin/zpool $out/bin - cp -pdv ${kernel.zfs}/lib/lib*.so* $out/lib + cp -v ${zfsPkg}/sbin/zfs $out/bin + cp -v ${zfsPkg}/sbin/zdb $out/bin + cp -v ${zfsPkg}/sbin/zpool $out/bin + cp -pdv ${zfsPkg}/lib/lib*.so* $out/lib cp -pdv ${pkgs.zlib}/lib/lib*.so* $out/lib ''; postDeviceCommands = @@ -139,7 +154,7 @@ in serviceConfig = { Type = "oneshot"; RemainAfterExit = true; - ExecStart = "${kernel.zfs}/sbin/zpool import -f -a"; + ExecStart = "${zfsPkg}/sbin/zpool import -f -a"; }; restartIfChanged = false; }; @@ -151,15 +166,15 @@ in serviceConfig = { Type = "oneshot"; RemainAfterExit = true; - ExecStart = "${kernel.zfs}/sbin/zfs mount -a"; - ExecStop = "${kernel.zfs}/sbin/zfs umount -a"; + ExecStart = "${zfsPkg}/sbin/zfs mount -a"; + ExecStop = "${zfsPkg}/sbin/zfs umount -a"; }; restartIfChanged = false; }; - system.fsPackages = [ kernel.zfs ]; # XXX: needed? zfs doesn't have (need) a fsck - environment.systemPackages = [ kernel.zfs ]; - services.udev.packages = [ kernel.zfs ]; # to hook zvol naming, etc. + system.fsPackages = [ zfsPkg ]; # XXX: needed? zfs doesn't have (need) a fsck + environment.systemPackages = [ zfsPkg ]; + services.udev.packages = [ zfsPkg ]; # to hook zvol naming, etc. }) (mkIf enableAutoSnapshots { diff --git a/pkgs/os-specific/linux/spl/git.nix b/pkgs/os-specific/linux/spl/git.nix new file mode 100644 index 000000000000..ba7ccc7348ee --- /dev/null +++ b/pkgs/os-specific/linux/spl/git.nix @@ -0,0 +1,46 @@ +{ stdenv, fetchgit, kernel, perl, autoconf, automake, libtool, coreutils, gawk }: + +stdenv.mkDerivation { + name = "spl-0.6.3pre-${kernel.version}"; + src = fetchgit { + url = git://github.com/zfsonlinux/spl.git; + rev = "89aa97059d7ddad668a5118aef7914743162a5e8"; + sha256 = "1x4pba26zbyly8xd9q8s4av9v88ck0n9szxx72wzcn0s25rsyanx"; + }; + + patches = [ ./install_prefix.patch ]; + + buildInputs = [ perl autoconf automake libtool ]; + + preConfigure = '' + ./autogen.sh + + substituteInPlace ./module/spl/spl-generic.c --replace /usr/bin/hostid hostid + substituteInPlace ./module/spl/spl-module.c --replace /bin/mknod mknod + + substituteInPlace ./module/spl/spl-generic.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:${gawk}:/bin" + substituteInPlace ./module/splat/splat-vnode.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:/bin" + substituteInPlace ./module/splat/splat-linux.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:/bin" + ''; + + configureFlags = '' + --with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source + --with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build + ''; + + enableParallelBuilding = true; + + meta = { + description = "Kernel module driver for solaris porting layer (needed by in-kernel zfs)"; + + longDescription = '' + This kernel module is a porting layer for ZFS to work inside the linux + kernel. + ''; + + homepage = http://zfsonlinux.org/; + platforms = stdenv.lib.platforms.linux; + license = stdenv.lib.licenses.gpl2Plus; + maintainers = with stdenv.lib.maintainers; [ wizeman ]; + }; +} diff --git a/pkgs/os-specific/linux/zfs/git.nix b/pkgs/os-specific/linux/zfs/git.nix new file mode 100644 index 000000000000..cc75011c7da9 --- /dev/null +++ b/pkgs/os-specific/linux/zfs/git.nix @@ -0,0 +1,52 @@ +{ stdenv, fetchgit, kernel, spl_git, perl, autoconf, automake, libtool, zlib, libuuid, coreutils, utillinux }: + +stdenv.mkDerivation { + name = "zfs-0.6.3pre-${kernel.version}"; + + src = fetchgit { + url = git://github.com/zfsonlinux/zfs.git; + rev = "de39ec11b885f97e6256324ee89eaf75af9852f6"; + sha256 = "02hrhka9hg0vn4z20x7xzwrkr340pv9qwvwj8phjdm5ln321jh33"; + }; + + patches = [ ./mount_zfs_prefix.patch ./nix-build.patch ]; + + buildInputs = [ spl_git perl autoconf automake libtool zlib libuuid coreutils ]; + + # for zdb to get the rpath to libgcc_s, needed for pthread_cancel to work + NIX_CFLAGS_LINK = "-lgcc_s"; + + preConfigure = '' + ./autogen.sh + + substituteInPlace ./module/zfs/zfs_ctldir.c --replace "umount -t zfs" "${utillinux}/bin/umount -t zfs" + substituteInPlace ./module/zfs/zfs_ctldir.c --replace "mount -t zfs" "${utillinux}/bin/mount -t zfs" + substituteInPlace ./lib/libzfs/libzfs_mount.c --replace "/bin/umount" "${utillinux}/bin/umount" + substituteInPlace ./lib/libzfs/libzfs_mount.c --replace "/bin/mount" "${utillinux}/bin/mount" + substituteInPlace ./udev/rules.d/* --replace "/lib/udev/vdev_id" "$out/lib/udev/vdev_id" + substituteInPlace ./cmd/ztest/ztest.c --replace "/usr/sbin/ztest" "$out/sbin/ztest" + substituteInPlace ./cmd/ztest/ztest.c --replace "/usr/sbin/zdb" "$out/sbin/zdb" + ''; + + configureFlags = '' + --disable-systemd + --with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source + --with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build + --with-spl=${spl_git}/libexec/spl + ''; + + enableParallelBuilding = true; + + meta = { + description = "ZFS Filesystem Linux Kernel module"; + longDescription = '' + ZFS is a filesystem that combines a logical volume manager with a + Copy-On-Write filesystem with data integrity detection and repair, + snapshotting, cloning, block devices, deduplication, and more. + ''; + homepage = http://zfsonlinux.org/; + license = stdenv.lib.licenses.cddl; + platforms = stdenv.lib.platforms.linux; + maintainers = with stdenv.lib.maintainers; [ wizeman ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 579e8d741d9f..07345ee5a8fb 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -7078,7 +7078,8 @@ let psmouse_alps = callPackage ../os-specific/linux/psmouse-alps { }; - spl = callPackage ../os-specific/linux/spl/default.nix { }; + spl = callPackage ../os-specific/linux/spl { }; + spl_git = callPackage ../os-specific/linux/spl/git.nix { }; sysdig = callPackage ../os-specific/linux/sysdig {}; @@ -7094,7 +7095,8 @@ let virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions { }; - zfs = callPackage ../os-specific/linux/zfs/default.nix { }; + zfs = callPackage ../os-specific/linux/zfs { }; + zfs_git = callPackage ../os-specific/linux/zfs/git.nix { }; }; # Build the kernel modules for the some of the kernels.