2022-11-01 11:55 Temps de lecture : 27 min

20 commandes Linux pour l'administrateur système

Linux regorge d'outils et de commandes permettant de gérer les tâches d'administration système de manière efficace et rapide.

Le rôle d'un administrateur système englobe l'installation et le fonctionnement des logiciels, la gestion des accès, la surveillance du système, la garantie de la disponibilité, la sauvegarde et la restauration des données, sans oublier la résolution des incidents. 😜

Cet article explore un ensemble de commandes fréquemment utilisées par les administrateurs système Linux dans leurs activités quotidiennes.

Informations système

La commande `uname -a` affiche des informations détaillées sur le système. Elle fournit le nom du noyau, sa version, son architecture, le nom d'hôte, le type de processeur et des informations sur la plateforme matérielle.

utilisateur@machine:~$ uname -a
Linux ubuntu18 5.3.0-1028-azure #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Voici la signification de chaque champ:

Nom du noyau: Linux
Nom d'hôte: ubuntu18
Version du noyau: 5.3.0-1028-azure
Version du noyau: #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020
Architecture matérielle: x86_64
Processeur: x86_64
Plateforme matérielle: x86_64
Système d'exploitation: GNU/Linux

Espace disque

La commande `df` permet d'évaluer l'espace disque utilisé et disponible. Sans option, elle affiche les résultats en blocs de 1 Ko.

utilisateur@machine:~$ df
Système de fichiers     Blocs de 1K      Utilisé   Disponible  Util% Monté sur
udev                   437208            0           437208      0% /dev
tmpfs                  91100             692         90408       1% /run
/dev/sda1             30309264       2383952   27908928     8% /
....

L'option `-h` présente la sortie dans un format plus lisible, en mégaoctets (Mo) et gigaoctets (Go).

utilisateur@machine:~$ df -h
Système de fichiers   Taille  Utilisé Dispo Util% Monté sur
udev                 427M       0   427M   0% /dev
tmpfs                 89M      692K  89M   1% /run
/dev/sda1            29G      2.3G   27G    8% /
tmpfs                 445M        0   445M   0% /dev/shm
tmpfs                 5.0M       0   5.0M   0% /run/lock
tmpfs                 445M        0   445M   0% /sys/fs/cgroup
/dev/sda15            105M     3.6M  101M   4% /boot/efi
/dev/sdb1             3.9G      16M  3.7G   1% /mnt
tmpfs                  89M        0   89M   0% /run/user/1001 

Pour exclure certains systèmes de fichiers, comme tmpfs, utilisez l'option `-x` pour obtenir une sortie plus claire:

utilisateur@machine:~$ df -h -x tmpfs
Système de fichiers   Taille  Utilisé Dispo Util% Monté sur
udev                 427M       0   427M   0% /dev
/dev/sda1            29G      2.3G   27G    8% /
/dev/sda15            105M     3.6M  101M   4% /boot/efi
/dev/sdb1             3.9G      16M  3.7G   1% /mnt

L'option `-t` permet de filtrer par type de système de fichiers. Par exemple, pour afficher uniquement les systèmes de fichiers ext4:

utilisateur@machine:~$ df -h -t ext4
Système de fichiers   Taille  Utilisé Dispo Util% Monté sur
/dev/sda1            29G      2.3G   27G    8% /
/dev/sdb1             3.9G      16M  3.7G   1% /mnt

L'option `--total` ajoute une ligne résumant les totaux:

utilisateur@machine:~$ df -h -t ext4 --total
Système de fichiers   Taille  Utilisé Dispo Util% Monté sur
/dev/sda1            29G      2.3G   27G    8% /
/dev/sdb1             3.9G      16M  3.7G   1% /mnt
<b>total             33G      2.3G   31G    8% -</b>

Utilisation des répertoires

La commande `du` est utilisée pour connaître l'espace disque occupé par un répertoire. Par exemple, pour examiner l'utilisation dans `/var/log`, utilisez l'option `-h` pour un format lisible.

utilisateur@machine:~$ sudo du -h /var/log
24K	/var/log/Microsoft/Azure/NetworkWatcherAgent/Logs
28K	/var/log/Microsoft/Azure/NetworkWatcherAgent
32K	/var/log/Microsoft/Azure
36K	/var/log/Microsoft
60K	/var/log/apt
4.0K	/var/log/samba
177M	/var/log/journal/0f4f926f583b4691af7de11025b19ff6
177M	/var/log/journal
...
204M	/var/log

Pour obtenir uniquement le total, utilisez l'option `-s` (sommaire):

utilisateur@machine:~$ sudo du -hs /var/log
204M	/var/log

