procfs - procfs

O sistema de arquivos proc ( procfs ) é um sistema de arquivos especial em sistemas operacionais tipo Unix que apresenta informações sobre processos e outras informações do sistema em uma estrutura tipo arquivo hierárquica, fornecendo um método mais conveniente e padronizado para acessar dinamicamente os dados do processo mantidos no kernel do que métodos de rastreamento tradicionais ou acesso direto à memória do kernel . Normalmente, ele é mapeado para um ponto de montagem denominado / proc no momento da inicialização. O sistema de arquivos proc atua como uma interface para estruturas de dados internas sobre processos em execução no kernel. No Linux , ele também pode ser usado para obter informações sobre o kernel e para alterar certos parâmetros do kernel em tempo de execução ( sysctl ).

Muitos sistemas operacionais semelhantes ao Unix suportam o sistema de arquivos proc, incluindo Solaris , IRIX , Tru64 UNIX , BSD , Linux , IBM AIX , QNX e Plan 9 da Bell Labs . O OpenBSD abandonou o suporte na versão 5.7, lançada em maio de 2015.

O kernel do Linux o estende para dados não relacionados ao processo.

O sistema de arquivos proc fornece um método de comunicação entre o espaço do kernel e o espaço do usuário . Por exemplo, a versão GNU do utilitário de relatório de processos ps usa o sistema de arquivos proc para obter seus dados, sem usar nenhuma chamada de sistema especializada .

História

UNIX 8ª Edição

Tom J. Killian implementou a versão UNIX 8th Edition (V8) de / proc : ele apresentou um artigo intitulado "Processes as Files" na USENIX em junho de 1984. O design do procfs visava substituir a chamada de sistema ptrace usada para rastreamento de processos. A documentação detalhada pode ser encontrada na página de manual proc (4) .

SVR4

Roger Faulkner e Ron Gomes portaram V8 / proc para SVR4 e publicaram um artigo chamado "O sistema de arquivos de processo e o modelo de processo no UNIX System V" no USENIX em janeiro de 1991. Este tipo de procfs suportava a criação de ps , mas os arquivos podiam só pode ser acessado com as funções read () , write () e ioctl () . Entre 1995 e 1996, Roger Faulkner criou a interface procfs-2 para Solaris-2.6 que oferece um sistema de arquivos / proc estruturado com subdiretórios.

Plano 9

O Plan 9 implementou um sistema de arquivos de processo, mas foi além do V8. O sistema de arquivos de processo do V8 implementou um único arquivo por processo. O Plan 9 criou uma hierarquia de arquivos separados para fornecer essas funções e tornou / proc uma parte real do sistema de arquivos.

4.4BSD

4.4BSD clonou sua implementação de / proc do Plano 9. A partir de fevereiro de 2011, procfs está gradualmente se tornando obsoleto no FreeBSD, e passou a usar o sysctl em vez de informações relacionadas ao processo. Ele foi removido do OpenBSD na versão 5.7, lançado em maio de 2015, porque "sempre sofreu com condições de corrida e agora não é usado". O macOS não implementou procfs e os programas de espaço do usuário precisam usar a interface sysctl para dados de processos.

Para fornecer compatibilidade binária com os programas de espaço do usuário do Linux, o kernel do FreeBSD também fornece linprocfs que é semelhante ao procfs do Linux.

Solaris

/ proc no Solaris estava disponível desde o início. Solaris 2.6 em 1996 introduziu procfs2 de Roger Faulkner.

Linux

O Linux primeiro adicionou um sistema de arquivos / proc na v0.97.3 , setembro de 1992, e começou a expandi-lo para dados não relacionados ao processo na v0.98.6, dezembro de 1992.

