Administrer un ordinateur Linux

Introduction

Attentes et objectifs du module

Dans le cadre de votre formation, ce module vous permettra :
Dans le cadre de ce module, il ne vous sera pas demandé de retenir les étapes de configurations par coeur, mais d'être capable de suivre des séries d'instructions, en comprenant ce que vous faites, leur effets et raisons. Vous devrez ainsi :

Les serveurs

Les serveurs sont des ordinateurs fournissant divers services à ses utilisateurs :
Le terme service fait référence au logiciel, quand le terme serveur peut faire référence au matériel ou au logiciel.
Les serveurs sont très utiles dans le cadre de vos activités (notamment pour effectuer des calculs intensifs) :

Pourquoi administrer un serveur ?

L'administration d'un ordinateur a (entre autres) pour objectifs :
Ce module se concentrera sur le système d'exploitation Linux. En effet, si Windows domine les parts de marchés pour les ordinateurs de bureaux (69% contre 4,5% pour Linux), Linux est majoritaire sur les serveurs (96,4%), et les mobiles (71% avec Android). Linux est aussi très utilisé comme poste de travail par les développeurs.

Vocabulaire

Dans le cadre de vos cours précédents, vous avez déjà manipulé plusieurs langages de scripts (R, Python, SQL). Vous utilisiez alors un interpréteur (Rscript, python3, sqlite3) pour exécuter des instructions écrites dans ces langages.
En Python, vous saisissiez vos instructions dans un fichier qui était lu et exécuté par l'interpréteur Python. On parlait alors de script Python.
En revanche, en SQL, vous utilisiez une interface REPL (Read-Eval-Print Loop). Vous écriviez alors une ligne que sqlite3 lisait (read), interprétait (eval), puis vous en affichait le résultat (print). Après chaque exécution, l'interpréteur vous affichait une invite (ici ) pour vous indiquer que vous pouviez saisir une nouvelle instruction :
Les interpréteurs supportent bien souvent ces deux modes (scripts et REPL). Il est par exemple tout à fait possible de donner un fichier SQL à sqlite3, ou de lancer python3 en mode REPL :
Pour administrer un système Linux, on utilise principalement Shell (un autre langage de script), avec l'interpréteur shell Bash. Comme pour les autres langages de script, il est possible de l'utiliser avec des scripts Shell, mais aussi via une interface REPL.
Cependant, le vocabulaire sera légèrement différent. On parlera de :

Les commandes

Pour rappel, les lignes de commandes Shell commencent par une commande Shell (l'équivalent d'une fonction en Python), indiquant l'opération à effectuer, e.g. pour copier des fichiers, pour déplacer des fichiers, etc. Les arguments de la commande sont ensuite indiqués, séparés par des espaces, e.g. .
Il existe plusieurs types de commandes Shell (cf ) :

Les alias

Certaines lignes de commandes peuvent être longue et complexes à écrire (et à retenir). Un alias permet alors de remplacer une ligne de commande par un nom plus court et simple à écrire :
Créez un alias permettant de copier les fichiers images du home vers le dossier (cf ensemble de chemins).

Réécriture de la ligne de commande

En réalité, le Shell n'exécute pas directement les lignes de commande, mais opère quelques réécritures avant de les exécuter. Ainsi, un alias est en réalité remplacé par sa valeur lors de l'interprétation de la ligne de commande.
demande au Shell d'afficher chaque ligne de commandes avant leur exécution (très utile pour déboguer) :
Aussi, les ensembles de chemins, et sont en réalité remplacés par le Shell avant l'exécution de la ligne de commande :
demande au Shell d'interpréter les caractères échappés, dont :

Les fichiers exécutables

Les commandes ne sont usuellement rien de plus qu'un exécutable (i.e. un script ou un programme). Il est ainsi possible de créer une commande à partir d'un script Python qui sera alors exécuté lorsque la commande est appelée :
Vous remarquerez que la première ligne du script est un peu bizarre : .
Il s'agit du Shebang. Il permet d'indiquer au Shell l'interpréteur à utiliser pour exécuter le script (ici ) :
Pour créer une commande à partir d'un script, nous fournirons la commande .

Chemins relatifs dans les scripts

