virli/tutorial/4/pseudofs.md

253 lines
6.2 KiB
Markdown
Raw Normal View History

2016-10-03 10:27:18 +00:00
\newpage
Pseudos systèmes de fichiers
============================
## Rappels sur les points de montage
Les systèmes Unix définissent le système de fichiers comme étant un arbre
2017-10-22 22:14:32 +00:00
unique partant d'une racine[^FHS] et où l'on peut placer au sein de son arborescence
2016-10-03 10:27:18 +00:00
des points de montage. Ainsi, l'utilisateur définit généralement deux points de
montage :
2017-10-22 22:14:32 +00:00
[^FHS]: Consultez
<https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard> pour
plus de détails sur l'arboresence.
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-10-03 10:27:18 +00:00
```
/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
/dev/sda3 on /home type ext4 (rw,relatime,data=ordered)
2016-10-03 10:27:18 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-03 10:27:18 +00:00
Dans ce schéma, la racine correspond à la première partition du premier disque,
et les fichiers des utilisateurs sont sur la troisième partition du premier
disque.
## Présentation des pseudos systèmes de fichiers
D'autres points de montage sont utilisés par le système : `/dev`, `/proc`,
`/tmp`, ... Ces points de montage vont, la plupart du temps, être montés par le
programme d'initialisation en utilisant des systèmes de fichiers virtuels, mis
à disposition par le noyau.
Ces systèmes sont virtuels, car ils ne correspondent à aucune partition d'aucun
2016-10-06 01:58:52 +00:00
disque : l'arborescence est créée de toute pièce par le noyau pour trier les
2016-10-03 10:27:18 +00:00
informations mises à disposition, mais il n'est pas toujours possible d'y
apporter des modifications.
2016-10-06 01:58:52 +00:00
Linux emploie de nombreux systèmes de fichiers virtuels :
2016-10-03 10:27:18 +00:00
- `/proc` : contient, principalement, la liste des processus (`top` et ses
dérivés se contentent de lire les fichiers de ce point de montage) ;
2017-10-22 22:14:32 +00:00
- `/proc/sys` : contient la configuration du noyau ;
- `/sys` : contient des informations à propos du matériel (utilisées notamment
par `udev` pour peupler `/dev`) et des périphériques (taille des tampons,
clignottement des DELs, ...) ;
2016-10-03 10:27:18 +00:00
- `/sys/firmware/efi/efivars` : pour accéder et modifier les variables de
l'UEFI ;
- ...
2016-10-06 01:58:52 +00:00
Tous ces systèmes de fichiers sont généralement exclusivement stockés en
2016-10-03 10:27:18 +00:00
RAM. Pour rendre une modification persistante, il est nécessaire de modifier un
fichier de configuration qui sera chargé par le programme d'initialisation. Par
exemple, pour modifier les paramètres du noyau, on passe par le fichier
`/etc/sysctl.conf` et du programme `sysctl`.
2017-10-22 22:14:32 +00:00
### Consultation et modification
2016-10-05 20:49:08 +00:00
2017-10-22 22:14:32 +00:00
La consultation d'un élément se fait généralement à l'aide d'un simple `cat` :
2016-10-05 20:49:08 +00:00
<div lang="en-US">
```
42sh$ cat /sys/power/state
freeze mem
2017-10-22 22:14:32 +00:00
```
</div>
2016-10-05 20:49:08 +00:00
2017-10-22 22:14:32 +00:00
La modification d'un élément se fait avec `echo`, comme ceci :
2016-10-05 20:49:08 +00:00
<div lang="en-US">
```bash
42sh# echo mem > /sys/power/state
2016-10-05 20:49:08 +00:00
```
</div>
2016-10-05 20:49:08 +00:00
2017-10-22 22:14:32 +00:00
Vous devriez constater l'effet de cette commande sans plus attendre !
## Exercices
2016-10-05 20:49:08 +00:00
### `procinfo`
2016-10-03 10:27:18 +00:00
Explorons le pseudo système de fichiers `/proc` pour écrire un script qui va
afficher des informations sur un processus donné :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-10-03 10:27:18 +00:00
```
42sh$ ./procinfo $$
PID: 4242
Path: /bin/bash
Command line: bash
Working directory: /home/nemunaire/virli/
Root: /
State: S (sleeping)
Threads: 1
CGroups
=======
12:pids:/
11:net_prio:/
10:perf_event:/
9:net_cls:/
8:freezer:/
7:devices:/
6:memory:/
5:blkio:/
4:cpuacct:/
3:cpu:/
2:cpuset:/
1:name=openrc:/
Namespaces
==========
cgroup:[4026531835]
ipc:[4026531839]
mnt:[4026531840]
net:[4026531969]
pid:[4026531836]
user:[4026531837]
uts:[4026531838]
2018-10-22 14:49:38 +00:00
```
</div>
2019-10-22 16:03:09 +00:00
### `batinfo.sh`, `cpuinfo.sh`
2018-10-22 14:49:38 +00:00
Explorons le pseudo système de fichiers `/sys` pour écrire un script
2018-10-31 08:41:27 +00:00
qui va, en fonction de ce que vous avez de disponible :
2018-10-22 14:49:38 +00:00
2018-10-31 08:41:27 +00:00
* nous afficher des statistiques sur notre batterie ;
* nous afficher des statistiques la fréquence de notre CPU.
2018-10-22 14:49:38 +00:00
2018-10-31 08:41:27 +00:00
#### `batinfo.sh`
Voici un exemple d'utilisation :
<div lang="en-US">
```
42sh$ ./batinfo.sh
BAT0 Discharging
====
Capacity: 83% (Normal)
Voltage: 11.972000 V (minimal: 11.400000 V)
Energy: 18.290000/21.830000 Wh
Power: 7.937000 W
Remaining time: 2.304 h
BAT1 Unknown
====
Capacity: 83% (Normal)
Voltage: 11.972000 V (minimal: 11.400000 V)
Energy: 18.290000/21.830000 Wh
Power: 0.0 W
Remaining time: N/A
2018-10-31 08:41:27 +00:00
```
</div>
2019-11-03 17:54:39 +00:00
Pour les détails sur l'organisation de ce dossier, regardez :
<https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>.
2018-10-31 08:41:27 +00:00
#### `cpuinfo.sh`
Voici un exemple d'utilisation :
<div lang="en-US">
```
42sh$ ./cpuinfo.sh
cpu0
====
Current frequency: 2100384 Hz
Current governor: powersave
Allowed frequencies: between 500000 - 2100000 Hz
Thermal throttle count: 0
cpu1
====
Current frequency: 2099871 Hz
Current governor: powersave
Allowed frequencies: between 500000 - 2100000 Hz
Thermal throttle count: 0
2018-10-31 08:41:27 +00:00
```
</div>
N'hésitez pas à rajouter toute sorte d'information intéressantes !
2019-10-22 16:03:09 +00:00
### `rev_kdb_leds.sh`, `suspend_schedule.sh`
Maintenant que vous savez lire des informations dans `/sys`, tentons d'aller
modifier le comportement de notre système. Au choix, réaliser l'un des scripts
suivant, en fonction du matériel dont vous disposez :
* inverser l'état des diodes de notre clavier ;
* mettre en veille votre machine, en ayant programmé une heure de réveil.
#### `rev_kdb_leds.sh`
Si vous avez :
* numlock On,
* capslock Off,
* scrolllock Off ;
Après avoir exécuté le script, nous devrions avoir :
* numlock Off,
* capslock On,
* scrolllock On.
Voici un exemple d'utilisation :
<div lang="en-US">
```
42sh# ./rev_kdb_leds.sh input20
```
</div>
`input20` correspond à l'identifiant de votre clavier, sous
`/sys/class/input/`.
#### `suspend_schedule.sh`
Votre script prendra en argument l'heure à laquelle votre machine doit être
réveillée, avant de la mettre effectivement en veille.
Bien sûr, vous ne devez utiliser que des écritures (et des lectures) dans le
système de fichiers `/sys`. Il n'est pas question de faire appel à un autre
programme (vous pourriez cependant avoir besoin de `date(1)` pour faire les
calculs horaires).
Voici un exemple d'utilisation :
<div lang="en-US">
```
42sh# ./suspend_schedule.sh 15:42
```
</div>
Vous aurez besoin de définir une alarme au niveau de votre RTC, via le
fichier : `/sys/class/rtc/rtcX/wakealarm`.
Attention au fuseau horaire utilisé par votre RTC, si votre système principal
est Windows, elle utilisera sans doute le fuseau horaire courant. Sinon, ce
sera UTC.
Un article très complet sur le sujet est disponible ici :
<https://www.linux.com/tutorials/wake-linux-rtc-alarm-clock/>