Mémoire système

La commande `free` affiche l'utilisation de la mémoire système, avec les totaux, la mémoire utilisée et la mémoire libre. L'option `-h` permet un affichage plus lisible.

utilisateur@machine:~$ free -h
             total       used       free     shared  buff/cache   available
Mem:          889M       272M       100M      712K       517M       443M
Swap:           0B         0B         0B
total - Total de la mémoire installée (mémoire totale + swap totale)
used - Mémoire utilisée
free - Mémoire non utilisée (mémoire libre + swap libre)
buffers - Mémoire utilisée par les tampons du noyau
cache - Mémoire utilisée par les caches de page
buff/cache - Somme des tampons et du cache
available - Estimation de la mémoire disponible pour le lancement de nouvelles applications, sans swap

Processus en cours

La commande `ps` affiche l'état des processus en cours sur le système. Pour visualiser les processus d'un utilisateur spécifique (ici, `ubuntu`), utilisez l'option `-u`:

utilisateur@machine:~$ ps -u ubuntu
   PID TTY          TIME CMD
  7804 ?        00:00:00 systemd
  7805 ?        00:00:00 (sd-pam)
  7940 ?        00:00:00 sshd
  7941 pts/0    00:00:00 bash
  8111 ?        00:00:00 sshd
  8112 pts/1    00:00:00 bash
 13868 ?        00:00:00 sshd
 13869 pts/2    00:00:00 bash
 13885 pts/0    00:00:00 man
 13895 pts/0    00:00:00 pager
 18111 pts/2    00:00:00 man
 18121 pts/2    00:00:00 pager
 18485 pts/1    00:00:00 ps

Pour afficher tous les processus, utilisez les options `aux`:

utilisateur@machine:~$ ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.7 160076  7020 ?        Ss   Jun29   0:34 /sbin/init
root          2  0.0  0.0      0     0 ?        S    Jun29   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        I<   Jun29   0:00 [rcu_gp]
root          4  0.0  0.0      0     0 ?        I<   Jun29   0:00 [rcu_par_gp]
root          6  0.0  0.0      0     0 ?        I<   Jun29   0:00 [kworker/0:0H-kb]
....

Voici la signification des colonnes:

Titre
Signification
PID
Identifiant du processus
%CPU
Pourcentage de temps CPU utilisé
%MEM
Pourcentage de RAM utilisé
VSZ
Mémoire virtuelle utilisée (Ko)
RSS
Mémoire physique utilisée (Ko)
TTY
Terminal associé
STAT
R - Exécution, S - Mise en veille, I - Inactif, T - Arrêté, Z - Zombie, D - En attente d'E/S disque, X - Mort, W - Swap, N - Basse priorité, < - Haute priorité

Surveillance des processus

Alors que `ps` affiche un instantané des processus, `top` offre une liste dynamique et mise à jour (toutes les 3 secondes par défaut) des processus, classés par activité du processeur.

La sortie de `top` se divise en deux parties: un résumé système et un tableau des processus classés par activité CPU.

top - 14:25:32 up 44 days, 11:37,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 114 total,   1 running,  59 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   910992 total,   101208 free,   274712 used,   535072 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   458492 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 50497 ubuntu    20   0   44528   3944   3368 R  0.7  0.4   0:00.15 top
     1 root      20   0  160076   7020   4400 S  0.0  0.8   0:34.85 systemd
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.08 kthreadd
     3 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 rcu_gp
     4 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 rcu_par_gp
     6 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 kworker/0:+
     9 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 mm_percpu_+

Voici quelques champs du résumé système:

top
Disponibilité. Temps écoulé depuis le dernier démarrage.
charge moyenne
Nombre de processus en attente d'exécution. Une valeur inférieure à 1,0 signifie que le système n'est pas surchargé. Il y a trois valeurs : la moyenne de la dernière minute, des 5 dernières minutes et des 15 dernières minutes.
%Cpu(s)

Cette ligne décrit l'activité du CPU.
0.3 us, utilisateur
0.3% du CPU est utilisé par les processus utilisateur.
0.0 sy, système
0.0% du CPU est utilisé par les processus système.
0.0 ni, sympa
0.0% du CPU est utilisé par les processus de basse priorité.
99.7 id, inactif
99.7% du CPU est inactif.
0.0 wa, attente E/S
0.0% du CPU est en attente d'E/S.
0.0 hi
Temps passé sur les interruptions matérielles.
0.0 si
Temps passé sur les interruptions logicielles.
0.0 st
Temps volé à cette VM par l'hyperviseur.

Voici les champs du tableau des processus:

