12 février 2014

sysfs

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.
Exemple
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" 
done
Enregistrez le fichier et quittez l’éditeur de texte.
Assignez le droit d’exécution au fichier memmap.sh :
# chmod +x memmap.sh
Exé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.
/sys/power/disk
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_dec
Syntaxe
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.
Afficher le bus SCSI
# 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.
Exemple
Le « 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 
-1
ou pour consulter le paramètre du lecteur CDROM :
# cat /sys/block/sr0/events_poll_msecs 
-1
Si 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_msecs
Pour 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