aboutsummaryrefslogtreecommitdiff
path: root/nixos
diff options
context:
space:
mode:
authorKevin Cox <kevincox@kevincox.ca>2020-11-11 20:32:42 -0500
committerGitHub <noreply@github.com>2020-11-11 20:32:42 -0500
commit66c98ec5506c8fbefc4326f9f95035aaecb3a464 (patch)
treea4c6960b9ad21bd88e3fb383112706c22c65c2cc /nixos
parentd3a30145c34cb86ecb9f55066414a4401bbacdee (diff)
parente0d51db401a64b7e69f10bde7221c1d27bed29dc (diff)
Merge pull request #95751 from srhb/forceImportAll
nixos/zfs: Fix boot.zfs.forceImportAll
Diffstat (limited to 'nixos')
-rw-r--r--nixos/doc/manual/release-notes/rl-2103.xml9
-rw-r--r--nixos/modules/tasks/filesystems/zfs.nix7
-rw-r--r--nixos/tests/zfs.nix35
3 files changed, 45 insertions, 6 deletions
diff --git a/nixos/doc/manual/release-notes/rl-2103.xml b/nixos/doc/manual/release-notes/rl-2103.xml
index 9bff9a745071..62dcbd6184e4 100644
--- a/nixos/doc/manual/release-notes/rl-2103.xml
+++ b/nixos/doc/manual/release-notes/rl-2103.xml
@@ -151,6 +151,15 @@
<literal>vim</literal> switched to Python 3, dropping all Python 2 support.
</para>
</listitem>
+ <listitem>
+ <para>
+ <link linkend="opt-boot.zfs.forceImportAll">boot.zfs.forceImportAll</link>
+ previously did nothing, but has been fixed. However its default has been
+ changed to <literal>false</literal> to preserve the existing default
+ behaviour. If you have this explicitly set to <literal>true</literal>,
+ please note that your non-root pools will now be forcibly imported.
+ </para>
+ </listitem>
</itemizedlist>
</section>
diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix
index 9ca7c6fb3431..7b6c2277741b 100644
--- a/nixos/modules/tasks/filesystems/zfs.nix
+++ b/nixos/modules/tasks/filesystems/zfs.nix
@@ -175,14 +175,10 @@ in
forceImportAll = mkOption {
type = types.bool;
- default = true;
+ default = false;
description = ''
Forcibly import all ZFS pool(s).
- This is enabled by default for backwards compatibility purposes, but it is highly
- recommended to disable this option, as it bypasses some of the safeguards ZFS uses
- to protect your ZFS pools.
-
If you set this option to <literal>false</literal> and NixOS subsequently fails to
import your non-root ZFS pool(s), you should manually import each pool with
"zpool import -f &lt;pool-name&gt;", and then reboot. You should only need to do
@@ -507,6 +503,7 @@ in
Type = "oneshot";
RemainAfterExit = true;
};
+ environment.ZFS_FORCE = optionalString cfgZfs.forceImportAll "-f";
script = (importLib {
# See comments at importLib definition.
zpoolCmd="${packages.zfsUser}/sbin/zpool";
diff --git a/nixos/tests/zfs.nix b/nixos/tests/zfs.nix
index 87e6c900c98e..e05cd540227a 100644
--- a/nixos/tests/zfs.nix
+++ b/nixos/tests/zfs.nix
@@ -18,7 +18,7 @@ let
maintainers = [ adisbladis ];
};
- machine = { pkgs, ... }: {
+ machine = { pkgs, lib, ... }: {
virtualisation.emptyDiskImages = [ 4096 ];
networking.hostId = "deadbeef";
boot.kernelPackages = kernelPackage;
@@ -26,6 +26,24 @@ let
boot.zfs.enableUnstable = enableUnstable;
environment.systemPackages = [ pkgs.parted ];
+
+ # Setup regular fileSystems machinery to ensure forceImportAll can be
+ # tested via the regular service units.
+ fileSystems = lib.mkVMOverride {
+ "/forcepool" = {
+ device = "forcepool";
+ fsType = "zfs";
+ options = [ "noauto" ];
+ };
+ };
+
+ # forcepool doesn't exist at first boot, and we need to manually test
+ # the import after tweaking the hostId.
+ systemd.services.zfs-import-forcepool.wantedBy = lib.mkVMOverride [];
+ systemd.targets.zfs.wantedBy = lib.mkVMOverride [];
+ boot.zfs.forceImportAll = true;
+ # /dev/disk/by-id doesn't get populated in the NixOS test framework
+ boot.zfs.devNodes = "/dev/disk/by-uuid";
};
testScript = ''
@@ -57,6 +75,21 @@ let
"zpool destroy rpool",
"udevadm settle",
)
+
+ with subtest("boot.zfs.forceImportAll works"):
+ machine.succeed(
+ "rm /etc/hostid",
+ "zgenhostid deadcafe",
+ "zpool create forcepool /dev/vdb1 -O mountpoint=legacy",
+ )
+ machine.shutdown()
+ machine.start()
+ machine.succeed("udevadm settle")
+ machine.fail("zpool import forcepool")
+ machine.succeed(
+ "systemctl start zfs-import-forcepool.service",
+ "mount -t zfs forcepool /tmp/mnt",
+ )
'' + extraTest;
};