Jump to content

Specialisation: Difference between revisions

From Official NixOS Wiki
Noewaeda (talk | contribs)
Use consistent spelling of the word "specialisation"
Noewaeda (talk | contribs)
mNo edit summary
 
(2 intermediate revisions by the same user not shown)
Line 2: Line 2:
{{low quality|References need to use <nowiki><cite></nowiki> instead of just being numbers in brackets.}}
{{low quality|References need to use <nowiki><cite></nowiki> instead of just being numbers in brackets.}}


Specialisations allow you to define variations of your system configuration. For instance, if you don't usually use GPU, you might create a base system with your GPU disabled and create a dedicated specialisation with Nvidia/AMD drivers installed - later, during boot, you can choose which configuration you want to boot into this time.
Specialisations allow you to define variations of your system configuration. For instance, if you don't usually use GPU, you might create a base system with your GPU disabled and create a dedicated specialisation with Nvidia/AMD drivers installed. Then, during boot, you can choose which configuration you want to boot into this time.


== Config ==
== Config ==
Line 11: Line 11:
specialisation = {
specialisation = {
   chani.configuration = {
   chani.configuration = {
     services.xserver.desktopManager.plasma5.enable = true;
     services.desktopManager.plasma6.enable = true;
   };
   };


Line 18: Line 18:
     configuration = {
     configuration = {
       system.nixos.tags = [ "paul" ];
       system.nixos.tags = [ "paul" ];
       services.xserver.desktopManager.gnome.enable = true;
       services.desktopManager.gnome.enable = true;
       users.users.paul = {
       users.users.paul = {
         isNormalUser = true;
         isNormalUser = true;
Line 24: Line 24:
         extraGroups = [ "networkmanager" "video" ];
         extraGroups = [ "networkmanager" "video" ];
       };
       };
       services.xserver.displayManager.autoLogin = {
       services.displayManager.autoLogin = {
         enable = true;
         enable = true;
         user = "paul";
         user = "paul";
Line 35: Line 35:
};</syntaxHighlight>
};</syntaxHighlight>


In this example, the <code>chani</code> specialisation inherits the parent config (that contains the <code>specialisation</code> directive), but additionally activates the plasma5 desktop. The <code>paul</code> specialisation on the other hand does not <code>inheritParentConfig</code> and defines its own one from scratch instead.  
In this example, the <code>chani</code> specialisation inherits the parent configuration (which contains the <code>specialisation</code> directive), but additionally activates the <code>plasma6</code> desktop. The <code>paul</code> specialisation does not inherit the parent configuration, and defines its own configuration from scratch instead.  


{{Note|At times, you may want to overwrite values in specialisations which you have already defined in your parent configuration. To solve this problem in <code>chani</code> example, the parent configuration could define <code>services.xserver.desktopManager.plasma5.enable &#61; false;</code> in an overwritable manner using <code>mkDefault</code> and similar<ref>https://discourse.nixos.org/t/what-does-mkdefault-do-exactly/9028</ref>: <code>services.xserver.desktopManager.plasma5.enable &#61; lib.mkDefault false;</code>}}
{{Note|At times, you may want to overwrite values in specialisations which you have already defined in your parent configuration. To solve this problem in <code>chani</code> example, the parent configuration could define <code>services.desktopManager.plasma6.enable &#61; false;</code> in an overwritable manner using <code>mkDefault</code> and similar<ref>https://discourse.nixos.org/t/what-does-mkdefault-do-exactly/9028</ref>: <code>services.desktopManager.plasma6.enable &#61; lib.mkDefault false;</code>}}


== Special case: the default non-specialized entry ==
== Special case: the default non-specialised entry ==


Specialisations are receiving options in addition to your default configuration, but what if you want to have options in your default configuration that shouldn't be pulled by the specialisations?
Specialisations will receive options in addition to your default configuration. If you want to have options in your default configuration that shouldn't be pulled by the specialisations, use the conditional <code>config.specialisation != {}</code> to declare values for the non-specialised case.


Use the conditional <code>config.specialisation != {}</code> to declare values for the non-specialized case. For example, you could write a module (as variable, or separate file), imported from <code>configuration.nix</code> via <code>imports = [...]</code> like this:
For example, you could write a module (as a variable, or a separate file), imported from <code>configuration.nix</code> via <code>imports = [...]</code> like this:


<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
Line 56: Line 56:
</syntaxHighlight>
</syntaxHighlight>


However, if there are no specialisations defined, then <code>config.specialisation != {}</code> always evaluate to <code>false</code>.
However, if there are no specialisations defined, then <code>config.specialisation != {}</code> always evaluates to <code>false</code>.


== Activating a specialisation ==  
== Activating a specialisation ==  


After rebuilding your system, you can choose a specialisation during boot; it's also possible to switch into a specialisation at runtime - following the example above, you would run:
After rebuilding your system, you can choose a specialisation during boot. It's also possible to switch into a specialisation at runtime - following the example above, you would run:


<syntaxHighlight lang=console>
<syntaxHighlight lang=console>
Line 66: Line 66:
</syntaxHighlight>
</syntaxHighlight>


Note that not all configurations can be fully switched into at runtime - e.g. if your specialisation uses a different kernel, switching into it will not actually reload the kernel (but if you were to restart your computer and pick the specialisation from the boot menu, the alternative kernel would get loaded).
Not all configurations can be fully switched into at runtime. For example, if your specialisation uses a different kernel, switching into it will not actually reload the kernel, but if you were to restart your computer and pick the specialisation from the boot menu, the alternative kernel would be loaded.


== Further reading ==
== Further reading ==


* https://discourse.nixos.org/t/nixos-specialisations-how-do-you-use-them/10367/4
* https://discourse.nixos.org/t/nixos-specialisations-how-do-you-use-them/


{{references}}
{{references}}

Latest revision as of 23:50, 22 September 2026

☶︎
This article or section needs to be expanded. Further information may be found in the related discussion page. Please consult the pedia article metapage for guidelines on contributing.
⍼︎
This article or section is of low quality. References need to use <cite> instead of just being numbers in brackets. Further information may be found in the related discussion page. Editors that are knowledgeable in this area are encouraged to expand it, otherwise this page could become a candidate for deletion.

Specialisations allow you to define variations of your system configuration. For instance, if you don't usually use GPU, you might create a base system with your GPU disabled and create a dedicated specialisation with Nvidia/AMD drivers installed. Then, during boot, you can choose which configuration you want to boot into this time.

Config

Specialisations are defined with the following options[1]: https://search.nixos.org/options?from=0&size=50&sort=relevance&query=specialisation

specialisation = {
  chani.configuration = {
    services.desktopManager.plasma6.enable = true;
  };

  paul = {
    inheritParentConfig = false;
    configuration = {
      system.nixos.tags = [ "paul" ];
      services.desktopManager.gnome.enable = true;
      users.users.paul = {
        isNormalUser = true;
        uid = 1002;
        extraGroups = [ "networkmanager" "video" ];
      };
      services.displayManager.autoLogin = {
        enable = true;
        user = "paul";
      };
      environment.systemPackages = with pkgs; [
        dune-release
      ];
    };
  };
};

In this example, the chani specialisation inherits the parent configuration (which contains the specialisation directive), but additionally activates the plasma6 desktop. The paul specialisation does not inherit the parent configuration, and defines its own configuration from scratch instead.

Note: At times, you may want to overwrite values in specialisations which you have already defined in your parent configuration. To solve this problem in chani example, the parent configuration could define services.desktopManager.plasma6.enable = false; in an overwritable manner using mkDefault and similar[2]: services.desktopManager.plasma6.enable = lib.mkDefault false;

Special case: the default non-specialised entry

Specialisations will receive options in addition to your default configuration. If you want to have options in your default configuration that shouldn't be pulled by the specialisations, use the conditional config.specialisation != {} to declare values for the non-specialised case.

For example, you could write a module (as a variable, or a separate file), imported from configuration.nix via imports = [...] like this:

({ lib, config, pkgs, ... }: {
  config = lib.mkIf (config.specialisation != {}) {
    # Config that should only apply to the default system, not the specialised ones

    # example
    hardware.opengl.extraPackages = with pkgs; [ vaapiIntel vaapiVdpau ];
  };
})

However, if there are no specialisations defined, then config.specialisation != {} always evaluates to false.

Activating a specialisation

After rebuilding your system, you can choose a specialisation during boot. It's also possible to switch into a specialisation at runtime - following the example above, you would run:

$ nixos-rebuild switch --specialisation chani

Not all configurations can be fully switched into at runtime. For example, if your specialisation uses a different kernel, switching into it will not actually reload the kernel, but if you were to restart your computer and pick the specialisation from the boot menu, the alternative kernel would be loaded.

Further reading

References