Les systèmes d’exploitation gnu/linux et Unix sont similaires sur de nombreux points. Cela s’explique par leur histoire commune. L’utilisateur final n’y verra le plus souvent que du feu tant ils sont proches pour un usage final.
Cela se compliquera d’avantage pour l’administrateur, qui est chargé maintenir le système, assurer sa mise à jour, son évolution et le déploiement de solutions applicatives variées.. Il doit tenir compte des différences d’outils, des technologies, des concepts à appréhender et fonctionnalités parfois totalement propres à tel ou tel système.
Ainsi, il devra composer avec le gestionnaire de paquet, ou son absence (nécessitant de compiler soit même les logiciels à installer et les dépendances), la gestion des services…
Retenons simplement pour le moment que oui les système linux et unix sont cousins, mais pas identiques à tout point de vue.
Linux et les distributions
Linux est en réalité un noyau, on peut dire le coeur du système d’exploitation. Mais un noyaux sans outils n’a qu’une utilité très limitée. Gnu est la partie système d’exploitation (hors noyau), pour simplifier, on peut dire que c’est les outils de base, l’enrobage qui travaille avec le noyaux linux.
Une distribution Linux est un packaging d’applications formant un tout cohérent, on peut dire que distribution est égale à système d’exploitation complet.
Les choix techniques réalisés par les mainteneurs, leur ligne directrice quant à la cible d’utilisateur visée, et l’idéologie qu’ils défendent donnent des saveurs différentes d’une distribution à l’autre.
Ceci étant posé, un système Linux reste un système Linux, l’utilisateur maîtrisant les notions de base que je vais vous donner au fil des articles saura se débrouiller sur n’importe quelle distribution.
Il existe un nombre très important de distribution Linux, mais l’on peut citer ici quelques unes des plus importantes (qualitativement et en terme de popularité et longévité) : RedHat, CentOS (fork de RedHat), Fedora, Suse, Ubuntu, Debian, Archlinux, Manjaro, Ubuntu, Mint, Slackware, Gentoo…
Je ne conseillerai ici aucune distribution pour une utilisation courante, car je considère que ce choix vous appartient, après avoir mesuré leur caractéristiques, le besoin auquel elle répondent, ainsi que le niveau de difficulté et le temps requis à leur maintenance opérationnelle.
Disques dur et partitionnement
Le partitionnement est le découpage du disque en espaces permettant d’accueillir un système de fichier, ou d’autres partitions.
Il existe deux types de partitions : les partitions primaires et les partition logiques
Au total, il est possible de découper un disque en 64 partitions (4 primaires et 60 logiques).
Les partitions logiques ne peuvent être crées qu’au sein d’une partition primaire auquel on aura positionné le flag ‘étendu’.
Le système d’exploitation utilise des conventions de nommage pour identifier les disques et les partitions.
Le nommage des disques est alphabétique
Ainsi, SDA représentera le 1er disque dur, SDB le second disque… SDX le disque Xème disque.
Le nommage des partitions est préfixé du nom du disque qui la contient, et est numéraire.
Ainsi, SDA1 représentera la première partition du disque SDA, SDA2 la seconde partition… SDC5 sera la 5ème partition du 3ème disque.
Pour rendre une partition exploitable (pour y lire et écrire des fichiers), un système de fichier doit être déployé, et un point de montage rattaché.
Exemple de partitionnement pertinent pour un système linux contenant un seul disque dur.
|Paritions Primaires|SDA1|SDA2|SDA3 (flag étendu)||||
|Point de montage|/boot|/swap|/|/home|/var|/tmp|
|Partitions Logiques|||SDA5|SDA6|SDA7|SDA8|
/boot contient le noyau, l’initramfs ainsi que le bootloader, Il est préférable de l’avoir dans une partition dédiée, afin de pouvoir la reconstruire en cas de problème sans risquer une perte de données utilisateurs ou d’applications.
/tmp est également isolé, il s’agit d’un espace de stockage temporaire, accessible à tous en lecture et écriture. Le séparer offre l’avantage d’éviter de compromettre le système à cause d’une action malveillante visant à saturer l’espace disque.
Vous l’aurez compris, le principal intérêt du partitionnement est d’éviter de rendre le système inutilisable en cas de saturation de l’espace (seule la partition pleine sera compromise, et non l’intégralité du système).
La taille des disques étant variable d’un modèle à un autre, il n’est pas possible de donner une volumétrie idéalement pour chaque partition. On peut cependant prendre en compte ce postulat de départ :
/boot environ 500mo , contient le noyau linux, avec 500mo, nous avons l’espace nécessaire pour stocker sereinement plusieurs versions du noyau (qui s’ajouteront au fur et à mesure des mises à jour du système).
/swap est une partition mémoire, qui sert lorsque la mémoire ram n’est plus suffisante. L’ordre de grandeur conseillé est d’avoir une partition swap d’une taille équivalente à la quantité de ram disponible sur l’ordinateur.
/home contiendra les données des utilisateurs, il faut donc y allouer un espace conséquent.
/tmp, espace de travail temporaire pour les applications, doit à minima avoir quelques Go
/ et /var doivent avoir une taille conséquente
Pour un disque de 500Go, et 8Go de ram en respectant ce qui est mentionné ci-dessus, cela donne :
|Paritions|SDA1|SDA2|SDA5|SDA6|SDA7|SDA8|
|Point de montage|/boot|/swap|/|/home|/var|/tmp|
|Partitions Logiques|0,5 Go|8 Go|50 Go|> 350 Go|100 Go|10 Go|
Le total ne fait pas 500Go, c’est volontaire car je réserve toujours un peu de place non allouée sur un disque afin de pouvoir soit augmenter la taille d’une partition si elle devient pleine (attention, cette opération peut s’avérer dangereuse pour les données, voir impossible à réaliser, selon le système de fichier déployé sur la partition), soit créer une partition supplémentaire en fonction du besoin
Avec l’apparition de LVM (Logical Volume Manager), le partitionnement est revu en profondeur, simplifiant les redimensionnements de ce que l’on appelle les logical volume, hébergés au sein volume groups, posés sur des physical volumes qui eux sont déployés sur un disque ou plusieurs ou sur une ou plusieures partitions de type LVM.
Au regard de ses nombreux avantages, LVM est devenu incontournable au fil des années. C’est une technologie mature que l’on peut tout à fait utiliser en production, pour peu qu’on assure l’intégrité des données en associant cette solution à un système RAID (redondance de disques durs, concept que j’ai également prévu de vous détailler en temps voulu).
Coup d’oeil rapide sur le terminal et premières commandes
Le terminal est le moyen privilégié d’interagir avec un système linux. Le terminal, après authentification, donne accès à un Shell, c’est à dire un interpréteur de commande. On y renseigne des commandes qui sont exécutées par le système. Le terminal est en mode texte, à la différence d’une interface graphique qui se pilote pour l’essentiel à la souris, le terminal lui est piloté quasi exclusivement via le clavier de l’ordinateur. Une fois maîtrisé, il offre un certain confort d’utilisation et se révèle, dans bien des cas, plus rapide que l’interface graphique.
Connection au terminal
Se connecter à un terminal peut se faire à distance grâce à SSH (Secure Shell).
Depuis Windows, vous pouvez utiliser un client tel que PuTTy, MobaXterm, ou bien encore Tunnelier pour accéder à votre système Linux à distance.
Depuis un poste linux, il est possible de se connecter à un autre système Linux à distance via la commande SSH.
Enfin, localement, l’ordinateur fonctionnant sous Linux offre généralement plusieurs Tty (Terminaux), naviguer de l’un à l’autre se fait à l’aide de la combinaison de touche CTRL+ALT+Fx (Fx représentent les touches de fonction de F1 à F12).
Sur un poste de travail, l’un des Tty est généralement associé à l’environnement graphique.
Depuis l’environnement graphique justement (KDE, Gnome et comparses), il y a systématiquement un terminal que l’on peut lancé sans pour autant devoir quitter l’environnement graphique.
Lorsque l’on accède à un terminal, une authentification est requise (sauf dans le cas d’un terminal lancé depuis l’interface graphique, auquel cas le système considère que c’est l’utilisateur loggué à la session graphique qui initie la demande de terminal).
On renseigne donc son nom d’utilisateur (login) et son mot de passe.
Accès au SHELL et présentation du PROMPT
L’invite de commande apparaît ensuite, avec éventuellement un message d’accueil.
En début de ligne s’affiche le prompt. Ce dernier est plus ou moins généreusement renseigner selon les distribution Linux, mais peu être personnalisé selon les goûts de l’utilisateur.
Cependant, nous avons quasi systématiquement l’information relative au type de compte actuellement utilisé
# : ce compte est administrateur, c’est le compte root
$ : il s’agit d’un compte utilisateur standard
Il existe plusieurs Shell (sh, bash,csh, tcsh,ksh …), tous offrent la possibilité de personnaliser son environnement, grâce aux variables d’environnement.
La commande
echo $SHELL
permet de savoir quel est le shell utilisé
Ainsi, le contenu de notre prompt est décrit au sein d’une variable d’environnement qui se nomme PS1
En tapant la commande : echo $PS1 , le système nous affiche le contenu de la variable PS1.
Exemple :
echo $PS1
PS1=’\n [\t] \u@\h \w\n$’
Nous sommes bien d’accord, ce n’est pas très intuitif, voici une rapide transcription :
PS1 affichera :
\n un saut de ligne
\t l’heure (time)
\u l’utilisateur (user)
\h le nom de la machine (hostname)
\w le répertoire actuel (working directory), équivalent à la comande pwd
$ affiche le type de compte (# pour administrateur et $ pour user standard)
Nous verrons plus tard comment modifier une variable d’environnement, et plus généralement comment personnaliser l’ensemble de son environnement.
BASH, le shell
BASH est un évolution du Shell SH. Ce dernier est disponible dans pratiquement dans toutes les distributions linux et souvent est celui définit par défaut à l’installation du système. C’est donc ce shell qui sera utilisé.
Lors de l’ouverture au Shell, l’utilisateur se retrouve dans son répertoire personnel (home directory), le fichier .bashrc, présent dans le home directory est automatiquement sourcé (chargé). Ce fichier .bashrc contient la configuration permettant de personnaliser son environnement.
Tu notera que le fichier .bashrc commence par un point. Ce point indique qu’il s’agit d’un fichier caché.
Autre remarque : sourcer un fichier signifie que l’on demande au shell de prendre en compte le contenu du fichier (généralement des définitions de variables).
Ainsi, si je modifie mon fichier .bashrc (pour modifier la variable $PS1 qui correspond au PROMPT), je n’aurai pas à me déconnecter et reconnecter au SHELL pour que la modification soit prise en compte. Pour sourcer mon fichier .bashrc :
source .bashrc
ou bien
. .bashrc
Le . dans la deuxième commande réalise exactement la même action que la commande source
On constatera donc que le . a une fonction différente selon le contexte :
Il peut sourcer un fichier, et peut signifier que le fichier est un fichier caché. Nous verrons plutôt que, dans d’autres situation, il a des signification encore différentes.
Aide du système : MAN, les MANPAGES.
Il existe plus de 500 commandes Linux, chaque commande dispose en moyenne de 5 options, autant dire qu’il est impossible de tout mémoriser, MAN est là justement pour ça.
La première source de documentation se situe au sein des pages MAN (pages du manuel).
Pour obtenir de l’aide sur une commande, tapez
man nom_commande
exemple :
man ssh
Naviguer dans les MANPAGES
|Recherche vers le haut|?|
|Recherche vers le bas|/|
|Occurence suivante de recherche|n|
|Occurence précédente de recherche|N|
|Aller en haut de page|g|
|Aller en bas de page|G|
|Quitter|q|
Conversion MAN en pdf
Une commande pratique est ps2pdf, qui permet la conversion de document en pdf, on peut donc facilement faire la converser d’une page de manuel en pdf.
Exemple de conversion de la page MAN de ssh:
man -t ssh > ssh.ps
ps2pdf ssh.ps > ssh.pdf
Rechercher les pages en rapport avec un mot dans l’ensemble des pages MAN
Exemple de recherche du terme ssh dans l’ensemble des pages MAN
man -k ssh
apropos ssh
Indexation des MANPAGES
L’indexation permet de faciliter et accélerer la recherche dans les pages man
Sous la distribution DEBIAN, taper la commande mandb
Sous la distribution REDHAT ou CENTOS, taper la commande makewhatis
Consulter l’historique et rappeler les commandes avec History
Commande magique, commande essentielle, j’y ai recours plusieurs fois par jour.
Cette commande montre l’historique des commandes saisies et les numérotes
en tapant ! et le numéro de la commande, le shell ré-exécute la ligne de commande concernée
en tapant !! ou CTRL P, c’est la dernière commande saisie qui est ré-exécutée
CTRL R permet de rappeler la dernière commande contenant le mot renseigné, pour passer au suivant dans la liste des lignes de commande, on refait CTRL R
history -d et le numéro de la commande efface la-dite commande de l’historique
history -c purge entièrement l’historique.
Enfin, l’historique des commandes est stocké dans le fichier caché .history qui est dans le home directory de l’utilisateur.
Autocomplétion avec la touche TAB
Le bash offre un système d’autocomplétion bien pratique.
taper simplement le début du nom d’une commande, ou d’un fichier, puis taper sur TAB pour que le shell complète automatiquement la partie manquante. Si plusieurs possibilités existe, la liste des possibilités s’affichera en tapant deux fois sur TAB.
Caractéristiques de l’environnement avec set et env
set liste toutes les options du shell
env liste les variable d’environnement.
Le processus de démarrage du système d’exploitation
Un démarrage ordonné

Microprogramme d’amorçage de l’ordinateur : Le BIOS et l’UEFI
Au démarrage de votre ordinateur, un microprogramme est lancé. Il s’agit d’un logiciel de bas niveau. Selon l’ancienneté de votre poste de travail, il peut s’agir du BIOS (Basic Input/Output System) ou de l’UEFI (Unified Extended Firmware Interface).
Ce microprogramme va assurer la détection et vérifier le bon fonctionnement du matériel, vous pouvez d’ailleurs y apporter certaines modifications.
Une fois le bon fonctionnement matériel validé (Power On Self Test), le BIOS va lancer un chargeur de démarrage (Boot Loader), identifié sur les 512 premiers octet de votre disque dur, sur le MBR (Master Boot Record).
De son côté, UEFI peut fonctionner de deux manière :
- En mode compatibilité BIOS (émulation) et chercher un MBR : c’est le mode LEGACY.
- En mode normal : l’UEFI va monter une partition UEFI contenant le chargeur de démarrage (ici le chargeur de démarrage est vu comme une application UEFI). UEFI s’appuie le schéma de partitionnement GPT (GUID Partition Table) au lieu de MBR.
Dans un cas comme dans l’autre, le chargeur de démarrage prend le relai dans le processus d’initialisation de votre poste de travail.
Le chargeur de démarrage : BOOT LOADER
Les chargeurs de démarrage les plus connus sont LILO (Linux Loader) et Grub (Grand Unified Boot Loader).
Les dernières versions de Debian et de CentOS utilisent Grub2.
Le Boot Loader va charger le noyau linux (Kernel) ainsi que l’initial ram disk (modules indispensables au démarrage et non contenu directement dans le noyau).
Concrètement, ce sont les fichiers Vmlinuz et Initrd (il peut en réalité s’agit soit d’un initrd, soit d’un initramfs plus récent).
Les Boot Loader permettent de gérer de multiples systèmes d’exploitation, et se faisant, également plusieurs noyaux. Il est également possible de passer des paramètres au Boot Loader pour adapter le démarrage aux exigences formulées.
Le Noyau (KERNEL)
Le noyau (Kernel) charge les pilotes adéquats aux périphériques présents, monte le système de fichier ( /), et enfin lance le gestionnaire de services.
Le Gestionnaire de services
Le gestionnaire de services est le parent de l’ensemble des services et des processus qui seront lancés sur la machine.
Il pilote les services: ordonne leur niveau d’exécution et dépendances, permet de les démarrer et de les arrêter, de consulter leur statut …
Il existe plusieurs gestionnaires de services : Init System V (init) , upstart, systemd (system daemon).
Sous linux un service est nommé un daemon (démon).
Pour CentOS et Debian, c’est systemd qui est utilisé désormais. Une rétrocompatibilité avec SystemV et upstart est assurée, mais il est tout de même conseillé d’appliquer les bonnes pratiques, c’est-à-dire fonctionner en mode systemd.
Les comptes utilisateurs et les groupes locaux

L’accès à une machine Unix / Linux se fait par le biais d’une authentification, à l’aide d’un compte utilisateur.
Au sein d’un système Unix, un compte se définit par :
- un nom de compte : il s’agit de l’identifiant (par exemple bob pour l’utilisateur bob)
- un UID (User ID) : il s’agit d’un numéro d’identification unique sur le système
- un GID (Group ID) : il s’agit du numéro d’identification du groupe principal auquel appartient l’utilisateur.
- un home directory (pas systématique): il s’agit du répertoire personnel de l’utilisateur, là où il pourra stocker ses documents et paramètres personnalisés.
Nous retrouverons deux types de comptes :
- Des comptes destinés aux utilisateurs
- Des comptes dits applicatifs (ou comptes de service) : il s’agit de comptes système utilisés par différents services. Ces comptes n’ayant pas vocation à être utilisés par des utilisateurs, ils ne disposent pas, la plupart du temps, de shell de connexion.
Cas particulier : le compte Root
Le compte root à les pleins pouvoirs sur le système, c’est un compte d’administration.
Les informations relatives au comptes sont regroupées au sein de deux fichiers.
Le fichier /etc/passwd
- le nom du compte
- uid
- gid
- commentaire
- home directory
- shell de connexion
Le fichier /etc/shadow
- le nom du compte
- le mot de passe hashé (crypté)
- les informations relatives aux dates (expiration du mot de passe, délai d’avertissement avant changement du mot de passe, date de désactivation du compte, etc..).
Le fichier shadow est un fichier sensible, il n’est consultable que par root.
Les outils permettant de gérer les comptes
useradd – ajouter un nouvel utilisateur au système
usermod – modifier un compte existant
userdel – supprimer un compte utilisateur
Lancées sans argument, ces commandes affichent la liste des paramètres disponibles, certains sont obligatoires, d’autres non.
NB : il est possible de modifier un compte en editant le fichier /_etc/_passwd
La notion de groupe permet de rassembler des comptes utilisateurs ayant les mêmes besoins en terme d’accès à des ressources afin de simplifier la gestion.
A titre d’exemple, au sein d’une société, on peut imaginer un regroupement par service (le groupe ‘paie’ rassemblerai les utilisateurs du service paie et aurai accès un à répertoire ‘fiches de paie’, auquel le groupe ‘commercial’ n’aurait pas accès)
Les informations relatives au groupes, sont stockés dans de deux fichiers.
Le fichier /etc/group
- le nom du groupe
- le gid : numéro d’identifiant unique définissant le groupe
- la liste des utilisateurs appartenant au groupe
Le fichier /_etc/_gshadow contient des informations cachées sur les groupes. A l’image de /etc/shadow , ce fichier n’est pas consultable par un autre utilisateur que root
Les outils de gestion des groupes
- groupadd : créer un nouveau groupe
-groupmod : modifier un groupe existant
-groupdel : supprimer un groupe
NB : il est possible de modifier un groupe en éditant directement le fichier /_etc/_group
L’ajout d’un utilisateur à un groupe se fera par exemple en éditant /_etc/_group ou en utilisant la commande usermod (et non groupmod comme l’on pourrait s’y attendre).
Cas particulier : le groupe wheel (sur RedHat et affiliés)
Tout utilisateur appartenant au groupe wheel aura la possibilité d’obtenir l’accès root. Nous verrons tout cela dans un autre article, dédié à la substitution d’utilisateur (commandes su et sudo, visudo, et fonctionnement du fichier /etc/sudoers )
Quelques commandes fondamentales
Pour interagir avec le système d’exploitation, vous saisissez des commandes. Ces commandes acceptent des paramètres (des options) permettant de définir le comportement de la commande, et donc le résultat que l’on souhaite obtenir.
Vous allez découvrir énormément de commandes au fil des TP, ces commandes sont placées dans un contexte (ce que l’on souhaite obtenir). Il serait trop long de détailler toutes les possibilités de chaque commande, et ce n’est pas l’objectif d’un TP, qui s’inscrit dans une démarche plus globale (je veux mettre en place un serveur web, pas que l’on m’explique en détail le fonctionnement de l’éditeur de texte que l’on va utiliser pour modifier les fichiers de configuration).
Je publierai régulièrement des articles concernant les commandes, mais la consultation des pages de manuel de la distribution resteront la base la plus complète sur le sujet, je vous explique comment consulter les pages man (pages de manuel) dans mon article de présentation du système GNU/Linux, je vous invite donc à commencer votre apprentissage par là.
Ceci étant posé, j’expliquerai bien sur les commandes que l’on utilise dans leur contexte (la fonction des paramètres utilisés).
Autre points importants :
- plusieurs commandes peuvent avoir le même rôle (pour lire un fichier texte par exemple, nous avons cat more less view nano … ). Je ne les listerai pas toutes, vous les découvrirez avec le temps et utiliserez à terme celles que vous préférez
- il y a parfois plusieurs façons d’obtenir les informations désirées : le système de journalisation en est un parfait exemple ; en effet, à côté de l’ancien système de logs (fichiers journaux sous forme texte que l’on peut directement consulter à l’aide des commandes évoqués ci-dessus) ; cohabite le système implémenté par l’arrivée de systemd sur Linux, la commande journalctl. Les deux options sont tout à fait valables et vous y retrouverez les mêmes informations.
Je vais vous présenter dès à présent une liste de commandes. Ce document doit être considéré comme un petit mémo, auquel se référer en cas de besoin (vous devriez peut être l’imprimer et le coller dans votre carnet de notes… comment ça, vous n’avez pas de carnet de notes ? 🙂
Action | Commande |
---|---|
Actions de base | |
Arrêter le système | shutdown -h now ou init 0 |
Redémarrer le système | reboot ou init 6 |
Consulter le manuel | man |
Consulter l’historique des commandes | history |
Gestion des services (systemd) | systemctl |
Gestion des services solaris (smf) | svcadm / svcs |
Gestion des logs (journalisation) | journalctl |
Usage CPU/RAM | top |
Gestion du réseau | |
NetworkManager | nmcli |
Solaris | ipadm / dladm |
Gestion des processus | ps / fg / bg / & / nice / renice |
Gestion des modules | lsmod/modprobe/partprobe |
Compilation | make |
Arborescence et fichiers | |
Se déplacer dans les répertoires | cd |
Lister le contenu d’un répertoire | ls |
Taille d’un fichier / répertoire | du |
Rechercher un fichier | find |
whereis (pour les binaires uniquement) | |
Rechercher dans un fichier | grep / egrep |
Traitement de flux | sed / awk |
Renomme ou déplacer un fichier ou repertoire | mv |
Copier un fichier ou répertoire | cp <br>scp (cp à travers ssh) <br>sync <br>rsync (distant) |
Supprimer un fichier ou répertoire | rm / rmdir |
Type d’un fichier | file |
Lire un fichier | cat <br>view / vi / vim <br>more <br>less <br>nano <br>emacs <br>tail <br>head |
Créer un répertoire | mkdir |
Créer un fichier (vide) | touch |
Créer fichier / modifier un fichier | vi / vim <br>nano <br>emacs |
Gestion des utilisateurs et des droits | |
Modifier propriétaires d’un fichier (user/group/other) | chown |
Modifier les droits d’un fichier | chmod |
Gestion des ACLs (droits étendus) | getfacl / setfacl |
Gestion des utilisateurs | useradd <br>usermod <br>userdel |
Gestion des groupes group[add/mod/del] | groupadd <br>groupmod <br>groupdel |
Se rendre super utilisateur (basculer root) | su |
Se substituer à root pour une commande | sudo |
Gestion des Filesystem / Disques / Partitions | |
Gestion des points de montage | mount <br>umount |
Occupation des filesystems | df |
Gestion des disques et partitions | fdisk |
Créer partition (filesystem) | mkfs |
LVM – logical volume, physical volume, volume group | [lv / pv / vg][display / resize / extend / create …] |
Gestion des paquets, dépôts et mise à jour système | |
Debian et affiliées | apt / dpkg |
RedHat et affiliées | dnf / yum / rpm |
Solaris | pkg |
Suse | yast / rpm |
ArchLinux / Manjaro | yaourt / pacman |
Il existe plus de 500 commandes, qui, vous vous en doutez, sont toutes utiles pour un usage ou un autre. Cette petite liste constitue les commandes les plus utilisées, à mon sens. Il est bon de les connaître.
Les fichiers
Sous un système Linux, tout est fichier. Ainsi, un périphérique tel qu’une imprimante, ou bien un bus de communication, ou bien encore le processeur de l’ordinateur sera un fichier, de type particulier, mais fichier tout de même. Un répertoire est également un fichier.
Linux ne s’occupe pas des extensions de fichier (suffixe en .quelquechose), ce sont les meta-tag qui sont utilisés.
Arborescence du système
|/|root – répertoire racine (à ne pas confondre avec l’utilisateur root qui est l’administrateur de la machine). Il n’existe rien au dessus de /|
|boot|contient le noyau (kernel), l’initramfs et le bootloader|
|swap|partition mémoire – permet de simuler une mémoire ram afin de pallier à une forte sollicitation de la ram, au prix d’une dégradation des performance (le swap est posé sur un disque dur, les accès sont donc beaucoup plus lent)|
|home|Emplacement des répertoires personnel des utilisateurs|
|tmp|Emplacement de travail temporaire des applications et du système. Selon les distributions, il peut être purgé automatiquement à durant le cycle de redémarrage du système. Cet espace n’a pas vocation a héberger des données que l’on souhaite conserver!|
|bin|Binaries – contient les binaires|
|etc|Edit text configuration – contient la plupart des fichiers de configuration|
|media|Emplacement des points de montage pour les périphériques externes montés automatiquement|
|mnt|Emplacement des points de montage pour les périphériques montés manuellement|
|opt|optionnels, logiciels commerciaux|
|proc|pseudo système de fichier contenant les fichiers point d’entrée du système (les processus)|
|sys|fonctionne avec proc, fichiers détaillant le fonctionnement du système|
|selinux|sur RedHat et CentOS – surcouche offrant une sécurité accrue de l’accès aux fichiers|
|srv|Emplacement des montage réseaux (samba, nfs …), on trouve parfois export|
|usr|Emplacement des application graphiques|
|var|Emplacement des log et autres données souvent modifiées, emplacement des bases de données par exemple|
Lister les fichiers avec ls
La commande ls permet de lister les fichiers. Avec l’option -l , ls affiche des informations complémentaires, et notamment le type des fichiers.
Le combo d’option que j’utilise avec ls : ls -ltrha . Cette commande affiche la liste des fichiers (-l), y compris les fichiers cachés (-a) du plus ancien au plus récent (-tr) et indique la taille de manière lisible (-h)

la commande ainsi présenté nous donne les informations suivantes :
- le type de fichier
- les droits d’accès respectivement pour l’utilisateur propriétaire, le groupe propriétaire, et pour le reste du monde :
r = read (lecture)
w = writer (écriture)
x = exécution
- l’utilisateur et le groupe propriétaire
- la taille du fichier
- la date et heure de création ou de modification
- le nom du fichier
Si vous êtes attentif à la capture d’écran, vous remarquerez deux choses : j’ai utilisé la commande pwd pour afficher mon répertoire actuel
vous remarquerez également les fichiers . et .. dans la liste. Vous les retrouverez dans tous les répertoires, nous détaillerons cela dans la section concernant les chemins relatifs, mais sachez qu’ici le « . » représente le répertoire courant (dans ce cas ci, le répertoire courant est SCRIPTS/), et le « .. » le répertoire parent (dans ce cas ci, le répertoire parent est jo/)
Types de fichiers
Voici une liste des types de fichiers avec leur symboles tels que retourné par la commande ls -l
|-|Fichier ordinaire (un exécutable, un fichier texte …)|
|c|Character device|
|b|Bloc device|
|S|Socket inter processus|
|d|Répertoire|
|l|Lien symbolique|
|P|Fichier pipe|
Obtenir le type d’un fichier avec file
La commande file permet de retourner le type d’un fichier
exemple :
[jo@msi-gf75 ~]$ file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4fef2dc9762eb7d4593f402a65cc02bb3d4c48de, for
GNU/Linux 3.2.0, stripped
Rechercher un fichier avec find
La commande find permet de rechercher un fichier
exemple :
find / -name toto.txt
Une recherche sera faite, depuis la racine (/), dans tous les répertoires, du fichier toto.txt
Il s’agit ici de l’utilisation la plus simple de la commande find, qui offre bien plus de possibilité (recheche en fonction de la date de modification, de la taille, du type, exécution d’une autre commande sur les occurrences de recherche trouvées ect..)
A titre d’exemple, je veux rechercher dans / tous les fichiers de type fichier, de moins de 2 jours, appartenant à Jo, et d’une taille supérieur à 20 mo :
find / -type f –mtime -2 –user jo –size +20M
Le paramètre –exec {}; permet d’ajouter des commandes sur chaque résultat de la commande find, pratique dans le cadre d’une suppression ou d’un renommage de masse.
Je peux décider, car je suis un méchant administrateur, de supprimer toutes les musiques au format mp3 stockées sur la machine !
*find / -name .mp3 –exec rm –f { }\ ;
Ici, « * » est un symbole évoquant 0 à n caractères. Je cherche donc, depuis la racine (/) tous les fichiers avec 0 ou plusieurs caractères, et finissant par .mp3, et pour chaque fichier trouvé, je supprime avec l’option force de rm (le -f)
Rechercher un fichier avec whereis
La commande whereis est bien plus rapide que find car sa recherche est sectorisée. Déjà, elle ne recherche que des binaires, des fichiers sources et des pages man. Ensuite, elle ne recherche que dans les répertoires de base du système, ainsi que dans les emplacements définit dans les variables $PATH et $MANPATH.
Vous allez me dire, les variables quoi ?? et d’abord c’est quoi une variable.
Et c’est là où l’on déborde de notre sujet de base. Je vais donc faire extrêmement simple.
Une variable est une notion très utilisée en programmation. Il s’agit d’un stockage permettant de contenir des chaînes de caractères. Il est très simple ensuite de récupérer le contenu de ces chaînes de caractère en appelant la variable qui les contient.
Sous Linux, les variables sont précédés d’un $.
Nous avons donc la variable $PATH qui contient des chemins pointant vers les binaires, les librairies du système et plus largement tout ce que vous voulez y ajouter.
Et la variable $MANPATH qui contient tous les emplacements où sont situé les pages man sur le système.
Pour lister le contenu d’une variable sur le terminal, vous pouvez utiliser la commande echo.
echo $PATH
Nous reviendrons en détail sur tout ceci dans le chapitre approprié.
Sachez pour le moment simplement que whereis s’appuie sur ces variables pour réaliser une recherche bien plus rapide que find. C’est tout à fait adapté lorsque l’on recherche un binaire par exemple.
Rechercher un fichier avec locate (et updatedb)
La recherche dans un répertoire peut être longue (dépend du nombre de fichiers à traiter).
Pour optimiser le temps de réponse de notre recherche, il est possible de générer une indexation des fichiers.
locate ne fait pas de recherche directement au niveau du système de fichier, mais en consultant une base de donnée gérée par la commande updatedb. Cela permet d’obtenir des temps de réponse bien plus rapide. Il convient donc, en première étape, de mettre à jour la base de donnée en tapant la commande updatedb, puis de lancer notre recherche
Exemple :
je génère la base pour pouvoir effectuer des recherche dans usr/share/doc
updatedb -o monindex -u /usr/share/doc
je peux ensuite réaliser ma recherche en m’appuyant sur cette base indexée grace à la commande locate
locate –database monindex toto.txt
Rechercher le chemin complet d’une commande avec which
which se focalise uniquement sur les commandes, et retourne en résultat le chemin complet vers les dites commandes.
Obtenir la taille d’un fichier avec du
La commande du (pour disk usage) permet d’obtenir la taille d’un fichier.
Avec l’option -s (summerize), nous avons une taille globale du répertoire visé
Comme pour la commande ls, le paramètre -h donnera une taille compréhensible
Naviguer dans le système de fichier
La racine du système de fichier est « / » . Il n’y a rien au dessus de « / »
Une histoire de chemins absolus et chemins relatifs
L’immense majorité des commandes Linux reconnaissent chemins relatifs et absolus
Un chemin absolu est la description complète du chemin d’un fichier depuis le répertoire racine « / »
Exemple, le chemin absolu vers le fichier applis.conf que nous avons vu dans l’exemple de la commande ls est : /home/jo/SCRIPTS/applis.conf
Un chemin relatif est la description du chemin d’un fichier depuis le répertoire courant
Nous avons vu un peu plus haut les répertoires « . » et « .. » qui désignent respectivement le répertoire courant et le répertoire parent.
Si je me situe dans le répertoire /home/jo/SCRIPTS , le chemin relatif de mon fichier applis.conf sera ./applis.conf (( je me positionne dans le répertoire courant pour atteindre applis.conf)
Si je me situe dans le répertoire /home/jo/SCRIPTS/BACKUP, le chemin relatif de mon fichier applis.conf sera ../applis.conf (je remonte d’un niveau à l’aide de « .. » pour me situer dans le répertoire SCRIPTS et ainsi atteindre applis.conf
La commande pwd pour situer mon emplacement actuel
La première commande à connaître est pwd , print working directory qui permet d’afficher le répertoire actuel.
La commande cd pour changer de répertoire
la commande cd (pour change directory) permet de se déplacer dans l’arborescence.
Lors de la connexion au terminal, nous nous retrouvons dans notre home directory (répertoire personnel de l’utilisateur connecté).
Dans mon cas, ce répertoire est /home/jo
Si je veux joindre le répertoire SCRIPTS, je peux utiliser le chemin absolu ou bien le chemin relatif.
avec le chemin absolu : cd /home/jo/SCRIPTS
avec le chemin relatif : cd ./SCRIPTS ou bien cd SCRIPTS (le . est implicite)
Maintenant que je suis dans le répertoire /home/jo/SCRIPTS, admettons que je veuille me rendre dans le répertoire /home/jo/Téléchargements/ISOS_linux/DEBIAN/
avec le chemin absolu : cd ../Téléchargements/ISOS_linux/DEBIAN
Si je veux revenir dans /home/jo/
Le tilde « ~ » désigne /home/
je peux donc utiliser :
cd ~/jo qui me ramènera dans mon home directory
je peux également utiliser
cd sans autre paramètre.
ou bien alors utiliser le chemin relatif :
cd ../../../
ou enfin le chemin absolu :
cd /home/jo/
le « – » désigne le répertoire dans lequel on se situait avant le répertoire courant.
cd –
NB : L’autocomplétion avec la touche TAB permet de se faciliter la vie, vous n’avez qu’à saisir le début d’un nom de fichier et de commande et appuyez sur la touche TAB pour que la complétion se fasse.
Comparer des fichiers avec diff et sdiff
diff fichier1 fichier2 renvoi toutes les différences entre deux fichiers (pratique pour comparer des fichiers de configuration)
sdiff fichier1 fichier2 permet d’avoir un affichage sous forme de colonne, et de mettre, la aussi, en évidence les différences entre deux fichiers.
Compter avec wc
La commande wc (Word Count) est vraiment très pratique, elle permet de compter le nombre de caractères d’un fichier, le nombre de ligne etc …
wc –l /var/log/messages me renverra le nombre de ligne de ce fichier
Je peux par exemple lister un répertoire et obtenir le nombre de résultats en tapant la commande
ls –l mon_repertoire | wc –l
Ici, nous utilisons le pipe (altGr +6) , c’est-à-dire que le résultat de ls –l est envoyé à la commande wc pour traitement.
wc –w renvoi le nombre de mots d’un fichier
wc –m renvoie le nombre de caractères
wc –l le nombre de lignes.
Copier cp, déplacer mv, renommer mv et supprimer rm
Rien de bien compliqué ici.
La copie se fait avec cp
Le déplacement ainsi que le renommage se fait avec mv (move)
La suppression avec rm (remove)
Supprimer un fichier
rm nom_du_fichier_a_supprimer , demandera une confirmation avant de réaliser la suppression. rm avec le paramètre –f (pour force) ne demandera pas de confirmation
pour supprimer un dossier vide, on peut utiliser au choix la commande rmdir ou rm –r ( r pour récursif)
pour supprimer un dossier non vide, c’est-à-dire contenant des fichier ou bien d’autre dossiers, on utilisateur également le mode récursif de rm :
Rm –r nom_du_repertoire_a_supprimer.
Pour ne pas avoir une demande de confirmation pour chaque fichier/dossier à supprimer :
rm –rf nom_du_repertoire_a_supprimer
La copie de fichier
La commande cp prend en premier argument le fichier à copier, et en deuxième argument la destination ou l’on souhaite déposer la copie, avec éventuellement le nom du nouveau fichier.
cp mon_fichier_a_copier archives/la_copie
j’utilise quasi systématiquement les paramètres –r pour récursif ( dans le cas d’un répertoire, il copie ainsi également son contenu) et –p qui permet de préserver les droits et les caractéristiques (dates notamment) du ou des fichiers concernés.
cp –pr mon_dossier_a_copier mon_nouveau_dossier
Création de liens symbolique avec ln
Un lien symbolique est un pointeur vers un fichier, on peut le comparer à une sortie de raccourci dans l’univers windows
ln -s nom_du_fichier nom_du_lien_symbolique
Cela s’avère pratique lorsque l’on fait des mises à jour d’applications et que l’on souhaite conserver l’ancienne version sur le disque. Nous aurons le répertoire application.version1 (ancienne version) et le répertoire application.version2. Mais c’est le lien symbolique application qui sera utilisé. On pourra ainsi faire pointer au besoin le lien symbolique application vers application.version1 ou application.version2
Renommer ou déplacer un fichier
mv permet à la fois de déplacer et de renommer.
mv mon_fichier mon_nouveau_fichier changera le nom
mv mon_fichier /home/jo/nouveau_repertoire/mon_fichier déplacera le fichier de l’emplacement courant vers /home/jo/nouveau_repertoire/.
Lire un fichier ( cat, tac, vi, view, less, more, tail, head )
Tout d’abord, sachez qu’il existe plusieurs commandes qui permettent de lire un fichier, je vais en lister ici quelques unes.
cat et tac
Nous avons cat qui permet d’afficher le contenu du fichier et nous renvoi ensuite sur l’invite de commande.
Tapez cat /var/log/messages et voyez opérer la magie !
Le petit copie de cat s’appel tac, il permet la aussi d’afficher le contenu du fichier, mais en mode inverse, si bien que la première ligne se retrouve en dernier, cela peut être assez pratique dans certaines situations…
Tapez
tac /var/log/messages
J’ai pris l’habitude d’utiliser tac pour savoir qui s’est connecté en dernier sur la machine (commande last)
Last |tac
Le symbole | (touche AltGr + 6 ) constitue ce qu’on appelle un pipe (il s’agit d’un tunnel permettant le dialogue entre deux commandes, la sortie d’une commande est envoyé en entrée d’une autres commande, nous verrons cela plus tard)
more et less
more existe, mais n’est pas très utile comparé à ce que je considère comme son concurrent directe less. less permet d’afficher un fichier page par page, et à la différence de more, permet également de revenir en arrière dans les pages consultées. Il est très rapide en consultation de fichier car il ne charge pas entièrement le fichier avant de commencer à le lire, ce qui est très pratique lorsque l’on consulter des fichiers de log de plusieurs Go.
vi, vim, view
vi est l’éditeur de fichier à connaître, il permet de consulter un fichier, mais également de le modifier et d’enregistrer ses modifications. Une section complète sera dédiée à vi car sa prise en main est un peu déroutante, mais il est extrêmement agréable une fois qu’on le maîtrise. vim est une évolution de vi.
vi a également un petit frère, view, qui permet d’ouvrir le document en mode lecture seule, afin d’éviter de faire des bêtises.. pour quitter vi sans enregistrer ses modifications, touche ECHAP, touche : , touche q et touche !
La commande head affiche le début d’un fichier, on peut préciser le nombre de ligne à afficher
head et tail
head affiche le début du fichier, on peut lui préciser le nom de lignes à afficher
head -50 /var/log/messages
tail permet de consulter la fin d’un fichier. Elle fonction de manière identique à head. Son paramètre –f est très pratique pour avoir un rafraîchissement en temps réel en cas de modification du fichier. Pour sortir de cette commande, car elle ne rend pas la main lorsque –f est activé, il vous suffit de faire touche ctrl + touche c.
tail -100f /var/log/messages
Archivage et compression de fichier
L’archivage se fait avec la commande tar. Il permet de regrouper des fichiers et répertoires au sein d’un même fichier appelé archive. Il est possible à la fois d’archiver et de compresser l’archive via l’outil tar, c’est ce que je vais vous montrer ici .
Créer une archive d’un répertoire :
tar cvzf monarchive.tar.gz monrep/
c= create (créer) v= verbeux z = zippé f= file
Décompresser une archive
tar xvzf monarchive.tar.gz .
(le point indique le répertoire courant, on peut indiquer n’importe quel répertoire de destination bien sûr en absolu ou en relatif)
X = extract .
Rechercher à l’intérieur d’un fichier ou du résultat d’une commande avec La commande GREP
La commande grep est absolument indispensable. On l’utilise à longueur de journée.
Elle permet d’afficher les lignes correspondantes aux critères recherchés, et cela, dans un ou plusieurs fichiers.
grep moncriète monfichier
Pour ma part, j’ai l’habitude d’utiliser un pipe, je fais donc
cat monfichier |grep moncritère
Pour faire une recherche dans une arborescence, on utilisera –R pour récursif
Pour faire une recherche en ne tenant pas compte des majuscules et minuscules (la casse), on utilisera –i
grep –i error /var/log/messages
j’espère que vous n’aurez pas beaucoup de retour sur cette commande…
cat /var/log/messages | grep –i error
nb: le | (nommé pipe) se fait avec ALT GR +6
Traitement de flux de fichiers avec SED et AWK
La commande SED est vraiment sympathique, je n’ai pas encore eu le temps de la documenter, il s’agit d’un gros morceau. Sachez simplement qu’elle existe et qu’elle permet de consulter des flux (par exemple un fichier de données) et de le modifier avant de le proposer à l’affichage. On peut substituer par exemple un nom par un autre dans tout un document assez facilement. C’est un outil puissant avec une syntaxe un peu particulière.
AWK est un carrément un langage à lui tout seul. Il permet d’interagir sur des flux de données. Mes compétences sur cet outils ne sont pas suffisantes pour que je l’aborde maintenant, sachez qu’il existe des livres entiers consacrés à AWK.
Gestion des droits
Je compte rédiger un article dédié concernant les droits sur les fichiers. Cependant, je vous indique ici pour votre information les commandes qui permettent d’agir sur les fichiers au niveau des droits.
chmod : modifier les droits d’accès (lecture, écriture, exécution) pour le propriétaire, le groupe propriétaire, et le reste du monde.
chown : le propriétaire et le groupe propriétaire
setfacl : mise en place d’acls (access control list) pour affiner la gestion des droits
Autres commandes sur les fichiers
Je l’ai déjà indiqué dans un article précédent, il existe plus de 500 commandes. Je vous ai présenté ici ce qui me paraissait le plus pertinentes, et vous ai proposés quelques exemples concrets d’utilisation. Je conclurai cet article avec quelques autres commandes que je ne détaillerai pas autant que le précédentes, en avoir connaissance peut être utile un jour ou l’autre, il faudra alors consulter la page de manuelle associée pour les utiliser selon vos besoins.
split qui permet de découper un fichier
whatis qui permet de donner l’entête de la page man d’une commande, afin de savoir rapidement quelle est sa fonction
uniq qui permet de gérer les doublons dans les résultats
sort qui permet de faire des tris
cut qui permet de découper des champs (de n’afficher que les colonnes qui nous intéressent)
Gestion des permissions sur les fichiers avec chown et chmod
Nous avons vu que sous Linux, tout est fichier. En complément, nous pouvons dire que tout fichier sous Linux appartient à un utilisateur et un groupe.
Par défaut, le propriétaire est celui qui crée le fichier, et le groupe propriétaire est le groupe principale de celui qui a crée le fichier
La commande chown permet de modifier ce propriétaire et ce groupe.
Sous Unix, nous devons également préciser les droits que l’on accorde :
- un droit de lecture (ou son interdiction)
- un droit d’écriture (ou son interdiction)
- un droit d’exécution (ou son interdiction)
Ces droits s’applique séparément sur :
- le propriétaire du fichier
- le groupe propriétaire du fichier
- le reste du monde
Nous pouvons donc associer des droits différents sur ces 3 entités.
Consulter les propriétaires et les droits d’un fichier avec ls
La commande ls -l que nous avons déjà vu dans l’article sur les fichiers permet de donner les détails d’un fichier, et, chose qui nous intéresse ici, son propriétaire et ses accès.
ls -l nom_du_fichier
Positionner le propriétaire et le groupe sur un fichier avec chown
La commande chown permet de modifier le propriétaire d’un fichier, et également son groupe.
La commande chgrp permet de ne modifier que le groupe propriétaire d’un fichier.
L’utilisation de la commande chown est simple: on saisi la commande, le propriétaire, puis deux points, le groupe, et enfin le nom du fichier concerné
chown user:group nom_du_fichier
exemple, je veux que le fichier paie_juillet appartienne à bob et au groupe paie
chown bob:paie paie_juillet
Si je souhaite que la modification soit étendue sur toute une arborescence et son contenu, j’utiliserai l’option récursive -R sur le répertoire
exemple, je veux que le répertoire et tous les fichiers situés dans fiches_de_paie appartiennent à bob et au groupe paie
chown -R bob:paie fiches_de_paie/
Positionner les droits d’accès sur un fichier avec chmod
La commande chmod permet de modifier les droits d’accès de ces entités sur le fichier.
Il existe deux méthodes pour positionner les droits avec chmod
La méthode que j’appelle alphabétique (on utilise la première lettre du droit concerné) et la méthode octale,qui est celle que je vais vous présenter, car je la trouve plus pratique à l’usage
Tout d’abord, laissez moi vous présenter le tableau de correspondance ci-dessous, qui associe le nom du droit, sa lettre d’usage, et son équivalent octal :
Accès souhaité | Nom | Lettre | Octal |
---|---|---|---|
Aucun droit | Null | – | 0 |
Exécution | eXecute | x | 1 |
Écriture | Write | w | 2 |
Lecture | Read | r | 4 |
Pour un fichier, nous aurons donc une association du type :
aaa / aaa / aaa , soit les droits pour l’utilisateur, le groupe, et le reste du monde
0 / 0 / 0 , équivalent octal, chaque chiffre est la somme des droits alphabétiques de l’entité concernée.
Pour clarifier mon propos, voici quelques exemple :
Le fichier est accessible en lecture, écriture, et exécution pour le propriétaire, et aucun droit pour le groupe et le reste du monde :
rwx / — / —
7 / 0 / 0
Le fichier est accessible en lecture, écriture, et exécution pour le propriétaire, en lecture et exécution pour le groupe, et aucun droit pour le reste du monde :
rwx / rw / —
7 / 5 / 0
Le fichier est accessible en lecture et écriture pour le propriétaire, en lecture seulement pour le groupe et également pour le reste du monde :
rw- / r– / r–
6 / 4 / 4
Cela peut semble un peu obscur à la première lecture, mais avec un peu de pratique, cela vous deviendra tout à fait naturel.
Donc, admettons que je veuille positionner le droit lecture, écriture, et exécution pour les trois entités sur le fichier monfichier.txt :
chmod 777 monfichier
Si je souhaite que ce droit soit étendue sur toute une arborescence et son contenu, j’utiliserai l’option récursive -R sur le répertoire :
chmod -R 777 repertoire/
Canaux de redirections, chaînage de commandes et caractères de substitution
Canaux de communication du shell, et redirection dans des fichiers grâce à > , >>, et 2>&1
Le shell fournit aux commandes des canaux de communication :
Un canal d’entrée (typiquement ce que vous saisissez au clavier par exemple), un canal de sortie dit standard (ce que répond la commande après avoir traité votre demande), et également un canal d’erreur, au cas où quelque chose se passe mal.
Il est possible de renvoyer directement les sorties des commandes dans des fichiers (on appelle cela une redirection), ceci est très utilisé lorsque l’on crée des scripts qui sont lancés automatiquement, cela permet de savoir ce qui s’est bien passé, et ce qui s’est mal passé.
De la même façon il est possible de fournir en entrée de commande des instructions issues d’un fichier au lieu de taper au clavier
Le canal d’entrée est nommé STDIN (canal 0), le canal de sortie STDOUT (canal 1)et le canal d’erreur STDERR (canal 2). Vous l’aurez compris, STD veut dire Standard. Il est possible de créer des canaux supplémentaires, mais cela ne nous intéresse pas ici.
Le symbole > permet de redirigé le résultat d’une commande dans un fichier. Si le fichier existe, ce dernier est écrasé.
Le symbole >> permet également de redirigé le résultat d’une commande dans un fichier, mais si le fichier existe, le résultat est ajouté au fichier.
Pour rediriger la sortie standard ainsi que la sortie d’erreur vers un fichier, on utilisera 2>&1 de cette façon :
Ma_commande > mon fichier_de_log 2>&1
Si je souhaite uniquement avoir les erreur, ce sera
Ma_commande 2> mon_fichier_de_log
Vous l’aurez compris, le 1 est implicite lorsque l’on redirige la sortie d’une commande avec > comme dans :
Ma_commande > mon_fichier_de_log identique à Ma_commande 1> mon_fichier_de_log
Le < pour désigner une entrée est implicite la plupart du temps
Par exemple :
cat /var/log/messages = cat < /var/log/messages
Le pipe « | » pour lier les canaux
On se servira du pipe pour lier la sortie d’une commande à l’entrée d’une autre commande.
cat /var/log/messages | grep error
Ici, nous lions la sortie de la commande cat à l’entrée de la commande grep : j’obtiens un filtre du mot clé « error » en consultant le fichier messages.
A noter que l’on peut utiliser plusieurs pipes
cat /var/log/messages | grep error | wc -l
Nous utilisons la commande wc avec le paramètre -l : nous obtiendrons ainsi le nombre de lignes contenant le mot clé error dans le fichier /var/log/messages !
Le pipe est donc très utile !
Avec ce que l’on a vu plus haut, on peut même stocker l’information dans un fichier :
cat /var/log/messages | grep error | wc -l > /tmp/nb_erreurs_messages.txt
Tee pour dupliquer la sortie
Le problème est que lorsque l’on redirige les sorties vers des fichiers, nous n’avons plus le résultat à l’écran et l’on est obligé de consulté le fichier créé pour savoir le déroulement des opérations. La commande tee permet de résoudre ce problème.
Son fonctionnement est le suivant :
Ma_commande | tee monfichier_de_log Si monfichier_de_log existe, il sera écrasé
Ma_commande | tee -a monfichier_de_log Si monfichier_de_log existe, il sera complété (même principe que >>)
Chaîner les commandes avec &&
Il est possible de saisir plusieurs commandes à la suite : si la première commande s’exécute correctement (code retour= 0, alors, lance la deuxième commande)
Je créer le répertoire BACKUP et si cela fonction je copie le fichier toto.txt dans le répertoire BACKUP
mkdir BACKUP && cp toto.txt BACKUP/
La substitution des caractères
Certains symboles permettent de dire au système que nous avons des inconnues qu’il doit trouver dans les noms des fichiers ou dans le contenu d’un fichier
Nous avons tout d’abord le symbole ***** qui représente une chaîne de caractère entre 0 et n caractères
? Identifie un caractère unique
[ … ] signifie que cela peut un des caractères situé dans la plage indiquée
[1-9] ou [a – z] signifie que le caractère peut être n’importe lequel entre 1 et 9 ou entre a et z par exemple.
[ ! ] inverse la recherche (tout ce qui ne contient pas…)
Les processus
Tout programme chargé en mémoire vive (c’est à dire en cours d’exécution), se voit délivrer un identifiant unique sur le système, c’est le PID (pour Processus ID). Ce PID va nous permettre d’agir sur les processus.
lister les processus avec la commande « ps »
Pour obtenir la liste des processus du système, nous utiliserons la commande ps.
J’utilise fréquemment le combo d’option -edf qui est facile à retenir et permet de lister tous les processus avec un affichage complet :
[jo@msi-gf75 ~]$ ps -edf
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 sept.05 ? 00:00:00 /sbin/init
root 2 0 0 sept.05 ? 00:00:00 [kthreadd]
root 3 2 0 sept.05 ? 00:00:00 [rcu_gp]
root 4 2 0 sept.05 ? 00:00:00 [rcu_par_gp]
root 6 2 0 sept.05 ? 00:00:00 [kworker/0:0H-kblockd]
root 8 2 0 sept.05 ? 00:00:00 [mm_percpu_wq]
On remarquera le processus /sbin/init , premier processus lancé lors du démarrage de la machine, et qui porte le PID 1.
Voici la description des champs :
UID : Utilisateur initiateur de la commande
PID : Processus ID
PPID : Processus ID du parent (on vois ici que rcu_gp portant le PID3 est un enfant de kthreadd qui porte le PID 2)
C : Utilisation du cpu
STIME : date de lancement du processus
TTY : le terminal d’exécution, ici le ? signifie que le processus n’est pas rattaché au terminal
TIME : Temps cpu
CMD : La commande
Supervision temps réel avec la commande « top »
top permet d’obtenir en temps réel actualisé en permanence, la liste des processus les plus consommateurs du système, mais pas que, il est en effet possible de trier la liste selon différents critères, je vous invite à consulter sa page de manuel pour obtenir la liste des commandes (man top).
On notera en en-tête un résumé le nombre des tâches, l’utilisation CPU (le load average, c’est à dire le nombre de processus en attente d’exécution à 1, 5, et 15 mn, si supérieur à 1, cela veut dire que le cpu n’a pas encore traité 1 processus, car occupé à autre chose, il s’agit de moyennes), la consommation mémoire vive et de mémoire d’échange (swap)
la touche q (quit) sert à sortir de la commande top

Modifier la priorité d’un processus avec nice / renice
Par défaut, un processus se lance avec une valeur de priorité de 0.
Nous pouvons modifier cette valeur de -20 (le processus est absolument prioritaire sur les autre) à 19 (le processus n’est pas du tout prioritaire)
nice permet de modifier le processus lors de son lancement.
renice modifie la priorité d’un processus qui est déjà en cours d’exécution
Gérer un processus avec & , bg, fg, et nohup
Pour lancer un processus en arrière plan, il suffit de rajouté « & » à votre commande
Placer en arrière plan un processus en cours (bloquant le terminal de ce fait)
Tapez CTRL+Z sur le clavier pour mettre le job en pause
Tapez bg (comme background) pour basculer le processus en arrière plan
Pour rétablir le processus au premier plan
Tapez fg (comme foreground).
Lancer un processus en le détachant du terminal.
Ainsi, en cas de fermeture du terminal (déconnexion), le processus continuera son exécution.
nohup nom_de_la_commande
Chose intéressante, la commande nohup crée un fichier .nohup dans le répertoire courant en y consignant la sortie du terminal telle qu’elle aurait été affichée en temps normal.
Le combo nohup et & permet de lancer facilement un processus qui sera en arrière plan et qui ne s’interrompra pas lors de la déconnexion (intéressant pour les traitement consommateur de temps).
nohup cp -pr mon_repertoire_de_films ma_sauvegarde &
Tuer un processus avec « kill »
La commande kill permet d’interrompre un processus
kill -9 est un arrêt brutal
kill -15 est un arrêt plus doux
Typiquement, on utilisera kill -9 si kill -15 ne donne pas de résultat.
Admettons que j’ai un processus firefox dont le PID est 3105 et qui ne réponds plus :
kill -15 3105
Systemd – gérer les services et les niveaux d’exécution du système
En matière de gestionnaire de système dans le monde Linux, Systemd est devenu la règle. C’est donc bien sûr ce gestionnaire de système que j’ai décidé de vous présenter aujourd’hui.
Systemd est lancé lors du processus de démarrage de l’ordinateur par le noyau. Il devient le premier service lancé sur la machine et porte donc toujours le PID 1 (PID = Processus ID, voir article sur les processus pour en savoir d’avantage).
Le gestionnaire de services systemctl
systemctl est le gestionnaire de services de systemd.
Un service est un programme chargé en mémoire (un processus) que l’on souhaite garder en permanence en cours d’exécution, pensez par exemple à un logiciel de serveur web comme apache qui doit être à l’écoute des connexions d’utilisateur pour leur afficher les pages web.
Le gestionnaire de service pilote et ordonne les services à travers la notion d’unités de service.
On interagit avec le gestionnaire de service via la commande systemctl.
Admettons que nous ayons un service appelé « nom_service » , les actions les plus communes que l’on souhaitera réaliser seront :
- Consulter son état
systemctl status nom_service
- le démarrer
systemctl start nom_service
- l’arrêter
systemctl stop nom_service
- le redémarrer gracieusement un service (c’est-à-dire sans couper les éventuels processus déjà en cours)
systemctl reload nom_service
- le redémarrer selon le principe d’arrêt, puis de relance
systemctl restart nom_service
- Activer le chargement automatique du service lors du démarrage du système
systemctl enable nom_service
- Désactiver le chargement automatique du service lors du démarrage du système
systemctl disable nom_service
En réalité, les commandes se font sur les unités de service qui portent la forme « nom_service**.service** ».
La véritable commande est donc par exemple systemctl start nom_service.service, dans les faits, le .service est implicite.
Il est possible de lister l’ensemble des services :
systemctl list-units –type=service
Pourquoi préciser « -–type=service » me direz-vous? Eh bien car il existe plusieurs types d’unités, systemctl ne gère pas que les services, son rôle va au-delà.
Création et modification d’une unité de service
Lorsque l’on installe un logiciel fonctionnant en tant que service via le gestionnaire de paquets de la distribution, les fichiers de gestion de services sont généralement fournit, et sont installés automatique, facilitant ainsi l’installation.
En revanche, ce n’est pas forcément le cas lorsque l’on installe un logiciel depuis les sources. Il sera nécessaire alors de créer et configurer manuellement le service afin qu’il soit pris en charge par systemctl.
Cela sort du cadre de la présentation, je n’exclue pas de rédiger un article à ce sujet un de ces jours.
Les niveaux d’exécution du système (TARGETS) avec systemctl
Les niveaux d’exécutions sont des états du système qui définissent quelles unités de service doivent être lancées ou non. systemd nomme ces niveaux d’exécution target. L’arrêt du système ou son redémarrage constituent par exemple des niveaux d’exécutions, des targets.
Suivant le même principe que les unités de services qui portent l’extension .service , les targets portent l’extension .target
Les principaux niveaux d’exécutions sont :
|emergency.target|Mode dégradé, ne lancera que le shell, mode minimal pour interagir avec le système. On utilisera typiquement ce mode si le système refuse de démarrer dans les autres modes, afin d’identifier et corriger le problème|
|rescue.target|Idem au mode précédent (à des fins de diagnostic/correction) mais charges quelques unités services supplémentaires|
|multi-user.target|Les services sont lancés, sauf la couche graphique (on travaille sur le terminal)|
|graphical.target|Idem au multi-user.targ, mais avec la couche graphique.|
|reboot.target|Initier le redémarrage du système|
|poweroff.target|Arrête le système|
NB : Il est possible de définir le niveau d’exécution par défaut au démarrage de la machine, et il existe d’autres niveaux d’exécution.
- Changer le niveau d’exécution avec systemctl isolate
Admettons que je souhaite basculer du niveau graphical.target à multi-user.target
systemctl isolate multi-user.target
- Arrêter le système
systemctl isolate poweroff.target ou bien systemctl poweroff
- Redémarrer le système
systemctl isolate reboot.target ou bien systemctl reboot
NB : les alias reboot et shutdown –h now ou bien halt ou poweroff marchent aussi sans avoir besoin de taper systemctl isolate
Dans le prochain article sur systemd, nous verrons deux autres fonctions inintéressantes, la consultation des journaux système ainsi que l’analyse des temps d’exécutions
La journalisation des évènements avec journalctl (les logs)
La journalisation des évènements permet de diagnostiquer les problèmes ou de vérifier le bon fonctionnement, à travers les traces écrites par les applications et services, et par le noyau.
journalctl remplace l’ancien système historique de logs syslog (des fichiers textes généralement déposés dans le répertoire /var/log/).
Il est possible sur certaines distributions que les deux fonctionnent en parallèle (c’est le cas sur centos/rhel 7), vous allez donc retrouver à peu près les mêmes informations en consultant journalctl qu’en lisant les fichiers logs.
Tout est tracé sur un système Linux, vous allez très vite vous retrouver avec des 10aines de milliers de lignes de journaux : journalctl offre des possibilités vraiment intéressantes qui facilitent grandement la recherche.
Niveaux de criticité / priorités
Sur un système de type Linux, les évènements de journalisation sont classés selon leur criticité (journalctl utilise le terme de priorité). Le tableau ci-dessous explique chaque niveau de criticité :
Niveau / Nom abrégé | Nom | Contient |
---|---|---|
0 / emerg | emergency | Criticité la plus élevée, si vous avez ce type de message, le système est inutilisable (typiquement un kernel panic) |
1 / alert | alert | Il s’agit d’erreurs gravent devant être prises en compte immédiatement |
2 / crit | critical | Relèvera les erreurs de type critique (exemple, une application a plantée) |
3 / err | error | Relèvera les erreurs, des comportements inattendus |
4 / warning | warning | Affichera les avertissements |
5 / notice | notice | Evènements normaux |
6 / info | info | Haut niveau de détail concernant le fonctionnement |
7 / debug | debug | Utile pour tracer et debbuger en profondeur, niveau de verbosité le plus élevé |
Lorsque l’on interroge un niveau de criticité, le système inclura tous les évènements de criticité supérieure.
Si j’interroge par exemple le niveau notice: j’aurai les informations du niveau 0 au niveau 4.
Si j’interroge le niveau debug, j’aurai toutes les informations disponibles.
Pour consulter l’intégralité du journal des évènements, il suffit de taper la commande journalctl
Navigation dans le journal
Les flèches haut et bas permettent de faire défiler les lignes, les touches pages up et page down de naviguer page par page, la barre d’espace de passer à la page suivante, la touche q permet de quitter le journal
Nous n’utiliserons que très rarement journalctl sans options, car le journal contient des milliers de lignes et qu’il serait très chronophage de le consulter de cette manière. On préférera demander au journal de nous afficher uniquement les évènements selon les critères que l’on aura définit.
Point important : on pourra combiner plusieurs des critères proposés par les options ci-dessous pour affiner d’avantage les évènements affichés par le journal.
Filtrer selon la criticité
On utilisera l’option –p (comme priority) et le niveau de log attendu (voir le tableau en début d’article). Nous pouvons utiliser le numéro associé à la criticité ou bien son nom abrégé.
Journalctl –p 0 ou journalctl –p emerg affichera les évènements de niveau emergency et de criticité supérieure
Journalctl –p 3 ou journalctl –p err affichera les évènements de niveau error et de criticité supérieure
Filtrer selon la date : –since –until
On indiquera la date au format : AAAA-MM-JJ et on précisera éventuellement l’heure au format HH:MM:SS . Il est possible d’utiliser tout ou partie du format, par exemple juste l’année, ou bien juste l’année et le mois.
Journalctl –since “2021-09-15 10:00” –until “2021-09-15 11:15:23”
A noter que journalctl est capable de comprendre certains mots clés tels que today, yersterday, hour…
Journalctl –since “yersterday” –until “2021-09-15″
Afficher les évènements survenus depuis le dernier démarrage uniquement, ou bien les 5 derniers
Journalctl –b (b pour boot)
Il est possible d’afficher les évènements depuis les boot précédents, en le précisant par son numéro :
Journalctl –b –5 (nous aurons les informations jusqu’à 5 démarrages en arrière)
Pour connaitre le nombre de boots que le journal a conservé :
Journalctl –list-boots
Filtrer par le service
Nous pouvons également concentrer nos recherches sur un service (ou plutôt sur une unité de service systemd) bien particulier
Journalctl –u crond affichera uniquement les informations concernant l’unité de service crond.service (dans la commande, le .service est implicite, nous pouvons le préciser, ou pas)
Nb : crond est le service permettant d’automatiser les taches (pour qu’elle s’exécutent de manière périodique, par exemple, tous les jours à 7H du matin). Je décrirai le fonctionnement de crond dans un prochain article.
Lancer Journalctl en défilement continu
Journalctl -f
Cette option est très pratique lorsque l’on souhaite savoir en temps réel ce qu’il se passe. En effet, le paramètre -f permet de rafraîchir en permanence le contenu affiché au fur et à mesure qu’il est inscrit dans le journal des évènements.
Exemple, j’installe un nouveau service, et je souhaite savoir exactement ce qu’il se passe au moment du démarrage et lors de mes essais fonctionnels.
Exemple de Combo d’options
Comme indiqué plus haut, le gros intérêt de ces options est de pouvoir les combiner.
Je veux par exemple avoir les logs du service crond, de criticité 7 depuis hier et en mode continu
Journalctl –p 7 –u crond –since yesterday -f
L’analyse des temps d’exécution avec systemd-analyze
La commande systemd-analyse à pour but d’aider à optimiser le système en identifiant les tâches les plus consommatrice de temps. Elle ne vous servira probablement jamais, les système Linux démarrent généralement très vite, hormis dans des contextes bien particuliers ou la performance est une priorité et ou chaque seconde compte. Mais il est bon de connaître son existence.
Voici quelques exemples de son utilisation :
Systemd-analyze lancée sans options affichera :
Le temps de démarrage du système, en détaillant le temps de démarrage du noyau, du gestionnaire de système (et lancement des services), et enfin le temps de démarrage du userspace (espace utilisateur)
Mais il est possible d’obtenir bien plus d’informations :
Systemd-analyse blame affichera la liste des unités triées par temps de démarrage
systemd-analyze critical-chain affichera les éléments sous forme d’arborescence d’interdépendance entre les différentes unités
Et ensuite ?
Il reste encore beaucoup de choses à voir dans le cadre des commandes essentielle d’un système LINUX. La partie réseau par exemple. Ce post est je pense déjà bien assez long, je rédigerai donc un article dédié au réseau sous Linux, puis je pense des articles plus thématiques.
J’espère que cet article vous a été utile. N’hésitez pas à me faire vos commentaires. A Bientôt !