1. Présentation
Introduit par le noyau Linux 2.6, le pseudo-système
de fichiers sysfs est, comme procfs, un système de fichiers
virtuel monté dans le dossier /sys.
Il n’occupe donc pas d’espace disque et sa taille est de 0 Kio :
# ls -ld /sys drwxr-xr-x 13 root root 0 août 3 10:26 /sys
Du fait que procfs était
encombré d’une multitude d’informations non liées aux
processus, sysfs a été conçu
pour exporter depuis l’espace noyau (anneau 0) vers l’espace
utilisateur (anneau 3) des informations sur les périphériques
et leurs pilotes.
2. Principaux fichiers de /sys
Le premier niveau /sys contient
les dossiers suivants :
# ls /sys block bus class dev devices firmware fs hypervisor kernel module power
a. /sys/block
Il contient les informations sur les périphériques
de blocs :
# ls /sys/block dm-0 dm-1 dm-2 dm-3 loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 sda sr0
Vous trouvez par exemple, dans chaque sous-dossier,
un fichier /sys/block/<disque>/stat qui
affiche les statistiques d’E/S (I/O) du disque :
# cat /sys/block/dm-0/stat 24113 0 551642 249092 12764 0 263840 532832 0 88828 781920
/sys/block/<disque>/<partition>/stat affiche
les statistiques E/S de la partition. Le format du fichier
est identique à celui du disque.
b. /sys/bus
Il contient des dossiers qui représentent
comment les périphériques sont connectés
aux différents bus :
# ls /sys/bus ac97 acpi cpu event_source hid i2c machinecheck pci pci_express platform pnp scsi serio spi usb xen xen- backend
c. /sys/class
Il contient une liste de dossiers qui montrent
les périphériques regroupés en classes :
# ls /sys/class/ ata_device bdi dma graphics input net printer scsi_device sound vc ata_link block dmi hidraw leds pci_bus regulator scsi_disk spi_master vtconsole ata_port bluetooth drm hwmon mem power_supply rfkill scsi_generic thermal backlight bsg firmware i2c-adapter misc ppdev rtc scsi_host tty
d. /sys/dev
Il fournit deux dossiers :
# ls /sys/dev block char
L’un est consacré aux périphériques
de blocs (block) et l’autre aux périphériques de caractères
(char). Dans ces derniers, les noms des liens symboliques sont
les numéros majeurs et mineurs des périphériques :
# ls -l /sys/dev/block total 0 lrwxrwxrwx 1 root root 0 août 3 10:26 11:0 - ../../devices/pci0000:00/0000:00:01.1/host2/target2:0:0/2:0:0:0/block/sr0 lrwxrwxrwx 1 root root 0 août 8 00:36 254:0 -> ../../devices/virtual/block/dm-0 lrwxrwxrwx 1 root root 0 août 8 00:36 254:1 -> ../../devices/virtual/block/dm-1 lrwxrwxrwx 1 root root 0 août 3 10:26 254:2 -> ../../devices/virtual/block/dm-2 lrwxrwxrwx 1 root root 0 août 3 10:26 254:3 -> ../../devices/virtual/block/dm-3 lrwxrwxrwx 1 root root 0 août 8 00:36 7:0 -> ../../devices/virtual/block/loop0 lrwxrwxrwx 1 root root 0 août 8 00:36 7:1 -> ../../devices/virtual/block/loop1 lrwxrwxrwx 1 root root 0 août 8 00:36 7:2 -> ../../devices/virtual/block/loop2 lrwxrwxrwx 1 root root 0 août 8 00:36 7:3 -> ../../devices/virtual/block/loop3 lrwxrwxrwx 1 root root 0 août 8 00:36 7:4 -> ../../devices/virtual/block/loop4 lrwxrwxrwx 1 root root 0 août 8 00:36 7:5 -> ../../devices/virtual/block/loop5 lrwxrwxrwx 1 root root 0 août 8 00:36 7:6 -> ../../devices/virtual/block/loop6 lrwxrwxrwx 1 root root 0 août 8 00:36 7:7 -> ../../devices/virtual/block/loop7 lrwxrwxrwx 1 root root 0 août 3 10:26 8:0 -> ../../devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/ block/sda lrwxrwxrwx 1 root root 0 août 3 10:26 8:1 -> ../../devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/ block/sda/sda1
Les liens symboliques pointent vers le dossier /sys/devices.
e. /sys/devices
Ce dossier contient des sous-dossiers qui
représentent la couche physique :
# ls /sys/devices breakpoint LNXSYSTM:00 pci0000:00 platform pnp0 software system tracepoint virtual
f. /sys/firmware
Le BIOS ou bien firmware fournit une mémoire
que le noyau Linux lit. Cette mémoire est montrée
dans l’espace utilisateur via /proc/iomem.
/sys/firmware contient
des dossiers :
# ls /sys/firmware/memmap 0 1 2 3 4 5
Le nombre de dossiers dépend de la
quantité de mémoire.
Chaque dossier comporte trois fichiers :
-
start qui contient l’adresse de début ;
-
end qui contient l’adresse de fin ;
-
type qui contient le type d’entrée. Les types peuvent être System RAM, ACPI Tables, ACPI Non-volatile Storage et reserved.
L’objectif est d’afficher les informations de memmap de façon plus lisible pour un humain via un script shell.
Vous devez être connecté en tant que root. Allez, si nécessaire, dans votre répertoire personnel /root. Vérifiez avec la commande pwd.
Lancez un éditeur de texte tel que VI ou nano pour créer le fichier memmap.sh.
Tapez ensuite les lignes suivantes :
#!/bin/bash cd /sys/firmware/memmap for dir in * ; do start=$(cat $dir/start) end=$(cat $dir/end) type=$(cat $dir/type) printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type" doneEnregistrez le fichier et quittez l’éditeur de texte.
Assignez le droit d’exécution au fichier memmap.sh :
# chmod +x memmap.shExécutez le script :
# ./memmap.sh 0000000000000000-000000000009fc00 (System RAM) 000000000009fc00-00000000000a0000 (reserved) 00000000000f0000-0000000000100000 (reserved) 0000000000100000-000000001fff0000 (System RAM) 000000001fff0000-0000000020000000 (ACPI Tables) 00000000fffc0000-0000000100000000 (reserved)
g. /sys/fs
Ce dossier contient les Informations sur les
systèmes de fichiers montés comme ext4 et aussi
sur la fonctionnalité du noyau cgroups (control groups) qui permet de limiter, compter et isoler l’utilisation
de ressources telles que le processeur, la mémoire, etc.
# ls /sys/fs/* /sys/fs/cgroup: /sys/fs/ext4: dm-0 dm-2 dm-3 features
h. /sys/hypervisor
Ce dossier contient les informations de l’hyperviseur
Xen lorsqu’il est installé.
i. /sys/kernel
Cette arborescence contient des informations
sur le noyau :
# ls /sys/kernel/* /sys/kernel/fscaps /sys/kernel/kexec_crash_size /sys/kernel/notes /sys/kernel/uevent_helper /sys/kernel/vmcoreinfo /sys/kernel/kexec_crash_loaded /sys/kernel/kexec_loaded /sys/kernel/profiling/sys/kernel/uevent_seqnum /sys/kernel/debug: /sys/kernel/fscache: /sys/kernel/mm: hugepages ksm transparent_hugepage /sys/kernel/security:/sys/kernel/debug
Ce dossier est utilisé par le système
de fichiers debugfs, lequel permet
de déboguer le code du noyau Linux. Ne confondez
pas ce système de fichiers debugfs avec
l’utilitaire debugfs.
L’option debugfs doit être
activée dans la configuration du noyau lors de la compilation.
Normalement, les distributions récentes intègrent
cette option.
Ubuntu Server 12.04 LTS monte par défaut
le système de fichiers debugfs.
# mount | grep debugfs none on /sys/kernel/debug type debugfs (rw)
Pour Debian 7 et CentOS 6, il faut le monter
manuellement :
# mount -t debugfs nodev /sys/kernel/debug
Si vous souhaitez le démonter :
# umount nodev
Pour vérifier le montage :
# mount | grep debugfs nodev on /sys/kernel/debug type debugfs (rw,relatime)
Enfin, si vous souhaitez que le montage soit
actif lors du démarrage du système, il suffit
d’ajouter dans le fichier /etc/fstab la
ligne suivante :
debugfs /sys/kernel/debug debugfs defaults 0 0
Une fois debugfs monté,
vous disposez de cette arborescence :
# ls debug/* debug/gpio debug/sched_features debug/suspend_stats debug/ wakeup_sources debug/acpi: debug/bdi: 11:0 254:0 254:1 254:2 254:3 7:0 7:1 7:2 7:3 7:4 7:5 7:6 7:7 8:0 default debug/bluetooth: l2cap rfcomm rfcomm_dlc sco debug/dri: 0 debug/extfrag: extfrag_index unusable_index debug/hid: 0003:80EE:0021.0001 debug/kprobes: enabled list debug/mce: fake_panic severities-coverage debug/regmap: debug/regulator: dummy supply_map debug/tracing: available_events buffer_total_size_kb free_buffer printk_formats set_event trace_marker tracing_cpumask tracing_thresh available_tracers current_tracer options README trace trace_options tracing_enabled buffer_size_kb events per_cpu saved_cmdlines trace_clock trace_pipe tracing_on debug/usb: devices debug/x86: pat_memtype_list
Ainsi, vous avez deux options :
-
Inclure dans votre code source (écrit en langage C) les API de debugfs. Dans ce cas, il est nécessaire d’inclure le fichier en-tête debugfs.h qui se situe dans le dossier /usr/src/linux-headers-$(uname -r)-common/include/linux.
-
Utiliser l’outil ftrace. Assurez-vous que les options de configuration Debugfs, FUNCTION_TRACER, FUNCTION_GRAPH_TRACER, DYNAMIC_FTRACE et STACK_TRACER sont activées lors de la compilation du noyau Linux.
j. /sys/module
Ce dossier contient tous les modules du noyau
(Loadable Kernel Modules) du système d’exploitation :
# ls /sys/module 8250 crc_t10dif libahci ppdev snd_timer ac dm_mod libata printk soundcore ac97_bus dns_resolver lockd processor spurious acpi drm loop psmouse sr_mod acpiphp e1000 lp pstore sunrpc ahci ehci_hcd mbcache rcutree tcp_cubic apparmor evdev mousedev rfcomm thermal_sys ata_generic ext4 netpoll rfkill uinput ata_piix fscache nfs scsi_mod usb_common auth_rpcgss hid nfs_acl sd_mod sbcore battery i2c_core nfsd serio_raw usbhid binfmt_misc i2c_piix4 ohci_hcd sg vboxguest block i8042 parport snd vboxvideo bluetooth intel_idle parport_pc snd_ac97_codec vt bnep ipv6 pcie_aspm snd_intel8x0 xz_dec button jbd2 pciehp snd_page_alloc cdrom joydev pci_hotplug snd_pcm cpuidle kernel pcspkr snd_seq crc16 keyboard power_supply snd_seq_device
k. /sys/power
Le dossier /sys/power contient
tous les fichiers qui fournissent une interface unifiée
pour le sous-système gestionnaire de l’alimentation (power management) :
# ls /sys/power disk image_size pm_async pm_test reserved_size resume state wakeup_count/sys/power/state
Ce fichier contrôle l’état
du niveau d’économie d’énergie utilisée
par l’ordinateur. Les valeurs possibles sont :
-
standby (Power-On Suspend). Il correspond à la mise en veille de l’ordinateur.
-
mem (Suspend-to-RAM). Il permet une suspension du système en mémoire.
-
disk (Suspend-to-Disk). Il permet d’éteindre complètement l’ordinateur (c’est-à-dire de faire une mise en veille prolongée) après avoir stocké son état dans la partition d’échange (swap). Il est recommandé pour cela que cette partition soit au moins égale à la RAM.
Ce fichier contient les informations pour
le mécanisme de la mise en veille prolongée.
/sys/power/image_size
Ce fichier gère la taille de l’image
créée lors de la mise en veille prolongée.
3. Utilitaire systool
La commande systool affiche
les informations des périphériques du système
par bus, par classe et par topologie. Cet outil doit être
installé par le biais du paquet sysfsutils.
a. Installation
Debian 7 et Ubuntu 12.04
L’installation s’effectue de cette manière :
# apt-get -y install sysfsutils Lecture des listes de paquets... Fait Construction de l’arbre des dépendances Lecture des informations d’état... Fait Les paquets supplémentaires suivants seront installés : libsysfs2 Les NOUVEAUX paquets suivants seront installés : libsysfs2 sysfsutils 0 mis à jour, 2 nouvellement installés, 0 à enlever et 9 non mis à jour. Il est nécessaire de prendre 59,8 ko dans les archives. Après cette opération, 186 ko d’espace disque supplémentaires seront utilisés. Réception de : 1 http://debian.proxad.net/debian/ wheezy/main libsysfs2 amd64 2.1.0+repack-2 [32,3 kB] Réception de : 2 http://debian.proxad.net/debian/ wheezy/main sysfsutils amd64 2.1.0+repack-2 [27,5 kB] 59,8 ko réceptionnés en 0s (164 ko/s) Sélection du paquet libsysfs2:amd64 précédemment désélectionné. (Lecture de la base de données... 175985 fichiers et répertoires déjà installés.) Dépaquetage de libsysfs2:amd64 (à partir de .../libsysfs2_2.1.0+repack-2_amd64.deb) ... Sélection du paquet sysfsutils précédemment désélectionné. Dépaquetage de sysfsutils (à partir de .../sysfsutils_2.1.0+repack-2_amd64.deb) ... Traitement des actions différées (« triggers ») pour « man-db »... Paramétrage de libsysfs2:amd64 (2.1.0+repack-2) ... Paramétrage de sysfsutils (2.1.0+repack-2) ... [ ok ] Setting sysfs variables....CentOS 6
L’installation de systool se
réalise ainsi :
# yum -y install sysfsutils Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile * base: ftp.ciril.fr * extras: mirror.in2p3.fr * updates: ftp.ciril.fr Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package sysfsutils.x86_64 0:2.1.0-7.el6 will be installed --> Processing Dependency: libsysfs.so.2()(64bit) for package: sysfsutils-2.1.0-7.el6.x86_64 --> Running transaction check ---> Package libsysfs.x86_64 0:2.1.0-7.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================== Package Arch Version Repository Size ================================================================== Installing: sysfsutils x86_64 2.1.0-7.el6 base 38 k Installing for dependencies: libsysfs x86_64 2.1.0-7.el6 base 44 k Transaction Summary ================================================================== Install 2 Package(s) Total download size: 82 k Installed size: 256 k Downloading Packages: (1/2): libsysfs-2.1.0-7.el6.x86_64.rpm | 44 kB 00:00 (2/2): sysfsutils-2.1.0-7.el6.x86_64.rpm | 38 kB 00:00 ------------------------------------------------------------------ Total 231 kB/s | 82 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : libsysfs-2.1.0-7.el6.x86_64 1/2 Installing : sysfsutils-2.1.0-7.el6.x86_64 2/2 Verifying : sysfsutils-2.1.0-7.el6.x86_64 1/2 Verifying : libsysfs-2.1.0-7.el6.x86_64 2/2 Installed: sysfsutils.x86_64 0:2.1.0-7.el6 Dependency Installed: libsysfs.x86_64 0:2.1.0-7.el6 Complete!
b. Utilisation de systool
L’exécution de systool sans
argument affiche tous les bus, les classes et les périphériques
racines qui sont disponibles :
# systool Supported sysfs buses: ac97 acpi cpu ... vtconsole ... usb_common usbcore usbhid vboxguest vboxvideo vt xz_decSyntaxe
systool <option>
Les options sont :
Option courte
|
Description
|
-a
|
Montre les attributs de la ressource
demandée.
|
-b
|
Affiche les informations pour un bus
précis.
|
-c
|
Affiche les informations pour une classe
de périphériques précise.
|
-d
|
Montre uniquement les périphériques.
|
-h
|
Affiche l’aide de la commande.
|
-m
|
Affiche les informations pour un module
précis.
|
-p
|
Affiche le chemin absolu d’une ressource
dans sysfs.
|
-v
|
Montre tous les attributs avec leurs
valeurs.
|
-A
|
Affiche les attributs pour la ressource
demandée.
|
-D
|
Montre uniquement les pilotes de périphériques.
|
-P
|
Affiche le périphérique
parent.
|
# systool -b scsi Bus = "scsi" Device = "0:0:0:0" Device = "2:0:0:0" Device = "host0" Device = "host1" Device = "host2" Device = "target0:0:0" Device = "target2:0:0"Afficher le bus et le chemin absolu dans sysfs
# systool -b scsi -p Bus = "scsi" Device = "0:0:0:0" Device path = "/sys/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0" Device = "2:0:0:0" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host2/target2:0:0/2:0:0:0" Device = "host0" Device path = "/sys/devices/pci0000:00/0000:00:0d.0/host0" Device = "host1" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host1" Device = "host2" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host2" Device = "target0:0:0" Device path = "/sys/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0" Device = "target2:0:0" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host2/target2:0:0"Afficher le bus SCSI et montrer les attributs avec leurs valeurs
# systool -b scsi -v Bus = "scsi" Device = "0:0:0:0" Device path = "/sys/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0" delete = <store method only> device_blocked = "0" evt_media_change = "0" iocounterbits = "32" iodone_cnt = "0xf65e" ioerr_cnt = "0x3" iorequest_cnt = "0xf67e" modalias = "scsi:t-0x00" model = "VBOX HARDDISK " queue_depth = "31" queue_ramp_up_period= "120000" queue_type = "simple" rescan = <store method only> rev = "1.0 " scsi_level = "6" state = "running" timeout = "30" type = "0" uevent = "DEVTYPE=scsi_device DRIVER=sd MODALIAS=scsi:t-0x00" vendor = "ATA " Device = "2:0:0:0" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host2/target2:0:0/2:0:0:0" delete = <store method only> device_blocked = "0" evt_media_change = "0" iocounterbits = "32" iodone_cnt = "0x17" ioerr_cnt = "0x2" iorequest_cnt = "0x27" modalias = "scsi:t-0x05" model = "CD-ROM " queue_depth = "1" queue_type = "none" rescan = <store method only> rev = "1.0 " scsi_level = "6" state = "running" timeout = "30" type = "5" uevent = "DEVTYPE=scsi_device DRIVER=sr MODALIAS=scsi:t-0x05" vendor = "VBOX " Device = "host0" Device path = "/sys/devices/pci0000:00/0000:00:0d.0/host0" uevent = "DEVTYPE=scsi_host" Device = "host1" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host1" uevent = "DEVTYPE=scsi_host" Device = "host2" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host2" uevent = "DEVTYPE=scsi_host" Device = "target0:0:0" Device path = "/sys/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0" uevent = "DEVTYPE=scsi_target" Device = "target2:0:0" Device path = "/sys/devices/pci0000:00/0000:00:01.1/host2/target2:0:0" uevent = "DEVTYPE=scsi_target"
4. Modification des paramètres du noyau
Si vous envisagez de modifier un fichier dans /sys, vous ne disposez pas
d’un outil identique à sysctl.
Cependant, vous pouvez utiliser la commande echo pour
une modification volatile. Si vous souhaitez conserver les paramètres
de façon persistante alors écrivez les directives
dans /etc/rc.local.
ExempleLe « kernel polling » est une alternative au traitement d’interruptions de base. Le noyau vérifie périodiquement un périphérique sans être interrompu.
Il n’est pas toujours activé dans certaines distributions. Pour consulter le paramètre global, tapez :
# cat /sys/module/block/parameters/events_dfl_poll_msecs -1ou pour consulter le paramètre du lecteur CDROM :
# cat /sys/block/sr0/events_poll_msecs -1Si vous avez la valeur 0 ou -1 alors la fonctionnalité est désactivée. La valeur (en millisecondes) raisonnable doit être comprise entre 2000 et 5000. Des interrogations trop fréquentes gaspilleraient les ressources du CPU.
Le fait que le « kernel polling » sur le lecteur CDROM (/dev/sr0) soit désactivé peut provoquer la non-détection du média et la désactivation du bouton d’éjection.
Mettez la valeur 2000 au fichier /sys/block/sr0/events_poll_msecs :
# echo 2000 > /sys/block/sr0/events_poll_msecsPour conserver ce paramètre définitivement, ajoutez avec un éditeur de texte la ligne ci-dessus dans le fichier /etc/rc.local avant exit 0 :
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. echo 2000 > /sys/block/sr0/events_poll_msecs exit 0
Aucun commentaire :
Enregistrer un commentaire