Commit e04c0b0d authored by Raito Bezarius's avatar Raito Bezarius
Browse files

zfs_2_1: init at 2.1.13

This re-introduces the old stable ZFS version we had in the past following
the many predicted issues of ZFS 2.2.x series, that is much more stable
than any further ZFS version at the moment.

I am also removing myself from maintenance of any further ZFS versions as I am
planning to quit ZFS maintenance at some point.

In the meantime, for users like me who depend on ZFS for critical operations, here is a ZFS version
that is known to work for LTS kernels.
parent d046cedf
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -322,9 +322,8 @@ pkgs/applications/version-management/forgejo @bendlas @emilylange
/pkgs/development/ocaml-modules     @ulrikstrid

# ZFS
pkgs/os-specific/linux/zfs                @raitobezarius
nixos/lib/make-single-disk-zfs-image.nix  @raitobezarius
nixos/lib/make-multi-disk-zfs-image.nix   @raitobezarius
pkgs/os-specific/linux/zfs/2_1.nix        @raitobezarius
pkgs/os-specific/linux/zfs/generic.nix    @raitobezarius
nixos/modules/tasks/filesystems/zfs.nix   @raitobezarius
nixos/tests/zfs.nix                       @raitobezarius

+19 −12
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ let
  cfgTrim = config.services.zfs.trim;
  cfgZED = config.services.zfs.zed;

  selectModulePackage = package: config.boot.kernelPackages.${package.kernelModuleAttribute};
  inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems;
  inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems;

