# GoboLinux

GoboLinux est une distribution Linux gratuite et open-source dont la principale caractéristique est de réorganiser l'arborescence des fichiers.
Plutôt que d'avoir une hiérarchie de fichier de type UNIX, chaque programme est installé dans son propre dossier. Dans ce dossier, tous les fichiers du programme sont réunis, ce qui inclut aussi les fichiers de configuration. Ainsi, il n'y a aucun "éclatement" du programme à plusieurs endroits différents comme c'est le cas pour une distribution Linux classique (ou sous Windows avec les applications Win32 qui peuvent placer des éléments dans d'autres dossiers comme C:\Windows\System32).
Par exemple, imaginons un programme appelé "vlc", tous ses fichiers et bibliothèques spécifiques seront dans le dossier /Programs/vlc. On pourrait donc aussi trouver les chemins d'accès complets suivants :
* /Programs/XFree86/4.3/
* /System/Settings/BootScripts/Reboot
« Au lieu d'avoir différents morceaux d'un programme jetés dans /usr/bin, d'autres morceaux dans /etc et encore d'autres /usr/share/quelquechose/ou/autrechose, chaque programme possède sa propre arborescence, ce qui garde tous les programmes bien séparés et vous permet de voir tout ce qui est installé sur le système et quels fichiers appartiennent à quels programmes d'une manière simple et évidente. »
Selon les développeurs de GoboLinux, il en résulte un système plus propre.

## Vue d'ensemble

L'arborescence de GoboLinux est radicalement différente de la FHS que l'on trouve sur les Systèmes d'exploitation Unix-like. En effet, la FHS regroupe les différents fichiers de chaque programme par type de fichier. Ainsi, chaque type de fichier est regroupé dans un sous-dossier.
Par exemple, les exécutables sont contenus dans le dossier /bin et les fichiers de configuration dans le dossier /etc. La conséquence directe de cet éclatement est la nécessité d'utiliser un Gestionnaire de paquets, un programme chargé de mémoriser quel fichier appartient à quel programme.
Avec GoboLinux, le gestionnaire de paquets devient inutile, puisque l'arborescence elle-même est le gestionnaire de paquets (selon les développeurs du système : "the filesystem is the package manager"). En effet, chaque fichier de chaque programme est placé dans un même dossier. Ainsi, GoboLinux utilise le système de fichiers lui-même comme base de données des paquets.
L'ensemble donne un système plus simple, plus logique, plus intuitif, avec une arborescence moins encombrée.

## Fonctionnement
### Liens symboliques

Le noyau Linux n'est évidemment pas modifié, ce serait un travail bien trop important et instable. Pour fonctionner, GoboLinux utilise des liens symboliques. En réalité, l'arborescence FHS est toujours présente, mais elle est rendue invisible. L'arborescence de GoboLinux coexiste juste à côté de celle-ci. L'arborescence FHS est remplie de liens symboliques qui mènent aux vrais fichiers présents dans l'arborescence de GoboLinux.
On pourrait penser qu'il en résulte une perte de vitesse du système, mais concrètement, ce n'est (pratiquement) pas le cas, la gestion des liens symboliques du noyau Linux étant suffisamment bien programmée.
Les développeurs de GoboLinux ont constaté que cette organisation était même plus performante que la FHS car elle supprime des distinctions empiriques entre des dossiers similaires. Par exemple, les problèmes comme les défauts d'exécution d'un script Console parce qu'un exécutable est dans /bin au lieu d'être dans /usr/bin ou /usr/local/bin sont résolus. Les scripts console plantent ainsi moins souvent que dans d'autres distributions.
Un autre avantage de l'arborescence de GoboLinux est qu'elle permet d'installer plusieurs versions d'un même programme côte à côte, ou plusieurs fois la même version d'un programme. Cela permet de lancer plusieurs fois un même programme en même temps afin d'effectuer des comparatifs de performances.
Il n'existe aucun risque de désynchronisation entre la FHS et l'arborescence de GoboLinux car lorsqu'un lien symbolique pointe sur un fichier qui n'existe pas, il devient un lien mort, donc inactif. Il est possible de supprimer ces liens morts du système avec l'outil "RemoveBroken".

### Éléments spécifiques à GoboLinux

