wip/yesman
parent
d2789791ee
commit
b42d52eeb0
@ -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…
Reference in new issue