Cheatsheet: Difference between revisions
imported>Mic92 building static packages go easier! |
|||
(58 intermediate revisions by 31 users not shown) | |||
Line 1: | Line 1: | ||
== A NixOS cheat sheet and comparison to Ubuntu == | |||
[[Ubuntu_vs._NixOS|Ubuntu vs. NixOS]] provides a table mapping of common administrative tasks and their commands in Ubuntu to similar capabilities in NixOS. | |||
== A cheat sheet and | |||
| | |||
== Working with the nix store == | == Working with the nix store == | ||
Line 270: | Line 6: | ||
=== Get the store path for a package === | === Get the store path for a package === | ||
< | <syntaxHighlight lang="console"> | ||
$ nix | $ nix repl | ||
nix-repl> :l <nixpkgs> | nix-repl> :l <nixpkgs> | ||
Added 7486 variables. | Added 7486 variables. | ||
nix-repl> "${xorg.libXtst}" | nix-repl> "${xorg.libXtst}" | ||
"/nix/store/nlpnx21yjdjx2ii7ln4kcmbm0x1vy7w9-libXtst-1.2.3" | "/nix/store/nlpnx21yjdjx2ii7ln4kcmbm0x1vy7w9-libXtst-1.2.3" | ||
nix-repl> :lf ./configuration.nix # as flakes way for a local file | |||
# load nixos configuration from a nix file | |||
$ nix repl --file '<nixpkgs/nixos>' -I nixos-config=./configuration.nix | |||
$ nix-build '<nixpkgs>' --no-build-output -A xorg.libXtst | $ nix-build '<nixpkgs>' --no-build-output -A xorg.libXtst | ||
/nix/store/nlpnx21yjdjx2ii7ln4kcmbm0x1vy7w9-libXtst-1.2.3 | /nix/store/nlpnx21yjdjx2ii7ln4kcmbm0x1vy7w9-libXtst-1.2.3 | ||
</ | </syntaxHighlight> | ||
==== Get store path for a package from the Flake input ==== | |||
When packages are managed using [[Flakes]], store paths to them can be retrieved using <code>nix eval --inputs-from</code>, like this:<syntaxhighlight lang="shell"> | |||
$ nix eval --inputs-from "$flake_path" --raw "$input#$package" | |||
</syntaxhighlight>For instance, when packages are managed using [[Home Manager]] using standard configuration, store path to the [[Git]] package can be retrieved using this command:<syntaxhighlight lang="shell"> | |||
$ nix eval --inputs-from ~/.config/home-manager --raw nixpkgs#git | |||
</syntaxhighlight> | |||
=== | === Add files to the store === | ||
It is sometimes necessary to add files to the store manually. | It is sometimes necessary to add files to the store manually. | ||
This is particularly the case with packages that cannot be downloaded automatically, | This is particularly the case with packages that cannot be downloaded automatically, | ||
Line 289: | Line 36: | ||
For most files, it is sufficient to run: | For most files, it is sufficient to run: | ||
< | <syntaxHighlight lang="console"> | ||
$ nix-store --add-fixed sha256 /path/to/file | $ nix-store --add-fixed sha256 /path/to/file | ||
</ | </syntaxHighlight> | ||
Unfortunately, | Unfortunately, <code>nix-store</code> will try to load the entire file into memory, | ||
which will fail if the file size exceeds available memory. | which will fail if the file size exceeds available memory. | ||
If we have root access, we can copy the file to the store ourselves: | If we have root access, we can copy the file to the store ourselves: | ||
< | <syntaxHighlight lang="console"> | ||
$ sudo unshare -m bash # open a shell as root in a private mount namespace | $ sudo unshare -m bash # open a shell as root in a private mount namespace | ||
$ largefile=/path/to/file | $ largefile=/path/to/file | ||
Line 306: | Line 53: | ||
$ printf "$storepath\n\n0\n" | nix-store --register-validity --reregister # register the file in the Nix database | $ printf "$storepath\n\n0\n" | nix-store --register-validity --reregister # register the file in the Nix database | ||
$ exit # exit to the original shell where /nix/store is still mounted read-only | $ exit # exit to the original shell where /nix/store is still mounted read-only | ||
</ | </syntaxHighlight> | ||
To add a file with fixed name (when the input filename is not stable), or to add entire directories with filter, you can use '''builtins.path''': | |||
<syntaxHighlight lang="console"> | |||
$ nix-instantiate --eval --read-write-mode -E 'builtins.path { path = ./myfile; name = "myname"; }' | |||
</syntaxHighlight> | |||
=== Build | === Build NixOS from nixpkgs repo === | ||
The following snippet will build the system from a git checkout: | The following snippet will build the system from a git checkout: | ||
< | <syntaxHighlight lang="console"> | ||
$ nixos-rebuild -I nixpkgs=/path/to/nixpkgs switch | $ nixos-rebuild -I nixpkgs=/path/to/nixpkgs switch | ||
</ | </syntaxHighlight> | ||
This method can be used when testing | This method can be used when testing NixOS services for a pull request to nixpkgs. | ||
Building | Building NixOS from a git is an alternative to using nix channels and set up permanent following this [https://web.archive.org/web/20160327190212/http://anderspapitto.com/posts/2015-11-01-nixos-with-local-nixpkgs-checkout.html blog article]. | ||
It has a couple of advantages over nixpkgs as it allows back-porting of packages/changes to stable versions | It has a couple of advantages over nixpkgs as it allows back-porting of packages/changes to stable versions | ||
as well as applying customization. | as well as applying customization. | ||
Use the following command to build directly from a particular branch of a | Use the following command to build directly from a particular branch of a repository in GitHub: | ||
< | <syntaxHighlight lang="console"> | ||
$ nixos-rebuild -I nixpkgs=https://github.com/nixcloud/nixpkgs/archive/release-17.03.tar.gz switch | $ nixos-rebuild -I nixpkgs=https://github.com/nixcloud/nixpkgs/archive/release-17.03.tar.gz switch | ||
</ | </syntaxHighlight> | ||
=== Evaluate a NixOS configuration without building === | |||
If you only want to evaluate <code>configuration.nix</code> without building (e.g. to syntax-check or see if you are using module options correctly), you can use: | |||
<syntaxHighlight lang="console"> | |||
$ nix-instantiate '<nixpkgs/nixos>' -A system | |||
</syntaxHighlight> | |||
This creates the <code>.drv</code> file that <code>nixos-rebuild build</code> would build. | |||
=== Explore a NixOS configuration in the REPL === | |||
If you want to see what ''value'' a NixOS option takes without building, as opposed to merely checking that all options work, you can run: | |||
<syntaxhighlight lang="console"> | |||
$ nix repl --file '<nixpkgs/nixos>' | |||
Welcome to Nix 2.18.2. Type :? for help. | |||
Loading installable ''... | |||
Added 6 variables. | |||
nix-repl> config.environment.shells # for example | |||
[ "/run/current-system/sw/bin/zsh" ... ] | |||
# Equivalently, if starting from an existing REPL: | |||
nix-repl> :l <nixpkgs/nixos> | |||
Added 6 variables. | |||
nix-repl> config.environment.shells | |||
</syntaxhighlight> | |||
This can be helpful if your configuration is spread across multiple modules, or if you import modules from external sources, or if NixOS has defaults and you want to know whether a default is being used or extended in your configuration, or a variety of other cases in which you might want the computer to tell you what the end result of all your Nixing is going to be before you switch to it. | |||
You can do this with configuration files other than the one installed in <code>/etc/nixos</code>, too: | |||
<pre> | |||
nix-repl> :a import <nixpkgs/nixos> { configuration = /path/to/config.nix; } | |||
</pre> | |||
=== Manually switching a NixOS system to a certain version of system closure === | |||
(''Or:'' What <code>nixos-rebuild</code> does under the hoods.) | |||
Step 1: Do this for the equivalent of <code>nixos-rebuild boot</code> or <code>nixos-rebuild switch</code>, i.e. if you want the changes to persist after reboot: | |||
If you have the store path, run this, replacing <code>$systemClosure</code> with store path to your system closure: | |||
<syntaxHighlight lang="console"> | |||
$ nix-env --profile /nix/var/nix/profiles/system --set $systemClosure | |||
</syntaxHighlight> | |||
Or, if it was a previous generation, you can run this instead, replacing <code>$generation</code> with the desired generation number: | |||
<syntaxHighlight lang="console"> | |||
$ nix-env --profile /nix/var/nix/profiles/system --switch-generation $generation | |||
</syntaxHighlight> | |||
Step 2: Do this for all changes: | |||
Run this, replacing <code>$action</code> with the action (one of <code>boot</code>, <code>switch</code>, <code>test</code>): | |||
<syntaxHighlight lang="console"> | |||
$ /nix/var/nix/profiles/system/bin/switch-to-configuration $action | |||
</syntaxHighlight> | |||
If you use a different profile name the procedure is similar, but use <code>/nix/var/nix/profiles/system-profiles/$profileName</code> instead of <code>/nix/var/nix/profiles/system</code>. | |||
=== Building a service as a VM (for testing) === | === Building a service as a VM (for testing) === | ||
Line 334: | Line 151: | ||
Given the following configuration: | Given the following configuration: | ||
< | <syntaxHighlight lang="nix"> | ||
# vm.nix | # vm.nix | ||
{ lib, config, ... }: | { lib, config, ... }: | ||
Line 341: | Line 158: | ||
users.users.root.initialPassword = "root"; | users.users.root.initialPassword = "root"; | ||
} | } | ||
</ | </syntaxHighlight> | ||
a vm can be build using the following command: | a vm can be build using the following command: | ||
< | <syntaxHighlight lang="console"> | ||
$ nixos-rebuild -I nixpkgs=/path/to/nixpkgs -I nixos-config=./vm.nix build-vm | $ nixos-rebuild -I nixpkgs=/path/to/nixpkgs -I nixos-config=./vm.nix build-vm | ||
</ | </syntaxHighlight> | ||
where <code>-I nixpkgs=/path/to/nixpkgs</code> is optionally depending whether the vm should be build from git checkout or a channel. | where <code>-I nixpkgs=/path/to/nixpkgs</code> is optionally depending whether the vm should be build from git checkout or a channel. | ||
On non- | On non-NixOS (linux) systems the following command can be used instead: | ||
< | <syntaxHighlight lang="console"> | ||
$ nix-build '<nixpkgs/nixos>' -A vm -k -I nixos-config=./vm.nix | $ nix-build '<nixpkgs/nixos>' -A vm -k -I nixos-config=./vm.nix | ||
</ | </syntaxHighlight> | ||
By default the resulting vm will require X11 to create a virtual display. | By default the resulting vm will require X11 to create a virtual display. | ||
By specifying additional arguments via the environment variables <code>QEMU_OPTS</code>and <code>QEMU_KERNEL_PARAMS</code> it is possible to reuse the current running terminal as serial console for the vm: | By specifying additional arguments via the environment variables <code>QEMU_OPTS</code>and <code>QEMU_KERNEL_PARAMS</code> it is possible to reuse the current running terminal as serial console for the vm: | ||
< | <syntaxHighlight lang="console"> | ||
$ export QEMU_OPTS="-nographic -serial mon:stdio" QEMU_KERNEL_PARAMS=console=ttyS0 | $ export QEMU_OPTS="-nographic -serial mon:stdio" QEMU_KERNEL_PARAMS=console=ttyS0 | ||
$ /nix/store/lshw31yfbb6izs2s594jd89ma4wf8zw6-nixos-vm/bin/run-nixos-vm | $ /nix/store/lshw31yfbb6izs2s594jd89ma4wf8zw6-nixos-vm/bin/run-nixos-vm | ||
</ | </syntaxHighlight> | ||
To forward a port you can set export <code>QEMU_NET_OPTS</code>. In the following example port 2222 on the host is forwarded to port 22 in the vm: | To forward a port you can set export <code>QEMU_NET_OPTS</code>. In the following example port 2222 on the host is forwarded to port 22 in the vm: | ||
< | <syntaxHighlight lang="console"> | ||
$ export QEMU_NET_OPTS="hostfwd=tcp::2222-:22" | $ export QEMU_NET_OPTS="hostfwd=tcp::2222-:22" | ||
</ | </syntaxHighlight> | ||
Don't forget that by default | Don't forget that by default NixOS comes with a firewall enabled: | ||
< | <syntaxHighlight lang="nix"> | ||
{...}: { | {...}: { | ||
networking.firewall.enable = false; | networking.firewall.enable = false; | ||
} | } | ||
</ | </syntaxHighlight> | ||
=== Reuse a package as a build environment === | === Reuse a package as a build environment === | ||
As packages already contains all build dependencies, they can be reused to a build environment quickly. | As packages already contains all build dependencies, they can be reused to a build environment quickly. | ||
In the following a setup for the cmake-based project [ | In the following a setup for the cmake-based project [https://github.com/iovisor/bcc bcc] is shown. | ||
After obtaining the source: | After obtaining the source: | ||
< | <syntaxHighlight lang="console"> | ||
$ git clone https://github.com/iovisor/bcc.git | $ git clone https://github.com/iovisor/bcc.git | ||
$ cd bcc | $ cd bcc | ||
</ | </syntaxHighlight> | ||
Add the following <code>default.nix</code> to the project: | Add the following <code>default.nix</code> to the project: | ||
< | <syntaxHighlight lang="nix"> | ||
with import <nixpkgs> {}; | with import <nixpkgs> {}; | ||
linuxPackages.bcc.overrideDerivation (old: { | linuxPackages.bcc.overrideDerivation (old: { | ||
Line 405: | Line 214: | ||
buildInputs = [ bashInteractive ninja ] ++ old.buildInputs; | buildInputs = [ bashInteractive ninja ] ++ old.buildInputs; | ||
}) | }) | ||
</ | </syntaxHighlight> | ||
To initiate the build environment run | To initiate the build environment run <code>nix-shell</code> in the project root directory | ||
< | <syntaxHighlight lang="console"> | ||
# this will download add development dependencies and set up the environment so build tools will find them. | # this will download add development dependencies and set up the environment so build tools will find them. | ||
$ nix-shell | $ nix-shell | ||
</ | </syntaxHighlight> | ||
The following is specific to bcc or cmake in general: | The following is specific to bcc or cmake in general: | ||
(so you need to adapt the workflow depending on the project, you hack on) | (so you need to adapt the workflow depending on the project, you hack on) | ||
< | <syntaxHighlight lang="console"> | ||
$ mkdir build | $ mkdir build | ||
$ cd build | $ cd build | ||
Line 423: | Line 232: | ||
$ eval cmake $cmakeFlags .. | $ eval cmake $cmakeFlags .. | ||
$ make | $ make | ||
</ | </syntaxHighlight> | ||
=== Evaluate packages for a different platform === | |||
Sometimes you want to check whether a change to a package (such as adding a new dependency) would evaluate even on a different type of system. For example, you may want to check on <code>x86_64-linux</code> whether a package evaluates for <code>x86_64-darwin</code> or <code>aarch64-linux</code>. | |||
Use the <code>system</code> argument: | |||
<syntaxHighlight lang="console"> | |||
$ nix-instantiate --argstr system "x86_64-darwin" -A mypackage | |||
</syntaxHighlight> | |||
=== Cross-compile packages === | === Cross-compile packages === | ||
Line 430: | Line 248: | ||
The following command will cross compile the tinc package for the aarch64 CPU architecture from a different architecture (e.g. x86_64). | The following command will cross compile the tinc package for the aarch64 CPU architecture from a different architecture (e.g. x86_64). | ||
< | <syntaxHighlight lang="console"> | ||
$ nix-build '<nixpkgs>' --arg crossSystem '(import <nixpkgs> {}).lib.systems.examples.aarch64-multiplatform' -A tinc | $ nix-build '<nixpkgs>' --arg crossSystem '(import <nixpkgs> {}).lib.systems.examples.aarch64-multiplatform' -A tinc | ||
</ | </syntaxHighlight> | ||
You can add your own specifications, or look at existing ones, in nixpkgs/lib/systems/examples.nix. | You can add your own specifications, or look at existing ones, in nixpkgs/lib/systems/examples.nix. | ||
Line 444: | Line 262: | ||
For example one can have both the unstable and stable channels on system root: | For example one can have both the unstable and stable channels on system root: | ||
< | <syntaxHighlight lang="console"> | ||
$ sudo nix-channel --list | $ sudo nix-channel --list | ||
nixos https://nixos.org/channels/nixos-17.03 | nixos https://nixos.org/channels/nixos-17.03 | ||
nixos-unstable https://nixos.org/channels/nixos-unstable | nixos-unstable https://nixos.org/channels/nixos-unstable | ||
</ | </syntaxHighlight> | ||
and the following in | and the following in <code>configuration.nix</code>: | ||
< | <syntaxHighlight lang="nix"> | ||
nixpkgs.config = { | nixpkgs.config = { | ||
# Allow proprietary packages | # Allow proprietary packages | ||
Line 459: | Line 277: | ||
# Create an alias for the unstable channel | # Create an alias for the unstable channel | ||
packageOverrides = pkgs: { | packageOverrides = pkgs: { | ||
unstable = import <nixos-unstable> { | unstable = import <nixos-unstable> { # pass the nixpkgs config to the unstable alias # to ensure `allowUnfree = true;` is propagated: | ||
config = config.nixpkgs.config; | config = config.nixpkgs.config; | ||
}; | }; | ||
}; | }; | ||
}; | }; | ||
</ | </syntaxHighlight> | ||
which allows you to switch particular packages to the unstable channel: | which allows you to switch particular packages to the unstable channel: | ||
< | <syntaxHighlight lang="nix"> | ||
environment | environment.systemPackages = with pkgs; [ | ||
ddate | ddate | ||
devilspie2 | devilspie2 | ||
Line 479: | Line 294: | ||
# ... | # ... | ||
zsh | zsh | ||
]; | |||
</ | </syntaxHighlight> | ||
=== Building statically linked packages === | === Building statically linked packages === | ||
< | <syntaxHighlight lang="console"> | ||
$ nix-build -E 'with (import ./. {}); (curl.override { stdenv = makeStaticLibraries stdenv;}).out' | $ nix-build -E 'with (import ./. {}); (curl.override { stdenv = makeStaticLibraries stdenv;}).out' | ||
</ | </syntaxHighlight> | ||
There is also an stdenv adapter that will build static binaries: | There is also an stdenv adapter that will build static binaries: | ||
< | <syntaxHighlight lang="console"> | ||
$ nix-build '<nixpkgs>' -A pkgsStatic.hello | $ nix-build '<nixpkgs>' -A pkgsStatic.hello | ||
</ | </syntaxHighlight> | ||
=== Rebuild a package with debug symbols === | === Rebuild a package with debug symbols === | ||
< | <syntaxHighlight lang="console"> | ||
$ nix-build -E 'with import <nixpkgs> {}; enableDebugging st' | $ nix-build -E 'with import <nixpkgs> {}; enableDebugging st' | ||
$ file result/bin/st | $ file result/bin/st | ||
result/bin/st: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, not stripped, with debug_info | result/bin/st: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, not stripped, with debug_info | ||
</ | </syntaxHighlight> | ||
=== Download a nix store path from the cache === | |||
If you want to the exact same nix store path on a different system, you can use the <code>--realise</code> or short <code>-r</code> parameter in the <code>nix-store</code> command: | |||
<syntaxHighlight lang="console"> | |||
$ nix-store -r /nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10 | |||
$ find /nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10 | |||
/nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10 | |||
/nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10/bin | |||
/nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10/bin/hello | |||
/nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10/share | |||
/nix/store/0vg5bw04dn21czjcqcqczyjrhys5cv30-hello-2.10/share/locale | |||
... | |||
</syntaxHighlight> | |||
=== Install an arbitrary nix store path into a user profile === | |||
<code>nix-env</code> also accepts the full path to a program in the nix store: | |||
<syntaxHighlight lang="console"> | |||
$ nix-env -i /nix/store/yzz2gvpcyxg5i68zi11sznbsp1ypccz8-firefox-65.0 | |||
</syntaxHighlight> | |||
=== Check the syntax of a nix file === | |||
<syntaxHighlight lang="console"> | |||
$ echo '{}: bar' > expression.nix | |||
$ nix-instantiate --parse-only expression.nix | |||
error: undefined variable 'bar' at /tmp/expression.nix:1:5 | |||
</syntaxHighlight> | |||
=== Using override with nix-build === | |||
using channels | |||
<syntaxhighlight lang="nix"> | |||
nix-build -E 'with (import <nixpkgs>{}); polybar.override { i3Support = true; }' | |||
</syntaxhighlight> | |||
using a local repo | |||
<syntaxhighlight lang="nix"> | |||
nix-build -E 'with (import ./default.nix{}); polybar.override { i3Support = true; }' | |||
</syntaxhighlight> | |||
== See also == | == See also == | ||
* [[Garbage Collection]] | * [[Garbage Collection]] | ||
* [[NFS#Nix_store_on_NFS|Nix store on NFS]] | * [[NFS#Nix_store_on_NFS|Nix store on NFS]] | ||
[[Category:Cookbook]] | |||
[[Category:Software]] |