Pour que cette organisation fonctionne, GoboLinux n'est constitué que de 3 éléments. En effet, plus d'éléments rendrait le système trop lourd à maintenir pour le faible nombre de développeurs.
* Les scripts d'installation permettent d'installer le système convenablement.
* Le programme Compile permet d'installer un programme selon l'arborescence de GoboLinux.
** Il peut être utilisé pour supprimer un programme, dans ce cas les liens de la FHS sont automatiquement supprimés avec.
** Il est aussi possible de simplement supprimer le dossier du programme pour le désinstaller complètement avec rm -rf. Mais dans ce cas, il reste dans la FHS les liens vers les fichiers du programmes. Ces liens sont alors des liens morts qu'on pourra supprimer avec l'outil appelé "RemoveBroken".
* Une extension du noyau Linux appelée GoboHide, qui permet de masquer ou de démasquer un élément du système, et notamment la FHS.
Tous les autres éléments du système peuvent être remplacés par les éléments les plus récents, depuis le noyau Linux jusqu'à n'importe quel programme.

### GoboHide

Sous Linux, il est impossible de masquer un fichier ou un dossier sans le renommer en rajoutant le caractère "." devant (contrairement à Windows qui inclut cela dans les attributs du fichier ou du dossier).
* vlc est un dossier (ou un fichier) non masqué
* .vlc est un dossier (ou un fichier) masqué
Dès lors, il était indispensable de créer un programme permettant de "cacher" les fichiers et dossiers de la FHS, mais sans les renommer.
Ce programme s'appelle GoboHide et il fonctionne très simplement :
* ~] gobohide --help pour afficher l'aide
* ~] gobohide -h ou ~] gobohide --hide pour cacher un fichier ou un dossier
* ~] gobohide -u ou ~] gobohide --unhide pour démasquer un fichier ou un dossier
* ~] gobohide -l ou ~] gobohide --list pour afficher la liste de tous les éléments cachés
* ~] gobohide -version pour afficher la version du programme
La commande "ls" n'affichera pas les éléments masqués par la commande "gobohide". Elle n'affiche que les éléments masqués parce que leur nom commencent par un point ".", seule la commande "gobohide" permet d'afficher les éléments masqués par elle-même.
Bien sûr, les éléments existent toujours, une simple commande Bash peut le confirmer, comme ~] [ -f /etc/fstab ] && echo "Il existe" ou ~] l /etc/zshrc.
Le patch GoboHide est appliqué au noyau Linux dès l'installation. En utilisant le programme Compile pour compiler le noyau, le "recipe" du noyau Linux contient les patches pour activer l'extension GoboHide. En cas de recompilation du noyau sans utiliser le programme Compile, il est nécessaire de réappliquer le patch.
Grâce à GoboHide, il est désormais possible de masquer ou démasquer les éléments que l'on souhaite. Gobohide rend donc possible la traduction des éléments de Linux comme sous Windows, par exemple en utilisant ce type de commandes :
ou
Le code source est librement disponible.

### Historique de Compile

Le programme Compile est similaire au système de portages de Gentoo, lui-même basé sur celui de FreeBSD. Mais ce portage est fait pour être compatible avec l'arborescence FHS, et Compile est capable de l'appliquer à l'arborescence GoboLinux. Compile utilise l'arborescence de GoboLinux comme base de données des programmes installés.
Il fut introduit avec la version "011" de GoboLinux. Avant cela, plusieurs discussions portaient sur la possibilité d'adapter le système de Gentoo sur GoboLinux, un projet de SourceForge.net appelé GoboPortage$^,$.

### Compile

Compile se base sur l'idée que les sources d'un programme ne devraient pas être distribuées selon de multiples formats de paquets spécifiques. En effet, entretenir la compatibilité des paquets comme le font les différentes distributions Linux est une immense perte de temps, et si tous les paquets suivaient les normes Linux, tout serait beaucoup plus simple. L'idée centrale est qu'au final, un programme se réduit toujours à un ensemble de fichiers à installer.
Donc le programme Compile se contente de télécharger, décompresser et compiler du code source au format Tarball.
Par exemple, il est possible d'installer un programme au format DEB en le traduisant en RPM avec le logiciel Alien, puis de l'installer avec le logiciel rpm2cpio. rpm2cpio vlc.rpm donne vlc.cpio.gz
Compile installe le programme décompressé en utilisant une commande très simple (compile vlc).
Compile se charge de placer le programme dans le dossier /Programs/[Nom du programme]/[Version du programme] et de créer les liens symboliques dans le dossier /System/Index.

### Recipe

