paint-brush
20.000 leguas bajo tu caparazónpor@tylerjl
1,651 lecturas
1,651 lecturas

20.000 leguas bajo tu caparazón

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

Demasiado Largo; Para Leer

Hoy, te emparejarás conmigo en la terminal. Estamos explorando las profundidades del sistema de archivos Linux y las herramientas y trucos de shell.

Coin Mentioned

Mention Thumbnail
featured image - 20.000 leguas bajo tu caparazón
Tyler HackerNoon profile picture

Con el tiempo, la mayoría de los aficionados a Linux acumulan un brillante cofre de guerra lleno de trucos ganados con esfuerzo que pueden ser tremendamente útiles cuando una situación exige un pensamiento rápido en su terminal. Guardé muchos de estos conocimientos a lo largo de los años y cada vez que tuve la oportunidad de mirar por encima del hombro de alguien excepcionalmente versado en Linux.


Hoy, te emparejarás conmigo en la terminal. Estamos explorando las profundidades del sistema de archivos Linux y las herramientas y trucos de shell.

Toma un /proc conmigo

Uno de los directorios más útiles en un sistema Linux es /proc . Desde la página man para proc :


El sistema de archivos proc es un pseudo-sistema de archivos que proporciona una interfaz para las estructuras de datos del núcleo.


Cuando la página de man dice "pseudo-filesystem", significa que si mirara debajo de su disco donde esperaría encontrar bits que representan un archivo como lo haría con un archivo de texto en /tmp/launch-codes.txt , hay nada en /proc . Está presente y vivo en un sistema Linux en ejecución, pero completamente ausente si tuviera que sacar el disco e inspeccionarlo. /proc ¡un panel de control para su kernel en ejecución!


Si echara un vistazo a su propio /proc ahora mismo, podría encontrar muchos directorios como el siguiente:


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


Cada uno de esos números representa un ID de proceso o PID ; sí, el mismo PID que identifica el proceso para su navegador o programa de terminal. De hecho, puede consultar mucha información sobre el proceso en sí. Por ejemplo, puede recordar que el proceso 1 en un sistema Linux es tradicionalmente el proceso de init de nivel superior, que en la mayoría de los sistemas modernos está basado en systemd. Veamos el comando que inició PID 1 en mi sistema:


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


cmdline es un archivo que nos dice el comando que inició el proceso 1 , en este caso, systemd mismo.


Hay un archivo cmdline en /proc que es particularmente útil: /proc/cmdline , que en realidad le muestra los argumentos pasados a su kernel en el momento del arranque. El mío es muy prolijo, pero me dice el initrd con el que arrancó mi sistema, junto con cualquier otro indicador, que en mi caso es init y 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


Mi nombre de host NixOS es diesel . Tenga en cuenta que no pongo petróleo en mi computadora portátil.


/proc tampoco es solo de solo lectura. Como dice su página de manual, /proc es una interfaz para el kernel, que incluye la interacción con el propio kernel. El /proc/sys contiene una variedad de perillas y diales, pero quiero mostrarles /proc/sys/vm , que nos permite echar un vistazo a la memoria virtual del kernel. ¿Quieres ser más aventurero?


Considere el uso de memoria actual de mi máquina.


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


Nada demasiado inusual aquí, pero ¿y si quisiera liberar mi memoria agresivamente? La mayoría de las veces, el kernel sabe mejor cuando se trata de usar la memoria para el almacenamiento en caché, pero hay algunas situaciones en las que es posible que desee borrar cualquier memoria que sea segura de borrar; no queremos interrumpir ningún proceso en ejecución, solo recuperar la memoria si es posible.


Resulta que hay un archivo para eso. Canalizamos un comando de echo en sudo tee porque /proc/sys/vm generalmente está protegido contra escritura y solo root puede escribir en el archivo que nos interesa.


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


Lo que hace este comando es una señal efectiva al núcleo, "por favor, descarte cualquier caché en la memoria que pueda permitirse perder sin interrumpir ningún proceso en ejecución en mi sistema". En mi máquina, esto abre alrededor de 500M de memoria:


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


¡Enfriar! Hay todo tipo de objetos útiles similares a archivos en /proc que pueden hacer cosas interesantes como esta. Siéntase libre de abrir man proc si desea obtener más información.

