summary refs log blame commit diff
path: root/modules/installer/cd-dvd/installation-cd-base.nix
blob: 3ec4f3a63de35aa642f7839de5b1d9de080e4b67 (plain) (tree)
1
2
3
4
5
6
7

                                                                   


                    

   







                                                        








                                                                       



    
















                                                                                  











                                                                      
                                                     







                                                                    

  
 
           

                     
                   
                                              
                                     
      
 


                                                                                     
                                                                       
  


                                                   
                    
                                         






                                                             



                                                                       





















































                                                                      



                                                                     




                                                                                     
 



                                                            
                                                

                   

                                                                          

                                                   
                                                               
                                 
                                                                     
                                   




                                                                     
       
 
                        


                              




                                                                        
       


                                                        


                                                                      
                                         
 
# This module contains the basic configuration for building a NixOS
# installation CD.

{config, pkgs, ...}:

let

  options = {

    system.nixosVersion = pkgs.lib.mkOption {
      default = "${builtins.readFile ../../../VERSION}";
      description = ''
        NixOS version number.
      '';
    };

    installer.configModule = pkgs.lib.mkOption {
      example = "./nixos/modules/installer/cd-dvd/installation-cd.nix";
      description = ''
        Filename of the configuration module that builds the CD
        configuration.  Must be specified to support reconfiguration
        in live CDs.
      '';
    };
  
  };


  # We need a copy of the Nix expressions for Nixpkgs and NixOS on the
  # CD.  We put them in a tarball because accessing that many small
  # files from a slow device like a CD-ROM takes too long.  !!! Once
  # we use squashfs, maybe we won't need this anymore.
  makeTarball = tarName: input: pkgs.runCommand "tarball" {inherit tarName;}
    ''
      ensureDir $out
      (cd ${input} && tar cvfj $out/${tarName} . \
        --exclude '*~' --exclude 'result')
    '';

  # Put the current directory in a tarball.
  nixosTarball = makeTarball "nixos.tar.bz2" (pkgs.lib.cleanSource ../../..);

  # Put Nixpkgs in a tarball.
  nixpkgsTarball = makeTarball "nixpkgs.tar.bz2" (pkgs.lib.cleanSource pkgs.path);


  # A dummy /etc/nixos/configuration.nix in the booted CD that
  # rebuilds the CD's configuration (and allows the configuration to
  # be modified, of course, providing a true live CD).  Problem is
  # that we don't really know how the CD was built - the Nix
  # expression language doesn't allow us to query the expression being
  # evaluated.  So we'll just hope for the best.
  dummyConfiguration = pkgs.writeText "configuration.nix"
    ''
      {config, pkgs, ...}:

      {
        require = [${config.installer.configModule}];

        # Add your own options below and run "nixos-rebuild switch".
        # E.g.,
        #   services.sshd.enable = true;
      }
    '';
  
  
in

