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