Mèrits
- Eelco Dolstra
- Armijn Hemel
- Eelco Visser
- Nicolas Pierron
- Michael Raskin
- Marc Weber
- Ludovic Courtès
- Sander van der Burg
- ...
Estructura
- Introducció
- Llenguatge nix
- Derivacions i el seu magatzem
- Nixpkgs i Hydra
- El constructor estàndard
- Perfils
- NixOS
Problemes al instal·lar components
- El component ha de funcionar igual de bé a varis sistemes
- Compatibilitat del component amb la resta del sistema
- Dependències: els components no solen ser autocontinguts
- Compatibilitat de les dependències amb la resta del sistema
- Actualització i desinstal·lació neta
- Saber bé d'on surten els fitxers d'un sistema
- Desfer canvis que no ens han agradat
- Poder variar el component fàcilment
Problemes de gestors imperatius (1)
- Les dependències especificades no es validen
- Les dependències especificades no són exactes
- No es poden instal·lar múltiples versions o variants d'un component
- Els components interfereixen uns amb altres
- No es pot tornar a configuracions anteriors
- Les actualitacions no són atòmiques
- Les instal·lacions les fan només administradors
Problemes de gestors imperatius (2)
-
- Falta d'enllaç entre els binaris generats i el seu font
- Mal suport d'instal·lació a partir de font o de binaris
- Hi ha molta feina manual a generar components instal·lables
Solucions de Nix
- Aïllament entre components: no hi ha interferències
- Els usuaris poden instal·lar independentment un d'altre
- Actualitzacions atòmiques
- Desfer canvis en O(1)
- Recol·lecció d'escombraries de components inútils
- Sistema transparent d'instal·lació de fonts o binaris
- Flexibilitat: canals, one-click installs, source-only installs
- No interfereix amb altres gestors de programes: /nix
Exemples
$ nix-env -i firefox # Instal·lació
$ nix-env -u firefox # Actualització
$ nix-env -e firefox # Desinstal·lació
$ nix-env --rollback # Desfer
$ firefox # Execució
El llenguatge nix
- Purament funcional
- Declara com construir components
- Declara composicions de components
- Suporta un mínim de maneig matemàtic, de llistes i de cadenes de caràcters
- Hi destaca una funció: derivation
- Les derivacions produeixen fitxers i directoris al magatzem
Derivacions i el seu magatzem
- /nix/store/5gq8i4m09xkwvy6l0h7cqjm8x6jwf9a7-firefox-3.5-with-plugins/bin/firefox
- Els resums són calculats a partir del font
- Només lectura. Diferents derivacions tindran un resum diferent.
- Control de dependències en una base de dades
- Reutilització de components compartits
Expressió nix
let
peer = "Albert";
sayhello = who : derivation {
system = "i686-linux";
name = "hello-to-${who}.txt";
builder = /bin/sh;
args = [ "-c" "echo Hello ${who} says $system > $out" ];
};
showprogram = fromfile : derivation {
system = "i686-linux";
name = "show-program.sh";
builder = /bin/sh;
args = [ "-c" "echo cat ${fromfile} > $out" ];
};
in
rec {
alberthello = sayhello peer;
showhello = showprogram alberthello;
}
Nixpkgs
- Arbre de fitxers nix (llenguatge nix)
- Descriu com a derivacions centenars de programes i llibreries (2500 aquest dilluns)
- Generalment segueix la modularitat escollida pels desenvolupadors dels programes originals
- Incorpora una llibreria nix per a derivar fàcilment programes de sistemes Unix
- És una sola expressió nix
Nixpkgs: el constructor estàndard
- Script que construeix programes a l'estil GNU
- Baixa el paquet de font i comprova que estigui bé
- configure
- make
- make install
- Fàcilment li afegim etapes intermitges (pedaços, adaptacions al magatzem, ...)
Exemple facilet: screen
{stdenv, fetchurl, ncurses}:
stdenv.mkDerivation {
name = "screen-4.0.2";
src = fetchurl {
url = mirror://gnu/screen/screen-4.0.2.tar.gz;
md5 = "ed68ea9b43d9fba0972cb017a24940a1";
};
buildInputs = [ncurses];
}
Perfils
- Els perfils tenen l'aspecte d'un /usr
- Cal que l'usuari tingui al $PATH el seu perfil/bin
- Permeten utilitzar nix com un gestor de programes disponibles
- Instancia derivacions de nix
- Les construeix
- N'instal·la referències al perfil
- Controla generacions. Cada canvi dóna una nova generació.
- Les generacions permeten desfer canvis.
Aspecte dels perfils
$ ls -l /nix/var/nix/profiles/
... default -> default-3-link
... default-1-link -> /nix/store/mib0crll5jdhbcfip2lpdbh5ikgga8nj-user-environment
... default-2-link -> /nix/store/nhyrbhk6jmd6sbmfr9d6sbsxg3gz98qi-user-environment
... default-3-link -> /nix/store/kdnxnj41v2gg36yy9ngc42brypcv2mch-user-environment
$ ls /nix/var/nix/profiles/default
bin demo etc include jre libexec manifest sample share var
db doc i686-pc-linux-gnu info lib man opt sbin src
$ echo $PATH
/nix/var/nix/profiles/default/bin:....
$ ls -l ~/.nix-profile
/nix/var/nix/profiles/default
Maneig dels perfils
$ ls /nix/var/nix/profiles
default default-1-link default-2-link default-3-link
$ nix-env -i firefox # Actualització: nova generació 4
...
$ ls /nix/var/nix/profiles
default default-2-link default-4-link
default-1-link default-3-link
$ nix-env -e firefox # Desinstal·lació: nova generació 5
...
$ ls /nix/var/nix/profiles
default default-2-link default-4-link
default-1-link default-3-link default-5-link
$ nix-env --rollback # Desfer
...
$ ls -l /nix/var/nix/profiles/default
... default -> default-4-link
Personalització de components
- ~/.nixpkgs/config.nix : Aquí podem escriure-hi expressions nix que es barrejaran amb nixpkgs
- Podem afegir-hi derivacions que utilitzin nixpkgs pels nostres programes personalitzats
- Podem sobreescriure expressions de nixpgks o canviar-ne detalls
- El magatzem i els perfils ens serviran tan per components de nixpkgs com per components nostres
- Cada usuari pot tenir els seus perfils i les seves expressions nix
- Podem tenir una còpia modificada de nixpkgs (git, svn, ...)
Eines de nix
- nix-instantiate: avalua expressions nix, i genera fitxers de derivació (.drv)
- nix-store: consulta el magatzem, realitza derivacions (fa output paths), i porta el control d'escombraries
- nix-build: realitza atributs d'expressions nix (nix-instantiate + nix-store)
- nix-env: realitza atributs d'expressions nix prefixades a perfils i en controla les generacions (nix-build)
- nix-channel: gestiona la llista de canals per a nix-env
- nix-copy-closure: copia camins del magatzem entre màquines
Hydra: la granja de nixpkgs
- Els canals inclouen tan una expressió nix com un llistat de MANIFESTS
- Els MANIFESTS descriuen continguts de magatzem disponibles per a baixar precompilats
- Els resums del magatzem permeten distingir a quin codi font correspon cada precompilat
- Hydra té nous MANIFESTS per cada canvi a nixpkgs
- Hydra produeix precompilats per a múltiples plataformes
- La puresa de nixpkgs garanteix que els precompilats funcionaran a diferents sistemes
Fi de l'explicació del nix
- Podem gestionar programes instal·lats de manera determinista només amb el codi font dels programes i una expressió nix
- Els perfils i les generacions ens permeten actualitzacions atòmiques i desfer canvis
- Nix dóna total flexibilitat per a personalitzar la construcció de programes
- Els programes instal·lats no interfereixen
- Diferents usuaris poden tenir diferents perfils
Alguna pregunta?
NixOS
- Nix permet generar no només directoris de programes instal·lats, sino qualsevol fitxer
- La configuració dels serveis i programes d'un ordinador poden ser generats per nix
- Aquesta configuració es pot gestionar com perfils de nix, tenint així generacions
- Nixpkgs és una expressió nix per a generar un /usr
- NixOS és una expressió nix per a generar un GNU/Linux: /
- NixOS té la seva configuració en un sol fitxer nix:
/etc/nixos/configuration.nix
- NixOS no té /usr, /lib o /opt, i /bin només té l'sh
Avantatges de NixOS
- El 'grub' ens ofereix engegar altres generacions
- Podem commutar de generació sense reiniciar
- Només té una nova comanda: nixos-rebuild <boot|test|switch|build>
- Serveis gestionats per upstart
- Utilitza nixpkgs
- Permet replicar configuracions entre màquines fàcilment
- Les actualitzacions són tan fiables com acabar d'instal·lar de nou
- Primer construim la generació, i després commutem si volem
Exemple facilet de NixOS
{
boot = {
grubDevice = "/dev/sda";
};
fileSystems = [
{ mountPoint = "/";
device = "/dev/sda1";
options = "noatime";
}
];
networking = {
hostName = "mandarina";
domain = "local";
};
services = {
xserver = { enable = true; };
sshd = { enable = true; };
};
}
Nix i NixOS
- Sistema no-trivial de gestió del programari d'un ordinador
- Tenen molts avantatges respecte altres sistemes imperatius
- Cap prova o actualització espanta - sempre podem tornar enrera
- Les ISOs d'instal·lació de NixOS són una derivació més.
- La infrastructura del magatzem i els perfils es segueix fàcilment amb 'ls -l'
- Aprendre a utilitzar nix, igual que aprendre a utilitzar GNU/Linux,
pot estalviar molts maldecaps indesitjats
- No hi ha gaire més a explicar