│ │ │ │

Homelab - Le système d'exploitation (Episode 2)

NixOS

Homelab - Le système d'exploitation (Episode 2)

NixOS

Les épisodes :

Preface

Après avoir mis en place le réseau, nous allons installer le système d’exploitation.
Pour cela, j’utilise un mini-PC NiPoGi, un équivalent de NUC doté des caractéristiques suivantes :

  • CPU : AMD Ryzen 7 3750H (4 cœurs / 8 threads)
  • RAM : 16 Go
  • Disque : 512 Go

Cette configuration est idéale pour héberger un petit serveur proposant divers services.

Cherchant une solution de virtualisation simple et flexible, j’ai opté pour NixOS depuis octobre 2022. Bien que Proxmox soit un excellent outil, je privilégie un contrôle total sur l’hôte.

NixOS est une distribution immuable, permettant de figer les versions du système, comme le font pyproject.toml en Python ou package.json en JavaScript. Sa force réside dans sa capacité à revenir à une version stable en cas de mise à jour défectueuse.

Installation

Avec 6 à 10 ordinateurs (anciens et récents) à gérer chez moi, unifier leurs configurations sous NixOS me semble être une solution idéale. C’est pourquoi je l’utilise également pour mes serveurs.

C’est pour cette raison que j’utiliserais NixOS pour configurer mes serveurs.

Pour faciliter cette démarche, j’ai créé le projet nix-homelab, qui propose :

  • Une installation simplifiée de NixOS via un CD personnalisé.
  • Un partitionnement automatique des disques grâce à l’excellent disko.
  • L’installation centralisée de logiciels pour tous les utilisateurs (system wide).
  • Une gestion personnalisée des logiciels par utilisateur (home manager)
  • La réutilisation de configurations communes pour chaque machine installée.

Les étapes

Dans l’épisode précédent, j’ai réservé la plage réseau 192.168.x.16/28 pour les hyperviseurs. La première adresse disponible est 16, et notre hôte sera donc nommé hype16.

Pour installer NixOS, j’utilise un Zalman ZM-VE350 (un boîtier disque dur capable d’émuler un lecteur CD-ROM) et exécute les commandes suivantes depuis mon ordinateur portable :

# Clone le projet
git clone git@github.com:badele/nix-homelab.git
cd nix-homelab

# Entre dans un environnement immuable NixOS
nix develop

# Initialise le hote (création des crédentials)
just nixos-init-host hype16

# Installe NixOS
just nixos-install

# Commit du travail
git add .
git commit -m "feat: add new hype16 host"
git push

Résumé de la configuration

Je vais détailler les sections du fichier de configuration hosts/hype16

Modules communs

Les modules suivants sont importés pour la configuration :

  • Gestion du matériel.
  • Partitionnement via disko.
  • Création des utilisateurs système.
  • Installation des paquets communs.
  imports = [
    # Host and hardware configuration
    ./hardware-configuration.nix
    ./disks.nix
    ../../nix/modules/nixos/host.nix

    # Users
    ../root.nix
    ../badele.nix

    # Commons
    ../../nix/nixos/features/commons
    ../../nix/nixos/features/homelab
    ../../nix/nixos/features/system/containers.nix

    # Roles
    ../../nix/nixos/roles # Automatically load service from <host.modules> sectionn from `homelab.json` file
  ];

Configuration du démarrage et du système de fichiers

  • boot UEFI
  • support systeme de fichier BTRFS
  • Support de l’IP forwarding sur toutes les cartes
boot = {
  kernelParams = [ "mem_sleep_default=deep" ];
  supportedFilesystems = [ "btrfs" ];
  loader.grub = {
    enable = true;
    efiSupport = true;
    efiInstallAsRemovable = true;
  };
  kernel.sysctl."net.ipv4.conf.all.forwarding" = true;
};

Le réseau

La configuration réseau reprend les VLANs définis dans l’épisode précédent. Le port ether9 du routeur Mikrotik est configuré avec les VLANs LAN, ADM, et DMZ.

  • Désactvation du support IPv6
  • Activation des VLANs depuis la carte ethernet enp1s0 (tagged)
  • Création des interfaces des bridges et attributions des IPs pour les connecter avec les futurs containers/VMs (tagged)
  • Définition de la gateway et DNS pour l’ensemble des interfaces
networking = {
  enableIPv6 = false;
  hostName = "hype16";
  useDHCP = false;
  vlans = {
    vlandmz = { id = 32; interface = "enp1s0"; };
    vlanadm = { id = 240; interface = "enp1s0"; };
  };
  interfaces = {
    brlan = { ipv4.addresses = [{ address = "192.168.254.16"; prefixLength = 24; }]; };
    bradm = { ipv4.addresses = [{ address = "192.168.240.16"; prefixLength = 24; }]; };
    brdmz = { ipv4.addresses = [{ address = "192.168.32.16"; prefixLength = 24; }]; };
  };
  bridges = {
    brlan = { interfaces = [ "enp1s0" ]; };
    bradm = { interfaces = [ "vlanadm" ]; };
    brdmz = { interfaces = [ "vlandmz" ]; };
  };
  defaultGateway = "192.168.254.254";
  nameservers = [ "89.2.0.1" "89.2.0.2" ];
};

Vérification

Je vais m’assurez que hype16 a accès aux réseaux des VLANs LAN, ADM, DMZ. Pour cela je vais pinger les adresses des VLANs du routeur .253

PING 192.168.254.253 (192.168.254.253) 56(84) octets de données.
64 octets de 192.168.254.253 : icmp_seq=1 ttl=64 temps=0.416 ms

PING 192.168.240.253 (192.168.240.253) 56(84) octets de données.
64 octets de 192.168.240.253 : icmp_seq=1 ttl=64 temps=0.672 ms

PING 192.168.32.253 (192.168.32.253) 56(84) octets de données.
64 octets de 192.168.32.253 : icmp_seq=1 ttl=64 temps=0.288 ms

Le système est opérationnel. Dans le prochain épisode, je testerai un nouvel hyperviseur : Incus.

Sources

Pas de commentaire