Le problème est que dans la pratique, tous les paquets ne vont pas s'installer convenablement en utilisant cette méthode, car tous les paquets Linux ne suivent pas forcément les normes de création des paquets. En effet, il existe des variations mineures dans la construction des paquets, et ces variations perturbent les installations. Sous GoboLinux, ces variations seront donc spécifiées dans un "recipe" (traduction : "recette"), une sorte de micro-script utilisé par le programme Compile pour que le programme s'installe correctement.
Le "recipe" est une sorte de fichier de configuration de l'installation que le programme Compile utilise à l'installation de chaque programme. En effet, pour chaque installation, Compile a besoin d'un "recipe". Deux possibilités sont offertes...
* Soit Compile télécharge le "recipe" sur le serveur de GoboLinux http://recipes.gobolinux.org/r/, et dans ce cas ce fichier est stocké dans le dossier /Files/Compile/Recipes.
* Soit il est possible de créer soi-même son propre "Recipe" avec des outils fournis comme "MakeRecipe" ou "NewVersion", dans ce cas le fichier sera stocké dans /Files/Compile/LocalRecipes et Compile utilisera ce "recipe" en priorité.
Le "recipe" est obligatoire pour l'installation de chaque programme. Le petit script "MakeRecipe" automatise la création de "recipe" pour un programme non présent sur le serveur. Il suffit de lui donner un URL et il va télécharger le Tarball, le décompresser et l'inspecter pour comprendre comment il doit être compilé (en utilisant "make", "perl", "python", ou un script de configuration). Si aucun message d'erreur n'oblige à modifier le "recipe", vous pouvez lancer Compile juste après.
Typiquement, le "recipe" standard d'un programme qui ne pose aucun problème d'installation ressemble à ceci (sachant que la seconde ligne est facultative) :
Il contient simplement l'URL où le programme a été téléchargé, et la méthode d'exécution. La méthode compileprogram est normalement la plus courante, c'est la méthode qui est appliquée par défaut même si la ligne is_compileprogram=yes n'est pas présente.
Le "recipe" sert à spécifier un modèle d'exécution pour le programme Compile. Il existe plusieurs modèles :
* compileprogram, qui regroupe les programmes dont la configuration est incluse dedans.
* makefile, qui regroupe les programmes à assembler avec un "make".
* xmkmf, qui regroupe les applications basées sur "X imake tools".
* meta, qui supporte le meta-packaging (mélanger plusieurs paquets en un).
Le "recipe" permet d'indiquer à Compile des variations mineures qui existent dans l'installation des programmes.
* Par exemple, pour "PSUtils", la commande "makefile" s'appelle "Makefile.unix", il est possible de le spécifier avec makefile=Makefile.unix.
* Par exemple, lorsque vous décompressez l'archive audacity-src-1.0.0-2.tar.gz, les fichiers ne sont pas dans le dossier audacity-src-1.0.0-2 mais dans audacity-src-1.0.0, donc il faut préciser dir=audacity-src-1.0.0 dans le "recipe". Malheureusement, certains paquets réclament des scripts pré et post installation, car ils s'installent selon des spécificités très éloignées des standards Linux. Les fonctions de script "shell" sont supportées pour ces cas-là.

### Maintenance des recipes

L'essentiel de la maintenance de GoboLinux consiste à maintenir à jour les différents "recipe" de chaque programme un peu particulier afin d'éviter à l'utilisateur d'avoir des difficultés d'installation. Début 2016, il existe des "recipes" pour environ 3500 paquets.
Cela peut apparaître comme étant un travail énorme, mais maintenir les "recipes" des paquets est bien moins compliqué que de maintenir la compatibilité des paquets eux-mêmes, comme le font les distributions Linux telles que Debian. Et au pire, il est possible de créer soi-même un "recipe" en étudiant la façon dont les paquets sont installés.
En règle générale, chaque paquet a besoin d'un "recipe". Les exceptions sont les paquets programmés dans un langage de script pouvant être géré par un paquet déjà installé (CPAN du Perl, Cabal du Haskell, LuaRocks du Lua, RubyGems du Ruby, et PIP du Python), ces paquets n'ont pas besoin de "recipe". Il suffit d'indiquer la dépendance sur le modèle "PackageManager: PackageName" (par exemple: CPAN:XML::Parser), et Compile laissera son gestionnaire de paquet traiter les détails de l'installation de ce programme.

### Versions simultanées

