Loading .github/CODEOWNERS +2 −3 Original line number Diff line number Diff line Loading @@ -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 Loading nixos/modules/tasks/filesystems/zfs.nix +19 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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 = '' Loading Loading @@ -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 Loading nixos/tests/zfs.nix +8 −2 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ let else pkgs.linuxPackages , enableUnstable ? false , enableSystemdStage1 ? false , zfsPackage ? if enableUnstable then pkgs.zfs else pkgs.zfsUnstable , extraTest ? "" }: makeTest { Loading @@ -21,7 +22,7 @@ let maintainers = [ adisbladis elvishjerricco ]; }; nodes.machine = { pkgs, lib, ... }: nodes.machine = { config, pkgs, lib, ... }: let usersharePath = "/var/lib/samba/usershares"; in { Loading @@ -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 ]; Loading Loading @@ -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" { Loading pkgs/os-specific/linux/zfs/2_1.nix 0 → 100644 +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 ]; } pkgs/os-specific/linux/zfs/generic.nix +236 −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 Loading @@ -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 Loading @@ -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; Loading @@ -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" Loading Loading @@ -180,23 +199,24 @@ 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 = { description = "ZFS Filesystem Linux Kernel module"; description = "ZFS Filesystem Linux" + (if buildUser then " Userspace Tools" else " 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. ${if buildUser then "This is the userspace tools package." else "This is the kernel module package."} ''; homepage = "https://github.com/openzfs/zfs"; changelog = "https://github.com/openzfs/zfs/releases/tag/zfs-${version}"; Loading @@ -212,11 +232,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
.github/CODEOWNERS +2 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
nixos/modules/tasks/filesystems/zfs.nix +19 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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 = '' Loading Loading @@ -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 Loading
nixos/tests/zfs.nix +8 −2 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ let else pkgs.linuxPackages , enableUnstable ? false , enableSystemdStage1 ? false , zfsPackage ? if enableUnstable then pkgs.zfs else pkgs.zfsUnstable , extraTest ? "" }: makeTest { Loading @@ -21,7 +22,7 @@ let maintainers = [ adisbladis elvishjerricco ]; }; nodes.machine = { pkgs, lib, ... }: nodes.machine = { config, pkgs, lib, ... }: let usersharePath = "/var/lib/samba/usershares"; in { Loading @@ -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 ]; Loading Loading @@ -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" { Loading
pkgs/os-specific/linux/zfs/2_1.nix 0 → 100644 +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 ]; }
pkgs/os-specific/linux/zfs/generic.nix +236 −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 Loading @@ -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 Loading @@ -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; Loading @@ -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" Loading Loading @@ -180,23 +199,24 @@ 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 = { description = "ZFS Filesystem Linux Kernel module"; description = "ZFS Filesystem Linux" + (if buildUser then " Userspace Tools" else " 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. ${if buildUser then "This is the userspace tools package." else "This is the kernel module package."} ''; homepage = "https://github.com/openzfs/zfs"; changelog = "https://github.com/openzfs/zfs/releases/tag/zfs-${version}"; Loading @@ -212,11 +232,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