Difference between revisions of "Cheatsheet"

From NixOS Wiki
Jump to: navigation, search
Line 11: Line 11:
 
!|NixOS (system-wide and root)
 
!|NixOS (system-wide and root)
 
!|NixOS (user) and Nix in general
 
!|NixOS (user) and Nix in general
!|Relevant section of the manual
 
 
|-
 
|-
 
| colspan="5" style="text-align:center"| Basic concepts
 
| colspan="5" style="text-align:center"| Basic concepts
Line 19: Line 18:
 
|This column will let you do everything you can with Ubuntu and more.
 
|This column will let you do everything you can with Ubuntu and more.
 
|This column just isn't possible in Ubuntu.
 
|This column just isn't possible in Ubuntu.
|
 
 
|-
 
|-
 
|Who can install packages and who can run them?
 
|Who can install packages and who can run them?
Line 25: Line 23:
 
|Packages root installs are system-wide. It does so through through /etc/nixos/configuration.nix. If root installs packages the same way users do, through ~/.nixpkgs/config.nix, they are also global. Root's default profile is the system-wide default profile.
 
|Packages root installs are system-wide. It does so through through /etc/nixos/configuration.nix. If root installs packages the same way users do, through ~/.nixpkgs/config.nix, they are also global. Root's default profile is the system-wide default profile.
 
|Users can install their own packages and have their own profiles (environments) through ~/.nixpkgs/config.nix
 