A partir de 2020, a implementação do Linux inclui um diretório para cada processo em execução, incluindo processos do kernel , em diretórios chamados / proc / PID , onde PID é o número do processo. Cada diretório contém informações sobre um processo, incluindo:

  • / proc / PID / cmdline , o comando que originalmente iniciou o processo.
  • / proc / PID / cwd , um link simbólico para o diretório de trabalho atual do processo.
  • / proc / PID / amb contém os nomes e valores das variáveis ​​de ambiente que afetam o processo.
  • / proc / PID / exe , um link simbólico para o arquivo executável original , se ele ainda existir (um processo pode continuar em execução após seu executável original ter sido excluído ou substituído).
  • / proc / PID / fd , um diretório que contém um link simbólico para cada descritor de arquivo aberto .
  • / proc / PID / fdinfo , um diretório contendo entradas que descrevem a posição e sinalizadores para cada descritor de arquivo aberto.
  • / proc / PID / maps , um arquivo de texto contendo informações sobre arquivos e blocos mapeados (como heap e pilha).
  • / proc / PID / mem , uma imagem binária que representa a memória virtual do processo , só pode ser acessada por um processo ptrace .
  • / proc / PID / root , um link simbólico para o caminho da raiz visto pelo processo. Para a maioria dos processos, este será um link para / a menos que o processo esteja sendo executado em uma jaula chroot .
  • / proc / PID / status contém informações básicas sobre um processo, incluindo seu estado de execução e uso de memória.
  • / proc / PID / task , um diretório contendo links físicos para quaisquer tarefas que tenham sido iniciadas por este (ou seja: o processo pai).

(Os usuários podem obter o PID com um utilitário como pgrep , pidof ou ps :

$ ls -l /proc/$(pgrep -n python3)/fd        # List all file descriptors of the most recently started `python3' process
total 0
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python3)/exe    # List executable used to launch the most recently started `python3' process  
/usr/bin/python3.8

)

/ proc também inclui informações do sistema não relacionadas ao processo, embora no kernel 2.6 muitas dessas informações tenham sido movidas para um sistema de pseudo-arquivos separado, sysfs , montado em / sys :

  • dependendo do modo de gerenciamento de energia (se houver), o diretório, / proc / acpi ou / proc / apm , que é anterior ao sysfs e contém vários bits de informações sobre o estado do gerenciamento de energia.
  • / proc / buddyinfo , informações sobre o algoritmo buddy que lida com a fragmentação da memória.
  • / proc / bus , contendo diretórios que representam vários barramentos no computador, como PCI / USB . Isso foi amplamente substituído por sysfs em / sys / bus, que é muito mais informativo.
  • / proc / fb , uma lista dos framebuffers disponíveis
  • / proc / cmdline , fornecendo as opções de inicialização passadas para o kernel
  • / proc / cpuinfo , contendo informações sobre a CPU , como seu fornecedor (e família de CPU, modelo e nomes de modelo que devem permitir aos usuários identificar a CPU) e sua velocidade (CPU clockspeed ), tamanho do cache, número de irmãos, núcleos, e sinalizadores de CPU . / proc / cpuinfo inclui um valor para " bogomips ", freqüentemente interpretado erroneamente como uma medida de velocidade da CPU, como um benchmark, mas na verdade não mede nenhum valor sensível (para usuários finais). Isso ocorre como um efeito colateral da calibração do cronômetro do kernel e produz valores altamente variáveis ​​dependendo do tipo de CPU, mesmo em velocidades de clock iguais.
$ cat /proc/cpuinfo
processor	: 0
 vendor_id	: AuthenticAMD
 cpu family	: 16
 model		: 6
 model name	: AMD Athlon(tm) II X2 270 Processor
 stepping	: 3
 microcode	: 0x10000c8
 cpu MHz		: 2000.000
 cache size	: 1024 KB
 ...
 processor	: 1
 vendor_id	: AuthenticAMD
 cpu family	: 16
 model		: 6
 model name	: AMD Athlon(tm) II X2 270 Processor
 stepping	: 3
 microcode	: 0x10000c8
 cpu MHz		: 800.000
 cache size	: 1024 KB
 ...

Em CPUs com vários núcleos, / proc / cpuinfo contém os campos para "irmãos" e "núcleos de CPU" que representam o seguinte cálculo aplicado:

