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

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

brown insect

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.

Bash
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.

Bash
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.

Bash
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).

Bash
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.

Bash
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
Voir plus

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 lsmod permet de lister les modules, rmmod 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).

Bash
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.

Bash
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.

Bash
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 :

  1. 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 : le Master Boot Record ou la GUID Partition Table.
  2. 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).
  3. GRUB 2
    Le bootloader GRUB va entre autres choses être en charge de charger le Kernel. Il propose notamment via un menu de sélectionner une version plus ancienne du Kernel
  4. Initrd / Kernel
    Initrd est une image disque montée en mémoire vive depuis le disque dur ayant les outils nécessaire au lancement du Kernel ; on peut l’imaginer comme une version minimaliste de Linux.
  5. 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).
Bash
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.

Bash
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"
Voir plus

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 !

Bash
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 le shell. 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éralement more ne permet que de naviguer vers l’avant mais certaines versions permettent de naviguer également vers l’arrière.
  • less est une amélioration de more 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 ou vim 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èmes vi 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.

Bash
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.
Bash
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
Voir plus

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.

Bash
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).

Bash
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.

Bash
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.

Bash
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.

Bash
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.

Bash
root@debian:~# nice -n 15 md5sum /dev/sda2 &
root@debian:~# top
Bash
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é.

Bash
root@debian:~# renice -n -10 7721
7721 (process ID) old priority 15, new priority -10
root@debian:~# top
Bash
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.

Bash
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 cassette

Fin de la bande

2 réflexions sur « Linux LPIC-1 (101-500) #1 – Matériel et exécution de processus »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *