stuff
This commit is contained in:
@@ -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";
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user