From 37edcf4fae23e1e3862ccbad063f91e712d13206 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 9 Jun 2009 12:01:31 +0000 Subject: [PATCH] * Provide an option to add more files to the ISO image. svn path=/nixos/branches/modular-nixos/; revision=15903 --- lib/make-iso9660-image.sh | 19 ++++++- modules/installer/cd-dvd/iso-image.nix | 79 ++++++++++++++++++-------- 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/lib/make-iso9660-image.sh b/lib/make-iso9660-image.sh index 5ba133b6890..a1d7f62f35c 100644 --- a/lib/make-iso9660-image.sh +++ b/lib/make-iso9660-image.sh @@ -6,13 +6,24 @@ targets_=($targets) objects=($objects) symlinks=($symlinks) + +# Remove the initial slash from a path, since genisofs likes it that way. +stripSlash() { + res="$1" + if test "${res:0:1}" = /; then res=${res:1}; fi +} + +stripSlash "$bootImage"; bootImage="$res" + + if test -n "$bootable"; then # The -boot-info-table option modifies the $bootImage file, so # find it in `contents' and make a copy of it (since the original # is read-only in the Nix store...). for ((i = 0; i < ${#targets_[@]}; i++)); do - if test "${targets_[$i]}" = "$bootImage"; then + stripSlash "${targets_[$i]}" + if test "$res" = "$bootImage"; then echo "copying the boot image ${sources_[$i]}" cp "${sources_[$i]}" boot.img chmod u+w boot.img @@ -23,11 +34,14 @@ if test -n "$bootable"; then bootFlags="-b $bootImage -c .boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table" fi + touch pathlist + # Add the individual files. for ((i = 0; i < ${#targets_[@]}; i++)); do - echo "${targets_[$i]}=$(readlink -f ${sources_[$i]})" >> pathlist + stripSlash "${targets_[$i]}" + echo "$res=$(readlink -f ${sources_[$i]})" >> pathlist done @@ -54,6 +68,7 @@ for ((n = 0; n < ${#objects[*]}; n++)); do fi done +# !!! what does this do? cat pathlist | sed -e 's/=\(.*\)=\(.*\)=/\\=\1=\2\\=/' | tee pathlist.safer diff --git a/modules/installer/cd-dvd/iso-image.nix b/modules/installer/cd-dvd/iso-image.nix index 49d1e5e24a3..cec42c24933 100644 --- a/modules/installer/cd-dvd/iso-image.nix +++ b/modules/installer/cd-dvd/iso-image.nix @@ -5,6 +5,23 @@ {config, pkgs, ...}: let + + options = { + + isoImage.contents = pkgs.lib.mkOption { + example = + [ { source = pkgs.memtest86 + "/memtest.bin"; + target = "boot/memtest.bin"; + } + ]; + description = '' + This option lists files that have to be copied to fixed + locations in the generated ISO image. + ''; + }; + + }; + cdLabel = "NIXOS_INSTALLATION_CD"; @@ -15,18 +32,14 @@ let timeout 10 splashimage /boot/background.xpm.gz - title Boot from hard disk - root (hd0) - chainloader +1 - - title NixOS Installer / Rescue - kernel /boot/vmlinuz init=/init ${toString config.boot.kernelParams} - initrd /boot/initrd + ${config.boot.extraGrubEntries} ''; in { + require = options; + # In stage 1 of the boot, mount the CD/DVD as the root FS by label # so that we don't need to know its device. fileSystems = @@ -44,36 +57,52 @@ in # and move that bit of code here. boot.isLiveCD = true; + # Individual files to be included on the CD, outside of the Nix + # store on the CD. + isoImage.contents = + [ { source = "${pkgs.grub}/lib/grub/${if pkgs.stdenv.system == "i686-linux" then "i386-pc" else "x86_64-unknown"}/stage2_eltorito"; + target = "/boot/grub/stage2_eltorito"; + } + { source = pkgs.writeText "menu.lst" grubCfg; + target = "/boot/grub/menu.lst"; + } + { source = config.boot.kernelPackages.kernel + "/vmlinuz"; + target = "/boot/vmlinuz"; + } + { source = config.system.build.initialRamdisk + "/initrd"; + target = "/boot/initrd"; + } + { source = config.boot.grubSplashImage; + target = "/boot/background.xpm.gz"; + } + ]; + + # The Grub menu. + boot.extraGrubEntries = + '' + title Boot from hard disk + root (hd0) + chainloader +1 + + title NixOS Installer / Rescue + kernel /boot/vmlinuz init=/init ${toString config.boot.kernelParams} + initrd /boot/initrd + ''; + # Create the ISO image. system.build.isoImage = import ../../../lib/make-iso9660-image.nix { inherit (pkgs) stdenv perl cdrkit pathsFromGraph; #isoName = "${relName}-${platform}.iso"; bootable = true; - bootImage = "boot/grub/stage2_eltorito"; + bootImage = "/boot/grub/stage2_eltorito"; #compressImage = ...; volumeID = cdLabel; # Single files to be copied to fixed locations on the CD. - contents = - [ { source = "${pkgs.grub}/lib/grub/${if pkgs.stdenv.system == "i686-linux" then "i386-pc" else "x86_64-unknown"}/stage2_eltorito"; - target = "boot/grub/stage2_eltorito"; - } - { source = pkgs.writeText "menu.lst" grubCfg; - target = "boot/grub/menu.lst"; - } - { source = config.boot.kernelPackages.kernel + "/vmlinuz"; - target = "boot/vmlinuz"; - } - { source = config.system.build.initialRamdisk + "/initrd"; - target = "boot/initrd"; - } - { source = config.boot.grubSplashImage; - target = "boot/background.xpm.gz"; - } - ]; + contents = config.isoImage.contents; # Closures to be copied to the Nix store on the CD. storeContents =