@@ -210,11 +211,17 @@ in
  options = {
    boot.zfs = {
      package = mkOption {
        readOnly = true;
        type = types.package;
        default = if config.boot.zfs.enableUnstable then pkgs.zfsUnstable else pkgs.zfs;
        defaultText = literalExpression "if config.boot.zfs.enableUnstable then pkgs.zfsUnstable else pkgs.zfs";
        description = lib.mdDoc "Configured ZFS userland tools package.";
        default = if cfgZfs.enableUnstable then pkgs.zfsUnstable else pkgs.zfs;
        defaultText = literalExpression "if zfsUnstable is enabled then pkgs.zfsUnstable else pkgs.zfs";
        description = lib.mdDoc "Configured ZFS userland tools package, use `pkgs.zfsUnstable` if you want to track the latest staging ZFS branch.";
      };

      modulePackage = mkOption {
        internal = true; # It is supposed to be selected automatically, but can be overridden by expert users.
        default = selectModulePackage cfgZfs.package;
        type = types.package;
        description = lib.mdDoc "Configured ZFS kernel module package.";
      };

      enabled = mkOption {
@@ -533,6 +540,10 @@ in
  config = mkMerge [
    (mkIf cfgZfs.enabled {
      assertions = [
        {
          assertion = cfgZfs.modulePackage.version == cfgZfs.package.version;
          message = "The kernel module and the userspace tooling versions are not matching, this is an unsupported usecase.";
        }
        {
          assertion = cfgZED.enableMail -> cfgZfs.package.enableMail;
          message = ''
@@ -571,18 +582,14 @@ in
        # https://github.com/NixOS/nixpkgs/issues/106093
        kernelParams = lib.optionals (!config.boot.zfs.allowHibernation) [ "nohibernate" ];

        extraModulePackages = let
          kernelPkg = if config.boot.zfs.enableUnstable then
            config.boot.kernelPackages.zfsUnstable
           else
            config.boot.kernelPackages.zfs;
        in [
          (kernelPkg.override { inherit (cfgZfs) removeLinuxDRM; })
        extraModulePackages = [
          (cfgZfs.modulePackage.override { inherit (cfgZfs) removeLinuxDRM; })
        ];
      };

      boot.initrd = mkIf inInitrd {
        kernelModules = [ "zfs" ] ++ optional (!cfgZfs.enableUnstable) "spl";
        # spl has been removed in ≥ 2.2.0.
        kernelModules = [ "zfs" ] ++ lib.optional (lib.versionOlder "2.2.0" version) "spl";
        extraUtilsCommands =
          mkIf (!config.boot.initrd.systemd.enable) ''
            copy_bin_and_libs ${cfgZfs.package}/sbin/zfs
+8 −2
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ let
                      else pkgs.linuxPackages
    , enableUnstable ? false
    , enableSystemdStage1 ? false
    , zfsPackage ? if enableUnstable then pkgs.zfs else pkgs.zfsUnstable
    , extraTest ? ""
    }:
    makeTest {
@@ -21,7 +22,7 @@ let
        maintainers = [ adisbladis elvishjerricco ];
      };

      nodes.machine = { pkgs, lib, ... }:
      nodes.machine = { config, pkgs, lib, ... }:
        let
          usersharePath = "/var/lib/samba/usershares";
        in {
@@ -35,8 +36,8 @@ let
        boot.loader.efi.canTouchEfiVariables = true;
        networking.hostId = "deadbeef";
        boot.kernelPackages = kernelPackage;
        boot.zfs.package = zfsPackage;
        boot.supportedFilesystems = [ "zfs" ];
        boot.zfs.enableUnstable = enableUnstable;
        boot.initrd.systemd.enable = enableSystemdStage1;

        environment.systemPackages = [ pkgs.parted ];
@@ -193,6 +194,11 @@ let

in {

  # maintainer: @raitobezarius
  series_2_1 = makeZfsTest "2.1-series" {
    zfsPackage = pkgs.zfs_2_1;
  };

  stable = makeZfsTest "stable" { };

  unstable = makeZfsTest "unstable" {
+49 −0
Original line number Diff line number Diff line
{ callPackage
, kernel ? null
, stdenv
, linuxKernel
, removeLinuxDRM ? false
, lib
, nixosTests
, fetchpatch
, ...
} @ args:

let
  stdenv' = if kernel == null then stdenv else kernel.stdenv;
in
callPackage ./generic.nix args {
  # You have to ensure that in `pkgs/top-level/linux-kernels.nix`
  # this attribute is the correct one for this package.
  kernelModuleAttribute = "zfs_2_1";
  # check the release notes for compatible kernels
  kernelCompatible =
    if stdenv'.isx86_64 || removeLinuxDRM
    then kernel.kernelOlder "6.6"
    else kernel.kernelOlder "6.2";

  latestCompatibleLinuxPackages = if stdenv'.isx86_64 || removeLinuxDRM
    then linuxKernel.packages.linux_6_5
    else linuxKernel.packages.linux_6_1;

  # This is a fixed version to the 2.1.x series, move only
  # if the 2.1.x series moves.
  version = "2.1.13";

  extraPatches = [
    (fetchpatch {
      # https://github.com/openzfs/zfs/pull/15571
      # Remove when it's backported to 2.1.x.
      url = "https://github.com/robn/zfs/commit/617c990a4cf1157b0f8332f35672846ad16ca70a.patch";
      hash = "sha256-j5YSrud7BaWk2npBl31qwFFLYltbut3CUjI1cjZOpag=";
    })
  ];

  hash = "sha256-tqUCn/Hf/eEmyWRQthWQdmTJK2sDspnHiiEfn9rz2Kc=";

  tests = [
    nixosTests.zfs.series_2_1
  ];

  maintainers = [ lib.maintainers.raitobezarius ];
}
+234 −215
Original line number Diff line number Diff line
let
  genericBuild =
  { pkgs, lib, stdenv, fetchFromGitHub, fetchpatch
  , autoreconfHook269, util-linux, nukeReferences, coreutils
, perl, nixosTests
  , perl
  , configFile ? "all"

  # Userspace dependencies
@@ -17,24 +19,29 @@
  , kernel ? null
  , enablePython ? true
  , ...
}:
  }@outerArgs:

  assert (configFile == "kernel") -> (kernel != null);
  { version
, sha256
  , hash
  , kernelModuleAttribute
  , extraPatches ? []
  , rev ? "zfs-${version}"
  , isUnstable ? false
  , latestCompatibleLinuxPackages
  , kernelCompatible ? null
}:
  , maintainers ? (with lib.maintainers; [ amarshall adamcstephens ])
  , tests
  }@innerArgs:

  let
  inherit (lib) any optionalString optionals optional makeBinPath;
    inherit (lib) any optionalString optionals optional makeBinPath versionAtLeast;

    smartmon = smartmontools.override { inherit enableMail; };

    buildKernel = any (n: n == configFile) [ "kernel" "all" ];
    buildUser = any (n: n == configFile) [ "user" "all" ];
    isAtLeast22Series = versionAtLeast version "2.2.0";

    # XXX: You always want to build kernel modules with the same stdenv as the
    # kernel was built with. However, since zfs can also be built for userspace we
@@ -47,11 +54,13 @@ in

  stdenv'.mkDerivation {
    name = "zfs-${configFile}-${version}${optionalString buildKernel "-${kernel.version}"}";
    pname = "zfs";
    inherit version;

    src = fetchFromGitHub {
      owner = "openzfs";
      repo = "zfs";
    inherit rev sha256;
      inherit rev hash;
    };

    patches = extraPatches;
@@ -78,9 +87,19 @@ stdenv'.mkDerivation {
                                                    --replace "/etc/default"            "$out/etc/default"
      substituteInPlace ./contrib/initramfs/Makefile.am \
        --replace "/usr/share/initramfs-tools" "$out/usr/share/initramfs-tools"
    '' + optionalString isAtLeast22Series ''
      substituteInPlace ./udev/vdev_id \
        --replace "PATH=/bin:/sbin:/usr/bin:/usr/sbin" \
         "PATH=${makeBinPath [ coreutils gawk gnused gnugrep systemd ]}"
    '' + optionalString (!isAtLeast22Series) ''
      substituteInPlace ./etc/zfs/Makefile.am --replace "\$(sysconfdir)/zfs" "$out/etc/zfs"

      find ./contrib/initramfs -name Makefile.am -exec sed -i -e 's|/usr/share/initramfs-tools|'$out'/share/initramfs-tools|g' {} \;

      substituteInPlace ./cmd/vdev_id/vdev_id \
        --replace "PATH=/bin:/sbin:/usr/bin:/usr/sbin" \
        "PATH=${makeBinPath [ coreutils gawk gnused gnugrep systemd ]}"
    '' + ''
      substituteInPlace ./config/zfs-build.m4 \
        --replace "bashcompletiondir=/etc/bash_completion.d" \
          "bashcompletiondir=$out/share/bash-completion/completions"
@@ -180,15 +199,14 @@ stdenv'.mkDerivation {
    outputs = [ "out" ] ++ optionals buildUser [ "dev" ];

    passthru = {
    inherit enableMail latestCompatibleLinuxPackages;

    tests =
      if isUnstable then [
        nixosTests.zfs.unstable
      ] else [
        nixosTests.zfs.installer
        nixosTests.zfs.stable
      ];
      inherit enableMail latestCompatibleLinuxPackages kernelModuleAttribute;
      # The corresponding userspace tools to this instantiation
      # of the ZFS package set.
      userspaceTools = genericBuild (outerArgs // {
        configFile = "user";
      }) innerArgs;

      inherit tests;
    };

    meta = {
@@ -212,11 +230,12 @@ stdenv'.mkDerivation {
        with lib.systems.inspect.patterns;
        map (p: p // isLinux) ([ isx86_32 isx86_64 isPower isAarch64 isSparc ] ++ isArmv7);

    maintainers = with lib.maintainers; [ jcumming jonringer globin raitobezarius ];
      inherit maintainers;
      mainProgram = "zfs";
      # If your Linux kernel version is not yet supported by zfs, try zfsUnstable.
      # On NixOS set the option boot.zfs.enableUnstable.
      broken = buildKernel && (kernelCompatible != null) && !kernelCompatible;
    };
}
  };
in
  genericBuild
Loading