O que acontece quando executo o comando cat /proc/cpuinfo?

O que acontece quando executo o comando cat /proc/cpuinfo?

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 psmuitas 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/123para 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 /procadquiria vários arquivos que forneciam informações sobre drivers, mas esse uso agora está obsoleto em favor de/sys, e /procagora evolui lentamente. Entradas como /proc/buse /proc/fs/ext4permanecem 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 /procLinux são:

  1. oproc(5)página de manual;
  2. O /procsistema 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 /procentradas está nofs/procdiretó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_entrye alguns wrappers (especialmente create_proc_read_entry) e versões do kernel3.10 e superiorforneça apenas proc_createe proc_create_data(e mais alguns).

Tomando /proc/cpuinfocomo 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 /procapenas despeja alguns dados de texto, existem funções auxiliares para fazer isso. Existe apenas umseq_operationsestrutura, e a verdadeira carne está nocpuinfo_opestrutura 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 /procsão as informações por processo no /proc/<PID>. Essas entradas são registradas emfs/proc/base.c, notgid_base_stuffvariedade; algumas funções registradas aqui são definidas em outros arquivos. Vejamos alguns exemplos de como essas entradas são geradas:

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_sysctle 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, statpodemos obter a próxima dica de que há algo especial em /proc/cpuinfo.

corrida #1
$ 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/cpuinfoparece 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 mountcomando.

$ 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 /procsão especiais. Eles não são apenas arquivos comuns. Então, vamos descobrir mais algumas informações sobre o que torna o procsistema de arquivos especial.

Dando uma olhada na mountpá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 procpá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 proccerca 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.

informação relacionada