Les chemins relatifs sont relatifs au dossier de travail actuel, et non à l'emplacement du script. Il convient donc de faire attention aux chemins relatifs dans les scripts. Vous pouvez alors soit :
Pour information :

Les arguments

Bien évidemment, le script peut accéder aux arguments de la ligne de commande par laquelle il a été invoqué :
Le script reçoit ainsi les arguments sous la forme d'un tableau de chaînes de caractères qu'il peut ensuite traiter et interpréter de manière totalement arbitraire.
Le premier élément de ce tableau (i.e. ) est la commande exécutée.
Écrivez une commande qui affiche la somme de ses arguments.

Traiter les arguments avec argparse

Il est cependant préférable d'utiliser une bibliothèque dédiée (e.g. argparse en Python) qui fournira diverses fonctionnalités :
Il suffit alors de déclarer les différents arguments de la commande, et la bibliothèque se chargera alors du reste :
Par convention, on distingue 3 types d'arguments :
Arguments positionnels Arguments nommés Drapeaux (flags)
Idem Python, i-ème argument
mis dans le i-ème paramètre.
Idem Python,
ou
Booléen dont la valeur dépend de la
présence de l'argument.
À l'inverse de Python, les drapeaux et arguments nommés sont usuellement écrits avant les arguments positionnels.
Il est possible d'associer un nom court (d'un caractère) aux drapeaux, permettant de fusionner les arguments :
Une fois les paramètres déclarés, vous pouvez utiliser l'argument pour en afficher l'usage :
a de nombreux autres arguments notamment :
Écrivez une commande prenant en argument deux nombres dont il fera la somme, la soustraction, la multiplication, ou la division en fonction de son argument .

Gestion des paquets

Linux fourni déjà de très nombreuses commandes déjà installées, ou à installer. Sous Linux, les logiciels (ou bibliothèques) sont distribués sous la forme d'un paquet (fichier pour Debian/Ubuntu). Les gestionnaire de paquets permettent alors d'aisément :

Installer/désinstaller un paquet

Par défaut, les distributions Debian/Ubuntu utilisent le gestionnaire de paquet :
Bien qu'il soit possible de télécharger un fichier et de l'installer directement via (commande utilisée en interne par ), cela n'est pas recommandé. En effet, vous risquez ensuite de vous retrouver avec des problèmes de résolution de dépendances lors de mises à jour.

Mise à jours des paquets

La mise à jours des paquets s'effectue en 2 temps :
  1. : télécharger la liste des paquets et des mises à jours.
  2. : télécharger les mises à jours et les installer.
En interne, lit les fichiers afin d'obtenir la liste des dépôts de paquets à interroger.
La liste des dépôts est très sensible. En effet, un dépôt corrompu pourrait fournir des paquets corrompus lors d'installations ou de mises à jour.

Arrêter et redémarrer l'ordinateur

Sous Linux, il n'est pas nécessaire de redémarrer après une mise à jour. Il est toutefois possible de programmer l'arrêt ou le redémarrage de l'ordinateur :

Mise à jours de la distribution

N'essayez jamais de mettre à jours votre distribution d'un coup en sautant plusieurs versions :
Lorsque vous souhaitez mettre à jour votre distribution Linux, il est recommandé de suivre les étapes suivantes :
  1. Préparation :
    • Branchez l'alimentation de l'ordinateur sur secteur.
    • Connectez l'ordinateur via Ethernet si possible.
    • Prévoyez un second ordinateur avec accès à Internet.
    • Prévoyez une clef USB bootable.
    • Faites une sauvegarde de vos fichiers.
  2. Mettez vos paquets le plus à jours possible :
    1. Téléchargez la liste des mises à jours avec .
    2. Alternez les et jusqu'à épuisement des mises à jours.
    3. pour autoriser la désinstallation de dépendances lors de la mise à jour.
    4. Si un paquet pose problème, et que vous savez ce que vous faites, (ré/dés)installez-le.
    5. Recommencez jusqu'à épuisement des mises à jours
  3. Dans les sources apt, remplacez la version de votre distribution par la version suivante, puis reprenez à l'étape 2.
    💡 affiche la version actuelle de votre distribution.
