From 60b3f95ad86826faf95680a3529ced1c322d4d87 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 25 May 2009 17:41:03 +0000 Subject: [PATCH] * Move the definition of the set of system packages to modules/config/system-path.nix. system/system.nix is now almost empty. * Removed the cleanStart option - it should be possible to get the same functionality by overriding config.system.path (or defining config.system.systemPackages with a higher priority - don't know if that works though). svn path=/nixos/branches/modular-nixos/; revision=15727 --- default.nix | 5 +- modules/config/system-path.nix | 150 ++++++++++++++++++++++++ modules/services/audio/pulseaudio.nix | 6 +- modules/services/misc/nix-daemon.nix | 16 ++- modules/services/scheduling/cron.nix | 6 +- modules/services/scheduling/fcron.nix | 5 +- system/nixos-environment.nix | 50 +------- system/options.nix | 13 ++- system/system-options.nix | 25 ---- system/system.nix | 162 ++------------------------ 10 files changed, 188 insertions(+), 250 deletions(-) create mode 100644 modules/config/system-path.nix diff --git a/default.nix b/default.nix index 9dd73430b66..affb6fdc3ea 100644 --- a/default.nix +++ b/default.nix @@ -19,7 +19,6 @@ in grubMenuBuilder kernel modulesTree - nix system systemPath config @@ -40,7 +39,9 @@ in modulesClosure ; - nixFallback = system.nix; + nix = system.config.environment.nix; + + nixFallback = (import nixpkgs {}).nixUnstable; manifests = system.config.installer.manifests; # exported here because nixos-rebuild uses it diff --git a/modules/config/system-path.nix b/modules/config/system-path.nix new file mode 100644 index 00000000000..41903297252 --- /dev/null +++ b/modules/config/system-path.nix @@ -0,0 +1,150 @@ +# This module defines the packages that appear in +# /var/run/current-system/sw. + +{pkgs, config, ...}: + +with pkgs.lib; + +let + + # NixOS installation/updating tools. + nixosTools = import ../../installer { + inherit pkgs config; + }; + + + systemPackages = + [ config.system.sbin.modprobe # must take precedence over module_init_tools + config.system.sbin.mount # must take precedence over util-linux + config.environment.nix + nixosTools.nixosInstall + nixosTools.nixosRebuild + nixosTools.nixosCheckout + nixosTools.nixosHardwareScan + nixosTools.nixosGenSeccureKeys + pkgs.acl + pkgs.attr + pkgs.bashInteractive # bash with ncurses support + pkgs.bzip2 + pkgs.coreutils + pkgs.cpio + pkgs.curl + pkgs.e2fsprogs + pkgs.findutils + pkgs.glibc # for ldd, getent + pkgs.glibcLocales + pkgs.gnugrep + pkgs.gnused + pkgs.gnutar + pkgs.grub + pkgs.gzip + pkgs.iputils + pkgs.less + pkgs.libcap + pkgs.lvm2 + pkgs.man + pkgs.mdadm + pkgs.module_init_tools + pkgs.nano + pkgs.ncurses + pkgs.netcat + pkgs.nettools + pkgs.ntp + pkgs.openssh + pkgs.pciutils + pkgs.perl + pkgs.procps + pkgs.pwdutils + pkgs.reiserfsprogs + pkgs.rsync + pkgs.seccure + pkgs.strace + pkgs.su + pkgs.sysklogd + pkgs.sysvtools + pkgs.time + pkgs.udev + pkgs.upstart + pkgs.usbutils + pkgs.utillinux + pkgs.wirelesstools + (import ../../helpers/info-wrapper.nix {inherit (pkgs) bash texinfo writeScriptBin;}) + ] + ++ pkgs.lib.optional config.services.bitlbee.enable pkgs.bitlbee + ++ pkgs.lib.optional config.networking.defaultMailServer.directDelivery pkgs.ssmtp + ++ config.environment.extraPackages + ++ pkgs.lib.optional config.fonts.enableFontDir config.system.build.x11Fonts + + # NSS modules need to be in `systemPath' so that (i) the builder + # chroot gets to seem them, and (ii) applications can benefit from + # changes in the list of NSS modules at run-time, without requiring + # a reboot. + ++ config.system.nssModules.list; + + + options = { + + environment = { + + systemPackages = mkOption { + default = systemPackages; + description = '' + The set of packages that appear in + /var/run/current-system/sw. These packages are + automatically available to all users, and are + automatically updated every time you rebuild the system + configuration. (The latter is the main difference with + installing them in the default profile, + /nix/var/nix/profiles/default. + ''; + }; + + # !!! Obsolete. + extraPackages = mkOption { + default = []; + example = [pkgs.firefox pkgs.thunderbird]; + description = '' + This option allows you to add additional packages to the system + path. + ''; + }; + + pathsToLink = mkOption { + default = ["/bin" "/sbin" "/lib" "/share/man" "/share/info" "/man" "/info"]; + example = ["/"]; + description = " + Lists directories to be symlinked in `/var/run/current-system/sw'. + "; + }; + + }; + + system = { + + path = mkOption { + default = config.environment.systemPackages; + description = '' + The packages you want in the boot environment. + ''; + apply = list: pkgs.buildEnv { + name = "system-path"; + paths = list; + + # Note: We need `/lib' to be among `pathsToLink' for NSS modules + # to work. + inherit (config.environment) pathsToLink; + + ignoreCollisions = true; + }; + }; + + }; + + }; + + +in + +{ + require = [options]; +} diff --git a/modules/services/audio/pulseaudio.nix b/modules/services/audio/pulseaudio.nix index 05ec99bae92..a32f4e38228 100644 --- a/modules/services/audio/pulseaudio.nix +++ b/modules/services/audio/pulseaudio.nix @@ -45,11 +45,7 @@ mkIf config.services.pulseaudio.enable { ]; environment = { - - extraPackages = - pkgs.lib.optional - (!config.environment.cleanStart) - pkgs.pulseaudio; + extraPackages = [pkgs.pulseaudio]; }; users = { diff --git a/modules/services/misc/nix-daemon.nix b/modules/services/misc/nix-daemon.nix index 63941bf8ef4..544ddab5832 100644 --- a/modules/services/misc/nix-daemon.nix +++ b/modules/services/misc/nix-daemon.nix @@ -1,11 +1,25 @@ {pkgs, config, ...}: +with pkgs.lib; + ###### interface let - inherit (pkgs.lib) mkOption mkIf; options = { + environment = { + + nix = mkOption { + default = pkgs.nixUnstable; + example = pkgs.nixCustomFun /root/nix.tar.gz; + merge = mergeOneOption; + description = " + This option specifies the Nix package instance to use throughout the system. + "; + }; + + }; + nix = { maxJobs = mkOption { diff --git a/modules/services/scheduling/cron.nix b/modules/services/scheduling/cron.nix index cef505c9a34..a3a19e03ad0 100644 --- a/modules/services/scheduling/cron.nix +++ b/modules/services/scheduling/cron.nix @@ -58,7 +58,6 @@ in # ? # config.time.timeZone # ? # config.environment.etc # ? # config.environment.extraPackages - # ? # config.environment.cleanStart options ]; @@ -71,10 +70,7 @@ in } ]; - extraPackages = - pkgs.lib.optional - (!config.environment.cleanStart) - pkgs.cron; + extraPackages = [pkgs.cron]; }; services = { diff --git a/modules/services/scheduling/fcron.nix b/modules/services/scheduling/fcron.nix index b05b9d8ab6a..e4b08b63282 100644 --- a/modules/services/scheduling/fcron.nix +++ b/modules/services/scheduling/fcron.nix @@ -107,10 +107,7 @@ in } ]; - extraPackages = ifEnabled ( - pkgs.lib.optional - (!config.environment.cleanStart) - pkgs.fcron); + extraPackages = ifEnabled [pkgs.fcron]; }; services = { diff --git a/system/nixos-environment.nix b/system/nixos-environment.nix index 7ce7571f475..d07d401d8e5 100644 --- a/system/nixos-environment.nix +++ b/system/nixos-environment.nix @@ -1,8 +1,6 @@ {pkgs, config, ...}: -let - inherit (pkgs.lib) mergeOneOption mkOption; -in +with pkgs.lib; { environment = { @@ -13,51 +11,5 @@ in If all configuration options must be checked. Non-existing options fail build. "; }; - - nix = mkOption { - default = pkgs.nixUnstable; - example = pkgs.nixCustomFun /root/nix.tar.gz; - merge = mergeOneOption; - description = " - Use non-default Nix easily. Be careful, though, not to break everything. - "; - }; - - extraPackages = mkOption { - default = []; - example = [pkgs.firefox pkgs.thunderbird]; - description = " - This option allows you to add additional packages to the system - path. These packages are automatically available to all users, - and they are automatically updated every time you rebuild the - system configuration. (The latter is the main difference with - installing them in the default profile, - /nix/var/nix/profiles/default. The value - of this option must be a function that returns a list of - packages. The function will be called with the Nix Packages - collection as its argument for convenience. - "; - }; - - - pathsToLink = mkOption { - default = ["/bin" "/sbin" "/lib" "/share/man" "/share/info" "/man" "/info"]; - example = ["/"]; - description = " - Lists directories to be symlinked in `/var/run/current-system/sw'. - "; - }; - - cleanStart = mkOption { - default = false; - example = true; - description = " - There are some times when you want really small system for specific - purpose and do not want default package list. Setting - cleanStart to true allows you - to create a system with empty path - only extraPackages will be - included. - "; - }; }; } diff --git a/system/options.nix b/system/options.nix index 50d61239903..6c81912ea33 100644 --- a/system/options.nix +++ b/system/options.nix @@ -157,9 +157,10 @@ in inherit (pkgs) module_init_tools; inherit (config.system) modulesTree; }; - description = " - Path to the modprobe binary used by the system. - "; + description = '' + Wrapper around modprobe that sets the path to the modules + tree. + ''; }; # !!! The mount option should not stay in /system/option.nix @@ -178,8 +179,9 @@ in } + "/sbin"; }; description = " - Install a special version of mount to search mount tools in - unusual path. + A patched `mount' command that looks in a directory in the Nix + store instead of in /sbin for mount helpers (like mount.ntfs-3g or + mount.cifs). "; }; }; @@ -447,6 +449,7 @@ in ../modules/system/upstart-events/ctrl-alt-delete.nix ../modules/system/upstart-events/halt.nix ../modules/system/upstart-events/maintenance-shell.nix + ../modules/config/system-path.nix ../system/assertion.nix ../system/nixos-environment.nix ../system/nixos-installer.nix diff --git a/system/system-options.nix b/system/system-options.nix index 1065d5721eb..8639cc702be 100644 --- a/system/system-options.nix +++ b/system/system-options.nix @@ -34,31 +34,6 @@ let builtins.head list; }; - overridePath = mkOption { - default = []; - description = '' - You should not redefine this option unless you have trouble with a - package define in path. - ''; - }; - - path = mkOption { - default = []; - description = '' - The packages you want in the boot environment. - ''; - apply = list: pkgs.buildEnv { - name = "system-path"; - paths = config.system.overridePath ++ list; - - # Note: We need `/lib' to be among `pathsToLink' for NSS modules - # to work. - inherit (config.environment) pathsToLink; - - ignoreCollisions = true; - }; - }; - }; }; in diff --git a/system/system.nix b/system/system.nix index eaa41c720d8..46804767081 100644 --- a/system/system.nix +++ b/system/system.nix @@ -8,7 +8,6 @@ rec { configComponents = [ configuration (import ./options.nix) - systemPathList ]; # Make a configuration object from which we can retrieve option @@ -26,14 +25,6 @@ rec { pkgs = import nixpkgs {system = platform;}; - manifests = config.installer.manifests; # exported here because nixos-rebuild uses it - - nix = config.environment.nix; - - kernelPackages = config.boot.kernelPackages; - - kernel = kernelPackages.kernel; - # The initial ramdisk. initialRamdiskStuff = import ../modules/system/boot/stage-1.nix { @@ -43,155 +34,18 @@ rec { initialRamdisk = initialRamdiskStuff.initialRamdisk; - # NixOS installation/updating tools. - nixosTools = import ../installer { - inherit pkgs config; - }; - - - # NSS modules. Hacky! - nssModules = config.system.nssModules.list; - - nssModulesPath = config.system.nssModules.path; - - - # Wrapper around modprobe to set the path to the modules. - modprobe = config.system.sbin.modprobe; - - - # The static parts of /etc. - etc = config.system.build.etc; - - - # Font aggregation - fontDir = config.system.build.x11Fonts; - - - # A patched `mount' command that looks in a directory in the Nix - # store instead of in /sbin for mount helpers (like mount.ntfs-3g or - # mount.cifs). - mount = config.system.sbin.mount; - - - # The packages you want in the boot environment. - # This have to be split up. - systemPathList = { - system = { - overridePath = [ - # Better leave them here - they are small, needed, - # and hard to refer from anywhere outside. - modprobe # must take precedence over module_init_tools - mount # must take precedence over util-linux - nix - nixosTools.nixosInstall - nixosTools.nixosRebuild - nixosTools.nixosCheckout - nixosTools.nixosHardwareScan - nixosTools.nixosGenSeccureKeys - ]; - path = - pkgs.lib.optionals (!config.environment.cleanStart) [ - pkgs.acl - pkgs.attr - pkgs.bashInteractive # bash with ncurses support - pkgs.bzip2 - pkgs.coreutils - pkgs.cpio - pkgs.curl - pkgs.e2fsprogs - pkgs.findutils - pkgs.glibc # for ldd, getent - pkgs.glibcLocales - pkgs.gnugrep - pkgs.gnused - pkgs.gnutar - pkgs.grub - pkgs.gzip - pkgs.iputils - pkgs.less - pkgs.libcap - pkgs.lvm2 - pkgs.man - pkgs.mdadm - pkgs.module_init_tools - pkgs.nano - pkgs.ncurses - pkgs.netcat - pkgs.nettools - pkgs.ntp - pkgs.openssh - pkgs.pciutils - pkgs.perl - pkgs.procps - pkgs.pwdutils - pkgs.reiserfsprogs - pkgs.rsync - pkgs.seccure - pkgs.strace - pkgs.su - pkgs.sysklogd - pkgs.sysvtools - pkgs.time - pkgs.udev - pkgs.upstart - pkgs.usbutils - pkgs.utillinux - pkgs.wirelesstools - (import ../helpers/info-wrapper.nix {inherit (pkgs) bash texinfo writeScriptBin;}) - ] - ++ pkgs.lib.optional config.services.bitlbee.enable pkgs.bitlbee - ++ pkgs.lib.optional config.networking.defaultMailServer.directDelivery pkgs.ssmtp - ++ config.environment.extraPackages - ++ pkgs.lib.optional config.fonts.enableFontDir fontDir - - # NSS modules need to be in `systemPath' so that (i) the builder - # chroot gets to seem them, and (ii) applications can benefit from - # changes in the list of NSS modules at run-time, without requiring - # a reboot. - ++ nssModules; - }; - }; - - - # We don't want to put all of `startPath' and `path' in $PATH, since - # then we get an embarrassingly long $PATH. So use the user - # environment builder to make a directory with symlinks to those - # packages. - systemPath = config.system.path; - - - defaultShell = config.system.shell; - - - # The script that activates the configuration, i.e., it sets up - # /etc, accounts, etc. It doesn't do anything that can only be done - # at boot time (such as start `init'). - activateConfiguration = config.system.activationScripts.script; - - # The shell that we want to use for /bin/sh. - binsh = pkgs.bashInteractive; - - - # The init script of boot stage 2, which is supposed to do - # everything else to bring up the system. - bootStage2 = config.system.build.bootStage2; - - - # Script to build the Grub menu containing the current and previous - # system configurations. - grubMenuBuilder = config.system.build.grubMenuBuilder; - # This attribute is responsible for creating boot entries for # child configuration. They are only (directly) accessible # when the parent configuration is boot default. For example, # you can provide an easy way to boot the same configuration # as you use, but with another kernel - children = map (x: ((import ./system.nix) + children = map (x: ((import ./system.nix) { inherit platform; configuration = x//{boot=((x.boot)//{grubDevice = "";});};}).system) config.nesting.children; configurationName = config.boot.configurationName; + # Putting it all together. This builds a store object containing # symlinks to the various parts of the built configuration (the # kernel, the Upstart services, the init scripts, etc.) as well as a @@ -205,14 +59,14 @@ rec { grubDevice = config.boot.grubDevice; kernelParams = config.boot.kernelParams ++ config.boot.extraKernelParams; - inherit bootStage2; - inherit activateConfiguration; - inherit grubMenuBuilder; - inherit etc; - inherit systemPath; + bootStage2 = config.system.build.bootStage2; + activateConfiguration = config.system.activationScripts.script; + grubMenuBuilder = config.system.build.grubMenuBuilder; + etc = config.system.build.etc; + systemPath = config.system.path; inherit children; inherit configurationName; - kernel = kernel + "/vmlinuz"; + kernel = config.boot.kernelPackages.kernel + "/vmlinuz"; initrd = initialRamdisk + "/initrd"; # Most of these are needed by grub-install. path = [