Arquivos úteis no /proc e /sys

Dentre as muitas coisas que me fascinam no Linux está a facilidade com que podemos lidar com informações de sistema. Os diretórios virtuais /proc e seu irmão mais novo, o /sys, são “locais quase sagrados” onde podemos obter todas as informações sobre o comportamento do seu computador e periféricos.

Nestes diretórios existem centenas ou talvez milhares de arquivos que podem ser usados para todos os fins. Por exemplo os que seguem abaixo são apenas umas gotinhas do oceano de informações possíveis de se obter e que uso/usei nos meus últimos scripts para gerenciamento/monitoramento dos meus servidores e até do laptop e desktop.

Informações de rede

Existem vários arquivos que podem nos fornecer informações sobre o estado das nossas interfaces de rede. Lembrando que, como se tratam de arquivos você os usará como tal em suas aplicações, ou seja, quando estiver desenvolvendo sua aplicação que os utilize – seja qual for a linguagem escolhida – abra com o respectivo comando open, leia com read e feche-o com close, só lembre que você nunca deverá abrir estes arquivos para gravação – o que algumas vezes é possível para o root – ou você corre risco de danificar seu sistema e também lembre-se que certos arquivos são restritos ao acesso do administrador apenas.

/proc/net/arp

Començando pelo básico, neste arquivo temos a tabela arp contendo os IPs e MACs das máquinas que estão em comunicação com esta máquina.

Veja no exemplo abaixo como é a formatação deste arquivo:

wbraga@welington64bits:~$ cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
192.168.254.252  0x1         0x2         00:13:46:E9:30:AE     *        eth0
192.168.254.253  0x1         0x2         00:1B:11:F6:82:14     *        eth0
wbraga@welington64bits:~$

Não me pergunte o significado das colunas HW Type e Flags, pois eu nunca as usei, mas como isso é a própria saída do comando arp, talvez a página de manual daquele comando seja um bom começo de procura para quem interessar.

Só para dar um exemplo de uso, certa vez fiz um script baseado neste arquivo para monitorar se uma máquina, que funcionava como roteador para internet, estava sendo requisitada. Caso ela estivesse ociosa eu a desligava. Bastava verificar o que havia na tabela arp e se estivesse vazia, shutdown no sistema! Fica como exercício para sua imaginação o procedimento completo para ligar e para desligar a máquina, o que ao contrário do que possa parecer é bem simples.

/proc/net/dev

Eis um arquivo que dá muitas linhas de código a serem programadas. Nele você pode assistir em tempo real, o volume de dados trafegado pelas suas interfaces de rede.

O conteúdo deste arquivo é similar ao mostrado abaixo:

wbraga@welington64bits:~$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:  385678    5651    0    0    0     0          0         0   385678    5651    0    0    0     0       0          0
  eth0:433264146  327756    0    0    0     0          0        76 31221310  247271    0    0    0     0       0          0
wbraga@welington64bits:~$

Veja que temos informações sobre a quantidade de bytes e de pacotes enviados e recebidos por cada uma das nossas interfaces de rede.

Num exemplo prático de uso destas informações você poderia ler este arquivo uma vez por segundo e pegando a quantidade de bytes enviados/recebidos e então subtrair a quantidade lida anteriormente da quantidade lida agora. O resultado disso será a velocidade de sua conexão diretamente “na boca do cano”.

/proc/net/wireless

Neste arquivo, que pode ser considerado um complemento do anterior, encontramos informações sobre a conexão wireless – caso haja alguma interface de rde deste tipo em seu sistema. Particularmente as informações que mais me interessam aqui são a qualidade e o nível do sinal, mas há outras informações úteis também, embora não estejam disponíveis para todos os modelos de interface.

Veja abaixo um exemplo de saída deste arquivo:

wbraga@magali-laptop:~$ cat /proc/net/wireless
Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
 face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
 wlan0: 0000   51.   47.    0        0      0      0      0      0        0
wbraga@magali-laptop:~$

/sys/class/net/