Il est important de bien prendre son temps, et de ne surtout pas paniquer en cas de problèmes lors de la mise à jour. N'éteignez pas l'ordinateurs tant que tous les problèmes ne sont pas résolus.

Droits d'exécutions de commandes

Pour des raisons évidentes de sécurité, on ne souhaite pas que n'importe qui puisse faire n'importe quoi. Ainsi seul l'administrateur (utilisateur , aussi appelé super utilisateur) peut effectuer des opérations d'administration comme :
Ainsi les commandes vues précédemment doivent être exécutées en tant qu'administrateur.

Sudo

Pour exécuter des lignes de commandes en tant qu'administrateur, on la préfixe par (superuser do) :
permet de réexécuter la ligne de commande précédente avec les droits d'administration :
Si vous avez plusieurs lignes de commandes à exécuter, vous pouvez utiliser afin d'ouvrir un Shell en tant que . L'invite de commande sera alors suffixée par au lieu de :

Sudoers

Il est fréquent de vouloir donner certains droits d'administrations à un utilisateur, sans pour autant lui donner l'intégralité des droits. Par exemple l'autoriser à mettre à jour les paquets (, ), sans lui permettre de modifier la liste des paquets installés (, ). Pour cela on va définir les commandes (ou lignes de commandes) qu'un utilisateur (ou groupe d'utilisateur) aura le droit d'exécuter avec .
Certains droits peuvent permettre une escalade de privilège. Par exemple, pouvoir ajouter des utilisateurs à n'importe quel groupe d'utilisateur, permet de s'ajouter au groupe , et ainsi d'obtenir un accès administrateur complet.
Ces droits sont définis dans les fichiers , et sont édités via la commande .
Les lignes suivent le format , et se lisent comme suit :
"Autorise ( ou interdit) l'utilisateur (ou le groupe ) à exécuter la commande en tant qu'administrateur".
Pour des raisons de sécurité, il faut préciser le chemin complet de la commande (cf ).
sudo applique la dernière règle correspondante à la situation.
Vous pouvez aussi autoriser une ligne de commande précise, et éventuellement utiliser des expressions régulières pour les arguments (vues plus tard dans la formation) :
Il est dangereux d'essayer d'interdire une commande avec des arguments donnés, car facilement contournable (e.g. en changeant l'ordre des arguments). À la place, il est préférable d'autoriser l'exécution d'un script qui se chargera de vérifier les arguments avant d'appeler la commande.
affiche les droits sudoers de l'utilisateur (ou de l'utilisateur actuel si non précisé).
Écrivez la ligne sudoers permettant de donner à le droit de redémarrer le poste de travail.

Gestion des utilisateurs

Les groupes d'utilisateurs

Gérer les droits de chaque utilisateur un à un serait fastidieux et source d'erreurs, e.g. :
Il est ainsi bien souvent préférable d'attribuer des droits, non pas à un utilisateur donné, mais à un groupe d'utilisateur. Il suffit alors d'ajouter (ou de retirer) des utilisateurs à ce groupe, pour leur attribuer (ou retirer) des droits. Par exemple, les membres du groupe peuvent exécuter n'importe quelle commande en tant qu'administrateur. Il suffit donc d'ajouter (ou de retirer) des utilisateurs à ce groupes pour leur permettre (ou interdire) d'administrer l'ordinateur.
Cela permet notamment d'aisément visualiser qui peut faire quoi. Par exemple, pour savoir qui peut exécuter des commandes d'administrations, il suffit d'afficher les membres du groupe . Pour savoir ce qu'un utilisateur a le droit de faire, il suffit d'afficher les groupes auxquels il appartient.
Les commandes sont des versions bas niveau et non-interactives des commandes présentées ci-dessus.

Gérer les comptes utilisateurs

À la création d'un utilisateur, le contenu de (skeleton) est copié dans son nouvel home. Ce dossier permet alors de définir les fichiers de configuration (e.g. ) des nouveaux utilisateurs, voire même e.g. un .
Les utilisateurs systèmes n'ont pas de dossier home et ne peuvent pas se connecter. Ils sont généralement utilisés pour exécuter des logiciels/scripts/services requérant des droits spécifiques sans pour autant les exécuter en tant que .