|Users can install their own packages and have their own profiles (environments) through ~/.nixpkgs/config.nix
|[https://nixos.org/nixos/manual/index.html#sec-package-management Package management]
 
 
 
|-
 
|-
 
|Package manager
 
|Package manager
Line 32: Line 28:
 
|nix, but many system-wide operations are provided by nixos packages.
 
|nix, but many system-wide operations are provided by nixos packages.
 
|Just nix without the involvement of nixos.
 
|Just nix without the involvement of nixos.
|
 
 
|-
 
|-
 
|How do you select your official sources and major releases
 
|How do you select your official sources and major releases
Line 38: Line 33:
 
|At any time you select from a collection of channels. They're system-wide when set by root. You can roll back changes or switch channels with ease.
 
|At any time you select from a collection of channels. They're system-wide when set by root. You can roll back changes or switch channels with ease.
 
|Channels are per-user if they're not set by root.
 
|Channels are per-user if they're not set by root.
|
 
 
|-
 
|-
 
|Where are packages installed?
 
|Where are packages installed?
Line 44: Line 38:
 
|System-wide packages are in /run/current-system/sw/ (these are installed because of /etc/nixos/configuration.nix) and /nix/var/nix/profiles/default/bin/ (this is the profile managed by root). Note that the files are just symlinks to the real packages managed by nix /nix/store/.
 
|System-wide packages are in /run/current-system/sw/ (these are installed because of /etc/nixos/configuration.nix) and /nix/var/nix/profiles/default/bin/ (this is the profile managed by root). Note that the files are just symlinks to the real packages managed by nix /nix/store/.
 
|User packages are in ~/.nix-profile/. Note that the files are just symlinks to the real packages managed by nix in /nix/store/.
 
|User packages are in ~/.nix-profile/. Note that the files are just symlinks to the real packages managed by nix in /nix/store/.
|
 
 
|-
 
|-
 
|When changes take effect
 
|When changes take effect
Line 52: Line 45:
 
|Most of the time you apply changes with nix-env -i all
 
|Most of the time you apply changes with nix-env -i all
 
TODO How does one get nix to do all the work for a switch and separate out the actual switching from fetching/building?
 
TODO How does one get nix to do all the work for a switch and separate out the actual switching from fetching/building?
|
 
 
|-
 
|-
 
|Packages
 
|Packages
Line 58: Line 50:
 
|Technically called "derivations" but everyone calls them packages.
 
|Technically called "derivations" but everyone calls them packages.
 
|Technically called "derivations" but everyone calls them packages.
 
|Technically called "derivations" but everyone calls them packages.
|
 
 
|-
 
|-
 
| colspan="5" style="text-align:center"| Package management
 
| colspan="5" style="text-align:center"| Package management
Line 75: Line 66:
 
Or with collections, add the package to your ~/.nixpkgs/config.nix and run
 
Or with collections, add the package to your ~/.nixpkgs/config.nix and run
 
<pre>nix-env -i all</pre>
 
<pre>nix-env -i all</pre>
|
 
 
|-
 
|-
 
|Uninstall a package
 
|Uninstall a package
Line 81: Line 71:
 
|remove from /etc/nixos/configuration.nix
 
|remove from /etc/nixos/configuration.nix
 
<pre>sudo nixos-rebuild switch</pre>
 
<pre>sudo nixos-rebuild switch</pre>
|
 
 
|
 
|
 
|-
 
|-
Line 87: Line 76:
 
|<pre>apt-get purge emacs</pre>
 
|<pre>apt-get purge emacs</pre>
 
|All configuration is in configuration.nix
 
|All configuration is in configuration.nix
|
 
 
|
 
|
 
|-
 
|-
Line 94: Line 82:
 
|<pre>sudo nix-channel --update</pre>
 
|<pre>sudo nix-channel --update</pre>
 
|<pre>nix-channel --update</pre>
 
|<pre>nix-channel --update</pre>
|
 
 
|-
 
|-
 
|Upgrade packages
 
|Upgrade packages
Line 100: Line 87:
 
|<pre>sudo nixos-rebuild switch</pre>
 
|<pre>sudo nixos-rebuild switch</pre>
 
|<pre>nix-env -u</pre>
 
|<pre>nix-env -u</pre>
|
 
 
|-
 
|-
 
|Check for broken dependencies
 
|Check for broken dependencies
Line 106: Line 92:
 
|<pre>nix-store --verify --check-contents</pre>
 
|<pre>nix-store --verify --check-contents</pre>
 
|unneeded!
 
|unneeded!
|
 
 
|-
 
|-
 
|List package dependencies
 
|List package dependencies
Line 116: Line 101:
 
For installed packages:
 
For installed packages:
 
<pre>nix-store --query --references $(which emacs)</pre>
 
<pre>nix-store --query --references $(which emacs)</pre>
|
 
 
|-
 
|-
 
|List which packages depend on this one (reverse dependencies)
 
|List which packages depend on this one (reverse dependencies)
Line 123: Line 107:
 
|For installed packages (only print reverse dependencies *which are already installed*):
 
|For installed packages (only print reverse dependencies *which are already installed*):
 
<pre>nix-store --query --referrers $(which emacs)</pre>
 
<pre>nix-store --query --referrers $(which emacs)</pre>
|
 
 
|-
 
|-
 
|Verify all installed packages
 
|Verify all installed packages
Line 129: Line 112:
 
|<pre>sudo nix-store --verify --check-contents</pre>
 
|<pre>sudo nix-store --verify --check-contents</pre>
 
|<pre>nix-store --verify --check-contents</pre>
 
|<pre>nix-store --verify --check-contents</pre>
|
 
 
|-
 
|-
 
|Fix packages with failed checksums
 
|Fix packages with failed checksums
Line 135: Line 117:
 
|<pre>sudo nix-store --verify --check-contents --repair</pre>
 
|<pre>sudo nix-store --verify --check-contents --repair</pre>
 
|<pre>nix-store --verify --check-contents --repair</pre>
 
|<pre>nix-store --verify --check-contents --repair</pre>
|
 
 
|-
 
|-
 
|Select major version and stable/unstable
 
|Select major version and stable/unstable
Line 147: Line 128:
 
To show all installed channel.
 
To show all installed channel.
 
|When run by a user channels work locally, when run by root they're used as the system-wide channels.
 
|When run by a user channels work locally, when run by root they're used as the system-wide channels.
|
 
 
|-
 
|-
 
|Private package repository
 
|Private package repository
Line 153: Line 133:
 
|Define your package tree as in the general column, and include it in configuration.nix, then list your packages in systemPackages to make them available system wide
 
|Define your package tree as in the general column, and include it in configuration.nix, then list your packages in systemPackages to make them available system wide
 
|See [https://sandervanderburg.blogspot.de/2014/07/managing-private-nix-packages-outside.html]
 
|See [https://sandervanderburg.blogspot.de/2014/07/managing-private-nix-packages-outside.html]
|
 
 
|-
 
|-
 
|Install a particular version of a package
 
|Install a particular version of a package
|
 
 
|
 
|
 
|
 
|
Line 167: Line 145:
 
|edit /etc/nixos/configuration.nix
 
|edit /etc/nixos/configuration.nix
 
|edit ~/.nixpkgs/config.nix TODO More details about how to edit
 
|edit ~/.nixpkgs/config.nix TODO More details about how to edit
|
 
 
|-
 
|-
 
|List package options
 
|List package options
|
 
 
|
 
|
 
|
 
|
Line 177: Line 153:
 
|Global package configuration
 
|Global package configuration
 
|Modify configuration file in /etc/
 
|Modify configuration file in /etc/
|
 
 
|
 
|
 
|
 
|
Line 187: Line 162:
 
|<pre>nix-env -qaP '.*emacs.*'</pre>
 
|<pre>nix-env -qaP '.*emacs.*'</pre>
 
|<pre>nix-env -qaP '.*emacs.*'</pre>
 
|<pre>nix-env -qaP '.*emacs.*'</pre>
|
 
 
|-
 
|-
 
|Show package description
 
|Show package description
Line 193: Line 167:
 
|<pre>nix-env -qa --description '.*emacs.*'</pre>
 
|<pre>nix-env -qa --description '.*emacs.*'</pre>
 
|<pre>nix-env -qa --description '.*emacs.*'</pre>
 
|<pre>nix-env -qa --description '.*emacs.*'</pre>
|
 
 
|-
 
|-
 
|Show files installed by package
 
|Show files installed by package
Line 202: Line 175:
 
<pre>du -a /nix/store/ji06y4haijly0i0knmr986l2dajffv1p-emacs-24.4</pre>
 
<pre>du -a /nix/store/ji06y4haijly0i0knmr986l2dajffv1p-emacs-24.4</pre>
 
|<pre></pre>
 
|<pre></pre>
|
 
 
|-
 
|-
 
|Show package for file
 
|Show package for file
Line 208: Line 180:
 
|follow the symlink
 
|follow the symlink
 
|follow the symlink
 
|follow the symlink
|
 
 
|-
 
|-
 
| colspan="5" style="text-align:center"| Services
 
| colspan="5" style="text-align:center"| Services
Line 215: Line 186:
 
|<pre>sudo service apache start</pre>
 
|<pre>sudo service apache start</pre>
 
|<pre>sudo systemctl start apache</pre>
 
|<pre>sudo systemctl start apache</pre>
|
 
 
|
 
|
 
|-
 
|-
Line 221: Line 191:
 
|<pre>sudo service apache stop</pre>
 
|<pre>sudo service apache stop</pre>
 
|<pre>sudo systemctl stop apache</pre>
 
|<pre>sudo systemctl stop apache</pre>
|
 
 
|
 
|
 
|-
 
|-
Line 228: Line 197:
 
|System-wide packages /var/log/
 
|System-wide packages /var/log/
 
|User packages ~/.nix-profile/var/log/
 
|User packages ~/.nix-profile/var/log/
|
 
 
|-
 
|-
 
|Adding a user
 
|Adding a user
Line 240: Line 208:
 
       [ "ssh-dss AAAAB3Nza... alice@foobar" ];
 
       [ "ssh-dss AAAAB3Nza... alice@foobar" ];
 
  };</pre> to to /etc/nixos/configuration.nix and then call <pre>nixos-rebuild switch</pre>
 
  };</pre> to to /etc/nixos/configuration.nix and then call <pre>nixos-rebuild switch</pre>
|
 
 
|
 
|
 
|-
 
|-
Line 250: Line 217:
 
ls /nix/var/nix/profiles/default/bin/</pre>
 
ls /nix/var/nix/profiles/default/bin/</pre>
 
|<pre>ls ~/.nix-profile/bin</pre>
 
|<pre>ls ~/.nix-profile/bin</pre>
|
 
 
|-
 
|-
 
|Get the current version number
 
|Get the current version number
Line 256: Line 222:
 
|<pre>nixos-version</pre>
 
|<pre>nixos-version</pre>
 
|<pre>nixos-version</pre>
 
|<pre>nixos-version</pre>
|
 
 
|-
 
|-
 
|Get sources for a package
 
|Get sources for a package
Line 267: Line 232:
 
The patched source is usually not a derivation itself, but can be produced for most packages with the following command: <pre>nix-shell '<nixpkgs>' -A emacs\
 
The patched source is usually not a derivation itself, but can be produced for most packages with the following command: <pre>nix-shell '<nixpkgs>' -A emacs\
 
   --command 'unpackPhase; patchPhase'</pre>
 
   --command 'unpackPhase; patchPhase'</pre>
|
 
 
|-
 
|-
 
|Compile & install a package from source
 
|Compile & install a package from source
Line 280: Line 244:
 
EOF
 
EOF
 
nix-build</pre>
 
nix-build</pre>
|
 
 
|-
 
|-
 
|Install a binary package
 
|Install a binary package
|
 
 
|
 
|
 
|
 
|
Line 292: Line 254:
 
|
 
|
 
|Install dpkg with Nix, then <pre>dpkg -i package.deb</pre>
 
|Install dpkg with Nix, then <pre>dpkg -i package.deb</pre>
|
 
 
|}
 
