spl, zfs: Add git versions, based on recent commits

Upstream has not been tagging new versions for a long time, but we need
compatibility with newer kernels. The 0.6.2 versions already have a bunch of
backported compatibility patches, but 3.14 kernels need even more.

Also, the git versions have fixed a bunch of crashes and other bugs, so perhaps
we should just bite the bullet and just use recent git versions (as sometimes
upstream recommends, when people run into bugs).

This adds a new "boot.zfs.useGit" boolean option, so that a user can
easily opt into using the git versions.
This commit is contained in:
Ricardo M. Correia 2014-03-22 18:27:23 +01:00
parent b2250ad851
commit 419a71e1e5
4 changed files with 129 additions and 14 deletions

View file

@ -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 {

View file

@ -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 ];
};
}

View file

@ -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 ];
};
}

View file

@ -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.