From b42d52eeb0159e716190ea1c96b1fae9c9b619c5 Mon Sep 17 00:00:00 2001 From: Jack Cummings Date: Tue, 4 Dec 2012 11:57:59 -0800 Subject: [PATCH] Add the hostid option. Refactor code a bit better for initrd(untested) and system operation. --- modules/tasks/filesystems/zfs.nix | 69 +++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/modules/tasks/filesystems/zfs.nix b/modules/tasks/filesystems/zfs.nix index b0e30d494ecd..d8ea66f2cd47 100644 --- a/modules/tasks/filesystems/zfs.nix +++ b/modules/tasks/filesystems/zfs.nix @@ -1,41 +1,68 @@ { config, pkgs, ... }: +# +# todo: +# - crontab for scrubs, etc +# - zfs tunables +# - /etc/zfs/zpool.cache handling + with pkgs.lib; let + cfgSpl = config.environment.spl; inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems; + inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems; kernel = config.boot.kernelPackages; in { + + ###### interface + + options = { + environment.spl.hostid = mkOption { + default = ""; + example = "0xdeadbeef"; + description = '' + ZFS uses a system's hostid to determine if a storage pool (zpool) is + native to this system, and should thus be imported automatically. + Unfortunately, this hostid can change under linux from boot to boot (by + changing network adapaters, for instance). Specify a unique 32 bit hostid in + hex here for zfs to prevent getting a random hostid between boots and having to + manually import pools. + ''; + }; + }; + ###### implementation - config = mkIf (any (fs: fs == "zfs") config.boot.supportedFilesystems) { + config = mkIf ( inInitrd || inSystem ) { - boot.kernelModules = [ "spl" "zfs" ] ; - boot.extraModulePackages = [ kernel.zfs kernel.spl ]; + boot = { + kernelModules = [ "spl" "zfs" ] ; + extraModulePackages = [ kernel.zfs kernel.spl ]; + extraModprobeConfig = mkIf (cfgSpl.hostid != "") "options spl spl_hostid=${cfgSpl.hostid}"; + }; - boot.initrd.kernelModules = mkIf inInitrd [ "spl" "zfs" ] ; - - boot.initrd.extraUtilsCommands = mkIf inInitrd - '' - cp -v ${kernel.zfs}/sbin/zfs $out/sbin - cp -v ${kernel.zfs}/sbin/zdb $out/sbin - cp -v ${kernel.zfs}/sbin/zpool $out/sbin - ''; - - boot.initrd.postDeviceCommands = mkIf inInitrd - '' - zpool import -f -a -d /dev - zfs mount -a - ''; - - system.fsPackages = [ kernel.zfs ]; + boot.initrd = mkIf inInitrd { + kernelModules = [ "spl" "zfs" ] ; + extraUtilsCommands = + '' + cp -v ${kernel.zfs}/sbin/zfs $out/sbin + cp -v ${kernel.zfs}/sbin/zdb $out/sbin + cp -v ${kernel.zfs}/sbin/zpool $out/sbin + ''; + postDeviceCommands = + '' + zpool import -f -a -d /dev + zfs mount -a + ''; + }; + system.fsPackages = [ kernel.zfs ]; # XXX: needed? zfs doesn't have a fsck environment.systemPackages = [ kernel.zfs ]; - - services.udev.packages = [ kernel.zfs ]; + services.udev.packages = [ kernel.zfs ]; # to hook zvol naming, etc. }; }