PID
Identifiant du processus.
USER
Propriétaire du processus.
PR
Priorité.
NI
Valeur "nice".
VIRT
Mémoire virtuelle utilisée (Ko).
RES
Mémoire physique utilisée (Ko).
SHR
Mémoire partagée utilisée (Ko).
S
État du processus : R - Exécution, S - Mise en veille, I - Inactif, T - Arrêté, Z - Zombie, D - Attente E/S disque, W - Swap, X - Mort.
%CPU
Pourcentage du temps CPU utilisé par le processus.
%MEM
Pourcentage de la mémoire physique utilisée par le processus.
TIME[+]
Temps CPU total utilisé par le processus.
COMMAND
Nom du programme.

Pendant l'exécution de `top`, plusieurs commandes sont disponibles. Appuyez sur `h` ou `?` pour voir les commandes. Appuyez sur `k` pour terminer un processus et sur `q` pour quitter `top`.

Requêtes DNS

`dig` est un excellent outil pour les requêtes DNS. Il s'utilise de la manière suivante:

dig <serveur DNS> <domaine> <type de requête>

Où:

  • <serveur DNS> est le nom du serveur DNS à interroger.
  • <domaine> est le nom de domaine à interroger.
  • <type de requête> est le type d'enregistrement recherché (A, MX, NS, SOA, etc.).

Pour simplifier la sortie, utilisez l'option `+short`.

Pour obtenir l'enregistrement A pour `google.com`:

utilisateur@machine:~$ dig google.com +short
172.217.164.174

Pour voir les enregistrements MX de `google.com`:

utilisateur@machine:~$ dig google.com MX  +short
50 alt4.aspmx.l.google.com.
10 aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
40 alt3.aspmx.l.google.com.
30 alt2.aspmx.l.google.com.

Il est également possible d'utiliser un outil de recherche DNS en ligne pour interroger des enregistrements DNS sur internet.

Utilisateurs connectés

`who` affiche les utilisateurs connectés.

utilisateur@machine:~$ who
ubuntu   pts/0        2020-08-14 17:28 (183.83.211.129)
ubuntu   pts/1        2020-08-14 17:58 (183.83.211.129)

`w` fournit des informations plus détaillées, y compris les processus lancés par chaque utilisateur. L'en-tête indique l'heure actuelle, la disponibilité du système, le nombre d'utilisateurs connectés et les charges moyennes.

utilisateur@machine:~$ w
 18:07:33 up 46 days, 15:19,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ubuntu   pts/0    183.83.211.129   17:28    2.00s  0.10s  0.00s w
ubuntu   pts/1    183.83.211.129   17:58    9:07   0.05s  0.01s vi

Ensuite, sont affichés le nom d'utilisateur, le terminal, l'adresse IP distante, l'heure de connexion, le temps d'inactivité, JCPU, PCPU et le programme en cours. JCPU est le temps total utilisé par tous les processus liés au terminal, tandis que PCPU est le temps utilisé par le processus actuel.

Archivage

Avec `GNU tar`, il est possible de regrouper plusieurs fichiers dans une seule archive.

Par exemple, créons un répertoire `myfiles` et trois fichiers `a.txt`, `b.txt`, `c.txt` à l'intérieur:

utilisateur@machine:~$ mkdir myfiles ; touch myfiles/{a.txt,b.txt,c.txt}

Pour créer une archive nommée `allfiles.tar` contenant tous les fichiers de `myfiles`:

utilisateur@machine:~$ tar -cvf allfiles.tar myfiles
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt

Voici la liste des fichiers et répertoires du répertoire courant. On y voit le répertoire `myfiles` et l'archive `allfiles.tar`:

utilisateur@machine:~$ ls
allfiles.tar  myfiles

L'extraction d'une archive se fait avec l'option `-x`. Pour extraire `allfiles.tar`:

utilisateur@machine:~$ tar -xvf allfiles.tar
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt

Il est possible de compresser l'archive avec l'option `-z`, qui utilisera `gzip`.

utilisateur@machine:~$ tar -zcvf allfiles.tar.gz myfiles
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt
utilisateur@machine:~$ ls
allfiles.tar.gz  myfiles

Pour décompresser une archive compressée, utilisez `-z` avec l'option `-x`.

utilisateur@machine:~$ tar -zxvf allfiles.tar.gz
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt

Recherche de texte

`grep` permet de chercher un motif dans un fichier ou un ensemble de fichiers. Il affiche toutes les lignes correspondant au motif. Par exemple, pour trouver la ligne contenant `ServerRoot` dans `/etc/apache2/apache2.conf`:

