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.
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 blocbus: 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'appareilsdev: fournit des informations sur les nœuds de périphérique initialisés, par types de nœuds de périphériquedevices: fournit des informations sur les appareils avec une présentation catégoriséefirmware: informations sur le micrologicielfs: 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 SCSCIlsblk: obtenir des informations sur les périphériques de type bloclsdev: obtenir des informations sur les appareilslscpu: 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