Comment interagir avec le noyau Linux via procfs et sysfs

Comprenez les pseudo-systèmes de fichiers Linux procfs et sysfs et apprenez à interagir avec le noyau pour afficher et modifier les paramètres d'exécution et obtenir des informations sur le matériel informatique.

Comment interagir avec le noyau Linux via procfs et sysfs
Photo par Hubert Neufeld / Unsplash

Qu'est-ce que procfs (/proc)

« procfs » de Linux est un pseudo-système de fichiers qui fournit une interface aux structures de données en mémoire du noyau. Il est généralement monté dans « /proc ». Il est généralement monté automatiquement par le système, mais il peut également être monté manuellement à l'aide d'une commande telle que :

mount -t proc proc /proc

La plupart des fichiers à l'intérieur du système de fichiers « /proc » sont en lecture seule, mais certains sont accessibles en écriture, permettant de modifier les variables du noyau.

Aperçu du contenu de procfs

$ ls /proc/
1     117   1581  1847  20    28   4    570  8    985        diskstats    kallsyms     meminfo       self           uptime
10    12    1582  1865  200   29   417  573  80   99         dma          kcore        misc          slabinfo       version
1017  13    1586  1868  2003  30   445  574  81   acpi       driver       keys         modules       softirqs       version_signature
1040  14    16    1869  201   302  447  575  82   buddyinfo  execdomains  key-users    mounts        stat           vmallocinfo
1049  15    17    188   21    303  452  593  83   bus        fb           kmsg         mtrr          swaps          vmstat
1062  1533  170   19    22    31   453  6    9    cgroups    filesystems  kpagecgroup  net           sys            zoneinfo
1067  154   172   1928  23    339  454  7    90   cmdline    fs           kpagecount   pagetypeinfo  sysrq-trigger
1075  155   18    1942  24    34   455  755  904  consoles   interrupts   kpageflags   partitions    sysvipc
1077  156   1844  1948  25    340  456  774  911  cpuinfo    iomem        loadavg      sched_debug   thread-self
1096  157   1845  199   27    35   457  78   927  crypto     ioports      locks        schedstat     timer_list
11    1570  1846  2     278   36   483  79   939  devices    irq          mdstat       scsi          tty

Pour plus d'informations sur chaque fichier/répertoire, utilisez : man procfs

Qu'est-ce que sysfs (/sys)

« sysfs » de Linux est un pseudo-système de fichiers qui fournit des informations sur les périphériques disponibles sur le système et les attributs matériels qu'ils utilisent. Il est généralement monté dans « /sys ». Il est généralement monté automatiquement par le système, mais peut également être monté manuellement à l'aide d'une commande telle que :

mount -t sysfs sysfs /sys

Aperçu du contenu de sysfs

$ ls /sys/
block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
  • block: fournit des informations sur les périphériques connectés de type bloc
  • bus : fournit des informations sur les bus disponibles (pilotes, périphériques connectés, paramètres...)
  • class : fournit des informations sur les appareils, organisées par classe d'appareils
  • dev : fournit des informations sur les nœuds de périphérique initialisés, par types de nœuds de périphérique
  • devices : fournit des informations sur les appareils avec une présentation catégorisée
  • firmware : informations sur le micrologiciel
  • fs : fournit des informations sur les types de systèmes de fichiers utilisés par les périphériques de type blocs, ainsi que leurs paramètres
    et statistiques associés
  • (...)

Obtenir des informations sur le matériel du système

Pour faciliter l'obtention d'informations sur les périphériques à partir du pseudo-système de fichiers sysfs, la commande « udevadm » peut être utilisée. Voir « udevadm info --help » pour plus de détails. Exemple :

# Get all types of info about the /dev/sda device
udevadm info --query=all --name=/dev/sda

