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.
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
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:
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 :)
Depuis la publication de ce billet, vscode est à la mode. Et pourtant il y a de quoi grincer des dents, on pense immédiatement à Visual Studio et à Microsoft, s'agit-il d'une usine à gaz propriétaire qui sert à pondre du code pour IE6? Pas du tout.
vscode n'est pas Visual Studio, c'est un éditeur de texte avancé plutôt léger, sous licence libre (Expat), avec pas mal de plugins pour les différents langages. Et oui il s'agit de Microsoft, mais comme beaucoup j'ai passé l'âge de jouer à l'intégriste, et on peut dire qu'ils font des efforts depuis quelques années. En ce qui me concerne j'ai toujours codé avec vim, mon premier contact avec vscode fut donc un premier contact avec ce genre d'éditeur de texte. Et pour le moment je me prends au jeu, j'utilise vscode, c'est vraiment pas mal.
J'aime la possibilité de visionner mon arborescence, travailler sur un fichier tout en ayant un terminal à disposition (par exemple pour tester des playbook Ansible). Il y a un léger temps d'adaptation pour apprendre les raccourcis (ctrl+s), mais ça reste plus facile que vim :) Je n'ai pas réussi à configurer l'utilisation d'un proxy http (oui, ça existe encore dans certaines entreprises...) ce qui m'a obligé à passer par proxychains.
Je n'aime pas l'autocomplétion, par exemple quand je veux ajouter un <strong> devant un mot, il ajoute automatiquement le </strong> mais pas au bon endroit. Pareil quand on manipule les double quote " dans les yaml, l'ajout et suppression peut devenir un enfer. Mais bon c'est toujours moins pire que vim et son indentation agaçante dans les dernières versions :) et ça se maîtrise.
Je continue à utiliser vscode, on verra si dans 6 mois je suis revenu sur vim ou pas :)
En 2018, en matière de containers il n'y a pas que Docker ou LXC, il y a aussi FreeBSD et ses jails :) en fait ça existait longtemps avant et c'est plutôt bien fichu. J'ai longtemps utilisé le framework ezjail qui a l'avantage d'être simple et de fonctionner sans ZFS (j'avais un serveur anémique à base d'Atom 32 bit).
J'utilise FreeNAS et bien que leur web-ui permette depuis longtemps de créer des jails, cette solution est trop rigide, il est par exemple impossible d'upgrader une jail :( Bonne nouvelle, dans les dernières versions (avec le web-ui en beta ou via la ligne de commandes) on a droit à iocage qui est plus souple et supporte (entre autres) les upgrades.
Création d'une jail FreeBSD
Tout comme iohyve, il faut commencer par définir un pool de stockage ZFS. Cela peut être un pool existant, il ne l'écrase pas mais créé quelques datasets. Par exemple pour utiliser le pool data:
[root@freenas] ~# iocage activate data
ZFS pool 'data' successfully activated.
Ensuite on télécharge un template qui va servir à créer nos jails. Par exemple pour récupérer 11.1-RELEASE:
[root@freenas] ~# iocage fetch
[0] 9.3-RELEASE (EOL)
[1] 10.1-RELEASE (EOL)
[2] 10.2-RELEASE (EOL)
[3] 10.3-RELEASE
[4] 10.4-RELEASE
[5] 11.0-RELEASE (EOL)
[6] 11.1-RELEASE
Type the number of the desired RELEASE
Press [Enter] to fetch the default selection: (11.1)
Type EXIT to quit: 6
Fetching: 11.1-RELEASE
Downloading : MANIFEST [####################] 100% 0Mbit/s
Downloading : base.txz [####################] 100% 13.44Mbit/s
Downloading : lib32.txz [####################] 100% 12.66Mbit/s
Downloading : doc.txz [####################] 100% 10.76Mbit/s
Downloading : src.txz [####################] 100% 11.94Mbit/s
11.94Mbit/sExtracting: base.txz...
Extracting: lib32.txz...
Extracting: doc.txz...
Extracting: src.txz...
* Updating 11.1-RELEASE to the latest patch level...
src component not installed, skipped
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... done.
Fetching metadata signature for 11.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 151 patches.....10....20....30....40....50....60....70....80....90....100....110....120....130....140....150 done.
Applying patches... done.
The following files will be updated as part of updating to 11.1-RELEASE-p9:
[--- blablabla ---]
Installing updates... done.
On lui met une adresse IP (en mode shared car j'ai encore quelques soucis avec le VNET):
root@freenas:~ # iocage set vnet=off unbound
Property: vnet has been updated to off
root@freenas:~ # iocage set ip4_addr="em0|192.168.0.201/24" unbound
Property: ip4_addr has been updated to em0|192.168.0.201/24
On démarre la jail:
root@freenas:~ # iocage start unbound
* Starting unbound
+ Started OK
+ Starting services OK
On entre dans la jail:
root@freenas:~ # iocage console unbound
FreeBSD 11.1-RELEASE (GENERIC) #0 r321309: Fri Jul 21 02:08:28 UTC 2017
Welcome to FreeBSD!
Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories: https://www.FreeBSD.org/security/
FreeBSD Handbook: https://www.FreeBSD.org/handbook/
FreeBSD FAQ: https://www.FreeBSD.org/faq/
Questions List: https://lists.FreeBSD.org/mailman/listinfo/freebsd-questions/
FreeBSD Forums: https://forums.FreeBSD.org/
Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with: pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.
Show the version of FreeBSD installed: freebsd-version ; uname -a
Please include that output and any error messages when posting questions.
Introduction to manual pages: man man
FreeBSD directory layout: man hier
Edit /etc/motd to change this login announcement.
root@unbound:~ #
Autres features
Créer ses propres templates, utile pour créer des jails prêtes à l'emploi (avec SSH + authorized_keys, par exemple).
Upgrade des jails
Snapshots (et oui, zfs...)
VNET (la jail a sa propre stack réseau, utile pour les manipulations pare-feu ou vpn)
Limitations CPU & mémoire
Installation automatique de paquets
Montage de volumes bind
Création de jails kFreeBSD (à titre de proof of concept)
A la manière des dataset/pool zfs, chaque jail a des propriétés modifiables (get/set)
Ecrit en python
Conclusion
J'utilise iocage pour une jail backuppc et j'en suis plutôt content. Si l'aspect VNET reste à améliorer, on a quand même fait un grand pas par rapport à la solution maison de FreeNAS.
iocage c'est le meilleur de FreeBSD: les jails et zfs. La syntaxe est claire, facile à retenir et me donne presque envie de m'y remettre et de migrer tous mes services dessus. Je vous encourage à l'essayer! Je vous encourage aussi à manger du FreeNAS, c'est bon pour la santé.
Proxmox VE fait partie de ces projets cool à vocation commerciale mais libre et distribué gratuitement avec toutes les fonctionalités (comme FreeNAS). Il s'agit d'une solution de virtualisation basée sur Linux-KVM + LXC, le tout avec un web-ui plutôt bien fichu. Aperçu des fonctionnalités:
Cluster simili-HA (non testé)
Web-ui HTML5
Multiples backend de stockage: local, LVM, iSCSi, Ceph, Gluster, ZFS
Snapshots à chaud
Backups à chaud
Ajout CPU/RAM/disk à chaud (pas testé)
Console Web noVNC (pas de plugin à installer!)
J'ai installé Proxmox 5.1 sur mon NUC et l'utilise actuellement pour propulser mes services privés @home répartis sur 6 machines virtuelles debian.
Par le passé, l'un des points les plus gênants de Proxmox VE à mon sens était la console VNC qui nécessitait l'installation d'un plugin navigateur avec les inconvénients que l'on connait: problèmes de clavier, temps de chargement du plugin (on rate le grub!!!), latence... et j'ai été très content de constater que tout se fait maintenant en HTML5 avec noVNC, merci Proxmox!
Je rédige cet article car tout comme FreeNAS j'ai ressenti un effet "wow" (en positif). On côtoie beaucoup de logiciels dans notre métier, libres ou pas, parfois mauvais, parfois passables, mais rarement très bons. Proxmox devrait être plus connu.
Virtualisation
KVM:
Proxmox utilise KVM pour la virtualisation, avec des périphériques virtio si le système invité le supporte (Linux + BSD family). Il est possible d'allouer une quantité fixe de RAM ou un provisionnement dynamique ce qui revient en fait techniquement à autoriser le ballooning. L'installation se fait à l'aide de la console noVNC en HTML5 et d'une ISO que l'on peut uploader via le web-ui.
Proxmox active également la fonctionnalité KSM qui permet de partager entre les VM les pages de mémoire similaires par mesure d'économie. L'ensemble est donc plutôt bien pensé.
On retrouve cependant les éternels bugs communs aux solutions KVM, tels que les VM qui ne veulent parfois pas s'arrêter, il faut se connecter en SSH et forcer l'extinction car le web-ui n'y parvient pas. Dommage.
LXC:
Historiquement, Proxmox VE se basait sur OpenVZ pour les containers. Désormais c'est LXC qui est utilisé, pour cause de souplesse si on en croit ce post sur le forum Proxmox. J'ai toujours trouvé OpenVZ supérieur en terme d'isolation et d'outils d'administration, mais ce projet n'est pas upstream et a longtemps été bloqué au kernel 2.6.32 et il semble que ce soit encore le cas aujourd'hui.
Donc le passage à LXC est une bonne chose d'autant que LXCFS semble présent! Pour rappel, LXCFS permet à un container de ne voir que la quantité de RAM qui lui est alloué (via top ou htop) idem pour l'espace disque avec df ce qui améliore l'isolation.
L'installation d'un container LXC se fait à partir de templates que l'on peut télécharger chez Proxmox et il est possible de choisir si on veut le faire fonctionner en mode unprivileged ou pas, pour plus de sécurité. Je n'utilise pas de containers LXC, je privilégie KVM pour plus de souplesse. En effet avec LXC il n'y a pas de migration de stockage possible et il n'est pas possible d'activer ou désactiver le mode unprivileged, il faut recréer le container. Cette implémentation semble donc un peu moins mure que celle de KVM.
Stockage, snapshots, backups
Le support des snapshots dépend du backend de stockage. Par défaut c'est un stockage local LVM-thin et ils sont supportés. Idem sur du stockage local qcow2. Les snapshots se font et se suppriment à chaud, rien à dire là dessus à part que ça marche bien. En revanche pour les backups c'est une autre histoire. Proxmox dispose d'une planificateur de sauvegardes qui non seulement ne supporte que du full, mais en plus ne permet pas de définir une durée de rétention. C'est extrêmement basique, limite pas utilisable en l'état, je passe par du backuppc.
Pour revenir sur les backend de stockage (dont la liste est disponible ici) je ne suis pas parvenu à faire fonctionner Zfs over iScsi, il semble que cela nécessite une connexion SSH avec le NAS, un choix de conception étrange. Donc je me contente du local (LVM-thin) et d'un datastore NFS.
Il faut noter que l'on peut uploader des iso directement depuis le web-ui pour les mettre dans un datastore, et c'est super.
Conclusion
Proxmox constitue une bonne alternative à ESXi pour un labo @home ou pour une infra de virtualisation maitrisée de A à Z. Espérons que le produit continuera à mûrir sur les containers et la partie sauvegarde, en tous cas merci!
Il y a deux ans j'affirmais aimer systemd dans l'article systemd, c'est bien. Aujourd'hui je parle de Firewalld, un service et ensemble d'outils permettant de gérer le pare-feu sous Linux.
La base du firewall sous Linux c'est iptables, et quand on a compris et beaucoup pratiqué, c'est pas si compliqué. Mais il y a toujours deux points qui me gênent:
Il n'y a pas de service officiel pour charger les règles au démarrage, il faut faire son propre script ou en emprunter à droite à gauche.
Les règles sont quand même indigestes et bas niveau, ce qui n'est pas toujours nécessaire.
Firewalld implémente un système de "zones" dans lesquelles vous allez définir des paramètres, autoriser des services: internet, public, dmz... elles peuvent être définies à partir de l'interface ou de la source, c'est assez souple. Le paramétrage se fait soit en cli (firewalld-cmd) soit graphiquement (firewall-config) ou encore au travers d'une api et introduit la notion de "permanent" pour savoir si il faut conserver les modifications au démarrage.
Bien entendu, firewalld est un service système donc il n'y a pas de script à écrire pour charger ses règles au boot, il suffit de l'activer dans sytemd.
Firewalld est présent sur Fedora, CentOS, RedHat mais peut être installé sur d'autres sytèmes comme Debian car il est proposé dans les dépôts. Et moi, je migre mes serveurs sur Firewalld avec prise en charge par Ansible, parce que je gagne un temps fou et je fais les choses proprement.
Merci Red Hat ces logiciels qui terminent en "d" et qui modernisent un peu Linux :)