mirror of
https://github.com/nix-community/disko.git
synced 2024-09-11 06:25:33 +03:00
init disk-deactivate for cleaning up the disk
This commit is contained in:
parent
4ce2aa4845
commit
17da9b0708
6
disk-deactivate/disk-deactivate
Executable file
6
disk-deactivate/disk-deactivate
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -efux
|
||||||
|
# dependencies: jq util-linux lvm2 mdadm zfs
|
||||||
|
disk=$1
|
||||||
|
|
||||||
|
lsblk --output-all --json | jq -r --arg disk_to_clear "$disk" -f "$(dirname $0)/disk-deactivate.jq"
|
77
disk-deactivate/disk-deactivate.jq
Normal file
77
disk-deactivate/disk-deactivate.jq
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# since lsblk lacks zfs support, we have to do it this way
|
||||||
|
def remove:
|
||||||
|
if .fstype == "zfs_member" then
|
||||||
|
"zpool destroy -f \(.label)"
|
||||||
|
elif .fstype == "LVM2_member" then
|
||||||
|
[
|
||||||
|
"vg=$(pvs \(.path) --noheadings --options vg_name | grep -o '[a-zA-Z0-9-]*')",
|
||||||
|
"vgchange -a n \"$vg\"",
|
||||||
|
"vgremove -f \"$vg\""
|
||||||
|
]
|
||||||
|
elif .fstype == "swap" then
|
||||||
|
"swapoff \(.path)"
|
||||||
|
elif .fstype == null then
|
||||||
|
# maybe its zfs
|
||||||
|
[
|
||||||
|
# the next line has some horrible escaping
|
||||||
|
"zpool=$(zdb -l \(.path) | sed -nr $'s/ +name: \\'(.*)\\'/\\\\1/p')",
|
||||||
|
"if [[ -n \"${zpool}\" ]]; then zpool destroy -f \"$zpool\"; fi",
|
||||||
|
"unset zpool"
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
;
|
||||||
|
|
||||||
|
def deactivate:
|
||||||
|
if .type == "disk" then
|
||||||
|
[
|
||||||
|
"wipefs --all -f \(.path)"
|
||||||
|
]
|
||||||
|
elif .type == "part" then
|
||||||
|
[
|
||||||
|
"wipefs --all -f \(.path)"
|
||||||
|
]
|
||||||
|
elif .type == "crypt" then
|
||||||
|
[
|
||||||
|
"cryptsetup luksClose \(.path)",
|
||||||
|
"wipefs --all -f \(.path)"
|
||||||
|
]
|
||||||
|
elif .type == "lvm" then
|
||||||
|
(.name | split("-")[0]) as $vgname |
|
||||||
|
(.name | split("-")[1]) as $lvname |
|
||||||
|
[
|
||||||
|
"lvremove -fy \($vgname)/\($lvname)"
|
||||||
|
]
|
||||||
|
elif .type == "raid1" then
|
||||||
|
[
|
||||||
|
"mdadm --stop \(.name)"
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
;
|
||||||
|
|
||||||
|
def walk:
|
||||||
|
[
|
||||||
|
(.mountpoints[] | "umount -R \(.)"),
|
||||||
|
((.children // []) | map(walk)),
|
||||||
|
remove,
|
||||||
|
deactivate
|
||||||
|
]
|
||||||
|
;
|
||||||
|
|
||||||
|
def init:
|
||||||
|
"/dev/\(.name)" as $disk |
|
||||||
|
if $disk == $disk_to_clear then
|
||||||
|
[
|
||||||
|
"set -fu",
|
||||||
|
walk
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
;
|
||||||
|
|
||||||
|
.blockdevices | map(init) | flatten | join("\n")
|
||||||
|
|
@ -26,6 +26,7 @@
|
|||||||
tsp-create = pkgs.writeScript "create" ((pkgs.callPackage ../. { }).create (import disko-config { disks = builtins.tail disks; inherit lib; }));
|
tsp-create = pkgs.writeScript "create" ((pkgs.callPackage ../. { }).create (import disko-config { disks = builtins.tail disks; inherit lib; }));
|
||||||
tsp-mount = pkgs.writeScript "mount" ((pkgs.callPackage ../. { }).mount (import disko-config { disks = builtins.tail disks; inherit lib; }));
|
tsp-mount = pkgs.writeScript "mount" ((pkgs.callPackage ../. { }).mount (import disko-config { disks = builtins.tail disks; inherit lib; }));
|
||||||
tsp-config = (pkgs.callPackage ../. { }).config (import disko-config { inherit disks; inherit lib; });
|
tsp-config = (pkgs.callPackage ../. { }).config (import disko-config { inherit disks; inherit lib; });
|
||||||
|
tsp-disko = pkgs.writeScript "disko" ((pkgs.callPackage ../. { }).zapCreateMount (import disko-config { disks = builtins.tail disks; inherit lib; }));
|
||||||
num-disks = builtins.length (lib.attrNames (import disko-config { inherit lib; }).disk);
|
num-disks = builtins.length (lib.attrNames (import disko-config { inherit lib; }).disk);
|
||||||
installed-system = { modulesPath, ... }: {
|
installed-system = { modulesPath, ... }: {
|
||||||
imports = [
|
imports = [
|
||||||
@ -60,9 +61,6 @@
|
|||||||
efiSupport = efi;
|
efiSupport = efi;
|
||||||
efiInstallAsRemovable = efi;
|
efiInstallAsRemovable = efi;
|
||||||
};
|
};
|
||||||
environment.systemPackages = [
|
|
||||||
pkgs.jq
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
installedTopLevel = (eval-config {
|
installedTopLevel = (eval-config {
|
||||||
modules = [ installed-system ];
|
modules = [ installed-system ];
|
||||||
@ -93,6 +91,9 @@
|
|||||||
(modulesPath + "/profiles/minimal.nix")
|
(modulesPath + "/profiles/minimal.nix")
|
||||||
extraConfig
|
extraConfig
|
||||||
];
|
];
|
||||||
|
environment.systemPackages = [
|
||||||
|
pkgs.jq
|
||||||
|
];
|
||||||
|
|
||||||
# speed-up eval
|
# speed-up eval
|
||||||
documentation.enable = false;
|
documentation.enable = false;
|
||||||
@ -127,20 +128,24 @@
|
|||||||
machine.succeed("${tsp-create}")
|
machine.succeed("${tsp-create}")
|
||||||
machine.succeed("${tsp-mount}")
|
machine.succeed("${tsp-mount}")
|
||||||
machine.succeed("${tsp-mount}") # verify that the command is idempotent
|
machine.succeed("${tsp-mount}") # verify that the command is idempotent
|
||||||
|
machine.succeed("${tsp-disko}") # verify that we can destroy and recreate
|
||||||
''}
|
''}
|
||||||
${lib.optionalString (testMode == "module") ''
|
${lib.optionalString (testMode == "module") ''
|
||||||
machine.succeed("${nodes.machine.system.build.formatScript}")
|
machine.succeed("${nodes.machine.system.build.formatScript}")
|
||||||
machine.succeed("${nodes.machine.system.build.mountScript}")
|
machine.succeed("${nodes.machine.system.build.mountScript}")
|
||||||
machine.succeed("${nodes.machine.system.build.mountScript}") # verify that the command is idempotent
|
machine.succeed("${nodes.machine.system.build.mountScript}") # verify that the command is idempotent
|
||||||
|
machine.succeed("${nodes.machine.system.build.disko}") # verify that we can destroy and recreate again
|
||||||
''}
|
''}
|
||||||
${lib.optionalString (testMode == "cli") ''
|
${lib.optionalString (testMode == "cli") ''
|
||||||
# TODO use the disko cli here
|
# TODO use the disko cli here
|
||||||
# machine.succeed("${../.}/disko --no-pkgs --mode create ${disko-config}")
|
# machine.succeed("${../.}/disko --no-pkgs --mode create ${disko-config}")
|
||||||
# machine.succeed("${../.}/disko --no-pkgs --mode mount ${disko-config}")
|
# machine.succeed("${../.}/disko --no-pkgs --mode mount ${disko-config}")
|
||||||
# machine.succeed("${../.}/disko --no-pkgs --mode mount ${disko-config}") # verify that the command is idempotent
|
# machine.succeed("${../.}/disko --no-pkgs --mode mount ${disko-config}") # verify that the command is idempotent
|
||||||
|
# machine.succeed("${../.}/disko --no-pkgs --mode zap_create_mount ${disko-config}") # verify that we can destroy and recreate again
|
||||||
machine.succeed("${tsp-create}")
|
machine.succeed("${tsp-create}")
|
||||||
machine.succeed("${tsp-mount}")
|
machine.succeed("${tsp-mount}")
|
||||||
machine.succeed("${tsp-mount}") # verify that the command is idempotent
|
machine.succeed("${tsp-mount}") # verify that the command is idempotent
|
||||||
|
machine.succeed("${tsp-disko}") # verify that we can destroy and recreate
|
||||||
''}
|
''}
|
||||||
|
|
||||||
${lib.optionalString testBoot ''
|
${lib.optionalString testBoot ''
|
||||||
|
23
types.nix
23
types.nix
@ -154,23 +154,11 @@ rec {
|
|||||||
*/
|
*/
|
||||||
zapCreateMount = devices: ''
|
zapCreateMount = devices: ''
|
||||||
set -efux
|
set -efux
|
||||||
shopt -s nullglob
|
umount -Rv /mnt || :
|
||||||
# print existing disks
|
|
||||||
lsblk
|
|
||||||
|
|
||||||
# TODO get zap the same way we get create
|
for dev in ${toString (lib.catAttrs "device" (lib.attrValues devices.disk))}; do
|
||||||
# make partitioning idempotent by dismounting already mounted filesystems
|
${./disk-deactivate}/disk-deactivate "$dev" | bash -x
|
||||||
if findmnt /mnt; then
|
done
|
||||||
umount -Rlv /mnt
|
|
||||||
fi
|
|
||||||
|
|
||||||
# stop all existing raids
|
|
||||||
if command -v mdadm; then
|
|
||||||
for r in /dev/md/* /dev/md[0-9]*; do
|
|
||||||
# might fail if the device was already closed in the loop
|
|
||||||
mdadm --stop "$r" || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 'creating partitions...'
|
echo 'creating partitions...'
|
||||||
${diskoLib.create devices}
|
${diskoLib.create devices}
|
||||||
@ -820,6 +808,7 @@ rec {
|
|||||||
type = types.functionTo types.str;
|
type = types.functionTo types.str;
|
||||||
default = vg: ''
|
default = vg: ''
|
||||||
lvcreate \
|
lvcreate \
|
||||||
|
--yes \
|
||||||
${if hasInfix "%" config.size then "-l" else "-L"} ${config.size} \
|
${if hasInfix "%" config.size then "-l" else "-L"} ${config.size} \
|
||||||
-n ${config.name} \
|
-n ${config.name} \
|
||||||
${optionalString (!isNull config.lvm_type) "--type=${config.lvm_type}"} \
|
${optionalString (!isNull config.lvm_type) "--type=${config.lvm_type}"} \
|
||||||
@ -1326,7 +1315,7 @@ rec {
|
|||||||
internal = true;
|
internal = true;
|
||||||
readOnly = true;
|
readOnly = true;
|
||||||
type = types.functionTo (types.listOf types.package);
|
type = types.functionTo (types.listOf types.package);
|
||||||
default = pkgs: lib.optionals (!isNull config.content) (config.content._pkgs pkgs);
|
default = pkgs: [ pkgs.jq ] ++ lib.optionals (!isNull config.content) (config.content._pkgs pkgs);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user