Linux LPIC-1 (101-500) #1 – Matériel et exécution de processus

Il y a quelques temps, Humble Bundle proposait un package de formations Linux dont la préparation à la certification LPIC-1 Linux Administrator. Comme d’habitude avec Humble Bundle, on ne se ruine pas tout en participant aux œuvres caritatives : c’est gagnant-gagnant, j’imagine.
Au travers de cet article, je te propose de retrouver les notes que j’ai prises en suivant la préparation à cette certification (donc je vais évidemment suivre leur plan de formation). Pour moi qui me sens encore rookie, j’attends de ces cours l’ajout de nouvelles commandes à ma trousse à outils ou, de conforter et formaliser ce que je sais déjà.
Disclaimer 1 :
Attention, je n’ai pas la prétention que ces notes peuvent se substituer à un vrai support de cours.
Disclaimer 2 :
Je ne suis en aucun cas affilié aux entreprises citées dans cet article.
Installation de Linux
Je fais l’impasse sur l’installation elle-même, tu m’en veux pas hein…
Gestion du matériel
D’une manière générale les distributions Linux sont lourdement dotées en terme de pilotes et la détection du matériel est très efficace. On peut lister le matériel présent sur une machine virtuelle ou physique selon le bus sur lequel il est rattaché.
Matériel détecté
Bien que le bus PCI
classique soit dépassé, la commande lspci
a été conservée pour lister (ls
) les périphériques internes.
root@debian:~# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: VMware SVGA II Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0b.0 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02)
De même, on peut lister le matériel utilisant le bus USB
. Bon sur ma VM c’est pas folichon mais t’as compris l’idée. Chose amusante, sur un ordi portable tu y trouveras probablement ta webcam, ton bluetooth et tes cartes réseau.
root@debian:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bien que les matériels listés ici aient des noms longs, Linux va plutôt interagir avec à l’aide de surnoms que l’on va pouvoir retrouver dans /dev
.
root@debian:~# ls /dev
autofs console fd initctl loop3 mem psaux sda snd tty1 tty16 tty22 tty29 tty35 tty41 tty48 tty54 tty60 ttyS0 userfaultfd vcs4 vcsa4 vcsu4 vhost-vsock
block core full input loop4 mqueue ptmx sda1 sr0 tty10 tty17 tty23 tty3 tty36 tty42 tty49 tty55 tty61 ttyS1 vboxguest vcs5 vcsa5 vcsu5 zero
bsg cpu_dma_latency fuse kmsg loop5 net pts sda2 stderr tty11 tty18 tty24 tty30 tty37 tty43 tty5 tty56 tty62 ttyS2 vboxuser vcs6 vcsa6 vcsu6
btrfs-control cuse hidraw0 log loop6 null random sg0 stdin tty12 tty19 tty25 tty31 tty38 tty44 tty50 tty57 tty63 ttyS3 vcs vcsa vcsu vfio
bus disk hpet loop0 loop7 nvram rfkill sg1 stdout tty13 tty2 tty26 tty32 tty39 tty45 tty51 tty58 tty7 uhid vcs1 vcsa1 vcsu1 vga_arbiter
cdrom dri hugepages loop1 loop-control port rtc shm tty tty14 tty20 tty27 tty33 tty4 tty46 tty52 tty59 tty8 uinput vcs2 vcsa2 vcsu2 vhci
char fb0 hwrng loop2 mapper ppp rtc0 snapshot tty0 tty15 tty21 tty28 tty34 tty40 tty47 tty53 tty6 tty9 urandom vcs3 vcsa3 vcsu3 vhost-net
On retrouve par exemple notre cpu
, un espace réservé pour un lecteur de disquettes fd
(floppy disk) ou encore, notre disque dur disk
.
Ces noms sont définis par le service udev
et il est possible de les modifier en ajoutant un fichier de règles dans le dossier des règles de udev
(dossier vide sur une Debian 12 en installation minimale) cependant ce n’est pas recommandé de le faire sans raison spécifique parce que cela rendra la maintenance du système moins évidente (les noms personnalisés seraient absents sur d’autres systèmes).
root@debian:~# vi /etc/udev/rules.d/custom-naming.rules
Matériel en fonction
Un matériel peut détecté et présenter un nom spécifique sans être nécessairement fonctionnel. Certains périphériques peuvent nécessiter l’installation d’un pilote.
Les pilotes sous Linux sont nommés modules du noyau
(kernel module
).
Au même titre que l’on peut lister les périphériques PCI et USB détectés, on peut afficher la (longue) liste des modules du noyau chargés à l’aide de la commande lsmod
.
root@debian:~# lsmod
Module Size Used by
binfmt_misc 24576 1
intel_rapl_msr 20480 0
intel_rapl_common 32768 1 intel_rapl_msr
intel_pmc_core 53248 0
intel_powerclamp 20480 0
ghash_clmulni_intel 16384 0
sha512_ssse3 49152 0
sha512_generic 16384 1 sha512_ssse3
sha256_ssse3 32768 0
sha1_ssse3 32768 0
aesni_intel 393216 0
crypto_simd 16384 1 aesni_intel
cryptd 28672 2 crypto_simd,ghash_clmulni_intel
rapl 20480 0
vmwgfx 376832 1
drm_ttm_helper 16384 1 vmwgfx
ttm 94208 2 vmwgfx,drm_ttm_helper
pcspkr 16384 0
drm_kms_helper 204800 1 vmwgfx
vboxguest 49152 0
ac 20480 0
button 24576 0
joydev 28672 0
evdev 28672 3
serio_raw 20480 0
sg 40960 0
loop 32768 0
drm 614400 5 vmwgfx,drm_kms_helper,drm_ttm_helper,ttm
fuse 176128 1
efi_pstore 16384 0
dm_mod 184320 0
configfs 57344 1
ip_tables 36864 0
x_tables 61440 1 ip_tables
autofs4 53248 2
ext4 983040 1
hid_generic 16384 0
crc16 16384 1 ext4
mbcache 16384 1 ext4
jbd2 167936 1 ext4
usbhid 65536 0
crc32c_generic 16384 0
hid 159744 2 usbhid,hid_generic
sd_mod 65536 3
t10_pi 16384 1 sd_mod
crc64_rocksoft 20480 1 t10_pi
crc64 20480 1 crc64_rocksoft
crc_t10dif 20480 1 t10_pi
sr_mod 28672 0
cdrom 81920 1 sr_mod
crct10dif_generic 16384 0
ohci_pci 20480 0
ata_generic 16384 0
ata_piix 45056 0
ahci 49152 2
libahci 49152 1 ahci
crct10dif_pclmul 16384 1
crct10dif_common 16384 3 crct10dif_generic,crc_t10dif,crct10dif_pclmul
crc32_pclmul 16384 0
crc32c_intel 24576 2
psmouse 184320 0
i2c_piix4 28672 0
battery 28672 0
video 65536 0
wmi 36864 1 video
ehci_pci 20480 0
ohci_hcd 61440 1 ohci_pci
ehci_hcd 102400 1 ehci_pci
usbcore 348160 5 ohci_hcd,ehci_pci,usbhid,ehci_hcd,ohci_pci
usb_common 16384 3 ohci_hcd,usbcore,ehci_hcd
e1000 163840 0
libata 401408 4 ata_piix,libahci,ahci,ata_generic
scsi_mod 286720 4 sd_mod,libata,sg,sr_mod
scsi_common 16384 4 scsi_mod,libata,sg,sr_mod
Si l’on ne voit pas de module en rapport avec un périphérique détecté, celui-ci ne fonctionnera pas et il faudra probablement le télécharger depuis le site du constructeur pour la famille de distribution utilisée.
Parfois, il faudra être un peu imaginatif parce que des périphériques dotés d’un chipset spécifique pourront utiliser un module destiné à un autre (exemple : carte réseau Realtek, cpu, … etc.).
Désactivation de matériel
On peut avoir besoin de désactiver un périphérique, donc un module. Le truc qui me fascine avec Linux c’est que la même logique s’applique souvent : si ls
mod permet de lister les modules, rm
mod permet de supprimer (temporairement) un module et donc de désactiver un périphérique (je reprends l’exemple du cours parce que, sur ma VM désactiver les modules n’aurait pas de sens).
root@debian:~# rmmod bluetooth
rmmod: ERROR: Module bluetooth is in use by: btrtl btintel btbcm bnep btusb
root@debian:~# rmmod btusb
En cas de redémarrage, tous les modules seront rechargés y compris le module btusb
que nous venons de désactiver.
Pour rendre une désactivation permanente, il faut s’intéresser à modprobe
. Modprobe
est un programme qui cherche à charger un module adapté dès qu’un nouveau périphérique est détecté. Dans son dossier de configuration, modprobe
entretient une ou plusieurs listes noires des modules désactivés. Il faudra nommer le module que l’on souhaite désactiver afin qu’il ne soit pas chargé lors du redémarrage.
root@debian:~# ls /etc/modprobe.d/
intel-microcode-blacklist.conf
root@debian:~# cat /etc/modprobe.d/intel-microcode-blacklist.conf
# The microcode module attempts to apply a microcode update when
# it autoloads. This is not always safe, so we block it by default.
blacklist microcode
root@debian:~#
On pourra recharger un module que l’on a désactivé à l’aide de modprobe
.
root@debian:~# modprobe -v bluetooth
Processus de démarrage

