Le Blog Utux

HTTP 200 GET /

Aperçu de NixOS en desktop

Rédigé par uTux 4 commentaires

Il y a un peu plus de 2 ans j'ai parlé de NixOS, distribution Linux atypique dans le sens où sa configuration se fait de manière déclarative à un unique emplacement.

NixOS logo

Mon ordinateur pro et ma machine gaming sont sous Windows, j'utilise donc très souvent des machines virtuelles Linux pour pouvoir travailler. Habituellement j'utilise Virtualbox + Debian + Mate, mais j'ai décidé d'expérimenter NixOS. Alors oui je sais qu'une machine virtuelle n'est pas représentative d'un cas d'usage réel, mais ça permet de se faire une première idée.

Installation

J'ai installé NixOS avec la configuration suivante:

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Use the GRUB 2 boot loader.
  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
  # Define on which hard drive you want to install Grub.
  boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only

  # Networking
  networking.hostName = "nixos"; # Define your hostname.
  networking.networkmanager.enable = true;

  # Select internationalisation properties.
  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "fr";
    defaultLocale = "fr_FR.UTF-8";
  };

  # Set your time zone.
  time.timeZone = "Europe/Paris";

  # Repositories
  nixpkgs.config.allowUnfree = true;

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    ansible
    dnsutils
    firefox-bin
    gimp
    git
    htop
    keepassxc
    libreoffice
    networkmanagerapplet
    parcellite
    p7zip
    sudo
    syncthing
    syncthing-gtk
    thunderbird-bin
    tree
    unzip
    vim
    vscode
    xarchiver
  ];

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable sound.
  sound.enable = true;
  hardware.pulseaudio.enable = true;

  # Mate
  services.xserver = {
    enable = true;
    layout = "fr";
    xkbOptions = "eurosign:e";
    desktopManager = {
      default = "mate";
      xterm.enable = false;
      mate.enable = true;
    };
  };

  # Docker
  virtualisation.docker.enable = true;
  
  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.utux = {
    isNormalUser = true;
    extraGroups = [ "wheel" "networkmanager" "docker" ];
  };

  # Nix Garbage Collector
  nix.gc = {
    automatic = true;
    dates = "weekly";
    options = "--delete-older-than 30d";
  };

  # This value determines the NixOS release with which your system is to be
  # compatible, in order to avoid breaking some software such as database
  # servers. You should change this only after NixOS release notes say you
  # should.
  system.stateVersion = "19.09"; # Did you read the comment?
  system.autoUpgrade.enable = true;

}

Environnement desktop

NixOS Mate

La gestion centralisée de la configuration s'applique au système, mais pas au $HOME de l'utilisateur. Les raccourcis, les thèmes de bureau, les profils se gèrent "à la main", ce qui m'amène à penser que NixOS perd un peu d'intérêt en usage desktop. Cependant, ce point pourrait bientôt changer avec Home-manager.

Lors de la rédaction de cet article, la version de Mate est la 1.22.1 donc très récente, un bon point. Dans la liste des paquets installés, notez firefox-bin et thunderbird-bin. Couplés à l'activation du repo unfree, cela permet d'installer les versions à jour et upstream. Les paquets firefox et thunderbird sont des versions ESR dépourvues du branding de Mozilla, un peu comme Iceweasel et Icedove pour Debian il y a quelques années.

La version de Keepassx fournie par Nix (0.4.4) est trop vieille pour être utilisable avec le format .kdbx, j'ai donc du installer keepassxc à la place. Vscode est disponible lui aussi grâce au repo unfree.

Python...

Globalement je retrouve donc mon environnement et mes applications favorites, mais je dois quand même parler de Python. Sur Debian, j'utilise généralement pip pour installer une version récente de Ansible et Molecule, mais sur NixOS je n'ai simplement pas compris comment ça marche :/ Il y a pourtant une documentation dédiée à Python mais elle a tendance à ne pas situer correctement les contextes ou ne pas donner assez d'exemples. Donc pas de pip pour le moment, j'ai utilisé le paquet NixOS de Ansible.

Performances

En ce qui me concerne, l'utilisation du bureau Mate dans Virtualbox sur NixOS n'est pas très fluide :/ que ce soit l'ouverture d'un onglet, le déplacement d'un fenêtre, le lancement d'un logiciel, tout accuse de saccades et de lags. Debian s'en sort mieux sur ce point, à configuration presque identique (2 vspus, 2Go de ram, vboxsvga, 32Mo vram), mais cette dernière utilise Mate 1.20.4 et pas 1.22.1.

