Skip to main content
Seb's blog

Nixos, la distribution du future!

neofetch-nixos

Je dois dire que je suis sur le cul, la distribution parfaite, le truc où on se dit merde ça c'est le future! J'entendais de plus en plus parler de Nixos, ça me disais rien d'essayer, pourquoi je n'en sais trop rien, je ne voyais pas l'intérêt de ce genre de choses. J'ai eu le courage de passer le cap avec les vidéos de notre ami Vinceff et de ses compatriotes.

Avant de commencer, faut parler de ce qui a autour, des projets comme Fedora et sa Silverblue, ou encore openSUSE avec ses deux projet dont Microos et Kubic sont dans le principe des distributions a update atomique. Je vais pas aller sur wikipedia pour vous balancer ce qu'est atomique, je vais le dire avec mes mots, de mon point de vue c'est un OS qui fait des sauvegardes avant et après tout changement de configuration ou de changement d'état (installation de paquets, suppressions, updates...), si il se passe par malchance une coupure d'électricité, une mauvaise manipe, une configuration foireuse, il est toujours possible de revenir à l'état précédent et donc de retrouver un OS toujours utilisable. En gros, fini les updates qui foirent, les applications qui ne se lancent plus suite à un changement de config foireuse et j'en passe. On peut aussi installer tout un tas de choses, tester des environnements complets comme Gnome ou Plasma et repartir sur une configuration avant installation du dite bureau si ça nous plaît pas!

Le fait est que Nixos est encore a part de ça, elle est une distribution de type déclarative, contrairement à la plupart des autres distributions, nous avons un fichier de configuration où on écrit tout ce que l'on souhaite avoir sur l'OS et après ça compile/installe et configure ce que l'on a demandé. En gros, ça va parler à ceux qui utilisent des générateurs de sites statiques comme ici avec Pelican, ou encore comme Hugo, Jekyll et zola dont je parle fréquemment ici même, ça fait exactement ce que fait notre générateurs de sites statiques mais cette fois pour l'OS. Mon site à un gros fichier central, qui dit tout ce que je veux, ça passe des plugins, à la langue, à la façon de ranger le site, ect..., puis quand je lance la compilation de mon site, le générateur interroge ce fichier pour construire mon site. Et bien là c'est pareil mais pour l'OS. Juste géniale!

Voila à quoi ressemble mon fichier pelicanconf.py pour mon site généré par Pelican:

# -*- coding: utf-8 -*- #
from __future__ import unicode_literals

DEFAULT_LANG = u'fr'
LOCALE = ('fr_FR.UTF-8')

AUTHOR = 'Sebastien.C'
SITENAME = "Seb's blog"
SITESUBTITLE = 'PassionGNU/Linux, la passion du Libre...'
BIO = 'PassionGNU/Linux, la passion du Libre...'
THEME = 'themes/pelican-hyde'
COLOR_THEME = 'd11'
FONT_ACADEMICONS = True
DISPLAY_PAGES_ON_MENU = True

FOOTER_TEXT = 'Powered by <a href="http://getpelican.com">Pelican <img src="https://	passiongnulinux.tuxfamily.org/images/pelican.png" /></a> and <a href="https://github.com/jvanz/pelican-hyde/tree/7f8341ad1caa0469582adf3d0362f6c0be0ae218">Hyde Theme.</a>'
COPYRIGHT = '<p style="text-align:center">© 2007/2021 Copyleft Seb95 - Licence de ce site: <a class="external text" href="https://www.gnu.org/licenses/fdl.html" rel="nofollow">GNU Free Documentation License</a> — <a class="maintitle" href="https://passiongnulinux.tuxfamily.org" title="PassionGNU/Linux">PassionGNU/Linux</a> - La Passion Du Libre... est hébergé gracieusement par:<a href="https://www.tuxfamily.org"><img alt="https://www.tuxfamily.org/images/logotfsmall.png" class="transparent" src="https://www.tuxfamily.org/images/logotfsmall.png"></a></p>'
PUB = '<a href="https://www.debian.org/"><img src="https://www.debian.org/logos/bouton.jpg" /></a>'
INDEX_DESCRIPTION = 'PassionGNU/Linux, la passion du Libre...'
SITEURL = 'https://passiongnulinux.tuxfamily.org'
DEFAULT_CATEGORY = 'Divers'

PATH = 'content'

STATIC_PATHS = [
    'images',
    'extra',  # this
]

EXTRA_PATH_METADATA = {
    'extra/custom.css': {'path': 'custom.css'},
    'extra/robots.txt': {'path': 'robots.txt'},
    'extra/favicon.ico': {'path': 'favicon.ico'},  # and this
    'extra/CNAME': {'path': 'CNAME'},
    'extra/LICENSE': {'path': 'LICENSE'},
    'extra/README': {'path': 'README'},
}

SOCIAL_ICONS = [
   ('https://github.com/passionlinux', 'GitHub', 'fa-github'),
   ('/feed.rss', 'RSS Feed', 'fa-feed'),
]

PROFILE_IMAGE = 'icons/avatar1.png'
ICONS_PATH = 'images/icons'


