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.
/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.
/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.
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!