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 avec moi /proc L'un des répertoires les plus utiles dans un système Linux est . Depuis la page de de : /proc man 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 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 à , il y a rien à . 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. un panneau de contrôle pour votre noyau en cours d'exécution ! man /tmp/launch-codes.txt /proc /proc Si vous deviez jeter un coup d'œil dans votre propre dès maintenant, vous pourriez trouver beaucoup de répertoires comme celui-ci : /proc ls /proc 1 10 10021 10059 10144 ...hundreds more files... Chacun de ces nombres représente un ID de processus, ou - oui, le même 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 sur un système Linux est traditionnellement le processus de niveau supérieur, qui dans la plupart des systèmes modernes est basé sur systemd. Voyons la commande qui a lancé le sur mon système : PID PID 1 init PID 1 cat /proc/1/cmdline /run/current-system/systemd/lib/systemd/systemd est un fichier qui nous indique la commande qui a lancé le processus - dans ce cas, lui-même. cmdline 1 systemd Il y a un fichier dans qui est particulièrement utile - , 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' avec lequel mon système a démarré, ainsi que tous les autres drapeaux, qui dans mon cas sont et : cmdline /proc /proc/cmdline initrd init 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 . Veuillez noter que je ne mets pas de pétrole dans mon ordinateur portable. diesel n'est pas seulement en lecture seule non plus. Comme le dit sa page de manuel, est une avec le noyau, qui inclut l'interaction avec le noyau lui-même. Le contient une variété de boutons et de cadrans, mais je veux vous montrer , qui nous permet de jeter un coup d'œil à la mémoire virtuelle du noyau. Vous voulez devenir plus aventureux? /proc /proc interface /proc/sys /proc/sys/vm 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 vers car est généralement protégé en écriture et seul peut écrire dans le fichier qui nous intéresse. echo sudo tee /proc/sys/vm root 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 qui peuvent faire des choses intéressantes comme celle-ci. N'hésitez pas à ouvrir si vous souhaitez en savoir plus. /proc man proc comme préhistorique /dev curl Un périphérique caractère comme représente un disque attaché, mais il y a une autre utilisation pour le chemin : une manière peu connue d'envoyer des requêtes réseau. /dev/sda /dev Le chemin 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 . 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 . /dev/tcp bash 80 Pour commencer, ouvrez un nouveau descripteur de fichier connecté à un chemin de fichier dans 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 , et , 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 à partir de maintenant. /dev/tcp stdin stdout stderr bash 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 à nécessite également que l'en-tête 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 : GET /status/200 Host 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 et : l'énigmatique répertoire . /proc /dev /sys Comme et , 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 à - qui est relativement axé sur les processus - et - qui modélise les périphériques blocs et plus encore - est une interface utile pour de nombreuses abstractions modélisées par le noyau. /proc /dev /sys /proc /dev /sys Par exemple, prenez le répertoire . À 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 : /sys/class/net 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 ), l'interface loopback, une interface et mon interface sans fil . 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 : en lo Tailscale wlan0 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 qui utilise les fichiers susmentionnés dans le répertoire des pour dériver un taux d'activité du réseau. bash statistics 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 , le rendre exécutable avec et l'essayer avec . Voici à quoi ressemble la sortie sur ma machine : $PATH chmod +x <script> script.sh <interface name> 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 pour des entrées comme afin de lire la fonction et le but de divers répertoires dans . man man hier / Amusez-vous à explorer!