![O que acontece quando executo o comando cat /proc/cpuinfo?](https://rvso.com/image/52103/O%20que%20acontece%20quando%20executo%20o%20comando%20cat%20%2Fproc%2Fcpuinfo%3F.png)
O que acontece quando escrevo cat /proc/cpuinfo
. É um canal nomeado (ou algo mais) para o sistema operacional que lê as informações da CPU em tempo real e gera esse texto cada vez que eu o chamo?
Responder1
Sempre que você lê um arquivo em /proc
, isso invoca algum código no kernel que calcula o texto para ser lido como o conteúdo do arquivo. O fato de o conteúdo ser gerado dinamicamente explica por que quase todos os arquivos têm seu tempo relatado como agora e seu tamanho relatado como 0 — aqui você deve ler 0 como “não sei”. Ao contrário dos sistemas de arquivos usuais, o sistema de arquivos montado /proc
, chamadoprocf, não carrega dados de um disco ou outra mídia de armazenamento (como FAT, ext2, zfs, …) ou pela rede (como NFS, Samba, …) e não chama o código do usuário (ao contrárioFUSÍVEL).
O Procfs está presente na maioria dos unices não-BSD. Começou sua vida no Bell Labs da AT&T emUNIX 8ª ediçãocomo uma forma de relatar informações sobre processos (e ps
muitas vezes é uma impressora bonita para leitura de informações /proc
). A maioria das implementações de procfs possui um arquivo ou diretório chamado /proc/123
para relatar informações sobre o processo com PID 123. O Linux estende o sistema de arquivos proc com muito mais entradas que relatam o estado do sistema, incluindo seu exemplo /proc/cpuinfo
.
No passado, o Linux /proc
adquiria vários arquivos que forneciam informações sobre drivers, mas esse uso agora está obsoleto em favor de/sys
, e /proc
agora evolui lentamente. Entradas como /proc/bus
e /proc/fs/ext4
permanecem onde estão para compatibilidade com versões anteriores, mas interfaces semelhantes mais recentes são criadas em /sys
. Nesta resposta, vou me concentrar no Linux.
Seu primeiro e segundo pontos de entrada para documentação sobre /proc
Linux são:
- o
proc(5)
página de manual; - O
/proc
sistema de arquivosnodocumentação do kernel.
Seu terceiro ponto de entrada, quando a documentação não cobre isso, élendo a fonte. Você pode baixar o código-fonte em sua máquina, mas este é um programa enorme eLXR, a referência cruzada do Linux, é uma grande ajuda. (Existem muitas variantes do LXR; aquela em execução lxr.linux.no
é de longe a melhor, mas infelizmente o site costuma ficar fora do ar.) É necessário um pouco de conhecimento de C, mas você não precisa ser um programador para rastrear um valor misterioso .
O tratamento principal das /proc
entradas está nofs/proc
diretório. Qualquer driver pode registrar entradas em /proc
(embora, como indicado acima, isso esteja obsoleto em favor de /sys
), portanto, se você não encontrar o que procura em fs/proc
, procure em qualquer outro lugar. Drivers chamam funções declaradas eminclude/linux/proc_fs.h
. Versões do kernelaté 3,9fornece as funções create_proc_entry
e alguns wrappers (especialmente create_proc_read_entry
) e versões do kernel3.10 e superiorforneça apenas proc_create
e proc_create_data
(e mais alguns).
Tomando /proc/cpuinfo
como exemplo, uma pesquisa por "cpuinfo"
leva você à chamada para proc_create("cpuinfo, …")
infs/proc/cpuinfo.c
. Você pode ver que o código é basicamente um código padrão: como a maioria dos arquivos /proc
apenas despeja alguns dados de texto, existem funções auxiliares para fazer isso. Existe apenas umseq_operations
estrutura, e a verdadeira carne está nocpuinfo_op
estrutura de dados, que depende da arquitetura, geralmente definida em arch/<architecture>/kernel/setup.c
(ou às vezes em um arquivo diferente). Tomando x86 como exemplo, somos levados aarch/x86/kernel/cpu/proc.c
. Lá a função principal é show_cpuinfo
, que imprime o conteúdo do arquivo desejado; o resto da infraestrutura existe para alimentar os dados ao processo de leitura na velocidade que ele solicitar. Você pode ver os dados sendo montados dinamicamente a partir de dados em diversas variáveis no kernel, incluindo alguns números computados dinamicamente, comoa frequência da CPU.
Uma grande parte /proc
são as informações por processo no /proc/<PID>
. Essas entradas são registradas emfs/proc/base.c
, notgid_base_stuff
variedade; algumas funções registradas aqui são definidas em outros arquivos. Vejamos alguns exemplos de como essas entradas são geradas:
cmdline
é gerado porproc_pid_cmdline
no mesmo arquivo. Ele localiza os dados no processo e os imprime.clear_refs
, diferentemente das entradas que vimos até agora, é gravável, mas não legível. Portanto, oproc_clear_refs_operations
estruturas define umclear_refs_write
função, mas nenhuma função de leitura.cwd
é um link simbólico (um pouco mágico), declarado porproc_cwd_link
, qualprocura o diretório atual do processoe o retorna como o conteúdo do link.fd
é um subdiretório. As operações no próprio diretório são definidas no arquivoproc_fd_operations
estrutura de dados (eles são padronizados, exceto pela função que enumera as entradas,proc_readfd
, que enumera os arquivos abertos do processo) enquanto as operações nas entradas estão em`proc_fd_inode_operações.
Outra área importante /proc
é /proc/sys
, que é uma interface direta parasysctl
. A leitura de uma entrada nesta hierarquia retorna o valor do valor sysctl correspondente e a gravação define o valor sysctl. Os pontos de entrada para sysctl estão emfs/proc/proc_sysctl.c
. Sysctls têm seu próprio sistema de registro comregister_sysctl
e amigos.
Responder2
Ao tentar entender que tipo de mágica está acontecendo nos bastidores, seu melhor amigo é strace
. Aprender a operar essa ferramenta é uma das melhores coisas que você pode fazer para apreciar melhor a magia maluca que está acontecendo nos bastidores.
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
Na saída acima você pode ver que /proc/cpuinfo
é apenas um arquivo normal, ou pelo menos parece ser um. Então, vamos nos aprofundar.
Mergulho mais profundo
#1- com ls..Olhando para o arquivo em si, parece ser "apenas um arquivo".
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
Mas dê uma olhada mais de perto. Recebemos nossa primeira dica de que é especial, observe que o tamanho do arquivo é 0 bytes.
#2- com estatísticas..Se olharmos agora para o arquivo usando, stat
podemos obter a próxima dica de que há algo especial em /proc/cpuinfo
.
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
corrida #2
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
Observe os tempos de acesso, modificação e alteração? Eles continuam mudando para cada acesso. É altamente incomum que todos os três mudem assim. A menos que seja editado, os atributos de carimbo de data/hora de um arquivo geralmente permanecem os mesmos.
#3- com arquivo..Mais uma pista de que este arquivo é tudo menos um arquivo normal:
$ file /proc/cpuinfo
/proc/cpuinfo: empty
Se fosse alguma manifestação de um pipe nomeado, seria semelhante a um destes arquivos:
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
Se tocarmos em um emptyfile
, /proc/cpuinfo
parece mais um arquivo do que um canal:
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
#4- com suporte..
Então, neste ponto, precisamos dar um passo para trás e diminuir um pouco o zoom. Estamos olhando para um arquivo específico, mas talvez devêssemos olhar para o sistema de arquivos em que esse arquivo reside. E para isso podemos usar o mount
comando.
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
OK, então o tipo de sistema de arquivos é do tipo proc
. Então /proc
é um tipo de sistema de arquivos diferente, essa é a nossa dica de que os arquivos abaixo /proc
são especiais. Eles não são apenas arquivos comuns. Então, vamos descobrir mais algumas informações sobre o que torna o proc
sistema de arquivos especial.
Dando uma olhada na mount
página de manual de:
O sistema de arquivos proc não está associado a um dispositivo especial e, ao montá-lo, uma palavra-chave arbitrária, como proc, pode ser usada em vez de uma especificação de dispositivo. (A escolha habitual, none, é menos afortunada: a mensagem de erro `none busy' de umount pode ser confusa.)
E se dermos uma olhada na proc
página de manual de:
O sistema de arquivos proc é um sistema de pseudoarquivos usado como interface para estruturas de dados do kernel. Geralmente é montado em /proc. A maior parte é somente leitura, mas alguns arquivos permitem que variáveis do kernel sejam alteradas.
Um pouco mais abaixo na mesma página de manual:
/proc/cpuinfo
Esta é uma coleção de itens dependentes da CPU e da arquitetura do sistema, para cada arquitetura suportada uma lista diferente. Duas entradas comuns são processador que fornece número de CPU e bogomips; uma constante do sistema que é calculada durante a inicialização do kernel. As máquinas SMP possuem informações para cada CPU. O comando lscpu(1) reúne suas informações deste arquivo.
Na parte inferior da página do manual há uma referência a um documento do kernel que você pode encontrar aqui, intitulado:O SISTEMA DE ARQUIVOS /proc. Citando esse documento:
O sistema de arquivos proc atua como uma interface para estruturas de dados internas no kernel. Pode ser usado para obter informações sobre o sistema e alterar determinados parâmetros do kernel em tempo de execução (sysctl).
Conclusões
Então, o que aprendemos aqui? Bem, dado que isso /proc
é conhecido como um pseudo sistema de arquivos e também uma "interface para estruturas de dados internas", provavelmente é seguro assumir que os itens dentro dele sãonãoarquivos reais, mas apenas manifestações feitas para parecerem arquivos, mas na verdade não são.
Encerrarei com esta citação que aparentemente estava em uma versão anterior de man 5 proc
cerca de 2004, mas por algum motivo não está mais incluída.OBSERVAÇÃO:Não sei por que foi removido, pois descreve muito bem o que /proc
é:
O diretório /proc em sistemas GNU/Linux fornece uma interface semelhante a um sistema de arquivos para o kernel. Isso permite que aplicativos e usuários busquem informações e definam valores no kernel usando a operação normal de E/S do sistema de arquivos.
O sistema de arquivos proc às vezes é chamado de sistema de pseudoarquivos de informações de processo. Ele não contém arquivos ``reais'', mas sim informações do sistema em tempo de execução (por exemplo, memória do sistema, dispositivos montados, configuração de hardware, etc). Por esta razão pode ser considerado um centro de controle e informação do kernel. Na verdade, muitos utilitários do sistema são simplesmente chamadas para arquivos neste diretório. Por exemplo, o comando lsmod, que lista os módulos carregados pelo kernel, é basicamente o mesmo que 'cat /proc/modules' enquanto lspci, que lista os dispositivos conectados ao barramento PCI do sistema, é o mesmo que 'cat / proc/pci'. Ao alterar os arquivos localizados neste diretório você pode alterar os parâmetros do kernel enquanto o sistema está em execução.
Fonte: O pseudo sistema de arquivos proc
Referências
Responder3
A resposta dada pelo @slm é muito abrangente, mas acho que uma explicação mais simples pode vir de uma mudança de perspectiva.
No uso diário, podemos pensar nos arquivos como coisas físicas, ou seja. pedaços de dados armazenados em algum dispositivo. Isso torna arquivos como /proc/cpuinfo muito misteriosos e confusos. No entanto, tudo faz sentido se pensarmos nos arquivos como uminterface; uma maneira de enviar dados para dentro e para fora de algum programa.
Os programas que enviam e recebem dados desta forma são sistemas de arquivos ou drivers (dependendo de como você define esses termos, essa definição pode ser muito ampla ou muito restrita). O ponto importante é quealgunsdestes programas utilizam um dispositivo de hardware para armazenar e recuperar os dados enviados através desta interface; mas nem todos.
Alguns exemplos de sistemas de arquivos quenãousar um dispositivo de armazenamento (pelo menos diretamente) são:
- Sistemas de arquivos usando dados pesquisados ou calculados. Proc é um exemplo, pois obtém dados de vários módulos do kernel. Um exemplo extremo é πfs ( github.com/philipl/pifs )
- Todos os sistemas de arquivos FUSE, que lidam com os dados com um programa de espaço de usuário regular
- Sistemas de arquivos que transformam os dados de outro sistema de arquivos dinamicamente, por exemplo, usando criptografia, compactação ou até mesmo transcodificação de áudio ( khenriks.github.io/mp3fs/ )
O sistema operacional Plan9 (http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs) é um exemplo extremo de uso de arquivos como interface de programação geral.