Le programme Compile va permettre d'installer plusieurs versions d'un même programme, et décider celle(s) que vous souhaitez tenir à jour grâce à des fichiers de configuration présent dans le dossier d'installation de chaque programme.
* Vous pouvez installer plusieurs versions d'un même programme, par exemple...
* Et vous pouvez installer plusieurs fois la même version d'un programme, par exemple...
Pour faire cela, il faut lancer Compile avec le paramètre -e <version> qui permet de modifier le nom du dossier de la version du programme contenu dans /Programs/[Nom du programme]/.

## Système de fichiers

Le système de fichier de GoboLinux s'inspire de NeXTSTEP, AtheOS, et BeOS, son principe philosophique étant de considérer qu'un système d'exploitation est par définition un support pour faire tourner plusieurs programmes, donc dès lors, il est illogique de séparer les éléments de ces programmes. C'est la même direction qu'a adopté la distribution Linux Android en regroupant toutes les applications dans un même dossier (/data/data).
À la racine de GoboLinux se trouvent plusieurs dossiers principaux dont voici le détail.
| Fonction du dossier | Arborescence GoboLinux | Correspondance dans l'arborescence FHS | Équivalence dans l'arborescence Windows | Équivalence dans l’arborescence macOS |
| Dossier d'installation des programmes disponibles pour tous les utilisateurs | /Programs | /bin, /sbin, /usr, /usr/bin, /usr/sbin, /usr/share, /usr/games, /usr/local, /usr/local/bin, /opt, /usr/opt, etc. | C:\Program Files | /Applications, /System/Applications |
| Dossier d'installation des programmes disponibles pour l'utilisateur courant | - | - | C:\Users\[Nom d'utilisateur]\AppData\Roaming | /Users/[Nom d’utilisateur]/Applications |
| Dossier des fichiers de configuration pour tous les utilisateurs | /Programs/[Nom du programme]/[Version]/etc | /etc, /usr/etc, /usr/local/etc | C:\ProgramData | /Applications/[Nom du programme].app/Contents |
| Dossier des fichiers de configuration pour l'utilisateur courant | /Users/[Nom d'utilisateur]/[Nom du programme]/etc | /home/[Nom d'utilisateur]/.[Nom du programme]/etc | C:\Users\[Nom d'utilisateur]\AppData\Local, C:\Users\Utilisateur\AppData\LocalLow | /Users/[Nom d’utilisteur]/Applications/[Nom du programme].app/Contents |
| Dossier des données disponibles pour tous les utilisateurs | - | - | C:\Users\Public, C:\ProgramData\Microsoft\Windows\Start Menu | /Users/Shared |
| Dossier des données disponibles pour chaque utilisateur | /Users | /home | C:\Users | /Users |
| Dossier des fichiers du système d'exploitation | /System | /bin, /sbin, /usr/bin, /usr/sbin, /lib, /proc, /sys, /var, etc. | C:\Windows | /System |
| Dossier des ressources partagées | /Files | ? | C:\Program Files\Common Files, C:\Windows\Fonts, C:\Windows\System32\Spool\Drivers\Color, C:\Windows\System32, etc. | /Library |
| Dossier contenant les points de montage | /Mount | /mnt, /media, etc. | Menu démarrer, Explorateur de fichiers, Ce PC | /Volumes |
| Dossier de dépôt de fichiers de l'utilisateur | /Depot | | D: ? | |
* /Programs contient des sous-dossiers contenant les différents programmes disponibles pour tous les utilisateurs. Chacun de ces sous-dossiers contient lui-même des dossiers pour chaque version du programme. Il existe aussi des fichiers et sous-dossiers de configuration optionnels (quelle version faut-il maintenir à jour, etc.). Ensuite, il existe des sous-dossiers qui reprennent l'arborescence FHS. Par exemple, on trouvera un fichier /Programs/Bash/3.0/bin/bash, ou encore /Programs/Xorg-Server/Settings/X11/xorg.conf. Les développeurs ont tenté de créer la possibilité d'installer des applications pour chaque utilisateur dans le répertoire /Users/[Nom de l'utilisateur]/[Nom de l'application] mais installer un programme en dehors du dossier dédié /Programs nécessitait de gérer la variable "$PATH" soi-même en effectuant une installation "rootless". Cette idée a donc été abandonnée devant les risques d'instabilité du système.
* /Users contient des sous-dossiers portant le nom de chaque utilisateur du système.
* /System contient les fichiers du système organisés par application. Par exemple /System/Settings/passwd.
** /System/Index contient des dossiers qui contiennent des liens symboliques des fichiers contenus dans le dossier /Programs.
*** /System/Index/bin contient des liens vers les fichiers de chaque dossier bin contenu dans un sous-dossier de /Programs.
*** /System/Index/include contient des liens vers les fichiers de chaque dossier include contenu dans un sous-dossier de /Programs.
*** /System/Index/lib contient des liens vers les fichiers de chaque dossier lib contenu dans un sous-dossier de /Programs.
*** /System/Index/share contient des liens vers les fichiers de chaque dossier share contenu dans un sous-dossier de /Programs.
** /System/Environment contient des liens vers les fichiers d'environnement contenu dans un sous-dossier de /Programs. Ils sont compilés dans un fichier cache et chargés par la Console (le Shell), permettant à chaque programme de créer ses propres variables d'environnement.
** /System/Tasks contient des liens vers les "boot tasks" de chaque programme, venant de son dossier Resources/Tasks.
** /System/Settings contient des liens vers les fichiers de configuration de chaque programme.
*** /System/Settings/BootScripts est un lien vers /Programs/BootScripts qui contient les scripts utilisés au démarrage.
** /System/Variable contient des journaux (log), des temporaires, des fichiers transitoires et des bobines (spool).
*** /System/Variable/tmp contient les fichiers temporaires.
** /System/Kernel contient les fichiers du système.
*** /System/Kernel/Boot contient les fichiers des programmes et de leur configuration utilisés durant le chargement du système. L'image du noyau Linux et les fichiers de configuration du "bootloader" sont ici.
*** /System/Kernel/Devices Fichiers des périphériques (gérés par udev).
*** /System/Kernel/Modules Fichiers des modules noyau (organisés par le numéro de version du noyau).
*** /System/Kernel/Objects Donne une vue d'ensemble de l'arbre des périphériques noyau.
*** /System/Kernel/Status Fichiers de statut du noyau (gérés par le système de fichiers "proc").
De cette façon, malgré le fait que chaque exécutable soit dans son propre dossier, tous les exécutables sont répertoriés (par des liens symboliques) dans /System/Index/bin, toutes les bibliothèques sont répertoriées dans /System/Index/lib, etc. Cette organisation élimine les problèmes dus aux fichiers non essentiels stockés dans /usr et les fichiers essentiels stockés dans des sous-dossiers.
* /Files contient les fichiers utilisés par les programmes, mais qui ne font pas partie des programmes. Par exemple les polices (fonts), les codecs, les plugins, tout ce qui ne requiert pas un gestionnaire de paquets. Chaque programme peut y définir des sous-dossiers pour y stocker des données spécifiques.
* /Mount contient les points de montage des différents périphériques de l'ordinateur, c'est-à-dire les dossiers permettant d'accéder à la mémoire des périphériques de l'ordinateur (lecteur CD-ROM, disques durs internes, disques durs externes, clé USB, appareil photo, téléphone portable, etc.).
* /Depot est un dossier que tous les utilisateurs peuvent organiser comme ils le veulent. Aucun des sous-dossiers de ce dossier n'est considéré comme faisant partie de l'arborescence de GoboLinux.

