summary refs log tree commit diff
path: root/nixos/modules/installer/cd-dvd/iso-image.nix
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2015-03-24 22:34:28 +0100
committerDomen Kožar <domen@dev.si>2015-03-29 22:25:41 +0200
commit299da40f9f1e00f9eb4e8e09c8456e91a83a424b (patch)
tree5f8f50a264b3d433ead0313c1a7054fbfa76632c /nixos/modules/installer/cd-dvd/iso-image.nix
parent553105310a5a1a2280fc2c40773ab1cf3fdfad98 (diff)
downloadnixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.tar
nixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.tar.gz
nixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.tar.bz2
nixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.tar.lz
nixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.tar.xz
nixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.tar.zst
nixpkgs-299da40f9f1e00f9eb4e8e09c8456e91a83a424b.zip
iso: make efi FS size adaptive, make deterministic
Fixes #6795.
This was co-authored with @bobvanderlinden.

(cherry picked from commit e19ac248ae59fd327c32b1ae3e37792c22a7c7ac)
Signed-off-by: Domen Kožar <domen@dev.si>

Conflicts:
	nixos/modules/installer/cd-dvd/iso-image.nix
Diffstat (limited to 'nixos/modules/installer/cd-dvd/iso-image.nix')
-rw-r--r--nixos/modules/installer/cd-dvd/iso-image.nix32
1 files changed, 21 insertions, 11 deletions
diff --git a/nixos/modules/installer/cd-dvd/iso-image.nix b/nixos/modules/installer/cd-dvd/iso-image.nix
index 39db7d9b8f7..8f17e720aca 100644
--- a/nixos/modules/installer/cd-dvd/iso-image.nix
+++ b/nixos/modules/installer/cd-dvd/iso-image.nix
@@ -56,17 +56,28 @@ let
     echo "timeout 5" >> $out/loader/loader.conf
   '';
 
-  efiImg = pkgs.runCommand "efi-image_eltorito" { buildInputs = [ pkgs.mtools ]; }
+  efiImg = pkgs.runCommand "efi-image_eltorito" { buildInputs = [ pkgs.mtools pkgs.libfaketime ]; }
+    # Be careful about determinism: du --apparent-size,
+    #   dates (cp -p, touch, mcopy -m, faketime for label), IDs (mkfs.vfat -i)
     ''
-      #Let's hope 15M is enough
-      dd bs=2048 count=7680 if=/dev/zero of="$out"
-      ${pkgs.dosfstools}/sbin/mkfs.vfat "$out"
-      mcopy -svi "$out" ${efiDir}/* ::
-      mmd -i "$out" boot
-      mcopy -v -i "$out" \
-        ${config.boot.kernelPackages.kernel}/bzImage ::boot/bzImage
-      mcopy -v -i "$out" \
-        ${config.system.build.initialRamdisk}/initrd ::boot/initrd
+      mkdir ./contents && cd ./contents
+      cp -rp "${efiDir}"/* .
+      mkdir ./boot
+      cp -p "${config.boot.kernelPackages.kernel}/bzImage" \
+        "${config.system.build.initialRamdisk}/initrd" ./boot/
+      touch --date=@0 ./*
+
+      usage_size=$(du -sb --apparent-size . | tr -cd '[:digit:]')
+      # Make the image 110% as big as the files need to make up for FAT overhead
+      image_size=$(( ($usage_size * 110) / 100 ))
+      # Make the image fit blocks of 1M
+      block_size=$((1024*1024))
+      image_size=$(( ($image_size / $block_size + 1) * $block_size ))
+      echo "Usage size: $usage_size"
+      echo "Image size: $image_size"
+      truncate --size=$image_size "$out"
+      ${pkgs.libfaketime}/bin/faketime "2000-01-01 00:00:00" ${pkgs.dosfstools}/sbin/mkfs.vfat -i 12345678 -n EFIBOOT "$out"
+      mcopy -bpsvm -i "$out" ./* ::
     ''; # */
 
   targetArch = if pkgs.stdenv.isi686 then
@@ -155,7 +166,6 @@ in
 
   };
 
-
   config = {
 
     boot.loader.grub.version = 2;