Este diretório não está no /proc e sim no /sys que uma nova especificação e cuja tendencia é tornar o /proc obsoleto muito em breve. Especificamente neste diretório que estou falando temos vários symlinks que correspondem aos subdiretórios para cada uma das nossas interfaces de rede, onde temos todas as informações sobre elas separadas em arquivos. Como mostrado abaixo:

wbraga@magali-laptop:~$ ls /sys/class/net/ -l
total 0
lrwxrwxrwx 1 root root 0 2008-07-19 14:04 eth0 -> ../../devices/pci0000:00/0000:00:12.0/net/eth0
lrwxrwxrwx 1 root root 0 2008-07-19 14:04 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 2008-07-19 14:04 wlan0 -> ../../devices/pci0000:00/0000:00:10.4/usb5/5-7/5-7:1.0/net/wlan0
lrwxrwxrwx 1 root root 0 2008-07-19 14:04 wmaster0 -> ../../devices/pci0000:00/0000:00:10.4/usb5/5-7/5-7:1.0/net/wmaster0
wbraga@magali-laptop:~$

Em uma definição geral este diretório é o /proc/net/dev e o /proc/net/wireless (vistos acima) e algo mais todo separado e organizado em arquivos. A vantagem de usá-lo é que se eu quero saber apenas a quantidade de bytes recebidos, por exemplo, bastaria ler um arquivo – o rx_bytes – o que tornaria mais simples já que não terei que criar filtros para cortar o restante da linha que não me serve.

O conteúdo destes diretórios é o mesmo para todas as interfaces, com exceção do symlink “py80211” e do subdiretório “wireless” que só existem para interfaces wireless (pelo menos não notei diferenças nos meus sistemas) e deve ser algo como segue:

wbraga@magali-laptop:~$ ls -l /sys/class/net/wlan0/
total 0
-r--r--r-- 1 root root 4096 2008-07-19 14:16 address
-r--r--r-- 1 root root 4096 2008-07-19 14:16 addr_len
-r--r--r-- 1 root root 4096 2008-07-19 14:16 broadcast
-r--r--r-- 1 root root 4096 2008-07-19 14:16 carrier
lrwxrwxrwx 1 root root    0 2008-07-19 14:16 device -> ../../../../../../../../devices/pci0000:00/0000:00:10.4/usb5/5-7/5-7:1.0
-r--r--r-- 1 root root 4096 2008-07-19 14:16 dormant
-r--r--r-- 1 root root 4096 2008-07-19 14:16 features
-rw-r--r-- 1 root root 4096 2008-07-19 14:16 flags
-r--r--r-- 1 root root 4096 2008-07-19 14:16 ifindex
-r--r--r-- 1 root root 4096 2008-07-19 14:16 iflink
-r--r--r-- 1 root root 4096 2008-07-19 14:16 link_mode
-rw-r--r-- 1 root root 4096 2008-07-19 14:16 mtu
-r--r--r-- 1 root root 4096 2008-07-19 14:16 operstate
lrwxrwxrwx 1 root root    0 2008-07-19 14:16 phy80211 -> ../../../../../../../../devices/pci0000:00/0000:00:10.4/usb5/5-7/5-7:1.0/ieee80211/phy0
drwxr-xr-x 2 root root    0 2008-07-19 14:16 power
drwxr-xr-x 2 root root    0 2008-07-19 14:07 statistics
lrwxrwxrwx 1 root root    0 2008-07-19 14:16 subsystem -> ../../../../../../../../class/net
-rw-r--r-- 1 root root 4096 2008-07-19 14:16 tx_queue_len
-r--r--r-- 1 root root 4096 2008-07-19 14:16 type
-rw-r--r-- 1 root root 4096 2008-07-19 14:16 uevent
drwxr-xr-x 2 root root    0 2008-07-19 14:16 wireless
wbraga@magali-laptop:~$

Para não me alongar muito, o conteúdo deste diretório e as informações mais relevantes aqui estão nos arquivos:

  • address – Endereço MAC desta interface
  • operstate – Indica se a interface está ativa ou não
    • up = ativa,
    • down = desativada,
    • unknown = só Deus é quem sabe 😉

No subdiretório statistics temos arquivos com cada informação que vimos em /proc/dev/net e creio que as estatísticas mais preciosas são as que estão em:

  • statistics/rx_bytes
  • statistics/tx_bytes
  • statistics/rx_packets
  • statistics/tx_packets