|}

Revision as of 20:15, 28 June 2017

A cheat sheet and rough mapping between Ubuntu and NixOS

This is meant to give you basic ideas and get you unstuck. NixOS being very different from most distributions, a deeper understanding will be necessary sooner or later! Follow the links to the manual pages and browse the wiki to find real NixOS tutorials.

The system-wide column is the equivalent of using apt under Ubuntu.

TODO Provide well-commented sample configuration.nix and ~/.nixpkgs/config.nix files with examples of common tasks.

Task Ubuntu NixOS (system-wide and root) NixOS (user) and Nix in general
Basic concepts
This column will let you do everything you can with Ubuntu and more. This column just isn't possible in Ubuntu.
Who can install packages and who can run them? All packages are always system-wide and only root can install packages. Packages root installs are system-wide. It does so through through /etc/nixos/configuration.nix. If root installs packages the same way users do, through ~/.nixpkgs/config.nix, they are also global. Root's default profile is the system-wide default profile. Users can install their own packages and have their own profiles (environments) through ~/.nixpkgs/config.nix
Package manager apt which is really running on top of dpkg, sometimes wrapped by UIs like aptitude. nix, but many system-wide operations are provided by nixos packages. Just nix without the involvement of nixos.
How do you select your official sources and major releases These are baked into the distribution (e.g. Ubuntu version X). Upgrades are hard and permanent. At any time you select from a collection of channels. They're system-wide when set by root. You can roll back changes or switch channels with ease. Channels are per-user if they're not set by root.
Where are packages installed? apt installs globally into /bin/, /usr/, etc. System-wide packages are in /run/current-system/sw/ (these are installed because of /etc/nixos/configuration.nix) and /nix/var/nix/profiles/default/bin/ (this is the profile managed by root). Note that the files are just symlinks to the real packages managed by nix /nix/store/. User packages are in ~/.nix-profile/. Note that the files are just symlinks to the real packages managed by nix in /nix/store/.
When changes take effect As soon as the command runs. Commands are not atomic and can leave your machine in a bad state. Most of the time you modify the configuration file and apply changes with nixos-rebuild switch

