diff --git a/lib/make-iso9660-image.nix b/lib/make-iso9660-image.nix index ea0cd1b4d22..51dce5eb402 100644 --- a/lib/make-iso9660-image.nix +++ b/lib/make-iso9660-image.nix @@ -1,4 +1,4 @@ -{ stdenv, perl, cdrkit, nixpkgs +{ stdenv, perl, cdrkit, pathsFromGraph , # The file name of the resulting ISO image. isoName ? "cd.iso" @@ -37,7 +37,7 @@ stdenv.mkDerivation { builder = ./make-iso9660-image.sh; buildInputs = [perl cdrkit]; - inherit isoName bootable bootImage compressImage volumeID; + inherit isoName bootable bootImage compressImage volumeID pathsFromGraph; # !!! should use XML. sources = map (x: x.source) contents; @@ -50,5 +50,4 @@ stdenv.mkDerivation { # For obtaining the closure of `storeContents'. exportReferencesGraph = map (x: [("closure-" + baseNameOf x.object) x.object]) storeContents; - pathsFromGraph = "${nixpkgs}/pkgs/build-support/kernel/paths-from-graph.pl"; } diff --git a/modules/installer/cd-dvd/iso-image.nix b/modules/installer/cd-dvd/iso-image.nix new file mode 100644 index 00000000000..64f788993fe --- /dev/null +++ b/modules/installer/cd-dvd/iso-image.nix @@ -0,0 +1,88 @@ +# This module creates a bootable ISO image containing the given NixOS +# configuration. The derivation for the ISO image will be placed in +# config.system.build.isoImage. + +{config, pkgs, ...}: + +let + + cdLabel = "NIXOS_INSTALLATION_CD"; + + # The configuration file for Grub. + grubCfg = + '' + default 0 + 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 + ''; + +in + +{ + # 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 = + [ { mountPoint = "/"; + label = cdLabel; + } + ]; + + # We need AUFS in the initrd to make the CD appear writable. + boot.extraModulePackages = [config.boot.kernelPackages.aufs]; + boot.initrd.extraKernelModules = ["aufs"]; + + # Tell stage 1 of the boot to mount a tmpfs on top of the CD using + # AUFS. !!! It would be nicer to make the stage 1 init pluggable + # and move that bit of code here. + boot.isLiveCD = true; + + # 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"; + + #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"; + } + ]; + + # Closures to be copied to the Nix store on the CD. + storeContents = + [ { object = config.system.build.bootStage2; + symlink = "/init"; + } + { object = config.system.build.system; + symlink = "/system"; + } + ]; + }; +}