Add the hostid option. Refactor code a bit better for initrd(untested) and system operation.

wip/yesman
Jack Cummings 12 years ago
parent d2789791ee
commit b42d52eeb0
  1. 67
      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
{
###### implementation
config = mkIf (any (fs: fs == "zfs") config.boot.supportedFilesystems) {
boot.kernelModules = [ "spl" "zfs" ] ;
boot.extraModulePackages = [ kernel.zfs kernel.spl ];
###### 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.
'';
};
};
boot.initrd.kernelModules = mkIf inInitrd [ "spl" "zfs" ] ;
###### implementation
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
'';
config = mkIf ( inInitrd || inSystem ) {
boot.initrd.postDeviceCommands = mkIf inInitrd
''
zpool import -f -a -d /dev
zfs mount -a
'';
boot = {
kernelModules = [ "spl" "zfs" ] ;
extraModulePackages = [ kernel.zfs kernel.spl ];
extraModprobeConfig = mkIf (cfgSpl.hostid != "") "options spl spl_hostid=${cfgSpl.hostid}";
};
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.
};
}

Loading…
Cancel
Save