/dev como un curl prehistórico

Un dispositivo de caracteres como /dev/sda representa un disco adjunto, pero hay otro uso para la ruta /dev : una forma poco conocida de enviar solicitudes de red.


La ruta /dev/tcp no es en realidad un dispositivo similar a un archivo expuesto por el kernel de Linux, sino una característica de su shell elegido como bash . Los shells pueden interceptar operaciones en esta ruta para abrir conexiones de socket de bajo nivel a puntos finales remotos como servidores web que escuchan en el puerto 80 .


Para comenzar, abra un nuevo descriptor de archivo conectado a una ruta de archivo en /dev/tcp que indique el punto final y el puerto deseados. Al igual que los números de descriptor de archivo 0, 1 y 2 representan stdin , stdout y stderr , respectivamente, puede pensar que este nuevo descriptor de archivo 3 representa una tubería a un extremo de red remoto. Asumiremos el uso de bash de aquí en adelante.


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


A continuación, envíe el formulario de texto sin formato de una solicitud HTTP simple al descriptor de archivo abierto. Esta solicitud GET a /status/200 también requiere que se configure el encabezado del Host para que la mayoría de los proxies inversos la manejen correctamente. Dos saltos de línea señalan la finalización de la solicitud:


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


Finalmente, una simple operación de lectura recupera la respuesta HTTP:


 cat <&3


Debería ver una respuesta similar a la siguiente:


 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


¡Felicidades! Acaba de enviar una solicitud HTTP usando nada más que su shell.

Nadar en /sys

Hay un directorio de nivel raíz más para explorar después de sumergirse en /proc y /dev : el enigmático directorio /sys .


Al igual que /proc y /dev , /sys es otra interfaz similar a un archivo para mecanismos de bajo nivel que se encuentran muy cerca del sistema operativo. A diferencia de /proc , que está relativamente centrado en el proceso, y /dev , que modela dispositivos de bloques y más, /sys es una interfaz útil para muchas abstracciones que modela el kernel.


Por ejemplo, tome el directorio /sys/class/net . Dentro de este directorio, encontrará una lista de enlaces que representan las interfaces de red en su host. Así es como se ve el mío:


 ls /sys/class/net
 enp0s20f0u6u4u1 lo tailscale0 wlan0


Como puede ver, las conexiones de red activas que administra mi sistema incluyen una interfaz cableada (la interfaz que comienza con en ), la interfaz lo loopback, una interfaz Tailscale y mi interfaz inalámbrica wlan0 . Listar el contenido de uno de estos directorios revela una larga lista de archivos, pero veamos más de cerca dos archivos en particular para mi interfaz de red cableada:


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


Cada uno de estos archivos representa el número de bytes recibidos y bytes transmitidos, respectivamente. Mira cómo cambian los números si uso el mismo comando unos segundos después:


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


¡Números más grandes! Aparentemente estoy aprovechando al máximo mi ancho de banda. ¿Cómo es esto útil?

¿Alguna vez te has preguntado cómo se escriben los widgets de uso de la red? Bueno, ¿qué tal hacer el tuyo propio?


Consulte este pequeño script bash que utiliza los archivos mencionados anteriormente en el directorio de statistics para derivar una tasa de actividad de la red.


 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


Puede colocar este script en algún lugar de su $PATH , hacerlo ejecutable con chmod +x <script> y probarlo con script.sh <interface name> . Así es como se ve la salida en mi máquina:


 13KiB/s ⬆ 379KiB/s ⬇


¡Eso es muy bonito! Puede imaginar algunos usos para esto: por ejemplo, como un widget para una herramienta que puede representar la salida del comando o como una forma rápida de ver la actividad de la red para una interfaz de red en particular. En cualquier caso, la interfaz basada en archivos para estos datos hace que acceder a ellos y usarlos sea excepcionalmente fácil.

Exploración adicional

Esta fue solo una pequeña inmersión en los tipos de información disponibles para usted a medida que profundiza en las capacidades de un sistema Linux moderno. Puede buscar guías adicionales como esta o ir directamente a la fuente leyendo las páginas de man para entradas como man hier para leer la función y el propósito de varios directorios en / .


¡Diviértete explorando!