Lorsque j'ai fait des tests sur une machine peu puissante, j'ai remarqué que nixos-rebuild arrive à mettre à genoux le système et les autres VMs, à cause des écritures sur le disque. Et à propos du disque, il faut parler de l'utilisation du stockage. Par nature, NixOS garde plusieurs versions de la configuration (overlays) et des paquets installés, pensez à des snapshots, donc on se doute que l'espace utilisé est important, très important. On peut facilement consommer 30 Go après quelques semaines, ce qui m'amène au point suivant.

Penser au nettoyage (garbage collector)

Heureusement il existe le Garbage collector qu'il faut régulièrement lancer en root:

[utux@nixos:~]$ sudo nix-collect-garbage -d
[...]
deleting '/nix/store/39s914agmm045fv7l3lz81zcvw86m3vb-xsltml_2.1.2.zip.drv'
deleting '/nix/store/5vy6k04dhrwn0951z7dnpkqyxp3r7ws0-jasper-2.0.16-bin'
deleting '/nix/store/p5c18w2cksfxw748d4f8l31rlfk8z1vg-font-adobe-100dpi-1.0.3'
deleting '/nix/store/mny4fywzpgb2yi54a0vz97f5kxlb8932-unit-systemd-modules-load.service.drv'
deleting '/nix/store/xbl8wj6293nfw3vziwqd5xmhrk5gdq6b-rand_hc-0.1.0.tar.gz.drv'
deleting '/nix/store/trash'
deleting unused links...
note: currently hard linking saves -0.00 MiB
8134 store paths deleted, 11574.19 MiB freed

Dans l'exemple ci-dessus, le système a nettoyé pas loin de 11,6 Go de paquets inutiles ! Il est possible d'automatiser ce nettoyage.

Documentation

NixOS a un manuel très détaillé et très instructif. On trouve aussi beaucoup d'informations sur des fils reddit et github. Il est tout de même fréquent de devoir aller lire le code pour savoir comment se configurer un logiciel pour NixOS, ce qui est intimidant au début mais on s'habitue.

Conclusion

Hé hé, un test ou un aperçu d'une distribution est un exercice que je n'ai pas fait depuis longtemps. Je vous encourage à tester NixOS, sur serveur ou en desktop. Cette distribution n'est pas comme toutes les autres que vous connaissez et elle vous plaira particulièrement si vous faites du devops et que vous cherchez une solution pour versionner les configurations de vos bécanes.

Je dois tout de même avouer que l'utilisation desktop est un peu laborieuse, surtout à cause des mauvaises performances dans Virtualbox (qui font que je reviens souvent à ma Debian) mais aussi à l'absence de gestion centralisée des $HOME (pour cela je testerai Home-manager.).

Utiliser NixOS met un peu de piment dans ma vie de Linuxien trop habitué à la Debian family et à la Red Hat family :)

4 commentaires

#1  - Sébastien a dit :

L'installation de packages Python se fait en créant un environnement qui contient les paquets en question (pas besoin de pip donc). En pratique, il faut créer un fichier `.config/nixpkgs/config.nix` avec les lignes suivantes:

```
{
packageOverrides = pkgs: with pkgs; {
python3Env = python37.withPackages (ps: with ps;
[
matplotlib
numpy
scipy
]
);
};
}
```
puis installer l'environnement dans son profil avec:

```
nix-env -iA python3Env
```

Répondre
#2  - Bzizou a dit :

Et sur cette base de python "environné nix", on peut ensuite faire un virtualenv et du pip dedans.

Répondre
#3  - uTux a dit :

Je déteste jouer les débutants, mais cela ne fonctionne pas:
error: attribute 'python3Env' in selection path 'python3Env' not found

Répondre
#4  - nokomprendo a dit :

Il y a une erreur dans la commande. Il faut faire : nix-env -iA nixos.python3Env

Une autre possibilité, c'est de faire des configurations par projet. Par exemple, si tu as un projet qui utilise numpy, tu peux mettre, dans son dossier, un fichier shell.nix contenant :

with import <nixpkgs> {};
(python3.withPackages ( ps: with ps; [ numpy ])).env

Il suffit ensuite de lancer la commande nix-shell dans ce dossier et Nix crée un environnement avec python et numpy. Pas besoin de virtualenv ou autre. Encore mieux : Nix peut faire ça pour plein de langages, pas seulement python. Il y a quelques articles qui parlent de ça sur mon blog, si ça t'intéresse.

Répondre

Écrire un commentaire

Quelle est le deuxième caractère du mot 6qaf3 ?