TODO How does one get nixos to do all the work for a switch and separate out the actual switching from fetching/building?

Most of the time you apply changes with nix-env -i all

TODO How does one get nix to do all the work for a switch and separate out the actual switching from fetching/building?

Packages Uniformly referred to as packages Technically called "derivations" but everyone calls them packages. Technically called "derivations" but everyone calls them packages.
Package management
Install a package
sudo apt-get install emacs
In /etc/nixos/configuration.nix:

If it's a program add to systemPackages:

 systemPackages = with pkgs; 
                    [ <other packages...> emacs ];

If it's a service add:

services.openssh.enable = true;
nix-env -i emacs

Or with collections, add the package to your ~/.nixpkgs/config.nix and run

nix-env -i all
Uninstall a package
sudo apt-get remove emacs
remove from /etc/nixos/configuration.nix
sudo nixos-rebuild switch
Uninstall a package removing its configuration
apt-get purge emacs
All configuration is in configuration.nix
Update the list of packages
sudo apt-get update
sudo nix-channel --update
nix-channel --update
Upgrade packages
sudo apt-get upgrade
sudo nixos-rebuild switch
nix-env -u
Check for broken dependencies
sudo apt-get check
nix-store --verify --check-contents
unneeded!
List package dependencies
apt-cache depends emacs
nix-store --query --requisites $(readlink -f /run/current-system)
nix-store -q --tree /nix/var/nix/profiles/system
nix-store --query --references\
  $(nix-instantiate '<nixpkgs>' -A emacs)

