# GNU/Linux
## Présentation
### Des origines à aujourd'hui
* en 1984, Richard Stallman, lance le projet GNU (GNU is Not Unix !), qui a pour objectif de construire un système d'exploitation compatible avec Unix, mais entièrement constitué de briques logicielles libres ;
* en 1991, un étudiant finlandais, Linus Torvalds, créé un clone libre d'Unix, appelé Linux ;
* le noyau Linux, associé aux logiciels GNU, donnera le système d'exploitation [GNU/Linux](red) ; dans la suite "Linux" désignera "GNU/linux" ;
* il existe aujourd'hui une multitude de distributions de Linux, pour les serveurs, pour les ordinateurs des particuliers (Ubuntu, Debian, etc.) et pour les smartphones (Android/Linux) ;
* Linux permet de s'acquitter de toutes les tâches usuelles : aller sur Internet, voir des vidéos, produire des textes, programmer en Python...
* [voici une vidéo qui compare sommairement Windows, macOS et Linux](https://www.youtube.com/watch?v=P7vgsrkUxBU) et [une autre](https://www.youtube.com/watch?v=EtWZP1meGsw), un peu plus partisane mais qui présente un peu plus le système Linux.
Richard Stallman
Linus Torvalds
Tux, la mascotte de Linux
## L'arborescence de dossiers
### Fichiers et dossiers
Les fichiers sont rangés dans des dossiers (ou répertoires), chacun de ces dossiers est lui-même contenu dans un dossier parent : tout ceci forme une arborescence de dossiers. Le dossier qui n'a pas de parent est appelé [dossier racine](red), et noté [/](red) sous Linux.
Remarque : en fait, sous Linux, les dossiers sont aussi des fichiers !
Voici une arborescence simplifiée des dossiers sous Linux/Unix :
### Chemins relatifs, chemins absolus
Pour accèder à un fichier ou à un dossier, il faut connaître le chemin qui y mène.
Prenons l'exemple un script *mon_script.py* qui doit utiliser un fichier *data*.
## Le shell Linux
Le shell est un logiciel qui permet à l'utilisateur d'exécuter des commandes. Il existe plusieurs shell, citons par exemple bash («Bourne again shell»), csh, zsh, fish, etc.
### L'invite de commande
Lors du lancement d'une application *terminal*, une invite de commande apparaît. Elle est précédée d'un texte au format :
```python
utilisateur@machine:dossier_actuel$
```
Ici, l'utilisateur a pour identifiant *yves*, sa machine s'appelle *ZBOX-CI523NANO* et le symbole ~ représente le dossier personnel de l'utilisateur.
Le $ est remplacé par # quand l'utilisateur est *root*.
### Les commandes
La syntaxe des commandes est souvent la suivante :
```python
nomcommande [options] [nomfichier]
```
(les crochets servent à indiquer des parties éventuellement optionnelles).
Par exemple, `ls -a mon_dossier` permet de lister (*ls*) tous les fichiers (*-a* pour *all*) du dossier *mon_dossier*.
Remarques :
* la **touche tabulation** est très pratique pour compléter le nom d'une commande ou d'un fichier ;
* la touche **flèche vers le haut** permet de retrouver les commandes précédemment saisies.
### Tester ou installer Linux
Linux est gratuit, il est donc possible de le télécharger pour le tester ou l'installer sur un ordinateur personnel. Certaines versions sont particulièrement légères et permettent de [redonner un second souffle à de vieilles machines](https://www.youtube.com/watch?v=dFu7OGnXOa0). Vous pouvez même créer votre propre distribution de Linux.
Pour tester Linux sans l'installer et **sans modifier la configuration de votre ordinateur**, il y a deux possibilités :
* soit le placer sur une clé USB (ou un CD-ROM...) et démarrer l'ordinateur sur cette clé en choisissant l'option "Tester" (une [bonne vidéo](https://www.youtube.com/watch?v=kZS84ctzii8) explique tout cela) ;
* soit installer un logiciel de virtualisation (Virtualbox par exemple), qui simulera un ordinateur dans lequel on pourra installer Linux ([vidéo 1](https://www.youtube.com/watch?v=7LxrYSD8UY8) et [vidéo 2](https://www.youtube.com/watch?v=Bu5pvk3lzEM)).
Pour l'installer : il faudra démarrer sur la clé USB puis choisir l'option "Installer". Linux s'installera soit sur une partition que vous créerez à cette occasion, soit un deuxième disque dur.
### Shell et interface graphique
Le [shell](red) Linux est une invite de commande très puissante qui permet de réaliser toutes sortes d'actions : se déplacer dans l'arborescence, créer, supprimer des fichiers, lancer des applications ou des commandes (exemple : convertir un lot d'images d'un format vers un autre), etc.
Cette invite de commande est suffisante par exemple quand on doit administrer un serveur Linux et demande moins de ressources qu'une interface graphique.
Un des objectifs de ce chapitre est de se familiariser avec quelques commandes de base du shell.
L'interface graphique : il en existe plusieurs sous Linux, citons par exemple Gnome, KDE ou Xfce.
Le [chemin absolu](red) du fichier *data* est le chemin démarrant à la racine : /home/yves/arbo/images/data
Le [chemin relatif](red) du fichier *data* à partir du fichier *mon_script.py* est ici : ../images/data
(.. signifie : remonter dans le dossier parent).
Je vous conseille d'utiliser des chemins relatifs, cela permet de déplacer l'ensemble des fichiers d'un projet d'un endroit à un autre (exemples : du disque local vers un site hébergé sur Internet ; d'un dossier vers un autre...).
## Les utilisateurs
Linux et Unix ont été pensés pour être utilisés par plusieurs personnes. Chaque utilisateur a son dossier personnel, qui est un sous-dossier du dossier /home et qui est par défaut inaccessible aux autres utilisateurs.
Par ailleurs, un utilisateur normal ne doit pas pouvoir modifier la configuration du système d'exploitation, c'est pourquoi il existe un *super-utilisateur* ou *administrateur* appelé [root](red) qui a accès à tout et dont le dossier personnel est /root.
## Les droits sur les fichiers
Pour restreindre l'accès à certains fichiers (et donc sur les dossiers), ceux-ci sont affectés de [droits](red) accordés à un utilisateur ou à un groupe d'utilisateurs :
* droits de lecture ;
* droits d'écriture (de modification) ;
* droits d'exécution (pour les programmes).
Nous reviendrons plus en détail sur les utilisateurs et les droits plus tard.
Vous allez découvrir les principales commandes UNIX en jouant à un jeu en ligne : TERMINUS.
Votre travail consiste à jouer à ce jeu et à compléter :
* une liste des commandes découvertes, à quoi elles servent et comment on les utilise ;
* faire un plan du jeu sous la forme d’une arborescence.
Pour cela, téléchargez et complétez [ce fichier](Terminus.odt).
Faîtes ce TP.
Vous pouvez essayer de répondre à ces questions issues de la banque nationale des sujets (rubrique "OS et lignes de commande").
Les plus motivés peuvent s'inscrire à [un cours en ligne](https://www.fun-mooc.fr/courses/course-v1:univ-reunion+128001+session03/about) (début le 15 mars 2021) ou suivre d'autres cours en ligne (openclassroom,, celui de [G. Connan](https://gitlab.com/lyceeND/1ere/blob/master/2019_20/2_Systeme_1/systeme19.md), etc.).
Vous pouvez aussi consulter :
* [ce document sur les pipes](https://isnbreizh.fr/nsi/activity/linuxtube/index.html) ;
* [ce document sur les redirections](https://isnbreizh.fr/nsi/activity/linuxredirect/index.html).
Voici d'autres moyens d'utiliser un terminal Linux sous Windows :
* mobaXterm (https://mobaxterm.mobatek.net/) ;
* WSL (sous-système Linux) sous Windows 10 ;
* [cette extension pour Firefox](https://addons.mozilla.org/fr/firefox/addon/xlinux-console-terminal/) permet de lancer un terminal Linux directement dans ce navigateur.