b262225972
As the whole partitioning run is quite an invasive procedure, we want to especially make sure that it doesn't unmount any filesystems that were mounted before the partitioner was run. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
183 lines
5.4 KiB
Nix
183 lines
5.4 KiB
Nix
{ pkgs, system, ... }:
|
|
|
|
with pkgs.lib;
|
|
|
|
let
|
|
ksExt = pkgs.writeText "ks-ext4" ''
|
|
clearpart --all --initlabel --drives=vdb
|
|
|
|
part /boot --recommended --label=boot --fstype=ext2 --ondisk=vdb
|
|
part swap --recommended --label=swap --fstype=swap --ondisk=vdb
|
|
part /nix --size=500 --label=nix --fstype=ext3 --ondisk=vdb
|
|
part / --recommended --label=root --fstype=ext4 --ondisk=vdb
|
|
'';
|
|
|
|
ksBtrfs = pkgs.writeText "ks-btrfs" ''
|
|
clearpart --all --initlabel --drives=vdb,vdc
|
|
|
|
part swap1 --recommended --label=swap1 --fstype=swap --ondisk=vdb
|
|
part swap2 --recommended --label=swap2 --fstype=swap --ondisk=vdc
|
|
|
|
part btrfs.1 --grow --ondisk=vdb
|
|
part btrfs.2 --grow --ondisk=vdc
|
|
|
|
btrfs / --data=0 --metadata=1 --label=root btrfs.1 btrfs.2
|
|
'';
|
|
|
|
ksRaid = pkgs.writeText "ks-raid" ''
|
|
clearpart --all --initlabel --drives=vdb,vdc
|
|
|
|
part raid.01 --size=200 --ondisk=vdb
|
|
part raid.02 --size=200 --ondisk=vdc
|
|
|
|
part swap1 --size=500 --label=swap1 --fstype=swap --ondisk=vdb
|
|
part swap2 --size=500 --label=swap2 --fstype=swap --ondisk=vdc
|
|
|
|
part raid.11 --grow --ondisk=vdb
|
|
part raid.12 --grow --ondisk=vdc
|
|
|
|
raid /boot --level=1 --fstype=ext3 --device=md0 raid.01 raid.02
|
|
raid / --level=1 --fstype=xfs --device=md1 raid.11 raid.12
|
|
'';
|
|
|
|
ksRaidLvmCrypt = pkgs.writeText "ks-lvm-crypt" ''
|
|
clearpart --all --initlabel --drives=vdb,vdc
|
|
|
|
part raid.1 --grow --ondisk=vdb
|
|
part raid.2 --grow --ondisk=vdc
|
|
|
|
raid pv.0 --level=1 --encrypted --passphrase=x --device=md0 raid.1 raid.2
|
|
|
|
volgroup nixos pv.0
|
|
|
|
logvol /boot --size=200 --fstype=ext3 --name=boot --vgname=nixos
|
|
logvol swap --size=500 --fstype=swap --name=swap --vgname=nixos
|
|
logvol / --size=1000 --grow --fstype=ext4 --name=root --vgname=nixos
|
|
'';
|
|
in {
|
|
machine = { config, pkgs, ... }: {
|
|
environment.systemPackages = [
|
|
pkgs.pythonPackages.nixpart
|
|
pkgs.file pkgs.btrfsProgs pkgs.xfsprogs pkgs.lvm2
|
|
];
|
|
virtualisation.emptyDiskImages = [ 4096 4096 ];
|
|
};
|
|
|
|
testScript = ''
|
|
my $diskStart;
|
|
my @mtab;
|
|
|
|
sub getMtab {
|
|
my $mounts = $machine->succeed("cat /proc/mounts");
|
|
chomp $mounts;
|
|
return map [split], split /\n/, $mounts;
|
|
}
|
|
|
|
sub parttest {
|
|
my ($desc, $code) = @_;
|
|
$machine->start;
|
|
$machine->waitForUnit("default.target");
|
|
|
|
# Gather mounts and superblock
|
|
@mtab = getMtab;
|
|
$diskStart = $machine->succeed("dd if=/dev/vda bs=512 count=1");
|
|
|
|
subtest($desc, $code);
|
|
$machine->shutdown;
|
|
}
|
|
|
|
sub ensureSanity {
|
|
# Check whether the filesystem in /dev/vda is still intact
|
|
my $newDiskStart = $machine->succeed("dd if=/dev/vda bs=512 count=1");
|
|
if ($diskStart ne $newDiskStart) {
|
|
$machine->log("Something went wrong, the partitioner wrote " .
|
|
"something into the first 512 bytes of /dev/vda!");
|
|
die;
|
|
}
|
|
|
|
# Check whether nixpart has unmounted anything
|
|
my @currentMtab = getMtab;
|
|
for my $mount (@mtab) {
|
|
my $path = $mount->[1];
|
|
unless (grep { $_->[1] eq $path } @currentMtab) {
|
|
$machine->log("The partitioner seems to have unmounted $path.");
|
|
die;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub checkMount {
|
|
my $mounts = $machine->succeed("cat /proc/mounts");
|
|
|
|
}
|
|
|
|
sub kickstart {
|
|
$machine->copyFileFromHost($_[0], "/kickstart");
|
|
$machine->succeed("nixpart -v /kickstart");
|
|
ensureSanity;
|
|
}
|
|
|
|
sub ensurePartition {
|
|
my ($name, $match) = @_;
|
|
my $path = $name =~ /^\// ? $name : "/dev/disk/by-label/$name";
|
|
my $out = $machine->succeed("file -Ls $path");
|
|
my @matches = grep(/^$path: .*$match/i, $out);
|
|
if (!@matches) {
|
|
$machine->log("Partition on $path was expected to have a " .
|
|
"file system that matches $match, but instead has: $out");
|
|
die;
|
|
}
|
|
}
|
|
|
|
sub ensureNoPartition {
|
|
$machine->succeed("test ! -e /dev/$_[0]");
|
|
}
|
|
|
|
parttest "ext2, ext3 and ext4 filesystems", sub {
|
|
kickstart("${ksExt}");
|
|
ensurePartition("boot", "ext2");
|
|
ensurePartition("swap", "swap");
|
|
ensurePartition("nix", "ext3");
|
|
ensurePartition("root", "ext4");
|
|
ensurePartition("/dev/vdb4", "boot sector");
|
|
ensureNoPartition("vdb6");
|
|
ensureNoPartition("vdc1");
|
|
};
|
|
|
|
parttest "btrfs filesystem", sub {
|
|
kickstart("${ksBtrfs}");
|
|
ensurePartition("swap1", "swap");
|
|
ensurePartition("swap2", "swap");
|
|
ensurePartition("/dev/vdb2", "btrfs");
|
|
ensurePartition("/dev/vdc2", "btrfs");
|
|
ensureNoPartition("vdb3");
|
|
ensureNoPartition("vdc3");
|
|
};
|
|
|
|
parttest "RAID1 with XFS", sub {
|
|
kickstart("${ksRaid}");
|
|
ensurePartition("swap1", "swap");
|
|
ensurePartition("swap2", "swap");
|
|
ensurePartition("/dev/md0", "ext3");
|
|
ensurePartition("/dev/md1", "xfs");
|
|
ensureNoPartition("vdb4");
|
|
ensureNoPartition("vdc4");
|
|
ensureNoPartition("md2");
|
|
};
|
|
|
|
parttest "RAID1 with LUKS and LVM", sub {
|
|
kickstart("${ksRaidLvmCrypt}");
|
|
ensurePartition("/dev/vdb1", "data");
|
|
ensureNoPartition("vdb2");
|
|
ensurePartition("/dev/vdc1", "data");
|
|
ensureNoPartition("vdc2");
|
|
|
|
ensurePartition("/dev/md0", "luks");
|
|
ensureNoPartition("md1");
|
|
|
|
ensurePartition("/dev/nixos/boot", "ext3");
|
|
ensurePartition("/dev/nixos/swap", "swap");
|
|
ensurePartition("/dev/nixos/root", "ext4");
|
|
};
|
|
'';
|
|
}
|