at master 3.6 kB view raw
1{ 2 kernelPackages ? null, 3 flavour, 4 mkXfsFlags ? "", 5}: 6let 7 preparationCode = 8 { 9 raid = '' 10 machine.succeed("vgcreate test_vg /dev/vdb /dev/vdc") 11 machine.succeed("lvcreate -L 512M --type raid0 test_vg -n test_lv") 12 ''; 13 14 thinpool = '' 15 machine.succeed("vgcreate test_vg /dev/vdb") 16 machine.succeed("lvcreate -L 512M -T test_vg/test_thin_pool") 17 machine.succeed("lvcreate -n test_lv -V 16G --thinpool test_thin_pool test_vg") 18 ''; 19 20 vdo = '' 21 machine.succeed("vgcreate test_vg /dev/vdb") 22 machine.succeed("lvcreate --type vdo -n test_lv -L 6G -V 12G test_vg/vdo_pool_lv") 23 ''; 24 } 25 .${flavour}; 26 27 extraConfig = 28 { 29 raid = { 30 boot.initrd.kernelModules = [ 31 "dm-raid" 32 "raid0" 33 ]; 34 }; 35 36 thinpool = { 37 services.lvm = { 38 boot.thin.enable = true; 39 dmeventd.enable = true; 40 }; 41 }; 42 43 vdo = { 44 services.lvm = { 45 boot.vdo.enable = true; 46 dmeventd.enable = true; 47 }; 48 }; 49 } 50 .${flavour}; 51 52 extraCheck = 53 { 54 raid = '' 55 "test_lv" in machine.succeed("lvs --select segtype=raid0") 56 ''; 57 58 thinpool = '' 59 "test_lv" in machine.succeed("lvs --select segtype=thin-pool") 60 ''; 61 62 vdo = '' 63 "test_lv" in machine.succeed("lvs --select segtype=vdo") 64 ''; 65 } 66 .${flavour}; 67 68in 69import ../make-test-python.nix ( 70 { pkgs, lib, ... }: 71 { 72 name = "lvm2-${flavour}-systemd-stage-1"; 73 meta.maintainers = lib.teams.helsinki-systems.members; 74 75 nodes.machine = 76 { pkgs, lib, ... }: 77 { 78 imports = [ extraConfig ]; 79 # Use systemd-boot 80 virtualisation = { 81 emptyDiskImages = [ 82 8192 83 8192 84 ]; 85 useBootLoader = true; 86 useEFIBoot = true; 87 # To boot off the LVM disk, we need to have a init script which comes from the Nix store. 88 mountHostNixStore = true; 89 }; 90 boot.loader.systemd-boot.enable = true; 91 boot.loader.efi.canTouchEfiVariables = true; 92 93 environment.systemPackages = with pkgs; [ xfsprogs ]; 94 boot = { 95 initrd.systemd = { 96 enable = true; 97 emergencyAccess = true; 98 }; 99 initrd.services.lvm.enable = true; 100 kernelPackages = lib.mkIf (kernelPackages != null) kernelPackages; 101 }; 102 103 specialisation.boot-lvm.configuration.virtualisation = { 104 useDefaultFilesystems = false; 105 fileSystems = { 106 "/" = { 107 device = "/dev/test_vg/test_lv"; 108 fsType = "xfs"; 109 }; 110 }; 111 112 rootDevice = "/dev/test_vg/test_lv"; 113 }; 114 }; 115 116 testScript = '' 117 machine.wait_for_unit("multi-user.target") 118 # Create a VG for the root 119 ${preparationCode} 120 machine.succeed("mkfs.xfs ${mkXfsFlags} /dev/test_vg/test_lv") 121 machine.succeed("mkdir -p /mnt && mount /dev/test_vg/test_lv /mnt && echo hello > /mnt/test && umount /mnt") 122 123 # Boot from LVM 124 machine.succeed("bootctl set-default nixos-generation-1-specialisation-boot-lvm.conf") 125 machine.succeed("sync") 126 machine.crash() 127 machine.wait_for_unit("multi-user.target") 128 129 # Ensure we have successfully booted from LVM 130 assert "(initrd)" in machine.succeed("systemd-analyze") # booted with systemd in stage 1 131 assert "/dev/mapper/test_vg-test_lv on / type xfs" in machine.succeed("mount") 132 assert "hello" in machine.succeed("cat /test") 133 ${extraCheck} 134 ''; 135 } 136)