paint-brush
20 000 lieues sous votre coquillepar@tylerjl
1,653 lectures
1,653 lectures

20 000 lieues sous votre coquille

par Tyler2022/06/13
Read on Terminal Reader
Read this story w/o Javascript

Trop long; Pour lire

Aujourd'hui, tu fais équipe avec moi au terminal. Nous explorons les profondeurs du système de fichiers Linux et des outils et astuces du shell.

Coin Mentioned

Mention Thumbnail
featured image - 20 000 lieues sous votre coquille
Tyler HackerNoon profile picture

Au fil du temps, la plupart des aficionados de Linux accumulent un trésor de guerre étincelant rempli d'astuces durement gagnées qui peuvent s'avérer extrêmement utiles lorsqu'une situation exige une réflexion rapide sur votre terminal. J'ai caché bon nombre de ces connaissances au fil des ans et chaque fois que j'ai eu l'occasion de surveiller quelqu'un d'exceptionnellement familiarisé avec Linux.


Aujourd'hui, tu fais équipe avec moi au terminal. Nous explorons les profondeurs du système de fichiers Linux et des outils et astuces du shell.

Prends un /proc avec moi

L'un des répertoires les plus utiles dans un système Linux est /proc . Depuis la page de man de proc :


Le système de fichiers proc est un pseudo-système de fichiers qui fournit une interface aux structures de données du noyau.


Lorsque la page de man indique "pseudo-filesystem", cela signifie que si vous deviez jeter un coup d'œil sous votre disque où vous pourriez vous attendre à trouver des bits représentant un fichier comme vous le feriez pour un fichier texte à /tmp/launch-codes.txt , il y a rien à /proc . Il est présent et vivant sur un système Linux en cours d'exécution, mais totalement absent si vous deviez retirer le disque et l'inspecter. /proc un panneau de contrôle pour votre noyau en cours d'exécution !


Si vous deviez jeter un coup d'œil dans votre propre /proc dès maintenant, vous pourriez trouver beaucoup de répertoires comme celui-ci :


 ls /proc
 1 10 10021 10059 10144 ...hundreds more files...


Chacun de ces nombres représente un ID de processus, ou PID - oui, le même PID qui identifie le processus pour votre navigateur ou votre programme de terminal. En fait, vous pouvez interroger de nombreuses informations sur le processus lui-même. Par exemple, vous vous souviendrez peut-être que le processus 1 sur un système Linux est traditionnellement le processus init de niveau supérieur, qui dans la plupart des systèmes modernes est basé sur systemd. Voyons la commande qui a lancé le PID 1 sur mon système :


 cat /proc/1/cmdline
 /run/current-system/systemd/lib/systemd/systemd


cmdline est un fichier qui nous indique la commande qui a lancé le processus 1 - dans ce cas, systemd lui-même.


Il y a un fichier cmdline dans /proc qui est particulièrement utile - /proc/cmdline , qui vous montre en fait les arguments passés à votre noyau lui-même au démarrage. Le mien est très verbeux, mais me dit l' initrd avec lequel mon système a démarré, ainsi que tous les autres drapeaux, qui dans mon cas sont init et loglevel :


 cat /proc/cmdline
 initrd=\efi\nixos\hx5g5rmvq748m64r32yjmpjk3pmgqmr1-initrd-linux-5.17.11-initrd.efi init=/nix/store/9zvklk45yx41pak2hdxsxmmnq12n712k-nixos-system-diesel-22.05.20220604.d9794b0/init loglevel=4


Mon nom d'hôte NixOS est diesel . Veuillez noter que je ne mets pas de pétrole dans mon ordinateur portable.


/proc n'est pas seulement en lecture seule non plus. Comme le dit sa page de manuel, /proc est une interface avec le noyau, qui inclut l'interaction avec le noyau lui-même. Le /proc/sys contient une variété de boutons et de cadrans, mais je veux vous montrer /proc/sys/vm , qui nous permet de jeter un coup d'œil à la mémoire virtuelle du noyau. Vous voulez devenir plus aventureux?


Considérez l'utilisation actuelle de la mémoire de ma machine.


 free -h
 total used free shared buff/cache available Mem: 31Gi 22Gi 3.0Gi 4.4Gi 5.6Gi 3.6Gi Swap: 31Gi 130Mi 31Gi


Rien de trop inhabituel ici - mais que se passe-t-il si je veux libérer ma mémoire de manière agressive ? La plupart du temps, le noyau sait mieux quand il s'agit d'utiliser la mémoire pour la mise en cache, mais il y a des situations dans lesquelles vous voudrez peut-être effacer toute mémoire qui peut être effacée en toute sécurité - nous ne voulons pas interrompre les processus en cours, juste récupérer la mémoire si possible.


Il s'avère qu'il existe un fichier pour cela. Nous dirigeons une commande echo vers sudo tee car /proc/sys/vm est généralement protégé en écriture et seul root peut écrire dans le fichier qui nous intéresse.


 echo 1 | sudo tee -a /proc/sys/vm/drop_caches


Cette commande signale effectivement au noyau, "veuillez supprimer tous les caches en mémoire que vous pouvez vous permettre de perdre sans interrompre les processus en cours d'exécution sur mon système". Sur ma machine, cela ouvre environ 500 Mo de mémoire :


 total used free shared buff/cache available Mem: 31Gi 22Gi 3.5Gi 4.4Gi 5.1Gi 3.6Gi Swap: 31Gi 130Mi 31Gi


