diff --git a/modules/image/disk/builder.nix b/modules/image/disk/builder.nix index 280b30e..39f321c 100644 --- a/modules/image/disk/builder.nix +++ b/modules/image/disk/builder.nix @@ -44,10 +44,12 @@ let image.repart = { name = "verity"; split = true; - mkfsOptions.erofs = [ - "-zlz4hc,level=12" - "-Efragments,dedupe,ztailpacking" - ]; + mkfsOptions = lib.mkIf config.image.compress { + erofs = [ + "-zlz4hc,level=12" + "-Efragments,dedupe,ztailpacking" + ]; + }; partitions = initialPartitions; }; } @@ -130,6 +132,10 @@ let in { + options.image.compress = lib.mkEnableOption "image compression" // { + default = true; + }; + config.system.build = { inherit verityRootHash; diff --git a/tests/common.nix b/tests/common.nix index 934b020..23232be 100644 --- a/tests/common.nix +++ b/tests/common.nix @@ -1,111 +1,154 @@ -{ self, lib, pkgs, ... }: +{ + self, + lib, + pkgs, + ... +}: -with import (pkgs.path + "/nixos/lib/testing-python.nix") { inherit pkgs; inherit (pkgs.hostPlatform) system; }; +with import (pkgs.path + "/nixos/lib/testing-python.nix") { + inherit pkgs; + inherit (pkgs.hostPlatform) system; +}; let - - nixos-lib = import (pkgs.path + "/nixos/lib") {}; qemu-common = import (pkgs.path + "/nixos/lib/qemu-common.nix") { inherit lib pkgs; }; -in rec { +in +rec { - makeSystem = extraConfig: - (import (pkgs.path + "/nixos/lib/eval-config.nix")) { - inherit pkgs lib; - system = null; - modules = [ - { - nixpkgs.hostPlatform = pkgs.hostPlatform; - } - { - users.allowNoPasswordLogin = true; - system.stateVersion = lib.versions.majorMinor lib.version; - system.image.id = lib.mkDefault "test"; - system.image.version = lib.mkDefault "1"; - networking.hosts."10.0.2.1" = [ "server.test" ]; - } - { - boot.kernelParams = [ "console=ttyS0,115200n8" "systemd.journald.forward_to_console=1" ]; - image.compress = false; - boot.initrd.compressor = lib.mkForce "zstd"; - boot.initrd.compressorArgs = lib.mkForce [ "-8" ]; - } - (pkgs.path + "/nixos/modules/testing/test-instrumentation.nix") - self.nixosModules.server - self.nixosModules.image - extraConfig - ]; - }; + makeSystem = + extraConfig: + (import (pkgs.path + "/nixos/lib/eval-config.nix")) { + inherit pkgs lib; + system = null; + modules = [ + { + nixpkgs.hostPlatform = pkgs.hostPlatform; + } + { + users.allowNoPasswordLogin = true; + system.stateVersion = lib.versions.majorMinor lib.version; + system.image.id = lib.mkDefault "test"; + system.image.version = lib.mkDefault "1"; + networking.hosts."10.0.2.1" = [ "server.test" ]; + } + { + boot.kernelParams = [ + "console=ttyS0,115200n8" + "systemd.journald.forward_to_console=1" + ]; + image.compress = false; + boot.initrd.compressor = lib.mkForce "zstd"; + boot.initrd.compressorArgs = lib.mkForce [ "-8" ]; + } + (pkgs.path + "/nixos/modules/testing/test-instrumentation.nix") + self.nixosModules.server + self.nixosModules.image + extraConfig + ]; + }; - makeImage = extraConfig: let - system = makeSystem extraConfig; - in "${system.config.system.build.image}/${system.config.system.build.image.imageFile}"; + makeImage = + extraConfig: + let + system = makeSystem extraConfig; + in + "${system.config.system.build.image}/${system.config.system.build.image.imageFile}"; - makeUpdatePackage = extraConfig: let - system = makeSystem extraConfig; - in "${system.config.system.build.updatePackage}"; + makeUpdatePackage = + extraConfig: + let + system = makeSystem extraConfig; + in + "${system.config.system.build.updatePackage}"; - makeImageTest = { name, image, script, httpRoot ? null }: let - qemu = qemu-common.qemuBinary pkgs.qemu_test; - flags = [ - "-m" "512M" - "-drive" "if=pflash,format=raw,unit=0,readonly=on,file=${pkgs.OVMF.firmware}" - "-drive" "if=pflash,format=raw,unit=1,readonly=on,file=${pkgs.OVMF.variables}" - "-drive" "if=virtio,file=${mutableImage}" - "-chardev" "socket,id=chrtpm,path=${tpmFolder}/swtpm-sock" - "-tpmdev" "emulator,id=tpm0,chardev=chrtpm" - "-device" "tpm-tis,tpmdev=tpm0" - "-netdev" ("'user,id=net0" + (lib.optionalString (httpRoot != null) ",guestfwd=tcp:10.0.2.1:80-cmd:${pkgs.micro-httpd}/bin/micro_httpd ${httpRoot}") + "'") - "-device" "virtio-net-pci,netdev=net0" - ]; - flagsStr = lib.concatStringsSep " " flags; - startCommand = "${qemu} ${flagsStr}"; - mutableImage = "/tmp/linked-image.qcow2"; - tpmFolder = "/tmp/emulated_tpm"; - indentLines = str: lib.concatLines (map (s: " " + s) (lib.splitString "\n" str)); - in makeTest { - inherit name; - nodes = { }; - testScript = '' - import os - import subprocess - - subprocess.check_call( - [ - "qemu-img", - "create", - "-f", - "qcow2", - "-F", - "raw", - "-b", - "${image}", - "${mutableImage}", - ] - ) - subprocess.check_call(["qemu-img", "resize", "${mutableImage}", "4G"]) - - os.mkdir("${tpmFolder}") - os.mkdir("${tpmFolder}/swtpm") - - def start_tpm(): - subprocess.Popen( - [ - "${pkgs.swtpm}/bin/swtpm", - "socket", - "--tpmstate", "dir=${tpmFolder}/swtpm", - "--ctrl", "type=unixio,path=${tpmFolder}/swtpm-sock", - "--tpm2" - ] + makeImageTest = + { + name, + image, + script, + httpRoot ? null, + }: + let + qemu = qemu-common.qemuBinary pkgs.qemu_test; + flags = [ + "-m" + "512M" + "-drive" + "if=pflash,format=raw,unit=0,readonly=on,file=${pkgs.OVMF.firmware}" + "-drive" + "if=pflash,format=raw,unit=1,readonly=on,file=${pkgs.OVMF.variables}" + "-drive" + "if=virtio,file=${mutableImage}" + "-chardev" + "socket,id=chrtpm,path=${tpmFolder}/swtpm-sock" + "-tpmdev" + "emulator,id=tpm0,chardev=chrtpm" + "-device" + "tpm-tis,tpmdev=tpm0" + "-netdev" + ( + "'user,id=net0" + + (lib.optionalString ( + httpRoot != null + ) ",guestfwd=tcp:10.0.2.1:80-cmd:${pkgs.micro-httpd}/bin/micro_httpd ${httpRoot}") + + "'" ) + "-device" + "virtio-net-pci,netdev=net0" + ]; + flagsStr = lib.concatStringsSep " " flags; + startCommand = "${qemu} ${flagsStr}"; + mutableImage = "/tmp/linked-image.qcow2"; + tpmFolder = "/tmp/emulated_tpm"; + indentLines = str: lib.concatLines (map (s: " " + s) (lib.splitString "\n" str)); + in + makeTest { + inherit name; + nodes = { }; + testScript = + '' + import os + import subprocess - machine = create_machine("${startCommand}") + subprocess.check_call( + [ + "qemu-img", + "create", + "-f", + "qcow2", + "-F", + "raw", + "-b", + "${image}", + "${mutableImage}", + ] + ) + subprocess.check_call(["qemu-img", "resize", "${mutableImage}", "4G"]) - try: - '' + indentLines script + '' - finally: - machine.shutdown() - ''; - }; + os.mkdir("${tpmFolder}") + os.mkdir("${tpmFolder}/swtpm") + + def start_tpm(): + subprocess.Popen( + [ + "${pkgs.swtpm}/bin/swtpm", + "socket", + "--tpmstate", "dir=${tpmFolder}/swtpm", + "--ctrl", "type=unixio,path=${tpmFolder}/swtpm-sock", + "--tpm2" + ] + ) + + machine = create_machine("${startCommand}") + + try: + '' + + indentLines script + + '' + finally: + machine.shutdown() + ''; + }; }