utilisateur@machine:~$ grep ServerRoot /etc/apache2/apache2.conf
# ServerRoot: The top of the directory tree under which the server's
#ServerRoot "/etc/apache2"

Pour rechercher dans tous les fichiers d'un répertoire, utilisez `*`. Pour inclure les sous-répertoires, ajoutez l'option `-r` (récursif). Ainsi, pour trouver toutes les lignes contenant `VirtualHost` dans `/etc/apache2`:

utilisateur@machine:~$ cd /etc/apache2
utilisateur@machine:/etc/apache2$ grep -r VirtualHost *
apache2.conf:# If you do not specify an ErrorLog directive within a <VirtualHost>
apache2.conf:# logged here.  If you *do* define an error logfile for a <VirtualHost>
conf-available/localized-error-pages.conf:# even on a per-VirtualHost basis.  If you include the Alias in the global server
conf-available/other-vhosts-access-log.conf:# Define an access log for VirtualHosts that don't define their own logfile
ports.conf:# have to change the VirtualHost statement in
sites-available/000-default.conf:<VirtualHost *:80>
...

Synchronisation de fichiers

`rsync` est un outil rapide pour synchroniser des fichiers et répertoires entre deux emplacements. Il peut être utilisé pour des copies locales ou distantes et est rapide car il n'envoie que les différences entre les fichiers sources et les fichiers existants à destination.

Il est souvent utilisé pour les sauvegardes et comme commande de copie améliorée.

Voici un exemple:

Pour copier ou synchroniser tous les fichiers de `myfiles` vers `backups`:

utilisateur@machine:~$ rsync -avh myfiles/ /backups
sending incremental file list
./
a.txt
b.txt
c.txt

sent 218 bytes  received 76 bytes  588.00 bytes/sec
total size is 0  speedup is 0.00

Pour synchroniser avec un hôte distant, indiquez `remote_user@remote_host` dans le nom de destination. Pour synchroniser `myfiles` avec un hôte ayant l'IP 10.0.0.50:

utilisateur@machine:~$ rsync -avh myfiles/ [email protected]:/home/vagrant
[email protected]'s password:
sending incremental file list
./
a.txt
b.txt
c.txt

sent 230 bytes  received 76 bytes  47.08 bytes/sec
total size is 0  speedup is 0.00

Sockets

La commande `ss` permet de visualiser les statistiques des sockets, remplaçant l'ancien utilitaire `netstat`. Pour afficher les sockets TCP, utilisez l'option `-t`.

utilisateur@machine:~$ ss -t
State       Recv-Q        Send-Q                 Adresse Locale:Port                     Adresse Distante:Port
ESTAB       0             0                           10.0.0.4:53852                   168.63.129.16:8037
ESTAB       0             0                           10.0.0.4:ssh                    183.83.211.129:64118
ESTAB       0             0                           10.0.0.4:33256                 169.254.169.254:http
ESTAB       0             1080                        10.0.0.4:ssh                     222.186.30.35:11527
ESTAB       0             0                           10.0.0.4:ssh                    183.83.211.129:63049

Par défaut, les sockets en écoute ne sont pas affichées. Pour inclure les sockets en écoute et non en écoute, utilisez les options `-t` et `-a`.

utilisateur@machine:~$ ss -t -a
State        Recv-Q        Send-Q                Adresse Locale:Port                     Adresse Distante:Port
LISTEN       0             128                         0.0.0.0:ssh                           0.0.0.0:*
LISTEN       0             80                        127.0.0.1:mysql                         0.0.0.0:*
LISTEN       0             128                   127.0.0.53%lo:domain                        0.0.0.0:*
ESTAB        0             0                          10.0.0.4:53852                   168.63.129.16:8037
ESTAB        0             0                          10.0.0.4:ssh                    183.83.211.129:64118
ESTAB        0             0                          10.0.0.4:33256                 169.254.169.254:http
ESTAB        0             1080                       10.0.0.4:ssh                     222.186.30.35:11527
ESTAB        0             120                        10.0.0.4:ssh                    183.83.211.129:63049
LISTEN       0             128                            [::]:ssh                              [::]:*
LISTEN       0             128                               *:http                                *:*

Recherche rapide de fichiers

La commande `locate` utilise une base de données pour rechercher des fichiers, ce qui la rend plus rapide que `find`. L'utilisation est simple. Pour chercher `apache2.conf`:

utilisateur@machine:~$ locate apache2.conf
/etc/apache2/apache2.conf
/var/lib/dpkg/info/apache2.conffiles

L'option `-c` affiche le nombre de fichiers correspondants.

utilisateur@machine:~$ locate -c apache2.conf
2

