Added mirror configuration
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
|
||||
# Data mirror configuration generated by deploy.sh
|
||||
disk = {
|
||||
"content-1" = {
|
||||
type = "disk";
|
||||
device = "${CONTENT_DISK_1}";
|
||||
content = {
|
||||
type = "gpt";
|
||||
partitions = {
|
||||
"data-1" = {
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "luks";
|
||||
name = "crypted-content-1";
|
||||
settings.keyFile = "/etc/secrets/disks/content-disk-1";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
"parity-1" = {
|
||||
type = "disk";
|
||||
device = "${PARITY_DISK_1}";
|
||||
content = {
|
||||
type = "gpt";
|
||||
partitions = {
|
||||
"parity-1" = {
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "luks";
|
||||
name = "crypted-parity-1";
|
||||
settings.keyFile = "/etc/secrets/disks/parity-disk-1";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
mdadm.raid-devices = [ "/dev/mapper/crypted-content-1" "/dev/mapper/crypted-parity-1" ];
|
||||
fs."/dev/md/data-storage" = {
|
||||
type = "xfs";
|
||||
label = "data-storage";
|
||||
mountpoint = "/mnt/data-storage";
|
||||
};
|
||||
@@ -377,38 +377,63 @@ disk_config_generation() {
|
||||
num_parity=0
|
||||
num_content=0
|
||||
|
||||
if (( num_selected == 1 )); then # If only one data disk is selected, it is a content disk
|
||||
if (( num_selected == 2 )); then
|
||||
# Special case for 2 data disks: create a mirror.
|
||||
echo -e "\n ✅ Two data disks detected, creating a mirror configuration."
|
||||
|
||||
disk1_name=${selected_data_names[0]}
|
||||
disk2_name=${selected_data_names[1]}
|
||||
disk1_size=${DISK_SIZE_MAP[$disk1_name]}
|
||||
disk2_size=${DISK_SIZE_MAP[$disk2_name]}
|
||||
|
||||
if [[ "$disk1_size" -ne "$disk2_size" ]]; then
|
||||
gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "⚠️ The two selected disks for the mirror have different sizes. The mirror will be created using the size of the smaller disk, and the extra space on the larger disk will be unused."
|
||||
gum confirm "Do you want to proceed anyway?" || { echo " ❌ Aborting as requested."; exit 1; }
|
||||
fi
|
||||
|
||||
export CONTENT_DISK_1=${DISK_BY_ID_MAP[${selected_data_names[0]}]}
|
||||
export PARITY_DISK_1=${DISK_BY_ID_MAP[${selected_data_names[1]}]}
|
||||
export CONTENT_DISK_1_KEY_VAR="CONTENT_DISK_1_KEY"
|
||||
export PARITY_DISK_1_KEY_VAR="PARITY_DISK_1_KEY"
|
||||
export CONTENT_DISK_1_KEY=${!CONTENT_DISK_1_KEY_VAR}
|
||||
export PARITY_DISK_1_KEY=${!PARITY_DISK_1_KEY_VAR}
|
||||
(envsubst < "config-files/disks/mirror.nix") >> ./nix-config/disks/disko.nix
|
||||
NUMBER_OF_CONTENT_DISKS=1 # For summary and key generation
|
||||
NUMBER_OF_PARITY_DISKS=1
|
||||
|
||||
elif (( num_selected == 1 )); then # If only one data disk is selected, it is a content disk
|
||||
num_content=1
|
||||
num_parity=0
|
||||
elif (( num_selected > 1 )); then # If more than one data disk is selected
|
||||
elif (( num_selected > 2 )); then # If more than two data disks are selected
|
||||
# 1 parity for up to 2 content disks.
|
||||
num_parity=$(( (num_selected + 2) / 3 ))
|
||||
num_content=$(( num_selected - num_parity ))
|
||||
fi
|
||||
|
||||
# Sort selected disks by size (largest first)
|
||||
sorted_disks=($(
|
||||
# shellcheck disable=SC2145
|
||||
for name in "${selected_data_names[@]}"; do
|
||||
echo "${DISK_SIZE_MAP[$name]} $name"
|
||||
done | sort -rn | awk '{print $2}'
|
||||
))
|
||||
if (( num_selected != 2 )); then
|
||||
# Sort selected disks by size (largest first) for snapraid
|
||||
sorted_disks=($(
|
||||
for name in "${selected_data_names[@]}"; do
|
||||
echo "${DISK_SIZE_MAP[$name]} $name"
|
||||
done | sort -rn | awk '{print $2}'
|
||||
))
|
||||
|
||||
# Assign parity disks (the largest ones)
|
||||
parity_disks_final=()
|
||||
for i in $(seq 0 $((num_parity > 0 ? num_parity - 1 : -1))); do
|
||||
[[ -n "${sorted_disks[$i]}" ]] && parity_disks_final+=("${DISK_BY_ID_MAP[${sorted_disks[$i]}]}")
|
||||
done
|
||||
# Assign parity disks (the largest ones)
|
||||
parity_disks_final=()
|
||||
for i in $(seq 0 $((num_parity > 0 ? num_parity - 1 : -1))); do
|
||||
[[ -n "${sorted_disks[$i]}" ]] && parity_disks_final+=("${DISK_BY_ID_MAP[${sorted_disks[$i]}]}")
|
||||
done
|
||||
|
||||
# Assign content disks (the remaining ones)
|
||||
content_disks_final=()
|
||||
for i in $(seq $num_parity $((num_selected - 1))); do
|
||||
[[ -n "${sorted_disks[$i]}" ]] && content_disks_final+=("${DISK_BY_ID_MAP[${sorted_disks[$i]}]}")
|
||||
done
|
||||
# Assign content disks (the remaining ones)
|
||||
content_disks_final=()
|
||||
for i in $(seq $num_parity $((num_selected - 1))); do
|
||||
[[ -n "${sorted_disks[$i]}" ]] && content_disks_final+=("${DISK_BY_ID_MAP[${sorted_disks[$i]}]}")
|
||||
done
|
||||
|
||||
# Set exported variables (up to 6 content disks and 3 parity disks)
|
||||
for i in {0..5}; do export "CONTENT_DISK_$((i+1))"="${content_disks_final[$i]:-}"; done
|
||||
for i in {0..2}; do export "PARITY_DISK_$((i+1))"="${parity_disks_final[$i]:-}"; done
|
||||
# Set exported variables (up to 6 content disks and 3 parity disks)
|
||||
for i in {0..5}; do export "CONTENT_DISK_$((i+1))"="${content_disks_final[$i]:-}"; done
|
||||
for i in {0..2}; do export "PARITY_DISK_$((i+1))"="${parity_disks_final[$i]:-}"; done
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo -e "\n\n ⚠️ No remaining disks to select for data."
|
||||
@@ -459,21 +484,23 @@ EOF
|
||||
(envsubst < "$template_file") > ./nix-config/disks/disko.nix
|
||||
echo -e "\n ✅ Generated boot disk configuration."
|
||||
|
||||
for i in $(seq 1 $NUMBER_OF_CONTENT_DISKS); do
|
||||
disk_var="CONTENT_DISK_$i"
|
||||
export DISK_NUMBER=$i
|
||||
export DISK_PATH=${!disk_var}
|
||||
(envsubst < "config-files/disks/content.nix") >> ./nix-config/disks/disko.nix
|
||||
done
|
||||
[[ "$NUMBER_OF_CONTENT_DISKS" -gt 0 ]] && echo -e "\n ✅ Generated $NUMBER_OF_CONTENT_DISKS data disk configuration(s)."
|
||||
if (( NUMBER_OF_CONTENT_DISKS != 2 )); then
|
||||
for i in $(seq 1 $NUMBER_OF_CONTENT_DISKS); do
|
||||
disk_var="CONTENT_DISK_$i"
|
||||
export DISK_NUMBER=$i
|
||||
export DISK_PATH=${!disk_var}
|
||||
(envsubst < "config-files/disks/content.nix") >> ./nix-config/disks/disko.nix
|
||||
done
|
||||
[[ "$NUMBER_OF_CONTENT_DISKS" -gt 0 ]] && echo -e "\n ✅ Generated $NUMBER_OF_CONTENT_DISKS data disk configuration(s)."
|
||||
|
||||
for i in $(seq 1 $NUMBER_OF_PARITY_DISKS); do
|
||||
disk_var="PARITY_DISK_$i"
|
||||
export DISK_NUMBER=$i
|
||||
export DISK_PATH=${!disk_var}
|
||||
(envsubst < "config-files/disks/parity.nix") >> ./nix-config/disks/disko.nix
|
||||
done
|
||||
[[ "$NUMBER_OF_PARITY_DISKS" -gt 0 ]] && echo -e "\n ✅ Generated $NUMBER_OF_PARITY_DISKS parity disk configuration(s)."
|
||||
for i in $(seq 1 $NUMBER_OF_PARITY_DISKS); do
|
||||
disk_var="PARITY_DISK_$i"
|
||||
export DISK_NUMBER=$i
|
||||
export DISK_PATH=${!disk_var}
|
||||
(envsubst < "config-files/disks/parity.nix") >> ./nix-config/disks/disko.nix
|
||||
done
|
||||
[[ "$NUMBER_OF_PARITY_DISKS" -gt 0 ]] && echo -e "\n ✅ Generated $NUMBER_OF_PARITY_DISKS parity disk configuration(s)."
|
||||
fi
|
||||
|
||||
# Close the disko.nix block
|
||||
cat <<'EOF' >> ./nix-config/disks/disko.nix
|
||||
|
||||
Reference in New Issue
Block a user