diff --git a/modules/profiles/clone-config.nix b/modules/profiles/clone-config.nix new file mode 100644 index 00000000000..69f8537e133 --- /dev/null +++ b/modules/profiles/clone-config.nix @@ -0,0 +1,100 @@ +{ config, pkgs, modules, ... }: + +with pkgs.lib; + +let + + # Location of the repository on the harddrive + nixosPath = toString ../..; + + # Check if the path is from the NixOS repository + isNixOSFile = path: + let s = toString path; in + removePrefix nixosPath s != s; + + # Copy modules given as extra configuration files. Unfortunately, we + # cannot serialized attribute set given in the list of modules (that's why + # you should use files). + moduleFiles = + filter isPath modules; + + # Partition module files because between NixOS and non-NixOS files. NixOS + # files may change if the repository is updated. + partitionedModuleFiles = + let p = partition isNixOSFile moduleFiles; in + { nixos = p.right; others = p.wrong; }; + + # Path transformed to be valid on the installation device. Thus the + # device configuration could be rebuild. + relocatedModuleFiles = + let + relocateNixOS = path: + ""; + relocateOthers = null; + in + { nixos = map relocateNixOS partitionedModuleFiles.nixos; + others = []; # TODO: copy the modules to the install-device repository. + }; + + # 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. + configClone = pkgs.writeText "configuration.nix" + '' + { config, pkgs, ... }: + + { + require = [ ${toString config.installer.cloneConfigIncludes} ]; + } + ''; + +in + +{ + + options = { + + installer.cloneConfig = mkOption { + default = true; + description = '' + Try to clone the installation-device configuration by re-using it's + profile from the list of imported modules. + ''; + }; + + installer.cloneConfigIncludes = mkOption { + default = []; + example = [ "./nixos/modules/hardware/network/rt73.nix" ]; + description = '' + List of modules used to re-build this installation device profile. + ''; + }; + + }; + + config = { + + installer.cloneConfigIncludes = + relocatedModuleFiles.nixos ++ relocatedModuleFiles.others; + + boot.postBootCommands = + '' + # Provide a mount point for nixos-install. + mkdir -p /mnt + + ${optionalString config.installer.cloneConfig '' + # 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. + if ! [ -e /etc/nixos/configuration.nix ]; then + cp ${configClone} /etc/nixos/configuration.nix + fi + ''} + ''; + + }; + +} diff --git a/modules/profiles/installation-device.nix b/modules/profiles/installation-device.nix index 2ed5a63887f..28c6b09670b 100644 --- a/modules/profiles/installation-device.nix +++ b/modules/profiles/installation-device.nix @@ -3,88 +3,19 @@ with pkgs.lib; -let - # Location of the repository on the harddrive - nixosPath = toString ../..; - - # Check if the path is from the NixOS repository - isNixOSFile = path: - let s = toString path; in - removePrefix nixosPath s != s; - - # Copy modules given as extra configuration files. Unfortunately, we - # cannot serialized attribute set given in the list of modules (that's why - # you should use files). - moduleFiles = - filter isPath modules; - - # Partition module files because between NixOS and non-NixOS files. NixOS - # files may change if the repository is updated. - partitionedModuleFiles = - let p = partition isNixOSFile moduleFiles; in - { nixos = p.right; others = p.wrong; }; - - # Path transformed to be valid on the installation device. Thus the - # device configuration could be rebuild. - relocatedModuleFiles = - let - relocateNixOS = path: - ""; - relocateOthers = null; - in - { nixos = map relocateNixOS partitionedModuleFiles.nixos; - others = []; # TODO: copy the modules to the install-device repository. - }; - - # 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. - configClone = pkgs.writeText "configuration.nix" - '' - { config, pkgs, ... }: - - { - require = [ - ${toString config.installer.cloneConfigIncludes} - ]; - } - ''; -in - { - imports = [ - # Enable devices which are usually scanned, because we don't know the - # target system. - ../installer/scan/detected.nix - ../installer/scan/not-detected.nix - ]; + imports = + [ # Enable devices which are usually scanned, because we don't know the + # target system. + ../installer/scan/detected.nix + ../installer/scan/not-detected.nix - options = { - - installer.cloneConfig = mkOption { - default = true; - description = '' - Try to clone the installation-device configuration by re-using it's - profile from the list of imported modules. - ''; - }; - - installer.cloneConfigIncludes = mkOption { - default = []; - example = [ "./nixos/modules/hardware/network/rt73.nix" ]; - description = '' - List of modules used to re-build this installation device profile. - ''; - }; - - }; + # Allow "nixos-rebuild" to work properly by providing + # /etc/nixos/configuration.nix. + ./clone-config.nix + ]; config = { - installer.cloneConfigIncludes = - relocatedModuleFiles.nixos ++ relocatedModuleFiles.others; # Show the manual. services.nixosManual.showManual = true; @@ -99,19 +30,6 @@ in # the full glibcLocales package. i18n.supportedLocales = ["en_US.UTF-8/UTF-8" "en_US/ISO-8859-1"]; - boot.postBootCommands = - '' - # Provide a mount point for nixos-install. - mkdir -p /mnt - - ${optionalString config.installer.cloneConfig '' - # 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 ${configClone} /etc/nixos/configuration.nix - ''} - ''; - # Some more help text. services.mingetty.helpLine = ''