PLUGIN_PATHS = ['plugins']
#PLUGINS = ['assets', 'neighbors', 'render_math']


TIMEZONE = 'Europe/Paris'

# Feed generation is usually not desired when developing
FEED_ATOM = 'atom.xml'
FEED_RSS = 'feed.rss'
FEED_ALL_ATOM = None
FEED_ALL_RSS = 'feeds/all.rss.xml'
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
CATEGORY_FEED_ATOM = None
CATEGORY_FEED_RSS = None
TAG_FEED_ATOM = None
TAG_FEED_RSS = None
TRANSLATION_FEED = None

# Blogroll
LINKS = (('Pelican', 'http://getpelican.com/'),
         ('Python.org', 'http://python.org/'),
         ('Jinja2', 'http://jinja.pocoo.org/'),
         ('Archive-Jekyll', 'https://passiongnulinux.tuxfamily.org/jekyll/'),)

# Social widget
SOCIAL = (('github', 'https://github.com/passionlinux'),)

DEFAULT_PAGINATION = 5
SUMMARY_MAX_LENGTH = 50

# Uncomment following line if you want document-relative URLs when developing
RELATIVE_URLS = True

# all defaults to True.
DISPLAY_HEADER = True
DISPLAY_FOOTER = True
DISPLAY_HOME   = True
DISPLAY_MENU   = True

# provided as examples, they make ‘clean’ urls. used by MENU_INTERNAL_PAGES.
TAGS_URL           = 'tags'
TAGS_SAVE_AS = 'tags/index.html'
AUTHORS_URL        = 'authors'
AUTHORS_SAVE_AS = 'authors/index.html'
CATEGORIES_URL     = 'categories'
CATEGORIES_SAVE_AS = 'categories/index'
ARCHIVES_URL       = 'archive'
ARCHIVES_SAVE_AS   = 'archive/index.html'
YEAR_ARCHIVE_SAVE_AS = '{#######date:%Y}/index.html'
MONTH_ARCHIVE_SAVE_AS = '{#######date:%Y}/{#######date:%m}/index.html'
ARTICLE_URL        = 'posts/{#######date:%Y}-{#######date:%m}-{#######date:%d}-{slug}/'
ARTICLE_SAVE_AS    = 'posts/{#######date:%Y}-{#######date:%m}-{#######date:%d}-{slug}/index.html'
PAGE_URL           = 'pages/{slug}/'
PAGE_SAVE_AS       = 'pages/{slug}/index.html'

# use those if you want pelican standard pages to appear in your menu
MENU_INTERNAL_PAGES = (
        ('Archives', ARCHIVES_URL, ARCHIVES_SAVE_AS),
)

# additional menu items
MENUITEMS = (
    ('Archive', '/archive/'),
    ('Forum', 'https://passiongnulinux.tuxfamily.org/forum'),
)

#TYPOGRIFY = True
CACHE_CONTENT = True
CONTENT_CACHING_LAYER = 'reader'
CACHE_PATH = 'cache'
GZIP_CACHE = True
LOAD_CONTENT_CACHE = True
DELETE_OUTPUT_DIRECTORY = True
TEMPLATES = ['404.html']
OUTPUT_SOURCES = False #Set to True if you want to copy the articles and pages in their original format (e.g. Markdown or reStructuredText) to the specified OUTPUT_PATH.

C'est assez indigeste pour le coup mais il est assez ultra complet, je suis sûr de pouvoir virer des trucs dedans... Pour Nixos c'est bien plus simple dans mon cas, bien entendu! Voila à quoi il ressemble pour une utilisation avec gnome:

# 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 systemd-boot EFI boot loader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  # boot.loader.grub.efiSupport = true;
  # boot.loader.grub.efiInstallAsRemovable = true;
  # boot.loader.efi.efiSysMountPoint = "/boot/efi";
  boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only

   networking.hostName = "debiacerlinux"; # Define your hostname.
   networking.networkmanager.enable = true;
# networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

   fileSystems."/home" =
  { device = "/dev/disk/by-label/home";
    fsType = "ext4";
  };
  # Set your time zone.
  # time.timeZone = "Europe/Amsterdam";
   time.timeZone = "Europe/Paris";

  # The global useDHCP flag is deprecated, therefore explicitly set to false here.
  # Per-interface useDHCP will be mandatory in the future, so this generated config
  # replicates the default behaviour.
  networking.useDHCP = false;
  networking.interfaces.enp2s0.useDHCP = true;
  networking.interfaces.wlo1.useDHCP = true;

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Select internationalisation properties.
  # i18n.defaultLocale = "en_US.UTF-8";
  # console = {
  #   font = "Lat2-Terminus16";
  #   keyMap = "us";
  # };
  i18n.defaultLocale = "fr_FR.UTF-8";
   console = {
     font = "Lat2-Terminus16";
     keyMap = "fr";
   };

  # Enable the X11 windowing system.
  services.xserver.enable = true;


  # Enable the GNOME Desktop Environment.
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
#  services.xserver.displayManager.autoLogin.enable = true;
#  services.xserver.displayManager.autoLogin.user = "sebastien";
  services.gnome.games.enable = true;
  services.xserver.videoDrivers = [ "nvidia" ];