{
  require =
    [ options
      ./iso-image.nix
      ./memtest.nix
      ../../hardware/network/intel-3945abg.nix
      ../../hardware/network/rt73.nix
    ];

  # ISO naming.
  isoImage.isoName = "nixos-${config.system.nixosVersion}-${pkgs.stdenv.system}.iso";
    
  isoImage.volumeID = "NIXOS_INSTALL_CD_${config.system.nixosVersion}";
  
  # Use Linux 2.6.29.
  boot.kernelPackages = pkgs.kernelPackages_2_6_29;

  # Show the manual.
  services.nixosManual.showManual = true;

  # Let the user play Rogue on TTY 8 during the installation.
  services.rogue.enable = true;

  # Disable some other stuff we don't need.
  security.sudo.enable = false;

  # Include only the en_US locale.  This saves 75 MiB or so compared to
  # the full glibcLocales package.
  i18n.supportedLocales = ["en_US.UTF-8/UTF-8" "en_US/ISO-8859-1"];

  # Include some utilities that are useful for installing or repairing
  # the system.
  environment.systemPackages =
    [ pkgs.subversion # for nixos-checkout
      pkgs.w3m # needed for the manual anyway
      pkgs.testdisk # useful for repairing boot problems
      pkgs.mssys # for writing Microsoft boot sectors / MBRs
      pkgs.ntfsprogs # for resizing NTFS partitions
      pkgs.parted
      pkgs.sshfsFuse
    ];

  # The initrd has to contain any module that might be necessary for
  # mounting the CD/DVD.
  boot.initrd.extraKernelModules =
    [ # SATA/PATA support.
      "ahci"

      "ata_piix"

      "sata_inic162x" "sata_nv" "sata_promise" "sata_qstor"
      "sata_sil" "sata_sil24" "sata_sis" "sata_svw" "sata_sx4"
      "sata_uli" "sata_via" "sata_vsc"

      "pata_ali" "pata_amd" "pata_artop" "pata_atiixp"
      "pata_cs5520" "pata_cs5530" /* "pata_cs5535" */ "pata_efar"
      "pata_hpt366" "pata_hpt37x" "pata_hpt3x2n" "pata_hpt3x3"
      "pata_it8213" "pata_it821x" "pata_jmicron" "pata_marvell"
      "pata_mpiix" "pata_netcell" "pata_ns87410" "pata_oldpiix"
      "pata_pcmcia" "pata_pdc2027x" /* "pata_qdi" */ "pata_rz1000"
      "pata_sc1200" "pata_serverworks" "pata_sil680" "pata_sis"
      "pata_sl82c105" "pata_triflex" "pata_via"
      # "pata_winbond" <-- causes timeouts in sd_mod

      # SCSI support (incomplete).
      "3w-9xxx" "3w-xxxx" "aic79xx" "aic7xxx" "arcmsr" 

      # USB support, especially for booting from USB CD-ROM
      # drives.  Also include USB keyboard support for when
      # something goes wrong in stage 1.
      "ehci_hcd"
      "ohci_hcd"
      "uhci_hcd"
      "usbhid"
      "usb_storage"

      # Firewire support.  Not tested.
      "ohci1394" "sbp2"

      # Virtio (QEMU, KVM etc.) support.
      "virtio_net" "virtio_pci" "virtio_blk" "virtio_balloon"

      # Wait for SCSI devices to appear.
      "scsi_wait_scan"

      # Add vfat to enable people to copy the contents of the CD to a
      # bootable USB stick.
      "vfat"
    ];

  # nixos-install will do a pull from this channel to speed up the
  # installation.
  installer.nixpkgsURL = http://nixos.org/releases/nixpkgs/channels/nixpkgs-unstable;

  boot.postBootCommands =
    ''
      export PATH=${pkgs.gnutar}/bin:${pkgs.bzip2}/bin:$PATH

      # Provide a mount point for nixos-install.
      mkdir -p /mnt

      # Provide the NixOS/Nixpkgs sources in /etc/nixos.  This is required
      # for nixos-install.
      echo "unpacking the NixOS/Nixpkgs sources..."
      mkdir -p /etc/nixos/nixos
      tar xjf ${nixosTarball}/nixos.tar.bz2 -C /etc/nixos/nixos
      mkdir -p /etc/nixos/nixpkgs
      tar xjf ${nixpkgsTarball}/nixpkgs.tar.bz2 -C /etc/nixos/nixpkgs
      chown -R root.root /etc/nixos

      # Provide a configuration for the CD/DVD itself, to allow users
      # to run nixos-rebuild to change the configuration of the
      # running system on the CD/DVD.
      cp ${dummyConfiguration} /etc/nixos/configuration.nix
    '';

  # Some more help text.
  services.mingetty.helpLine =
    ''
        
      Log in as "root" with an empty password.  ${
        if config.services.xserver.enable then
          "Type `start xserver' to start\nthe graphical user interface."
        else ""
      }
    '';
  
  # Have the redistributable firmware of rt73 wifi nics.
  networking.enableRT73Firmware = true;

  # To speed up installation a little bit, include the complete stdenv
  # in the Nix store on the CD.
  isoImage.storeContents = [pkgs.stdenv];
}