Cool! Il existe toutes sortes d'objets utiles de type fichier dans /proc qui peuvent faire des choses intéressantes comme celle-ci. N'hésitez pas à ouvrir man proc si vous souhaitez en savoir plus.

/dev comme curl préhistorique

Un périphérique caractère comme /dev/sda représente un disque attaché, mais il y a une autre utilisation pour le chemin /dev : une manière peu connue d'envoyer des requêtes réseau.


Le chemin /dev/tcp n'est pas réellement un périphérique de type fichier exposé par le noyau Linux, mais en fait une fonctionnalité de votre shell choisi comme bash . Les shells peuvent intercepter les opérations sur ce chemin afin d'ouvrir des connexions socket de bas niveau vers des points de terminaison distants tels que des serveurs Web écoutant sur le port 80 .


Pour commencer, ouvrez un nouveau descripteur de fichier connecté à un chemin de fichier dans /dev/tcp qui indique le point de terminaison et le port souhaités. Tout comme la façon dont les numéros de descripteur de fichier 0, 1 et 2 représentent respectivement stdin , stdout et stderr , vous pouvez considérer ce nouveau descripteur de fichier 3 comme représentant un canal vers un point de terminaison de réseau distant. Nous supposerons l'utilisation de bash à partir de maintenant.


 exec 3<>/dev/tcp/httpbin.org/80


Ensuite, envoyez la forme en clair d'une simple requête HTTP au descripteur de fichier ouvert. Cette requête GET à /status/200 nécessite également que l'en-tête Host soit défini afin d'être correctement géré par la plupart des proxys inverses. Deux retours à la ligne signalent la fin de la requête :


 echo -e "GET /status/200 HTTP/1.1\r\nHost: httpbin.org\r\n\r\n" >&3


Enfin, une simple opération de lecture récupère la réponse HTTP :


 cat <&3


Vous devriez voir une réponse similaire à celle ci-dessous :


 HTTP/1.1 200 OK Date: Fri, 10 Jun 2022 21:39:43 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: keep-alive Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true


Toutes nos félicitations! Vous venez d'envoyer une requête HTTP en utilisant uniquement votre shell.

Nager dans /sys

Il y a un autre répertoire de niveau racine à explorer après avoir plongé dans /proc et /dev : l'énigmatique répertoire /sys .


Comme /proc et /dev , /sys est une autre interface de type fichier pour les mécanismes de bas niveau qui se trouvent très près du système d'exploitation. Contrairement à /proc - qui est relativement axé sur les processus - et /dev - qui modélise les périphériques blocs et plus encore - /sys est une interface utile pour de nombreuses abstractions modélisées par le noyau.


Par exemple, prenez le répertoire /sys/class/net . À l'intérieur de ce répertoire, vous trouverez une liste de liens qui représentent les interfaces réseau de votre hôte. Voici à quoi ressemble le mien :


 ls /sys/class/net
 enp0s20f0u6u4u1 lo tailscale0 wlan0


Comme vous pouvez le voir, les connexions réseau actives que mon système gère incluent une interface câblée (l'interface qui commence par en ), l'interface lo loopback, une interface Tailscale et mon interface sans fil wlan0 . Lister le contenu d'un de ces répertoires révèle une longue liste de fichiers, mais regardons de plus près deux fichiers en particulier pour mon interface réseau filaire :


 cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes
 11281235262 274308842


Chacun de ces fichiers représente le nombre d'octets reçus et d'octets transmis, respectivement. Découvrez comment les chiffres changent si j'utilise la même commande quelques secondes plus tard :


 cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes
 11289633209 274760138


Des chiffres plus gros ! Apparemment, je tire le meilleur parti de ma bande passante. Comment est-ce utile?

Vous êtes-vous déjà demandé comment les widgets d'utilisation du réseau sont écrits ? Eh bien, que diriez-vous de fabriquer le vôtre ?


Découvrez ce petit script bash qui utilise les fichiers susmentionnés dans le répertoire des statistics pour dériver un taux d'activité du réseau.


 interval=1 interface=$1 rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) rx_bytes_rate=0 tx_bytes_rate=0 function fmt() { numfmt --to=iec-i --suffix=B $1 } while true do echo -en " $(fmt $tx_bytes_rate)/s ⬆ $(fmt $rx_bytes_rate)/s ⬇\t\r" sleep $interval old_rx_bytes=$rx_bytes old_tx_bytes=$tx_bytes rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) tx_bytes_rate=$(( ($tx_bytes - $old_tx_bytes) / $interval )) rx_bytes_rate=$(( ($rx_bytes - $old_rx_bytes) / $interval )) done


Vous pouvez placer ce script quelque part dans votre $PATH , le rendre exécutable avec chmod +x <script> et l'essayer avec script.sh <interface name> . Voici à quoi ressemble la sortie sur ma machine :


 13KiB/s ⬆ 379KiB/s ⬇


C'est plutôt cool! Vous pouvez imaginer quelques utilisations pour cela : par exemple, en tant que widget pour un outil capable de rendre la sortie d'une commande ou en tant que moyen rapide d'examiner l'activité du réseau pour une interface réseau particulière. Dans les deux cas, l'interface basée sur des fichiers vers ces données rend leur accès et leur utilisation exceptionnellement faciles.

Exploration plus approfondie

Ce n'était qu'une petite plongée dans les types d'informations à votre disposition lorsque vous approfondissez les capacités d'un système Linux moderne. Vous pouvez rechercher des guides supplémentaires comme celui-ci ou aller directement à la source en lisant les pages de man pour des entrées comme man hier afin de lire la fonction et le but de divers répertoires dans / .


Amusez-vous à explorer!