# hardware.nvidia.modesetting.enable = true;

  # Configure keymap in X11
  services.xserver.layout = "fr";
  services.xserver.xkbOptions = "eurosign:e";

  # Enable CUPS to print documents.
  services.printing.enable = true;
  services.printing.drivers = [ pkgs.hplip pkgs.gutenprint ];

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

  # Enable touchpad support (enabled default in most desktopManager).
   services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  # users.users.jane = {
  #   isNormalUser = true;
  #   extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
  # };
  users.users.sebastien = {
     isNormalUser = true;
     home = "/home/sebastien";
  description = "Sebastien CHAVAUX";
  extraGroups = [ "wheel" "networkmanager" ];
  };

  nixpkgs.config.allowUnfree = true; 
  
  # List packages installed in system profile. To search, run:
  # $ nix search wget
  # environment.systemPackages = with pkgs; [
  #   vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed 	by default.
  #   wget
  #   firefox
  # ];
   environment.systemPackages = with pkgs; [
  #   vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed 	by default.
   firefox
   mldonkey
   wget
   mc
   thunderbird
   vlc
   smplayer
   mpv
   mplayer
   deluge
   quodlibet
   qbittorrent
   amule
   gnomeExtensions.gsconnect
   aspellDicts.fr

   ];

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "21.11"; # Did you read the comment?

}

Alors le soucis principale de cette distribution, c'est qu'il faut se taper la documentation car oui rien n'est semblable à ce que l'on peut trouver par ailleurs. Je pense par exemple à la configuration des serveurs, il y a bien des fichiers dans /etc mais par exemple rien pour minidlna, je n'ai pas su comment lui dire ma configuration et en même temps je n'ai pas chercher plus loin que le bout de mon nez. Je pense qu'il faut coller des sections qu'on veut changer directement dans ce fichier central, on verra bien.

L'autre chose c'est les nix-shell, c'est un peu à part, je sais pas si c'est top ou si c'est trop pour moi, je vois plein de possibilités et en même temps je me dis pourquoi encore réapprendre ce truc. En gros c'est faire un environnement qui s'effacera une fois qu'on en sortira, pour faire ce qu'on devrait faire normalement avec pip ou gem, ce n'est qu'une possibilité d'utilisation, en fait il n'y a pas de limites... Vous comprendrez mieux avec des explications plus claires, comme sur ce blog et sa version non traduite.

Nixos est une excellente idée pour les utilisateurs qui ont constamment besoin de créer, d'installer, de modifier ou de tester des applications et des environnements sur leurs systèmes d'exploitation. Étant donné que le fait d'être capable d'effectuer fréquemment de telles actions sans crainte ni préoccupation pour altérer ou endommager le système d'exploitation utilisé et d'être capable de revenir à l'état initial en changeant juste une ligne dans un fichier, est vraiment un atout inestimable.

Exemple tout bête, je viens de tester 4 environnements de bureau, alors Gnome, Plasma, Pantheon, Xfce les uns après les autres et j'ai pu revenir à l'état initial avant ces essaies. Sous Debian, Arch, Gentoo, Mageia, j'aurais dû passer par une action de nettoyage intensif pour qu'il ne reste aucunes traces des bureaux testés. Et bien sous Nixos, pour installer plasma, il suffit d'ajouter ces lignes dans notre fichier configuration(/etc/nixos/configuration.nix):

nixos changement de bureau

services.xserver.desktopManager.plasma5.enable = true;
services.xserver.displayManager.sddm.enable = true;

nixos plasma

nixos plasma+htop+neofetch

Vous voulez Gnome, c'est simple on commente les deux précédentes pour Plasma ou bien on les vire et on ajoute ceci à la place:

services.xserver.desktopManager.gnome.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.gnome.games.enable = true;

nixos gnome

Vous êtes plutôt Xfce:

services.xserver.desktopManager.xfce.enable = true;
services.xserver.displayManager.defaultSession = "xfce";
services.xserver.displayManager.lightdm.enable = true;

nixos xfce

nixos xfce4

Vous voulez l'autologin:

services.xserver.displayManager.autoLogin.enable = true;
services.xserver.displayManager.autoLogin.user = "nom-utilisateur";

Et à chaque changement de configutation, il faut recharger la nouvelle:

# nixos-rebuild switch

Vous l'aurez compris, je suis emballé par la chose, c'est assez déroutant et je sais pas si je vais la garder sur ma machine principale, mais pour le moment l'attrait a été assez grande pour que ma Debian soit releguée!

Les choses qui me dérange est la communauté francophone quasi inexistante si ce n'est sur IRC et le channel #nixos-fr ou encore via matrix. Pas besoin de regarder sur leur forum tout est en anglais... L'autre chose qui me dérange c'est que je perds mes petites dedans tellement j'ai de choses qui changent.

Commencer la discussion: Venez écrire un commentaire dans le forum