"siblings" = (HT per CPU package) * (# of cores per CPU package)
"cpu cores" = (# of cores per CPU package)

Um pacote de CPU significa CPU física que pode ter vários núcleos ( núcleo único para um, núcleo duplo para dois, núcleo quádruplo para quatro). Isso permite uma distinção entre hyper-threading e dual-core, ou seja, o número de hyper-threads por pacote de CPU pode ser calculado por irmãos / núcleos de CPU . Se os dois valores de um pacote de CPU forem iguais, o hyper-threading não será suportado. Por exemplo, um pacote de CPU com irmãos = 2 e "cpu cores" = 2 é uma CPU dual-core, mas não suporta hyper-threading.

  • / proc / crypto , uma lista de módulos criptográficos disponíveis
  • / proc / devices , uma lista de caracteres e dispositivos de bloco classificados por ID de dispositivo, mas fornecendo a maior parte do nome / dev também
  • / proc / diskstats , fornecendo algumas informações (incluindo números de dispositivos) para cada um dos dispositivos de disco lógico
  • / proc / filesystems , uma lista dos sistemas de arquivos suportados pelo kernel no momento da listagem
  • / proc / interrupts , / proc / iomem , / proc / ioports e o diretório / proc / irq , fornecendo alguns detalhes sobre os dispositivos (físicos ou lógicos) usando os vários recursos do sistema
  • / proc / kmsg , contendo mensagens de saída do kernel
  • / proc / meminfo , contendo um resumo de como o kernel está gerenciando sua memória.
  • / proc / modules , um dos arquivos mais importantes em / proc , contendo uma lista dos módulos do kernel carregados atualmente. Ele fornece alguma indicação (nem sempre totalmente correta) das dependências.
  • / proc / mounts , um link simbólico para self / mounts que contém uma lista dos dispositivos atualmente montados e seus pontos de montagem (e qual sistema de arquivos está em uso e quais opções de montagem estão em uso).
  • / proc / net / , um diretório contendo informações úteis sobre a pilha de rede, em particular / proc / net / nf_conntrack , que lista as conexões de rede existentes (particularmente útil para rastrear o roteamento quando iptables FORWARD é usado para redirecionar conexões de rede)
  • / proc / partitions , uma lista dos números de dispositivos, seus tamanhos e nomes / dev que o kernel identificou como partições existentes
  • / proc / scsi , fornecendo informações sobre quaisquer dispositivos conectados por meio de um controlador SCSI ou RAID
  • um link simbólico para o processo atual (de passagem) em / proc / self (ou seja, / proc / PID / onde PID é o do processo atual).
  • / proc / slabinfo , listando estatísticas sobre os caches para objetos usados ​​com frequência no kernel do Linux
  • / proc / swaps , uma lista das partições de troca ativas, seus vários tamanhos e prioridades
  • Acesso a opções de kernel configuráveis ​​dinamicamente em / proc / sys . Sob / proc / sys aparecem diretórios que representam as áreas do kernel, contendo arquivos virtuais legíveis e graváveis .
    Por exemplo, um arquivo virtual comumente referenciado é / proc / sys / net / ipv4 / ip_forward , porque é necessário para rotear firewalls ou túneis. O arquivo contém um '1' ou um '0': se for 1, a pilha IPv4 encaminha os pacotes não destinados ao host local; se for 0, então não.
  • / proc / sysvipc , contendo informações de compartilhamento de memória e comunicação entre processos (IPC).
  • / proc / tty , contendo informações sobre os terminais atuais; / proc / tty / driver parece ser uma lista dos diferentes tipos de tty disponíveis - cada um dos quais é uma lista de cada tipo
  • / proc / uptime , a quantidade de tempo que o kernel está rodando desde a inicialização e passou no modo inativo (ambos em segundos)
  • / proc / version , contendo a versão do kernel Linux, número de distribuição, número da versão gcc (usado para construir o kernel) e qualquer outra informação pertinente relacionada à versão do kernel atualmente em execução
  • outros arquivos dependendo de vários hardwares, configurações de módulos e mudanças no kernel.

Os utilitários básicos que usam / proc no Linux vêm no pacote procps ( processos / proc ) e só funcionam em conjunto com um / proc montado .

CYGWIN

Cygwin implementou um procfs que é basicamente igual ao procfs Linux.

Expansões Proprietárias

Várias empresas e projetos adicionaram funções adicionais a / proc para seus sistemas, por exemplo, / proc / lcd , pode ser um arquivo contendo o conteúdo da tela LCD do painel frontal. O texto escrito neste arquivo será exibido na tela.

Referências

links externos