Le processus de démarrage d’un ordinateur sous Linux se décompose en 5 étapes. Connaître ces étapes n’apporte pas grand chose au commun des mortels qui ne souhaite qu’arriver au moment de connecter le compte utilisateur. Mais si quelque chose se passe mal, il peut être intéressant de les connaître pour tenter de déduire la cause initiale d’un problème. Ci-dessous, l’explication de Jean-Michel Apeuprès :
- BIOS / UEFI
La carte mère reçoit l’impulsion électrique et démarre la puce BIOS / UEFI qui va se charger de mettre en oeuvre les composants de l’ordinateur (CPU, mémoire, disque… etc) et surtout de, grossièrement, déterminer sur quel disque dur se trouve le boot : leMaster Boot Record
ou laGUID Partition Table
. - MBR / GPT
Le premier secteur du disque dur (MBR
) ou la première partition FAT32 (GPT
) indiquent où trouver la partition où se trouve le boot loader (généralement GRUB 2). - GRUB 2
Le bootloaderGRUB
va entre autres choses être en charge de charger leKernel
. Il propose notamment via un menu de sélectionner une version plus ancienne duKernel
- Initrd / Kernel
Initrd
est une image disque montée en mémoire vive depuis le disque dur ayant les outils nécessaire au lancement duKernel
; on peut l’imaginer comme une version minimaliste de Linux. - Systemd
Systemd est un gestionnaire de services présent sur une grande partie des distributions Linux. On pouvait précédemment trouver SysVinit dans ce rôle ou Initd. C’est le premier processus lancé (PID 1).
root@debian:~# ps aux | head -n 2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 2.5 101892 12032 ? Ss 03:33 0:00 /sbin/init
root@debian:~# ls -alh /sbin/init
lrwxrwxrwx 1 root root 20 26 janv. 2024 /sbin/init -> /lib/systemd/systemd
Configuration de GRUB (GRand Unified Bootloader)
Le rôle premier de GRUB
est de répertorier les systèmes d’exploitation installés sur l’ordinateur et de pouvoir les exécuter. Il permet de gérer une grande quantité de paramètres relatifs au lancement des OS comme le chargement de modules spécifiques à la prise en charge de matériels ou la résolution d’écran, même si ce n’est probablement pas le meilleur endroit où gérer cela.
GRUB
conserve automatiquement une liste des versions installées du Kernel
lorsque celui-ci est mis à jour et au lancement d’une machine Linux, il va permettre de sélectionner la version sur laquelle on souhaite démarrer ou bien de démarrer sur un environnement de secours (bonjour le mot de passe root oublié).
On peut modifier la configuration de GRUB
manuellement mais la moindre erreur pourra empêcher le bon démarrage de l’OS et il faudra probablement avoir recours à un média externe pour démarrer sur un environnement de secours.
Le comportement général de GRUB
est régi par /etc/default/grub
.
root@debian:~# cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
# If your computer has multiple operating systems installed, then you
# probably want to run os-prober. However, if your computer is a host
# for guest OSes installed via LVM or raw disk devices, running
# os-prober can cause damage to those guest OSes as it mounts
# filesystems to look for things.
#GRUB_DISABLE_OS_PROBER=false
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
Les fichier de configuration de GRUB
ne sont pas modifiables par défaut, mais sous Debian les commentaires du fichier indiquent la marche à suivre en cas de modification : update-grub
. Mais t’auras remarqué que le fichier ne nous montre pas du tout les OS de ma machine ? Parce que c’est géré ailleurs !
root@debian:~# ls /etc/grub.d/
00_header 05_debian_theme 10_linux 20_linux_xen 30_os-prober 30_uefi-firmware 40_custom 41_custom README
Dans le dossier /etc/grub.d/
on retrouve les fichiers de configuration qui permettent de lister les OS de la machine. Typiquement si on souhaite ajouter un OS manuellement on utilisera 40_custom
et l’autodétection fonctionne grâce à 30_os-prober
.
Le fichier qui compulse le paramétrage de GRUB
se trouve à l’emplacement /boot/grub/grub.cfg
. Ce fichier est généré automatiquement à partir des fichiers listés ci-dessus.
Exécuter des applications
Le shell
J’ai déjà écrit un article à ce sujet qui peut compléter ou servir d’introduction à cette partie.
Avant toute chose, il faut bien distinguer la différence entre le terminal et le shell. Le terminal ne représente que l’interface qui permet d’accéder au shell. Par exemple, j’utilise le terminal Konsole
afin d’exécuter le shell Bash
. Il existe d’autres shell que Bash
comme Dash
qui est le remplaçant de ash
(/bin/sh
) et qui est par défaut le shell non-interactif du compte root
de Debian ou bien Zsh
que l’on rencontre généralement sur les BSD
.
Si le travail du terminal ne représente que l’affichage du shell
, ce dernier à un rôle bien plus important. Bash est responsable de la localisation des commandes à l’aide la variable d’environnement PATH
pour trouver les exécutables ou en identifiant les commandes internes, fonctions ou alias mais également de transmettre l’exécution d’une commande au Kernel
.
Voici un petit inventaire des outils de visualisation/édition de fichiers dont je ne t’avais pas encore parlé mais qu’il te faut connaître :
cat
permet d’afficher le contenu d’un fichier directement dans leshell
. C’est bien mais pour un contenu long c’est pas le plus pratique.more
permet justement d’afficher à l’écran le contenu d’un fichier et de naviguer dans ce contenu. Généralementmore
ne permet que de naviguer vers l’avant mais certaines versions permettent de naviguer également vers l’arrière.less
est une amélioration demore
qui permet de naviguer vers le haut comme vers le bas. Tu peux sauter à la fin avec G, retourner au début g, faire une recherche en avant avec / et vers l’arrière avec ?… etc.vi
ouvim
est un éditeur de texte assez surprenant avec des commandes pensées pour n’avoir que très peu à bouger les doigts sur le clavier.Vim
est l’un des meilleurs exemples du syndrome de Stockholm : on est resté bloqué trop longtemps sans réussir à en sortir pour ne pas l’aimer. Humour mis à part, sur certains systèmesvi
peut être le seul éditeur de fichier. Il est impératif de savoir s’en servir.
La première marche à franchir pour le dompter est assez haute mais avec l’aide d’un bon bouquin tu capteras rapidement la puissance de cet éditeur.nano
est souvent présent également. C’est un autre éditeur de texte qui est plus simple d’usage.
Gestion des processus
Pour afficher les processus en cours sous Linux, on utilise ps
. Par défaut, il n’affiche que les processus de la session en cours de notre terminal. ps
accepte les arguments de plusieurs façons : regroupés ou non après un tiret simple pour les options UNIX ; regroupés ou non sans tiret pour les options BSD ; les options GNU de forme longue après deux tirets. On peut donc utiliser ps a
et ps -a
sans problème mais les informations de sortie seront différentes.
root@debian:~# ps
PID TTY TIME CMD
517 pts/0 00:00:00 bash
6659 pts/0 00:00:00 ps
root@debian:~# ps -a
PID TTY TIME CMD
6661 pts/0 00:00:00 ps
root@debian:~# ps a
PID TTY STAT TIME COMMAND
455 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear - linux
517 pts/0 Ss 0:00 -bash
6674 pts/0 R+ 0:00 ps a
Pour fonctionner, Linux va lancer bien plus de processus que ceux listés ci-dessus. Afin de les afficher, on va cumuler les arguments suivants en mode BSD :
a
afin de lever la restriction de mon seul utilisateur,u
permet de générer un format de sortie plus lisible,x
pour lister tous les processus vu qu’il est adossé àa
.
root@debian:~# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 2.8 103124 13296 ? Ss déc.18 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S déc.18 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< déc.18 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< déc.18 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< déc.18 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< déc.18 0:00 [netns]
root 10 0.0 0.0 0 0 ? I< déc.18 0:00 [mm_percpu_wq]
root 11 0.0 0.0 0 0 ? I déc.18 0:00 [rcu_tasks_kthread]
root 12 0.0 0.0 0 0 ? I déc.18 0:00 [rcu_tasks_rude_kthread]
root 13 0.0 0.0 0 0 ? I déc.18 0:00 [rcu_tasks_trace_kthread]
root 14 0.0 0.0 0 0 ? S déc.18 0:00 [ksoftirqd/0]
root 15 0.0 0.0 0 0 ? I déc.18 0:00 [rcu_preempt]
root 16 0.0 0.0 0 0 ? S déc.18 0:00 [migration/0]
root 18 0.0 0.0 0 0 ? S déc.18 0:00 [cpuhp/0]
root 20 0.0 0.0 0 0 ? S déc.18 0:00 [kdevtmpfs]
root 21 0.0 0.0 0 0 ? I< déc.18 0:00 [inet_frag_wq]
root 22 0.0 0.0 0 0 ? S déc.18 0:00 [kauditd]
root 23 0.0 0.0 0 0 ? S déc.18 0:00 [khungtaskd]
root 24 0.0 0.0 0 0 ? S déc.18 0:00 [oom_reaper]
root 27 0.0 0.0 0 0 ? I< déc.18 0:00 [writeback]
root 28 0.0 0.0 0 0 ? S déc.18 0:11 [kcompactd0]
root 29 0.0 0.0 0 0 ? SN déc.18 0:00 [ksmd]
root 30 0.0 0.0 0 0 ? I< déc.18 0:00 [kintegrityd]
root 31 0.0 0.0 0 0 ? I< déc.18 0:00 [kblockd]
root 32 0.0 0.0 0 0 ? I< déc.18 0:00 [blkcg_punt_bio]
root 33 0.0 0.0 0 0 ? I< déc.18 0:00 [tpm_dev_wq]
root 34 0.0 0.0 0 0 ? I< déc.18 0:00 [edac-poller]
root 35 0.0 0.0 0 0 ? I< déc.18 0:00 [devfreq_wq]
root 36 0.0 0.0 0 0 ? I< déc.18 0:01 [kworker/0:1H-kblockd]
root 37 0.0 0.0 0 0 ? S déc.18 0:00 [kswapd0]
root 43 0.0 0.0 0 0 ? I< déc.18 0:00 [kthrotld]
root 45 0.0 0.0 0 0 ? I< déc.18 0:00 [acpi_thermal_pm]
root 46 0.0 0.0 0 0 ? I< déc.18 0:00 [mld]
root 47 0.0 0.0 0 0 ? I< déc.18 0:00 [ipv6_addrconf]
root 52 0.0 0.0 0 0 ? I< déc.18 0:00 [kstrp]
root 57 0.0 0.0 0 0 ? I< déc.18 0:00 [zswap-shrink]
root 58 0.0 0.0 0 0 ? I< déc.18 0:00 [kworker/u3:0]
root 119 0.0 0.0 0 0 ? I< déc.18 0:00 [ata_sff]
root 120 0.0 0.0 0 0 ? S déc.18 0:00 [scsi_eh_0]
root 121 0.0 0.0 0 0 ? S déc.18 0:00 [scsi_eh_1]
root 122 0.0 0.0 0 0 ? I< déc.18 0:00 [scsi_tmf_0]
root 123 0.0 0.0 0 0 ? I< déc.18 0:00 [scsi_tmf_1]
root 124 0.0 0.0 0 0 ? S déc.18 0:00 [scsi_eh_2]
root 125 0.0 0.0 0 0 ? I< déc.18 0:00 [scsi_tmf_2]
root 132 0.0 0.0 0 0 ? I< déc.18 0:00 [kworker/0:2H-kblockd]
root 164 0.0 0.0 0 0 ? S déc.18 0:00 [jbd2/sda2-8]
root 165 0.0 0.0 0 0 ? I< déc.18 0:00 [ext4-rsv-conver]
root 204 0.0 2.6 32920 12600 ? Ss déc.18 0:01 /lib/systemd/systemd-journald
root 236 0.0 1.3 26132 6388 ? Ss déc.18 0:03 /lib/systemd/systemd-udevd
root 288 0.0 0.0 0 0 ? S déc.18 0:00 [irq/18-vmwgfx]
root 298 0.0 0.0 0 0 ? I< déc.18 0:00 [cryptd]
root 324 0.0 0.7 5868 3556 ? Ss déc.18 0:00 dhclient -4 -v -i -pf /run/dhclient.enp0s3.pid -lf /var/lib/dhcp/dhclient.enp0s3.leases -I -df /var/lib/dhcp/dhclient6.enp0s3.leases enp0s3
root 440 0.0 0.5 7256 2636 ? Ss déc.18 0:00 /usr/sbin/cron -f
message+ 441 0.0 0.8 7916 3788 ? Ss déc.18 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 445 0.0 1.6 24856 7736 ? Ss déc.18 0:00 /lib/systemd/systemd-logind
root 455 0.0 0.2 6520 1048 tty1 Ss+ déc.18 0:00 /sbin/agetty -o -p -- \u --noclear - linux
root 460 0.0 1.8 15412 8880 ? Ss déc.18 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 494 0.0 2.4 17952 11400 ? Ss déc.18 0:01 sshd: root@pts/0
root 497 0.0 2.2 18928 10700 ? Ss déc.18 0:00 /lib/systemd/systemd --user
root 498 0.0 0.6 102560 2896 ? S déc.18 0:00 (sd-pam)
root 517 0.0 1.0 8772 5136 pts/0 Ss déc.18 0:00 -bash
root 6010 0.2 0.0 0 0 ? I 00:10 0:13 [kworker/0:3-events_power_efficient]
root 6505 0.0 0.0 0 0 ? I 01:15 0:00 [kworker/u2:2-flush-8:0]
root 6553 0.0 0.0 0 0 ? I 01:23 0:00 [kworker/u2:0-events_unbound]
root 6783 0.0 0.0 0 0 ? I 01:48 0:00 [kworker/0:1-ata_sff]
root 6821 0.0 0.0 0 0 ? I 01:53 0:00 [kworker/u2:1-flush-8:0]
root 6822 0.0 0.0 0 0 ? I 01:53 0:00 [kworker/u2:3]
root 6827 0.0 0.0 0 0 ? I 01:53 0:00 [kworker/0:0-ata_sff]
root 6848 0.0 0.9 11816 4392 pts/0 R+ 01:56 0:00 ps aux
Le PID
(deuxième colonne) est une information fluctuante. C’est un numéro qui est attribué par le Kernel
de façon incrémentale.
On peut voir des trous dans la numérotation et c’est normal : le processus qui avait le PID
manquant a terminé son exécution après que le Kernel
ait attribué les numéros suivants.
Vu que le PID
est volatile, il sera utile de pouvoir déterminer le PID
d’un processus. Pour cela, on utilise la commande pgrep
.
root@debian:~# pgrep bash
517
En listant les processus avec leur PID
, l’utilisateur, la consommation cpu et mémoire, ps
est pratique pour nous donner un cliché instantané mais lorsque l’ordinateur ralentie par exemple, on peut avoir besoin de surveiller et de classer en temps réel les processus et leur usage. Pour cela, on va utiliser la commande top
.
top
est présent sur la majorité des systèmes Linux. Il permet de lister en temps réel les processus en affichant approximativement le même résultat que ps aux
classé par usage cpu et un délais de rafraîchissement de 3 secondes par défaut. On peut changer ce délais à l’aide de la touche d et spécifier le délais en seconde, classer par usage mémoire avec Shift + M et, classer de nouveau par usage cpu avec Shift + P ou encore, tuer un programme k en spécifiant son PID
.

