This commit is contained in:
Shelvacu
2025-06-28 17:20:35 -07:00
committed by Shelvacu on fw
parent 7b7ea923a9
commit ed151ac1f4

View File

@@ -11,56 +11,74 @@ let
t = g * 1000; t = g * 1000;
ki = 1024; ki = 1024;
_8ki = 8 * ki; _8ki = 8 * ki;
vdev_size = lib.pipe (14 * t) [ safe_size = size:
# 14TB lib.pipe size [
(n: n * 0.99) # leave 1% unused (n: n * 0.99) # leave 1% unused
builtins.floor # convert back to int (n: n / (4*ki)) # convert to sectors
(n: (n / _8ki) * _8ki) # round to multiple of 8KiB builtins.floor # integer number of sectors
]; (n: n * (4*ki)) # convert to bytes
vdev_size_ki = vdev_size / ki; ]
md_partition_size = lib.pipe vdev_size [ ;
(n: n / 2) # only using raid0 pairs currently # I have drives that are 8TB, 10TB, and 14TB. By partitioning the 14TB into 8 + 2 + 4 and the 10TB into 8 + 2, I can create a vdevs across a bunch of 8TB, 2TB, and 4TB partitions
# from man md(4): "between 64K and 128K is lost when a device in incorporated into an MD array" slabsMin = {
(n: n + (128 * ki)) slabA = { idx = 0; sizeT = 8; };
]; slabB = { idx = 1; sizeT = 2; };
md_partition_size_ki = md_partition_size / ki; slabC = { idx = 2; sizeT = 4; };
};
slabs = lib.mapAttrs (name: value:
value // rec {
inherit name;
sizeBytes = safe_size (value.sizeT * t);
sizeKi = sizeBytes / ki;
partitionConfig = {
size = "${builtins.toString sizeKi}K";
type = fs_type_zfs;
priority = 1000 + value.idx;
};
}
) slabsMin;
slapParts = lib.mapAttrs (_: v: v.partitionConfig) slabs;
# slabs = {
# _8 = rec {
# idx = 0;
# letter = "slabA";
# size_bytes = safe_size (8 * t);
# size_ki = size_bytes / ki;
# };
# _2 = rec {
# idx = 1;
# letter = "slabB";
# size_bytes = safe_size (2 * t);
# size_ki = size_bytes / ki;
# };
# _4 = rec {
# idx = 2;
# letter = "slabC";
# size_bytes = safe_size (4 * t);
# size_ki = size_bytes / ki;
# };
# };
# slab_size_8t = safe_size (8 * t);
# slab_size_2t = safe_size (2 * t);
# slab_size_4t = safe_size (4 * t);
path_prefix = "/dev/disk/by-id/"; path_prefix = "/dev/disk/by-id/";
# each 8TB # 8TB
seagate_1 = "ata-ST8000DM004-2U9188_ZR115511"; seagate_1 = "ata-ST8000DM004-2U9188_ZR115511";
seagate_2 = "ata-ST8000DM004-2U9188_ZR11FWPR"; seagate_2 = "ata-ST8000DM004-2U9188_ZR11FWPR";
seagate_gaming = [ seagates = [
seagate_1 seagate_1
seagate_2 seagate_2
]; ];
# each 10TB # 10TB
easystore_1 = "ata-WDC_WD100EMAZ-00WJTA0_1EGEP22N"; easystore_1 = "ata-WDC_WD100EMAZ-00WJTA0_1EGEP22N";
easystore_2 = "ata-WDC_WD100EMAZ-00WJTA0_1EGLWXMZ"; easystore_2 = "ata-WDC_WD100EMAZ-00WJTA0_1EGLWXMZ";
easystores_10 = [ easystores_10 = [
easystore_1 easystore_1
easystore_2 easystore_2
]; ];
fs_type_raid = "fd00"; # Linux RAID # 14TB
fs_type_zfs = "a504"; # FreeBSD ZFS
split_config = md_name: {
type = "disk";
content = {
type = "gpt";
partitions.mdadm = {
size = "${builtins.toString md_partition_size_ki}K";
type = fs_type_raid;
content = {
type = "mdraid";
name = md_name;
};
};
};
};
md_name_seagate = "propdata-seagates-combiner";
md_name_easystore = "propdata-easystores-combiner";
poolname = "propdata";
# each 14TB
easystores_14 = vaculib.listOfLines { } '' easystores_14 = vaculib.listOfLines { } ''
ata-WDC_WD140EDFZ-11A0VA0_Y5J3929C # unused, previously nothing
ata-WDC_WD140EDGZ-11B2DA2_2BHRSN3F ata-WDC_WD140EDGZ-11B2DA2_2BHRSN3F
ata-WDC_WD140EDGZ-11B2DA2_2CG19ERP ata-WDC_WD140EDGZ-11B2DA2_2CG19ERP
ata-WDC_WD140EDGZ-11B2DA2_2CG4ZYSN ata-WDC_WD140EDGZ-11B2DA2_2CG4ZYSN
@@ -70,90 +88,141 @@ let
ata-WDC_WD140EDGZ-11B2DA2_3WH4KX0P ata-WDC_WD140EDGZ-11B2DA2_3WH4KX0P
ata-WDC_WD140EDGZ-11B2DA2_3WJ4XRUJ ata-WDC_WD140EDGZ-11B2DA2_3WJ4XRUJ
ata-WDC_WD140EDGZ-11B2DA2_3WK2HBDP ata-WDC_WD140EDGZ-11B2DA2_3WK2HBDP
# unused, previously cold spare for emanlooc
ata-WDC_WD140EDFZ-11A0VA0_Y5J3929C
# previously the emanlooc pool
ata-WDC_WD140EDFZ-11A0VA0_9LG7AUEG
ata-WDC_WD140EDFZ-11A0VA0_9LG8247A
ata-WDC_WD140EDFZ-11A0VA0_9LG8475A
ata-WDC_WD140EDFZ-11A0VA0_9LG872WA
ata-WDC_WD140EDFZ-11A0VA0_9MG7KBWA
ata-WDC_WD140EDFZ-11A0VA0_Y5J31ZAC
ata-WDC_WD140EDFZ-11A0VA0_Y5J333UC
ata-WDC_WD140EDFZ-11A0VA0_Y5J3V54C
''; '';
easystore_14_configs = lib.pipe easystores_14 [ easystores_14_spare = lib.singleton (lib.head easystores_14);
(map (name: { easystores_14_active = lib.tail easystores_14;
name = "easystore14_${lib.last (lib.splitString "_" name)}"; fs_type_zfs = "a504"; # FreeBSD ZFS
poolname = "propdata";
mk_configs = { groupName, drives, partitions }:
builtins.listToAttrs (map (name: {
name = "${groupName}_${lib.last (lib.splitString "_" name)}}";
value = { value = {
type = "disk"; type = "disk";
device = path_prefix + name; device = path_prefix + name;
content = { content = {
type = "gpt"; type = "gpt";
partitions.main = { inherit partitions;
size = "${builtins.toString vdev_size_ki}K";
type = fs_type_zfs;
content = {
type = "zfs";
pool = poolname;
};
};
}; };
}; };
})) }) drives)
builtins.listToAttrs ;
];
md_config = { # each 14TB
type = "mdadm"; # easystore_14_configs = lib.pipe easystores_14 [
level = 0; # (map (name: {
content = { # name = "easystore14_${lib.last (lib.splitString "_" name)}";
type = "zfs"; # value = {
pool = poolname; # type = "disk";
}; # device = path_prefix + name;
}; # content = {
# type = "gpt";
# partitions.main = {
# size = "${builtins.toString vdev_size_ki}K";
# type = fs_type_zfs;
# content = {
# type = "zfs";
# pool = poolname;
# };
# };
# };
# };
# }))
# builtins.listToAttrs
# ];
in in
{ {
imports = [ inputs.disko.nixosModules.default ]; imports = [ inputs.disko.nixosModules.default ];
options.vacu.prophecy = lib.mapAttrs (_: vaculib.mkOutOption) { options.vacu.prophecy = lib.mapAttrs (_: vaculib.mkOutOption) {
inherit inherit
vdev_size
md_partition_size
easystores_10 easystores_10
easystores_14 easystores_14
seagate_gaming seagates
; ;
}; };
config.disko.enableConfig = false; config.disko = {
config.disko.checkScripts = true; enableConfig = false;
config.disko.rootMountPoint = "/"; checkScripts = true;
config.disko.devices.disk = { rootMountPoint = "/";
seagate1 = (split_config md_name_seagate) // { devices.disk = {}
device = path_prefix + seagate_1; // mk_configs {
groupName = "easystore14";
drives = easystores_14;
partitions = {
inherit (slapParts) slabA slabB slabC;
};
}
// mk_configs {
groupName = "easystore10";
drives = easystores_10;
partitions = {
inherit (slapParts) slabA slabB;
};
}
// mk_configs {
groupName = "seagate8";
drives = seagates;
partitions = {
inherit (slapParts) slabA;
};
}
;
devices.zpool."${poolname}" = {
type = "zpool";
options = {
ashift = "12";
comment = "Shelvacu's, for prophecy server"; # comment is limited to 32 characters
failmode = "continue";
};
rootFsOptions = {
acltype = "posix";
atime = "off";
compression = "zstd";
devices = "off";
dedup = "on";
dnodesize = "auto";
encryption = "on";
keyformat = "hex";
keylocation = "file:///var/log/propdata-encryption-key.hex.txt";
exec = "off";
redundant_metadata = "most";
xattr = "sa";
};
# mode = "raidz3";
mode = {
type = "topology";
vdev = [
# slabA
{
mode = "raidz3";
members = map (drive: path_prefix+drive+"-part1") (seagates ++ easystores_10 ++ easystores_14_active);
}
# slabB
{
mode = "raidz3";
members = map (drive: path_prefix+drive+"-part2") (easystores_10 ++ easystores_14_active);
}
# slabC
{
mode = "raidz3";
members = map (drive: path_prefix+drive+"-part3") easystores_14_active;
}
];
spare = easystores_14_spare;
};
}; };
seagate2 = (split_config md_name_seagate) // {
device = path_prefix + seagate_2;
};
easystoreEMAZ1 = (split_config md_name_easystore) // {
device = path_prefix + easystore_1;
};
easystoreEMAZ2 = (split_config md_name_easystore) // {
device = path_prefix + easystore_2;
};
} // easystore_14_configs;
config.disko.devices.mdadm = {
"${md_name_seagate}" = md_config;
"${md_name_easystore}" = md_config;
};
config.disko.devices.zpool."${poolname}" = {
type = "zpool";
options = {
ashift = "12";
comment = "Shelvacu's, for prophecy server"; # comment is limited to 32 characters
failmode = "continue";
};
rootFsOptions = {
acltype = "posix";
atime = "off";
compression = "zstd";
devices = "off";
dedup = "on";
dnodesize = "auto";
encryption = "on";
keyformat = "hex";
keylocation = "file:///var/log/propdata-encryption-key.hex.txt";
exec = "off";
redundant_metadata = "most";
xattr = "sa";
};
mode = "raidz3";
}; };
} }