## Versions

Les versions sont numérotées en utilisant le système octal. Il fut choisi car il répond zéro indicatif que l'on trouve dans de nombreux logiciels libres, et le système octal permet de faire la course aux versions qui se fit autour de 1999.
* 016 - 15 déc 2016 : Introduit Runner, un outil pour virtualiser le système de fichiers. Support de l'architecture x64.
* 015 - 7 mai 2014 : Introduit /System/Index. Linux kernel version 3.14.2, Abandon de KDE 4 pour Enlightenment 18, plus léger.
* 015-beta - 4 mars 2014
* 015-alpha - 21 janvier 2014
* 014.01 - 30 mars 2008 : Corrections de bugs et mises à jour de paquets
* 014 - 31 décembre 2007 : Mises à jour de paquets, Corrections de bugsbug fixes, nouveaux outils de gestion GoboLinux.
* 013 - 2 novembre 2006: Introduit Listener, un outil pour écouter les événements du système de fichier et automatiser des actions.
* 012 - 6 juin 2005 : Introduit Manager, un système de gestion graphique.
* 011 - 7 juin 2004 : Introduit Compile, l'outil de compilation.
* 010 - 7 janvier 2004 : Installeur graphique accessible depuis un Live CD.
* 007 - 22 octobre 2003 : Introduit le dossier Adds Resources.
* 006 - 9 mai 2003 : Introduit GoboHide, et adopte une installation sandboxée des programmes.
* 005 - 2003 : Première version publique.
* Les versions 001 à 004 furent réservées aux développeurs seulement.