O subdiretório wireless – se presente – fornece as mesmas informações que vimos no arquivo /proc/net/wireless e como já disse as informações mais interessantes e genéricas aqui são a qualidade e o nível do sinal que estão respectivamente nos arquivos “link” e “level” deste diretório.

  • wireless/link – Qualidade do sinal
  • wireless/level – Nível do sinal

Informações sobre disco

Saber mais sobre os discos pode ser interessante caso você queira saber quais são os seus gravadores de DVD, ou a marca dos discos rígidos que veio naquele computador “xingue-lingue” que sua tia importou da China via Paraguai.

/proc/scsi/sg/device_strs

Neste primeiro arquivo podemos ver o tipo do disco (para HD geralmene é ATA, ou outro para outro tipo de disco), o modelo dos seus discos, e o número da versão do firmware de cada um; como na saída a seguir:

wbraga@welington64bits:~$ cat /proc/scsi/sg/device_strs
ATA         Maxtor 6Y120L0      YAR4
ATA         SAMSUNG SP1203N     TL10
ATA         ST98823AS           3.04
Optiarc     CD-RW CRX880A       KX07
HL-DT-ST    RW/DVD GCC-4480B    1.02
HL-DT-ST    DVDRAM GSA-H42N     RL00
wbraga@welington64bits:~$

/proc/scsi/scsi

Este arquivo fornece mais informações além do que vimos no arquivo anterior, tal como suas marcas e modelos, canal scsi, tipo (ATA/CD-ROM) etc. Uma saída deste arquivo tem a seguinte aparência:

wbraga@welington64bits:~$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: Maxtor 6Y120L0   Rev: YAR4
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi0 Channel: 00 Id: 01 Lun: 00
  Vendor: ATA      Model: SAMSUNG SP1203N  Rev: TL10
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: ST98823AS        Rev: 3.04
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: Optiarc  Model: CD-RW CRX880A    Rev: KX07
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: HL-DT-ST Model: RW/DVD GCC-4480B Rev: 1.02
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi1 Channel: 00 Id: 01 Lun: 00
  Vendor: HL-DT-ST Model: DVDRAM GSA-H42N  Rev: RL00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
wbraga@welington64bits:~$

Informações sobre o seu processador

De forma curta grossa e direta, veja uma lista:

/proc/cpuinfo

Este é o arquivo mais famoso e conhecido por quase todos, onde temos informações gerais sobre o processador do nosso sistema. Uma saída desse arquivo mostra algo como:

wbraga@welington64bits:~$ cat /proc/cpuinfo
processor    : 0
vendor_id    : AuthenticAMD
cpu family    : 15
model        : 44
model name    : AMD Athlon(tm) 64 Processor 3000+
stepping    : 2
cpu MHz        : 1999.430
cache size    : 512 KB
fpu        : yes
fpu_exception    : yes
cpuid level    : 1
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow up rep_good pni lahf_lm
bogomips    : 4000.93
TLB size    : 1024 4K pages
clflush size    : 64
cache_alignment    : 64
address sizes    : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc
wbraga@welington64bits:~$

Neste caso minha máquina pobre só possui um núcleo se tivesse dois ou mais veríamos todos eles aqui.

Informações sobre a memória

A memória do seu computador pode ser completamente lida a partir do arquivo /proc/kcore, mas este não é um processo muito trivial, pois só o fato de ler a memória já irá alterar o seu conteúdo entretanto tal procedimento pode ser usado para fazer análises que em outros sistemas poderia ser um procedimento tenebroso.

/proc/meminfo

Saber a quantidade de de memória total e quando você tem disponível é primordial, principalmente para quem tem apenas uma vaga lembrança no lugar da memória.

O arquivo meminfo fornee bastante informações sobre isso como mostro abaixo:

wbraga@welington64bits:~$ cat /proc/meminfo
MemTotal:      1932976 kB
MemFree:         44776 kB
Buffers:        203392 kB
Cached:         801200 kB
SwapCached:         56 kB
Active:        1052772 kB
Inactive:       587116 kB
SwapTotal:      979956 kB
SwapFree:       979900 kB
Dirty:              40 kB
Writeback:           0 kB
AnonPages:      635304 kB
Mapped:         145108 kB
Slab:           203120 kB
SReclaimable:   175980 kB
SUnreclaim:      27140 kB
PageTables:      17736 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1946444 kB
Committed_AS:  1111336 kB
VmallocTotal: 34359738367 kB
VmallocUsed:     15036 kB
VmallocChunk: 34359723331 kB
wbraga@welington64bits:~$

Veja que temos os totais para a memória real e para o swap o que pode ajudar quem quer monitorar o uso de memória do sistema.

Em um sistema crítico onde não havia mais como aumentar a memória do hardware e o uso do swap não era desejado eu fiz um script que emitia bips sempre que o swap atingia certo valor, então ia lá o coitado do sysadmin ver porque a memória tinha se esgotado e matar alguns processos, coisa que depois foi substituído por um script mais elaborado que já matava o processo guloso. Hoje em dia o sistema todo já roda em um novo hardware e não preciso mais dessa gambiarra, mas valeu a experiência.

/proc/swaps

Sem respirar e sem piscar, responda rápido: Qual(is) é(são) a(s) patição(ões)/arquivo(s) de swap que estão ativos no seu sistema?

wbraga@welington64bits:~$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/dev/sda2               partition    979956    56    -1
wbraga@welington64bits:~$

Outros recursos do sistema

Nem só de rede, disco, processador e memória é feito um computador. Então podemos encontrar mais informações além daquelas, como por exemplo as que seguem.

/proc/cmdline

Possui a linha de comando passada para o kernel no instante do boot, por exemplo quando você precisa do temível “init=single” para recuperar seu sistema este parâmetro aparecerá aqui.

Uma saída desse arquivo seria como:

wbraga@welington64bits:~$ cat /proc/cmdline
root=UUID=0ab32b7d-c497-4b3c-bffc-dc9c2231ecc4 ro quiet splash locale=pt_BR
wbraga@welington64bits:~$

Isto pode ser interessante caso você tenha um hardware não usual, ou mesmo criar perfis, onde você teria duas entradas para o mesmo kernel no menu do grub/lilo, mas em uma delas você inventaria uma parâmetro como “meumodemesquisito=sim”, daí bastaria colocar um script no seu /etc/rc.local que verificaria se este parâmetro foi passado e neste caso ativar o módulo para o seu modem esquisito.

/proc/modules

Você precisa saber se dado módulo para aquela sua placa wireless, ou set de mouse/teclado sem fio estão carregados!? Eis o cara que pode te dizer isso. Não vou listar todo o meu arquivo pois ele é bem grande, mas segue um pedaço para degustação:

wbraga@welington64bits:~$ cat /proc/modules
usblp 17664 0 - Live 0xffffffff8861f000
af_packet 27272 2 - Live 0xffffffff88617000
rfcomm 47392 2 - Live 0xffffffff8860a000
l2cap 28800 13 rfcomm, Live 0xffffffff88601000
bluetooth 67748 4 rfcomm,l2cap, Live 0xffffffff885ef000
ppp_deflate 7808 0 - Live 0xffffffff885ec000
zlib_deflate 23192 1 ppp_deflate, Live 0xffffffff885e5000
bsd_comp 7424 0 - Live 0xffffffff885e2000
vboxdrv 1649152 0 - Live 0xffffffff8844e000
ppdev 11400 0 - Live 0xffffffff8844a000
ppp_async 14592 0 - Live 0xffffffff88445000
wbraga@welington64bits:~$

Um grep no meio desta salada retornaria o módulo que você deseja saber se foi ou não carregado.

Finalizando

É claro que existe muito mais do que isso e as melhores formas de descobrir o que cada aquivo destes fazem sem dúvida alguma é ler o código fonte do kernel, ou então garimpar estes diretórios e ler os arquivos um a um.

Se você conhece algum arquivo destes que seja interessante entrar na lista, deixe um comentário. com certeza ele poderá ser útil para mais alguém.

2 comentários em “Arquivos úteis no /proc e /sys”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.