Bon t’as vu, j’ai pété mon affichage en tuant top
(un petit clear
et on n’en parle plus).
Si on se moque de savoir quel processus utilise la mémoire, on peut également utiliser free
(si besoin on ajoutera -h
pour le rendre plus lisible).
root@debian:~# free
total utilisé libre partagé tamp/cache disponible
Mem: 468528 88452 136704 504 255832 380076
Échange: 1951740 0 1951740
Avec ps
on se rend bien compte à quel point Linux est multitâche et on peut avoir besoin de faire nous-même du multitâche dans un même terminal, lors d’une connexion ssh
par exemple.
Imaginons que je souhaite écrire un script bash dans lequel je me serts de la commande top
. Je risque d’avoir besoin d’un côté du manuel de top
et de vim
de l’autre pour rédiger.
Une fois dans mon man top
à la ligne qui m’intéresse, je vais l’envoyer en tâche de fond à l’aide de Ctrl + z et me revoici à ma ligne de commande. Je lance vim top3_process.sh
et commence à rédiger. Pour basculer de nouveau vers man
, je vais de nouveau Ctrl + z afin d’envoyer mon vim
en tâche de fond.
root@debian:~# man top
[1]+ Stoppé man top
root@debian:~# vi super_duper_script.sh
[2]+ Stoppé vi top3_process.sh
root@debian:~#
Le shell indique entre crochet le numéro qu’il a attribué à ces commandes en tâches de fond mais je peux lui demander de me les lister avec jobs
.
root@debian:~# jobs
[1]- Stoppé man top
[2]+ Stoppé vi super_duper_script.sh
root@debian:~#
Pour récupérer une des commandes interactives, on va pouvoir utiliser % suivi du numéro indiqué. Tu peux aussi utiliser fg
(foreground) mais j’ai pas hyper bien saisi l’usage de bg
(background).
Pour lancer une commande directement en arrière plan, on termine notre ligne de commande par un « et » commercial &.
Par contre, tes commandes interactives seront fermées si ta session (ton terminal, ta connexion ssh) est fermée. Pour que des commandes fonctionnent même après déconnexion, il faudra s’intéresser aux services.
Priorités d’exécution
La priorité d’un processus peut aller de -20 à 19 et c’est comme au golf, le score le plus bas est le meilleur ; en l’état le plus prioritaire. Par défaut, sous Linux tous les processus s’exécutent avec la même priorité : 0.
top
montre d’ailleurs la priorité attribuée aux processus dans la colonne NI
.
top - 04:51:27 up 1 day, 1:17, 1 user, load average: 0,00, 0,00, 0,00
Tâches: 69 total, 1 en cours, 68 en veille, 0 arrêté, 0 zombie
%Cpu(s): 0,0 ut, 0,0 sy, 0,0 ni,100,0 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
MiB Mem : 457,5 total, 129,9 libr, 88,4 util, 251,4 tamp/cache
MiB Éch : 1906,0 total, 1906,0 libr, 0,0 util. 369,1 dispo Mem
PID UTIL. PR NI VIRT RES SHR S %CPU %MEM TEMPS+ COM.
6010 root 20 0 0 0 0 I 0,3 0,0 0:34.26 kworker/0:3-events_power_efficient
1 root 20 0 103124 13296 9188 S 0,0 2,8 0:01.39 systemd
2 root 20 0 0 0 0 S 0,0 0,0 0:00.03 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
5 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 slub_flushwq
6 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 netns
10 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq
11 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_tasks_kthread
12 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_tasks_rude_kthread
13 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_tasks_trace_kthread
14 root 20 0 0 0 0 S 0,0 0,0 0:00.33 ksoftirqd/0
15 root 20 0 0 0 0 I 0,0 0,0 0:01.03 rcu_preempt
16 root rt 0 0 0 0 S 0,0 0,0 0:00.92 migration/0
On peut outrepasser la valeur par défaut à l’aide de l’outil nice
. Prenons une commande longue qu’on envoi en tâche de fond pour étudier ça.
root@debian:~# nice -n 15 md5sum /dev/sda2 &
root@debian:~# top
top - 04:57:32 up 1 day, 1:23, 1 user, load average: 0,33, 0,14, 0,05
Tâches: 69 total, 2 en cours, 67 en veille, 0 arrêté, 0 zombie
%Cpu(s): 0,0 ut, 21,6 sy, 75,7 ni, 0,0 id, 2,7 wa, 0,0 hi, 0,0 si, 0,0 st
MiB Mem : 457,5 total, 7,5 libr, 88,1 util, 374,2 tamp/cache
MiB Éch : 1906,0 total, 1906,0 libr, 0,0 util. 369,5 dispo Mem
PID UTIL. PR NI VIRT RES SHR S %CPU %MEM TEMPS+ COM.
7702 root 35 15 6124 888 800 R 93,0 0,2 0:13.74 md5sum
37 root 20 0 0 0 0 S 5,0 0,0 0:02.18 kswapd0
28 root 20 0 0 0 0 S 0,3 0,0 0:13.00 kcompactd0
7697 root 20 0 0 0 0 I 0,3 0,0 0:00.23 kworker/0:2-events
1 root 20 0 103124 13152 9044 S 0,0 2,8 0:01.39 systemd
On retrouvre bien notre md5sum
et sa priorité.
On peut tout à fait modifier la valeur de la priorité d’un processus en cours à l’aide de renice
en précisant la nouvelle priorité et le PID
du processus dont on veut changer la priorité.
root@debian:~# renice -n -10 7721
7721 (process ID) old priority 15, new priority -10
root@debian:~# top
top - 05:00:38 up 1 day, 1:26, 1 user, load average: 0,44, 0,28, 0,12
Tâches: 70 total, 2 en cours, 68 en veille, 0 arrêté, 0 zombie
%Cpu(s): 87,4 ut, 11,9 sy, 0,0 ni, 0,0 id, 0,0 wa, 0,0 hi, 0,7 si, 0,0 st
MiB Mem : 457,5 total, 5,0 libr, 88,1 util, 376,6 tamp/cache
MiB Éch : 1906,0 total, 1906,0 libr, 0,0 util. 369,5 dispo Mem
PID UTIL. PR NI VIRT RES SHR S %CPU %MEM TEMPS+ COM.
7721 root 10 -10 6132 924 840 R 96,7 0,2 0:15.56 md5sum
37 root 20 0 0 0 0 S 2,7 0,0 0:04.83 kswapd0
494 root 20 0 17952 11108 9044 S 0,3 2,4 0:03.37 sshd
1 root 20 0 103124 13152 9044 S 0,0 2,8 0:01.39 systemd
2 root 20 0 0 0 0 S 0,0 0,0 0:00.03 kthreadd
Dans le cas où un processus poserait problème, on peut le tuer à l’aide de la commande kill
. Si kill 7721
suffirait à tuer notre commande md5sum
, il y a cependant de nombreuses manières différentes de tuer un processus ; 64 exactement sur ma Debian.
root@debian:~# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
On peut alors choisir plus finement la manière dont on va mettre fin au processus en question (9 pour que le Kernel
le tue ou 15 pour qu’il se ferme par lui-même, par exemple).
Il est possible de kill
un processus à l’aide de son nom plutôt que son PID
mais s’il y en a plusieurs occurrences le résultat peut être… inattendu… D’ailleurs à ce sujet, avec killall
on sera bien aise d’utiliser le nom d’un processus ; genre killall nano
.
On a déjà parcouru un tier de ce cours et j’ai vu quelques petites choses intéressantes. J’espère en apprendre plus avec la suite du cours pour te le partager.

Fin de la bande
2 réflexions sur « Linux LPIC-1 (101-500) #1 – Matériel et exécution de processus »
Bonjour,
Je me permets de partager, les cours du LPI (officiels) sont en cours de traduction et disponible gratuitement sur le site :
* https://learning.lpi.org/fr/learning-materials/learning-materials/
Bonjour tzkuat,
Bonne initiative, je te remercie !