diff --git a/.gitignore b/.gitignore index 8cfe0d4..97ab6ac 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,6 @@ /result /target /out -/initrd* -/patos* .*.swp .*.swo .nixos-test-history diff --git a/flake.nix b/flake.nix index 146376c..2e4eafa 100644 --- a/flake.nix +++ b/flake.nix @@ -21,18 +21,7 @@ { packages = { default = self.packages.${system}.image; - image = pkgs.writeShellScriptBin "image" '' - set -ex - echo "make UKI..." - - mkdir -p patos/efi/boot - ${patosPkgs.systemd.out}/usr/bin/ukify build \ - --linux ${patosPkgs.kernel.kernel}/bzImage \ - --initrd ${patosPkgs.initrd.out}/initrd.xz \ - --cmdline "console=ttyS0" \ - -o patos/efi/boot/bootx64.efi - ''; - + image = pkgs.callPackage ./image { inherit patosPkgs; }; kernel = pkgs.callPackage ./kernel { }; glibc = pkgs.callPackage ./glibc { }; systemd = pkgs.callPackage ./systemd { }; @@ -60,7 +49,6 @@ nixfmt-rfc-style squashfs-tools-ng self.packages.${system}.qemu-uefi-tpm - self.packages.${system}.mkinitrd ]; }; diff --git a/image/default.nix b/image/default.nix new file mode 100644 index 0000000..b4394c2 --- /dev/null +++ b/image/default.nix @@ -0,0 +1,27 @@ +{ + pkgs, + stdenvNoCC, + patosPkgs, + ... +}: +let + version = "0.0.1"; + pname = "patos-image"; +in +stdenvNoCC.mkDerivation (finalAttrs: { + inherit version; + inherit pname; + + buildInputs = with pkgs; [ + erofs-utils + dosfstools + mtools + ]; + + systemd = patosPkgs.systemd.out; + kernel = patosPkgs.kernel.kernel; + initrd = patosPkgs.initrd.out; + rootfs = patosPkgs.rootfs.out; + + builder = ./mkimage.sh; +}) diff --git a/image/mkimage.sh b/image/mkimage.sh new file mode 100644 index 0000000..c7473d7 --- /dev/null +++ b/image/mkimage.sh @@ -0,0 +1,52 @@ +set -ex -o pipefail + +mkdir -p $out/repart.d $out/boot +pushd $out + +# Don't seem to work just to create a symlink to rootfs derivation? +# ln -sf $rootfs rootfs +mkdir rootfs +cp -prP $rootfs/* rootfs/ +find rootfs/ -type d -exec chmod 755 {} \; + +$systemd/usr/bin/ukify build \ + --os-release rootfs/etc/os-release \ + --linux $kernel/bzImage \ + --initrd $initrd/initrd.xz \ + --cmdline "console=ttyS0" \ + -o boot/patos-x64.efi + +cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/ + +cat < repart.d/10-esp.conf +[Partition] +Type=esp +Format=vfat +SizeMinBytes=96M +SizeMaxBytes=96M +SplitName=- +CopyFiles=/boot/patos-x64.efi:/EFI/Linux/patos-x64.efi +CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI +EOF + +cat < repart.d/10-root.conf +[Partition] +Type=root +Format=erofs +CopyFiles=/rootfs:/ +Minimize=best +SplitName=root +EOF + +$systemd/usr/bin/systemd-repart \ + --no-pager \ + --empty=create \ + --size=1G \ + --definitions=./repart.d \ + --root=$out \ + patos-$version.raw + +rm -rf rootfs +rm -rf boot + +popd diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix index e6a27f9..d05fbb2 100644 --- a/utils/qemu-uefi-tpm.nix +++ b/utils/qemu-uefi-tpm.nix @@ -19,7 +19,7 @@ pkgs.writeShellApplication { state="/tmp/patos-qemu-$USER" rm -rf "$state" mkdir -m 700 "$state" - truncate -s 1G "$state/disk.raw" + qemu-img create -f qcow2 -F raw -b "$(readlink -e "$1")" "$state/disk.qcow2" 2G swtpm socket -d --tpmstate dir="$state" \ --ctrl type=unixio,path="$state/swtpm-sock" \ @@ -44,7 +44,6 @@ pkgs.writeShellApplication { -device tpm-tis,tpmdev=tpm0 \ -netdev id=net00,type=user,hostfwd=tcp::2222-:22 \ -device virtio-net-pci,netdev=net00 \ - -drive "file=fat:rw:patos/,format=raw" \ - -drive "format=raw,file=$state/disk.raw" + -drive "format=qcow2,file=$state/disk.qcow2" ''; }