Variables d’environnement

La variable PATH contient les chemins dans lesquels le shell cherche les programmes à lancer.

Toutes ces variables se comportent comme PATH : si elles sont exportées, elles se transmettent aux processus fils ; le contenu de la variable est obtenu en le précédant d’un $.

Le fichier .bashrc est lu à chaque démarrage du shell. Si on veut que des réglages se conservent au prochain démarrage, on peut ajouter ces réglages dans ce fichier. Si on y met des commandes, elles seront elles aussi exécutées au démarrage du shell. Par exemple, ajoutons echo Bonjour $USER dans le .bashrc. Au prochain lancement de bash, nous serons salué.

  1. Changer la valeur de la variable HOME (par exemple pour /tmp). Que fait cd sans argument.
  2. Quelles autres variables sont données par env ?

Alias

Il est également possible d’ajouter des raccourcis de commande. Par exemple pour que cd.. fasse l’effet de cd .., on peut ajouter alias cd..="cd ..". On peut même aliaser des commandes existantes (par exemple remplacer ls par echo *, ou de façon plus intéressante lui ajouter des options).

  1. Créer un alias ll qui donnera la liste avec plus d’information que ls.
  2. Créer un alias acp qui donnera la version d’un paquet passé en argument.

FHS

Les systèmes Unix s’attachent à respecter un certain nombre de normes et standards, parmi ceux-ci, le FHS (Filesystem Hierarchy Standard) décrit la structure du système de fichier. Des distinctions existent dans certains Unix (en particulier Mac OSX), mais il est bon de connaître cette hiérarchie. Le tableau suivant est inspiré de Wikipedia.

Chemin Description
/bin Binaires (commandes) de base
/boot Amorçage (bootloader + noyaux)
/dev Périphériques (devices)
/etc Fichiers de configuration (Editable Text Configuration)
/home Répertoires utilisateurs
/lib Bibliothèques logicielles de base (libraries)
/media Points de montage pour les médias amovibles (clefs USB)
/mnt Points de montage temporaires (mount)
/proc Processus (système de fichiers virtuel)
/root Répertoire de l’utilisateur root
/sbin Binaires pour administrateur (system binaries)
/tmp Fichiers temporaires
/usr Hiérarchie système (contient des dossiers bin, lib, …)
/var Fichiers variables

Intéressons-nous maintenant plus en profondeur à certains de ces dossiers :

/dev

Les périphériques sont listés dans le dossier /dev. On peut ainsi y voir les disques durs ‘/dev/[hs]d[a-e]*’. Des périphériques virtuels /dev/null, /dev/zero, /dev/random…

/proc

/proc
|-- 1
|   |-- cmdline
|   |-- environ
|   |-- fd
|   |   `-- ...
|   `-- status
|-- 1186
|   `...
|-- cpuinfo
|-- loadavg
|-- stat
|-- uptime
`-- version

/etc

etc = Editable Text Configuration

Ce dossier abrite les fichiers de configuration générales au système des différents outils installés.

Nous avons déjà vu /etc/sudoers, /etc/passwd et /etc/shadow.

Mais on trouve aussi /etc/bash.bashrc : configuration de base du shell bash. /etc/apt/sources.list liste des dépôts utilisés par apt. /etc/hostname contient le nom de la machine…

Administration

Locate

Un service nommé updatedb se charge régulièrement d’indexer les fichiers présents sur la machine. Grace à lui, on peut localiser un fichier dont on connaît le nom mais pas le chemin.

Tâches programmées

Il est possible de programmer des tâches pour qu’elles se lancent plus tard (par exemple dans 17 minutes ou à minuit) ou encore pour qu’elles soient exécutées régulièrement.

Autrefois, les commandes utilisées pour cela étaient cron, crontab et at. Aujourd’hui, sous Linux, c’est systemd qui s’en occupe ; sous macOS, c’est launchd qui s’en charge ; sous BSD, on utilise toujours cron et at.

Avec systemd, on utilise des timers. Les timers sont des fichiers décrivant les activités à faire et leur périodicité. Ils peuvent activer des services (qui sont eux-mêmes gérés par systemd)

On peut créer des tâches à n’exécuter qu’une seule fois. On parle alors de “Transient timers” (par opposition aux tâches répétées qui sont “persistent”).

Arrêt et redémarrage

L’arrêt, le redémarrage et la veille d’une machine peuvent être exécutées depuis la ligne de commande. Cela se fera à l’aide de sous-commandes de systemctl (c’est-à-dire avec systemd).

Services

On nomme services (ou en Unix daemons) les programmes lancés en tâche de fond par le système. Par exemple le serveur ssh, le serveur http, le serveur postgresql sont des services. Il est possible de contrôler les services lancés : les stopper, les relancer, définir s’ils doivent être exécutés à chaque démarrage de l’ordinateur à l’aide de systemctl (encore une fois, sur les linux modernes, c’est systemd qui gère les services, sur d’autes systèmes, il peut s’agir d’upstart, init, sysV, launchd qui sont en général utilisables par la commande service).

Note : les commandes suivantes peuvent être “pipées” vers cat pour éviter dêtre en mode interactif.

Les unit sont donc des fichiers définissant la façon de lancer un service et les units dont il dépend. Ainsi le sshd.service nécessite d’avoir du réseau (network.target) et est nécessaire pour le démarrage en mode multi-utilisateur (multi-user.target). Note : les target sont des unités qui ne lancent pas forcément de programmes mais sont pratiques pour définir les dépendances.

Certains services ne sont pas lancés au démarrage mais quand ils sont utilisés. Ainsi, pour un serveur http ou ssh ou…, on pourrait décider de ne lancer le serveur que si une connexion sur le port 80 (respectivement 22) est demandée. Dans ce cas, on a des unit qui sont des .socket au lieu de .service. Cela signifie que les informations transmises par netstat ou ss sur les ports sur lesquels l’ordinateur écoute peuvent ne pas être tout à fait fiable : le fait que systemd écoute sur le port 80 pour savoir s’il faut lancer un serveur http n’implique pas que le serveur fonctionne.