Il est parfois nécessaire de mettre à jour la base de données utilisée par `locate` (mlocate). Utilisez `updatedb` pour cela (nécessite les privilèges de superutilisateur).

utilisateur@machine:~$ sudo updatedb

Recherche avancée de fichiers

La commande `find` est l'une des plus utilisées sous Linux. Elle permet de rechercher des fichiers selon leur nom, les permissions, l'ID utilisateur, l'ID de groupe, la taille, le type de fichier et d'autres critères.

Pour rechercher un fichier par son nom dans le répertoire courant, utilisez l'option `-name` suivie du nom du fichier:

utilisateur@machine:~$ find . -name a.txt
./myfiles/a.txt

Pour rechercher des répertoires, utilisez l'option `-type d`:

utilisateur@machine:~$ find . -type d
.
./.ssh
./myfiles
./.cache
./.gnupg
./.gnupg/private-keys-v1.d
./docker

Pour rechercher des fichiers par taille (par exemple, les fichiers de plus de 20 Mo), utilisez l'option `-size`:

utilisateur@machine:~$ find . -size +20M
./docker/docker-ce-cli_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb
./docker/docker-ce_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb

Gestion des services

Avec l'avènement de `systemd`, remplaçant SysV, la commande `systemctl` est utilisée pour gérer les services et les unités `systemd`.

Pour démarrer un service, tel que `apache2`:

utilisateur@machine:~$ sudo systemctl start apache2.service

Il est possible d'omettre le suffixe `.service`.

Pour arrêter un service:

utilisateur@machine:~$ sudo systemctl stop apache2

Pour connaître l'état d'un service, utilisez `systemctl status`. L'exemple suivant montre l'état d'`apache2` lors de son exécution:

utilisateur@machine:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Wed 2020-08-19 11:34:04 UTC; 2s ago
  Process: 25346 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 18202 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
  Process: 25536 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 25555 (apache2)
    Tasks: 55 (limit: 1024)
   CGroup: /system.slice/apache2.service
           ├─25555 /usr/sbin/apache2 -k start
           ├─25558 /usr/sbin/apache2 -k start
           └─25559 /usr/sbin/apache2 -k start

Aug 19 11:34:04 ubuntu18 systemd[1]: Starting The Apache HTTP Server...
Aug 19 11:34:04 ubuntu18 systemd[1]: Started The Apache HTTP Server.

Pare-feu

UFW (Uncomplicated Firewall) est une interface simple pour `iptables`. Il est installé par défaut sur les distributions basées sur Ubuntu. Sur CentOS, UFW peut être installé à partir du référentiel EPEL.

Pour activer UFW:

$ sudo ufw enable

Vérifiez l'état du pare-feu avec `ufw status`:

$ sudo ufw status
Status: active

Par défaut, UFW autorise tout le trafic sortant et bloque tout le trafic entrant.

La commande suivante autorise le trafic entrant sur le port HTTP:

$ sudo ufw allow http
Rule added
Rule added (v6)

Il est possible de refuser le trafic sur un port, comme par exemple le port 21:

$ sudo ufw deny 21
Rule added
Rule added (v6)

Journaux du système

`journalctl` permet d'afficher les journaux collectés par `systemd`. `systemd` stocke les journaux dans un emplacement central au format binaire. Pour afficher ces journaux:

utilisateur@machine:~$ sudo journalctl
-- Logs begin at Mon 2020-06-29 02:48:31 UTC, end at Wed 2020-08-19 15:07:59 UTC. --
Jun 29 02:48:31 ubuntu kernel: Linux version 5.3.0-1028-azure (utilisateur@machine) (gcc version 7.5.0 (Ubuntu
Jun 29 02:48:31 ubuntu kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.3.0-1028-azure root=UUID=b0dd9d06-536e-41
Jun 29 02:48:31 ubuntu kernel: KERNEL supported cpus:
Jun 29 02:48:31 ubuntu kernel:   Intel GenuineIntel
...

Souvent, il est préférable de voir les derniers journaux en premier. Utilisez l'option `-r`:

utilisateur@machine:~$ sudo journalctl -r
-- Logs begin at Mon 2020-06-29 02:48:31 UTC, end at Wed 2020-08-19 15:10:16 UTC. --
Aug 19 15:10:16 ubuntu18 sudo[31263]: pam_unix(sudo:session): session opened for user root by ubuntu(uid=0)
Aug 19 15:10:16 ubuntu18 sudo[31263]:   ubuntu : TTY=pts/1 ; PWD=/home/ubuntu ; USER
Auteur
France

Rédacteur tech, guides pratiques et astuces numériques.