Voici une liste d'autres outils que nous pouvons utiliser pour obtenir des informations sur le matériel à partir de sysfs :

  • lspci : obtenir des informations sur les périphériques connectés au bus PCI. Utilisez l'option « -k » pour obtenir des informations sur les modules du noyau associés, utilisés pour les matériels listés.
  • lsusb : obtenir des informations sur les périphériques connectés au bus USB.
  • dmidecode : obtenir des informations sur le BIOS et des informations détaillées sur l'ordinateur à partir du micrologiciel. Utilisez « man dmidecode » pour plus d'informations sur la commande et la structure des informations affichées.
  • dmesg : affiche le contenu du tampon circulaire du noyau, contenant des informations sur les événements matériels récents (branchement/débranchement d'un périphérique, etc.). Chaque ligne affichée commence par un horodatage en secondes correspondant au nombre de secondes écoulées depuis le démarrage du système.
  • lsscsi : obtenir des informations sur ce qui est connecté au bus SCSCI
  • lsblk : obtenir des informations sur les périphériques de type bloc
  • lsdev : obtenir des informations sur les appareils
  • lscpu : obtenir des informations sur le matériel du processeur

Mise à jour des paramètres d'exécution du noyau

Les paramètres d'exécution du noyau sont visibles dans le répertoire « /proc/sys ». Ce répertoire contient des sous-répertoires qui les classent :

$ ll /proc/sys/
total 0
dr-xr-xr-x   1 root root 0 Dec 27 08:50 ./
dr-xr-xr-x 191 root root 0 Dec 27 08:50 ../
dr-xr-xr-x   1 root root 0 Dec 27 08:52 abi/
dr-xr-xr-x   1 root root 0 Dec 27 09:07 debug/
dr-xr-xr-x   1 root root 0 Dec 27 08:52 dev/
dr-xr-xr-x   1 root root 0 Dec 27 08:50 fs/
dr-xr-xr-x   1 root root 0 Dec 27 08:50 kernel/
dr-xr-xr-x   1 root root 0 Dec 27 08:50 net/
dr-xr-xr-x   1 root root 0 Dec 27 09:07 user/
dr-xr-xr-x   1 root root 0 Dec 27 08:50 vm/

Pour plus d'informations sur chaque sous-répertoire, ou parfois sur les fichiers de paramètres qu'ils contiennent, et leur utilité, utilisez « man procfs » et recherchez le chemin absolu du sous-répertoire ou des fichiers de paramètres. Par exemple, pour obtenir des informations sur le sous-répertoire « abi », recherchez : \/proc\/sys\/abi.

Nous pouvons également obtenir des descriptions de certains paramètres du noyau en consultant le manuel du noyau Linux correspondant au module ou au protocole sous-jacent. Par exemple, pour connaître la fonction de « /proc/sys/net/ipv4/ip_forward » ou « net.ipv4.icmp_echo_ignore_all », nous pouvons utiliser :

man 7 ip # and search for 'ip_forward'
man 7 icmp # and search for 'icmp_echo_ignore_all'

Examinons maintenant le contenu de l'un des fichiers de paramètres présents dans « /proc/sys ». Celui-ci permet d'activer (1) ou de désactiver (0) le routage de paquets pour IPv4 :

$ cat /proc/sys/net/ipv4/ip_forward
1

Pour activer ou désactiver le routage de paquets pour IPv4, il suffit de mettre à jour la valeur à l'intérieur du fichier de paramètres avec 1 ou 0 :

# Enable packet forwarding for IPv4
echo "1" > /proc/sys/net/ipv4/ip_forward

# Disable packet forwarding for IPv4
echo "0" > /proc/sys/net/ipv4/ip_forward

Nous pouvons également utiliser l'outil « sysctl » pour cela :

sysctl -w net.ipv4.ip_forward=1 # or
sysctl -w net.ipv4.ip_forward=0

Les modifications que nous avons apportées de cette manière ne persisteront pas après le redémarrage du système.

Faire en sorte que les modifications des paramètres du noyau persistent après le redémarrage

Pour rendre les mises à jour des paramètres du noyau persistantes, nous devons définir les paramètres dans « /etc/sysctl.conf » ou dans un nouveau fichier de configuration dans « /etc/sysctl.d/ ». Ce fichier doit avoir l'extension « .conf ». Chaque ligne du fichier de configuration doit être au format : « param = value ».

Remplaçons maintenant le paramètre de routage de paquets IPv4 en utilisant notre nouveau fichier de configuration « /etc/sysctl.d/local.conf ». Voici comment trouver le paramètre à utiliser dans le fichier de configuration :

$ sysctl -a | grep "ip_forward"
net.ipv4.ip_forward = 1 # this is the one we are looking for
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

# or use the --pattern to search for a specific
# pattern across available parameters
$ sysctl -a --pattern ip_forward$
net.ipv4.ip_forward = 1

Nous pouvons maintenant placer la ligne de configuration suivante dans le fichier de configuration '/etc/sysctl.d/local.conf' :

net.ipv4.ip_forward = 1 # To enable IPv4 packet forwarding

# or
net.ipv4.ip_forward = 0 # To disable IPv4 packet forwarding

Après avoir mis à jour le fichier de configuration, nous devons exécuter la commande suivante pour que le noyau relise les fichiers de configuration et mette à jour les valeurs des paramètres en conséquence :

systemctl restart procps.service # or
service procps reload # or
deb-systemd-invoke restart procps.service