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.
Informações muito boas. bem ao contrário de muito lixo sobre linux que vemos por aí.
Fiz até o bookmark deste site.
Congratulations.
Opa,
Valeu pelo elogio e pela visita.
Abraço.