From 1cea6b09efa23e4e2755d547193b1610d7ff6403 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 10 Jun 2009 16:29:48 +0000 Subject: [PATCH] * Compress the Nix store on the CD using squashfs. This reduces the size of the i686-linux ISO image from 463 MiB to 147 MiB. Hopefully it also speeds up installation due to reduced seek time and larger block sizes, but I haven't tested that yet (on real hardware). svn path=/nixos/branches/modular-nixos/; revision=15930 --- modules/installer/cd-dvd/installation-cd.nix | 6 +-- modules/installer/cd-dvd/iso-image.nix | 55 ++++++++++++-------- modules/installer/cd-dvd/live-dvd.nix | 6 +-- modules/system/boot/stage-1-init.sh | 18 ++++--- 4 files changed, 46 insertions(+), 39 deletions(-) diff --git a/modules/installer/cd-dvd/installation-cd.nix b/modules/installer/cd-dvd/installation-cd.nix index 4f38ebfc796..2d21eaa1300 100644 --- a/modules/installer/cd-dvd/installation-cd.nix +++ b/modules/installer/cd-dvd/installation-cd.nix @@ -181,9 +181,5 @@ in # To speed up installation a little bit, include the complete stdenv # in the Nix store on the CD. - isoImage.storeContents = - [ { object = pkgs.stdenv; - symlink = "none"; - } - ]; + isoImage.storeContents = [pkgs.stdenv]; } diff --git a/modules/installer/cd-dvd/iso-image.nix b/modules/installer/cd-dvd/iso-image.nix index d7d346bd264..bea9da2d03f 100644 --- a/modules/installer/cd-dvd/iso-image.nix +++ b/modules/installer/cd-dvd/iso-image.nix @@ -45,11 +45,7 @@ let }; isoImage.storeContents = pkgs.lib.mkOption { - example = - [ { object = pkgs.stdenv; - symlink = "/stdenv"; - } - ]; + example = [pkgs.stdenv]; description = '' This option lists additional derivations to be included in the Nix store in the generated ISO image. @@ -80,17 +76,37 @@ in [ { mountPoint = "/"; label = config.isoImage.volumeID; } + { mountPoint = "/nix/store"; + fsType = "squashfs"; + device = "/nix-store.squashfs"; + options = "loop"; + neededForBoot = true; + } ]; - # We need AUFS in the initrd to make the CD appear writable. + # We need squashfs in the initrd to mount the compressed Nix store, + # and aufs to make the root filesystem appear writable. boot.extraModulePackages = [config.boot.kernelPackages.aufs]; - boot.initrd.extraKernelModules = ["aufs"]; + boot.initrd.extraKernelModules = ["aufs" "squashfs"]; # 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; + # Closures to be copied to the Nix store on the CD, namely the init + # script and the top-level system configuration directory. + isoImage.storeContents = + [ config.system.build.bootStage2 + config.system.build.system + ]; + + # Create the squashfs image that contains the Nix store. + system.build.squashfsStore = import ../../../lib/make-squashfs.nix { + inherit (pkgs) stdenv squashfsTools perl pathsFromGraph; + storeContents = config.isoImage.storeContents; + }; + # Individual files to be included on the CD, outside of the Nix # store on the CD. isoImage.contents = @@ -109,16 +125,12 @@ in { source = config.boot.grubSplashImage; target = "/boot/background.xpm.gz"; } - ]; - - # Closures to be copied to the Nix store on the CD, namely the init - # script and the top-level system configuration directory. - isoImage.storeContents = - [ { object = config.system.build.bootStage2; - symlink = "/init"; + { source = config.system.build.squashfsStore; + target = "/nix-store.squashfs"; } - { object = config.system.build.system; - symlink = "/system"; + { # Quick hack: need a mount point for the store. + source = pkgs.runCommand "empty" {} "ensureDir $out"; + target = "/nix/store"; } ]; @@ -130,7 +142,7 @@ in chainloader +1 title NixOS Installer / Rescue - kernel /boot/vmlinuz init=/init ${toString config.boot.kernelParams} + kernel /boot/vmlinuz init=${config.system.build.bootStage2} systemConfig=${config.system.build.system} ${toString config.boot.kernelParams} initrd /boot/initrd ''; @@ -138,18 +150,17 @@ in system.build.isoImage = import ../../../lib/make-iso9660-image.nix { inherit (pkgs) stdenv perl cdrkit pathsFromGraph; - inherit (config.isoImage) isoName compressImage volumeID contents storeContents; + inherit (config.isoImage) isoName compressImage volumeID contents; bootable = true; bootImage = "/boot/grub/stage2_eltorito"; }; - # After booting, register the contents of the Nix store on the CD in - # the Nix database in the tmpfs. boot.postBootCommands = '' - ${config.environment.nix}/bin/nix-store --load-db < /nix-path-registration - rm /nix-path-registration + # After booting, register the contents of the Nix store on the + # CD in the Nix database in the tmpfs. + ${config.environment.nix}/bin/nix-store --load-db < /nix/store/nix-path-registration # nixos-rebuild also requires a "system" profile and an # /etc/NIXOS tag. diff --git a/modules/installer/cd-dvd/live-dvd.nix b/modules/installer/cd-dvd/live-dvd.nix index c510c94b359..dde8dd9930d 100644 --- a/modules/installer/cd-dvd/live-dvd.nix +++ b/modules/installer/cd-dvd/live-dvd.nix @@ -5,11 +5,7 @@ # Build the build-time dependencies of this configuration on the DVD # to speed up installation. - isoImage.storeContents = - [ { object = config.system.build.system.drvPath; - symlink = "none"; - } - ]; + isoImage.storeContents = [config.system.build.system.drvPath]; # Include lots of packages. environment.systemPackages = diff --git a/modules/system/boot/stage-1-init.sh b/modules/system/boot/stage-1-init.sh index 50870909489..8d062ac96c8 100644 --- a/modules/system/boot/stage-1-init.sh +++ b/modules/system/boot/stage-1-init.sh @@ -1,6 +1,6 @@ #! @shell@ -targetRoot=/mnt/root +targetRoot=/mnt-root export LD_LIBRARY_PATH=@extraUtils@/lib @@ -236,13 +236,17 @@ done # If this is a live-CD/DVD, then union-mount a tmpfs on top of the # original root. -targetRoot=/mnt-root if test -n "@isLiveCD@"; then - mkdir /mnt-tmpfs - mount -t tmpfs -o "mode=755" none /mnt-tmpfs - mkdir /mnt-union - mount -t aufs -o dirs=/mnt-tmpfs=rw:$targetRoot=ro none /mnt-union - targetRoot=/mnt-union + mkdir /mnt-root-tmpfs + mount -t tmpfs -o "mode=755" none /mnt-root-tmpfs + mkdir /mnt-root-union + mount -t aufs -o dirs=/mnt-root-tmpfs=rw:$targetRoot=ro none /mnt-root-union + targetRoot=/mnt-root-union + + mkdir /mnt-store-tmpfs + mount -t tmpfs -o "mode=755" none /mnt-store-tmpfs + mkdir -p $targetRoot/nix/store + mount -t aufs -o dirs=/mnt-store-tmpfs=rw:/mnt-root/nix/store=ro none /mnt-root-union/nix/store fi