Journal Gérer son environnement utilisateur NixOS, avec Home-manager

Posté par (page perso) . Licence CC by-sa.
16
11
nov.
2019

Sommaire

Home-manager est un outil qui permet de gérer son environnement utilisateur : environnement de bureau, thème de fenêtre, thème d'icones, logiciels, paramètres des logiciels, services utilisateur, "dot files"…

Home-manager est prévu pour fonctionner sur la distribution linux NixOS et utilise le gestionnaire de paquets Nix.

code source - vidéo youtube - vidéo peertube

Présentation de home-manager

Pour faire simple, le but de home-manager est de fournir l'équivalent du fichier /etc/nixos/configuration.nix mais pour l'environnement utilisateur (au lieu de l'environnement système). Plus précisemment, l'utilisateur décrit sa configuration via un fichier ~/.config/nixpkgs/home.nix et lance une commande home-manager pour construire et installer la configuration correspondante.

Home-manager est capable de gérer finement l'environnement logiciel. Il permet non seulement d'indiquer l'environnement de bureau, les logiciels et les services à installer mais également de paramètrer tous ces éléments. Par exemple, home-manager peut configurer le user.name de git, les extensions de firefox, la police de caractères de vscode

Attention, home-manager n'est pas un outil officiel de Nix. Il est encore en développement, et donc incomplet. Enfin, il est prévu pour NixOS; son fonctionnement sur une autre distribution n'est pas garanti.

Voir le site officiel de home-manager et le wiki NixOS.

Installation

Home-manager est fourni dans les dépôts de paquets de Nix. Il est donc très simple à installer :

$ nix-env -iA nixos.home-manager

Premier exemple de configuration utilisateur

Le point d'entrée d'une configuration home-manager est le fichier ~/.config/nixpkgs/home.nix. Par exemple, le fichier suivant installe les logiciels geany, meld et vlc, et configure le clavier en français bépo.

{ pkgs, ... }: {
  home.packages = with pkgs; [
    geany
    meld
    vlc
  ];
  home.keyboard = {
    layout = "fr";
    variant = "bepo";
  };
}

Home-manager est documenté dans les pages man. Pour connaitre les options de configuration disponibles, il suffit de lancer :

$ man home-configuration.nix

Enfin, pour installer ou mettre à jour la configuration, on lance la commande :

$ home-manager switch

Séparer les fichiers de configuration

Pour éviter d'avoir un gros fichier home.nix difficile à lire, on peut le découper en plusieurs fichiers. Par exemple, on peut mettre les logiciels à installer dans un fichier ~/.config/nixpkgs/packages.nix :

{ pkgs, ... }: {
  home.packages = with pkgs; [
    geany
    meld
    vlc
  ];
}

et importer ce fichier dans le ~/.config/nixpkgs/home.nix :

{ pkgs, ... }: {
  imports = [
    ./packages.nix
  ];
  home.keyboard = {
    layout = "fr";
    variant = "bepo";
  };
}

Configurer des logiciels utilisateurs

Home-manager permet de régler les paramètres de certains programmes. Par exemple, on peut ajouter le code suivant dans le home.nix pour installer firefox et bash (avec des alias shell) :

  programs = {
    firefox.enable = true;
    bash = {
      enable = true;
      shellAliases = {
        ll = "ls -lh";
        la = "ls -a";
      };
    };
  };

Autre exemple, on peut configurer git dans un fichier git.nix, que l'on importera dans home.nix :

{ pkgs, ... }: {
  programs.git = {
    enable = true;
    userName = "nokomprendo";
    userEmail = "nokomprendo@example.com";
    ignores =  [
      "*~"
      "*.swp"
    ];
}

Après mise-à-jour, le client git est configuré :

$ home-manager switch
...

$ git config --get user.name
nokomprendo

Configurer l'environnement de bureau

Home-manager peut configurer le thème de fenêtre et le thème d'icones. Par exemple, pour un thème "dark" :

  gtk = {
    enable = true;
    iconTheme = {
      name = "Adwaita";
      package = pkgs.gnome3.adwaita-icon-theme;
    };
    theme = {
      name = "Shades-of-gray";
      package = pkgs.shades-of-gray-theme;
    };
  };
  qt = {
    enable = true;
    platformTheme = "gtk";
  };

Home-manager peut également configurer finement certains environnements de bureau. Par exemple, avec i3 :

  xsession.enable = true;
  xsession.windowManager.i3 = {
    enable = true;
    config = let mod = "Mod4"; in {
      fonts = [ "DejaVu Sans 12" ];
      modifier = mod;
      keybindings = pkgs.lib.mkOptionDefault {
        "${mod}+m" = "exec ${pkgs.i3lock}/bin/i3lock -n -c 000000";
      };
    };
  };

Penser, dans ce cas, à activer le paquet dconf du service dbus, dans /etc/nixos/configuration.nix :

  services.dbus.packages = [ pkgs.gnome3.dconf ];

Gérer des "dot files"

Home-manager suit le fonctionnement habituel de Nix. Par exemple, quand on configure bash dans le home.nix (cf précédemment), Nix crée un fichier de configuration .bashrc dans le /nix/store et ajoute un lien symbolique dans le dossier utilisateur :

$ ll ~/.bashrc 
lrwxrwxrwx 1 toto users 70 11 nov.  15:48 /home/toto/.bashrc -> /nix/store/z2arwbwyhvvwhy2caazlxasw5jnscyg3-home-manager-files/.bashrc

Cependant, home-manager peut également gérer des "dot files" classiques. Par exemple, on peut centraliser des "dot files" dans le dossier ~/.config/nixpkgs/ et demander à home-manager de les gérer, via le home.nix (il va alors les copier dans le /nix/store et créer les liens symboliques) :

  home.file.".i3status.conf".source = ./i3status.conf;

Utiliser les overlays et cachix

Comme home-manager est basé sur Nix, on peut utiliser les outils Nix classiques, comme les overlays ou cachix.

Par exemple, on peut empaqueter le plugin Vim minibufexpl en ajoutant un fichier dans le dossier ~/.config/nixpkgs/overlays/ :

self: super: {
  vimPlugins = super.vimPlugins // {
    minibufexpl = super.vimUtils.buildVimPluginFrom2Nix { 
      name = "minibufexpl.vim-2013-06-16";
      src = self.fetchgit {
        url = "https://github.com/fholgado/minibufexpl.vim";
        rev = "ad72976ca3df4585d49aa296799f14f3b34cf953";
        sha256 = "1bfq8mnjyw43dzav8v1wcm4rrr2ms38vq8pa290ig06247w7s7ng";
      };
      dependencies = [];
    };
  };
}

On peut ensuite utiliser ce plugin dans notre configuration Vim. Si on a déjà empaqueté ce plugin sur une autre machine et envoyé le paquet binaire sur un dépôt cachix, on peut utiliser ce cache et éviter de reconstruire le paquet :

$ cachix use nokomprendo
Configured https://nokomprendo.cachix.org binary cache in /home/toto/.config/nix/nix.conf

$ home-manager switch
...
copying path '/nix/store/2pkqy6nv5vmqq6cw7zhyd44qw7vigg4l-vimplugin-minibufexpl.vim-2013-06-16' from 'https://nokomprendo.cachix.org'...
...

Conclusion

Home-manager est un outil basé sur Nix et qui permet de configurer son environnement utilisateur. Le projet est encore en développement mais il est déjà très exploitable, s'intègre bien avec l'écosystème Nix et apporte des fonctionnalités intéressantes : spécifier et paramétrer l'environnement de bureau, les thèmes et les logiciels, gérer des "dot files" classiques, utiliser des overlays, utiliser cachix, etc.

  • # Nix ta distrib' !

    Posté par . Évalué à 4 (+4/-2). Dernière modification le 12/11/19 à 09:28.

    C'est vraiment intéressant ces derniers journaux présentant les outils liés à Nix. Utilisant plusieurs PC, ça pourrait me permettre de déployer plusieurs logiciels et environnements que j'utilise, du coup je vais regarder avec intérêt comment utiliser tout ça (je vais commencer par le gestionnaire de paquets).

    À l'époque j'avais apprécié d'utiliser les recettes de AUR dans archlinux, ça me semble un peu similaire. J'avais aussi essayé pkgsrc, l'outil de NetBSD, mais à cette lointaine époque ça fonctionnait moyen avec Linux…

  • # Fais une dépêche

    Posté par (page perso) . Évalué à 5 (+3/-0).

    très peu retravaillés, tes 3 derniers journaux feraient une belle dépêche

    "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

  • # DLL-Hell-o-world

    Posté par . Évalué à 1 (+1/-0).

    Je travaille dans une entreprise où tout est sclérosé, où les environnements sont vieux, etc.
    J’avais regardé avec interêt nix pour me construire un système moderne sans avoir à me palucher toutes les recherches des dépendances à la main, ni tous les ./configure --prefix=… && make && make install.
    Malgré mes efforts (c’était au moment de nix 2.0.x), je n’avais pas réussi à faire marcher les installations ailleurs que dans /nix.
    Comme je n’étais pas root et que bien sûr un tel répertoire était impossible à obtenir, j’avais dû abandonner.
    Sais-tu si ça marche de ce côté-là ?

    Deuxième question, tu présentes pas mal de personnalisations des paquets nix, ce qui m’intéresse beaucoup.
    Je travaille dans la simulation numérique et j’ai jeté un œil à spack qui permet d’installer des paquets en personnalisant les dépendances par de simples arguments depuis la ligne de commande. Détail très utile dans mon cas, le compilateur utilisé pour la construction fait lui-même partie des dépendances (configurables) et peut coexister avec le même paquet compilé avec un autre compilateur !
    Quand on travaille avec 3 versions de 4 compilateurs différents, c’est vraiment pratique.
    Que penses-tu de l’utilisation de nix (et de toutes les variations que tu présentes en ce moment : je te remercie) dans ce contexte ?

    • [^] # Re: DLL-Hell-o-world

      Posté par (page perso) . Évalué à 3 (+1/-0).

      Comme je n’étais pas root et que bien sûr un tel répertoire était impossible à obtenir, j’avais dû abandonner.
      Sais-tu si ça marche de ce côté-là ?

      C'est trés fortement déconseillé de ne pas utiliser /nix. Si tu n'as pas les droits roots, tu peux par contre simuler un "/nix" en utilisant un mount bind et les linux namespaces.

      Je travaille dans la simulation numérique et j’ai jeté un œil à spack qui permet d’installer des paquets en personnalisant les dépendances par de simples arguments depuis la ligne de commande.

      Spack est trés bon mais il ne supporte pas le deploiement de binaires de manière fiable… car justement il n'a pas de prefix absolu comme "/nix". Donc tu dois souvent tout recompiler dés que tu changes de machine.

      Que penses-tu de l’utilisation de nix (et de toutes les variations que tu présentes en ce moment : je te remercie) dans ce contexte ?

      Tu peux avoir 50 compilateurs en parallèle avec Nix, ce n'est pas un problème. Configurer un nouveau compilateur n'est pas la chose la plus accessible à faire par contre.

      • [^] # Re: DLL-Hell-o-world

        Posté par . Évalué à 2 (+1/-0).

        utilisant un mount bind et les linux namespaces

        sans les droits root c'est possible ?

        • [^] # Re: DLL-Hell-o-world

          Posté par (page perso) . Évalué à 2 (+0/-0).

          Oui mais ça dépend de la config Kernel de ton installation.

          • [^] # Re: DLL-Hell-o-world

            Posté par (page perso) . Évalué à 9 (+6/-0).

            Donc, si tu n'as pas les droits, il suffit de modifier la config du kernel.

            « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: DLL-Hell-o-world

        Posté par . Évalué à 1 (+1/-0).

        Donc tu dois souvent tout recompiler dés que tu changes de machine.

        Ca ne me dérange pas trop, tant que tout le processus est fluide et les dépendances sont propres, ce n'est "que" du temps machine.

        Tu peux avoir 50 compilateurs en parallèle avec Nix, ce n'est pas un problème.

        Donc un même paquet (disons une bibliothèque), avec les mêmes options et tout et tout, mais compilé avec un compilateur GNU et un autre Intel (par ex) vont pouvoir vivre leur vie proprement dans l'écosystème nix sans conlits vicieux ? Bonne nouvelle, je vais essayer!

    • [^] # Re: DLL-Hell-o-world

      Posté par (page perso) . Évalué à 2 (+1/-0).

      Sais-tu si ça marche de ce côté-là ?

      J'avais écrit un article sur le sujet il y a un moment (https://yann.hodique.info/blog/nix-in-custom-location/). Utiliser un overlay pour ça est relativement élégant (note que je n'ai plus le problème actuellement, il est possible que les instructions nécessitent une mise à jour).
      Cachix n'existait pas à l'époque, j'aurais probablement utilisé ça comme moyen de distribuer ma propre version de Nix utilisant ${HOME}/nix

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.