For installed packages:

nix-store --query --references $(which emacs)
List which packages depend on this one (reverse dependencies)
apt-cache rdepends emacs
For installed packages (only print reverse dependencies *which are already installed*):
nix-store --query --referrers $(which emacs)
Verify all installed packages
debsums
sudo nix-store --verify --check-contents
nix-store --verify --check-contents
Fix packages with failed checksums Reinstall broken packages
sudo nix-store --verify --check-contents --repair
nix-store --verify --check-contents --repair
Select major version and stable/unstable Change sources.list and apt-get dist-upgrade. A an extremely infrequent and destructive operation. The nix variants are safe and easy to use.
nix-channel --add\
   https://nixos.org/channels/nixpkgs-unstable <name>

Add the unstable channel. At that address you will find names for other versions and variants. Name can be any string.

nix-channel --remove <name>

To eliminate a channel.

nix-channel --list

To show all installed channel.

When run by a user channels work locally, when run by root they're used as the system-wide channels.
Private package repository PPA Define your package tree as in the general column, and include it in configuration.nix, then list your packages in systemPackages to make them available system wide See [1]
Install a particular version of a package
Package configuration
Configure a package
sudo dpkg-reconfigure <package>
edit /etc/nixos/configuration.nix edit ~/.nixpkgs/config.nix TODO More details about how to edit
List package options
Global package configuration Modify configuration file in /etc/
Package configuration
Find packages
apt-cache search emacs
nix-env -qaP '.*emacs.*'
nix-env -qaP '.*emacs.*'
Show package description
apt-cache show emacs
nix-env -qa --description '.*emacs.*'
nix-env -qa --description '.*emacs.*'
Show files installed by package
dpkg -L emacs
readlink -f $(which emacs)
 /nix/store/ji06y4haijly0i0knmr986l2dajffv1p-emacs-24.4/bin/emacs-24.4

then

du -a /nix/store/ji06y4haijly0i0knmr986l2dajffv1p-emacs-24.4

Show package for file
dpkg -S /usr/bin/emacs
follow the symlink follow the symlink
Services
Start a service
sudo service apache start
sudo systemctl start apache
Stop a service
sudo service apache stop
sudo systemctl stop apache
Where your log files live /var/log/ System-wide packages /var/log/ User packages ~/.nix-profile/var/log/
Adding a user sudo adduser alice Add
users.extraUsers.alice =
 { isNormalUser = true;
   home = "/home/alice";
   description = "Alice Foobar";
   extraGroups = [ "wheel" "networkmanager" ];
   openssh.authorizedKeys.keys =
      [ "ssh-dss AAAAB3Nza... alice@foobar" ];
 };
to to /etc/nixos/configuration.nix and then call
nixos-rebuild switch
Misc tasks
List binaries
ls /usr/bin/
ls /run/current-system/sw/bin &&\
ls /nix/var/nix/profiles/default/bin/
ls ~/.nix-profile/bin
Get the current version number
cat /etc/debian_version
nixos-version
nixos-version
Get sources for a package
apt-get source emacs
In Debian, apt-get source gets both the patched upstream source and the recipe for the package. Those need two steps in Nix. To find the package recipe:
grep -r emacs $(nix-instantiate --eval --expr '<nixpkgs>')
To download the source as specified by the package recipe:
nix-build '<nixpkgs>' -A emacs.src
The patched source is usually not a derivation itself, but can be produced for most packages with the following command:
nix-shell '<nixpkgs>' -A emacs\
   --command 'unpackPhase; patchPhase'
Compile & install a package from source
git clone foobar
cat >default.nix <<EOF
with import <nixpkgs> { };
stdenv.lib.overrideDerivation foobar (oldAttrs : {
  src = ./foobar;
})
EOF
nix-build
Install a binary package
Install a .deb
dpkg -i package.deb
Install dpkg with Nix, then
dpkg -i package.deb