Na verdade, é bem simples, pelo menos se você não precisar dos detalhes da implementação.
Primeiro, no Linux todos os sistemas de arquivos (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) são implementados no kernel. Alguns podem descarregar o trabalho para o código da terra do usuário através do FUSE, e outros vêm apenas na forma de um módulo do kernel (o ZFS nativo é um exemplo notável deste último devido a restrições de licença), mas de qualquer forma permanece um componente do kernel. Este é um importante básico.
Quando um programa quer ler a partir de um arquivo, ele irá emitir várias chamadas de bibliotecas do sistema que finalmente acabam no kernel na forma de um open()
, read()
, close()
seqüência (possivelmente com seek()
jogado em boa medida). O kernel usa o caminho e o nome do arquivo fornecidos e, através do sistema de arquivos e da camada de E / S do dispositivo, os converte em solicitações de leitura física (e em muitos casos também solicitações de gravação - pense, por exemplo, atualizações atime) em algum armazenamento subjacente.
No entanto, ele não precisa converter essas solicitações especificamente para armazenamento físico persistente . O contrato do kernel é que a emissão desse conjunto específico de chamadas do sistema fornecerá o conteúdo do arquivo em questão . Onde exatamente em nosso domínio físico o "arquivo" existe é secundário a isso.
Em /proc
geralmente é montado o que é conhecido como procfs
. Esse é um tipo especial de sistema de arquivos, mas como é um sistema de arquivos, na verdade não é diferente de, por exemplo, um ext3
sistema de arquivos montado em algum lugar. Portanto, a solicitação é passada para o código do driver do sistema de arquivos procfs, que conhece todos esses arquivos e diretórios e retorna informações específicas das estruturas de dados do kernel .
A "camada de armazenamento", neste caso, são as estruturas de dados do kernel e procfs
fornece uma interface limpa e conveniente para acessá-las. Lembre-se de que montar procfs no /proc
é simplesmente uma convenção; você poderia facilmente montá-lo em outro lugar. De fato, isso às vezes é feito, por exemplo, nas cadeias chroot quando o processo em execução lá precisa acessar / proc por algum motivo.
Funciona da mesma maneira se você escrever um valor em algum arquivo; no nível do kernel, que se traduz em uma série de open()
, seek()
, write()
, close()
chamadas que novamente são passadas para o driver de sistema de arquivos; novamente, nesse caso em particular, o código procfs.
A razão específica pela qual você vê o file
retorno empty
é que muitos dos arquivos expostos pelo procfs são expostos com um tamanho de 0 bytes. O tamanho de 0 byte é provavelmente uma otimização no lado do kernel (muitos dos arquivos em / proc são dinâmicos e podem variar facilmente em comprimento, possivelmente até de uma leitura para a próxima, e calcular o tamanho de cada arquivo em cada diretório lido potencialmente muito caro). Indo pelos comentários a esta resposta, que você pode verificar em seu próprio sistema, executando o strace ou uma ferramenta semelhante, file
emite uma stat()
chamada para detectar arquivos especiais e, em seguida, aproveita a oportunidade para, se o tamanho do arquivo for 0 , anule e relate o arquivo como vazio.
Esse comportamento é realmente documentado e pode ser substituído, especificando -s
ou --special-files
na file
invocação, embora conforme declarado na página de manual que possa ter efeitos colaterais. A citação abaixo é da página do manual do arquivo BSD 5.11, de 17 de outubro de 2011.
Normalmente, o arquivo tenta apenas ler e determinar o tipo de arquivos de argumento que os relatórios stat (2) são arquivos comuns. Isso evita problemas, porque a leitura de arquivos especiais pode ter consequências peculiares. A especificação da -s
opção faz com que o arquivo também leia arquivos de argumento que são arquivos especiais de bloco ou caractere. Isso é útil para determinar os tipos de sistema de arquivos dos dados nas partições de disco bruto, que são arquivos especiais de bloco. Essa opção também faz com que o arquivo desconsidere o tamanho do arquivo, conforme relatado pelo stat (2), pois em alguns sistemas ele relata um tamanho zero para partições de disco bruto.
strace file /proc/version
oultrace -S /proc/version
, a otimização é bastante pequena. Ele faz umastat()
chamada primeiro e descobre que o tamanho é 0, pulando oopen()
- mas antes disso está carregando vários arquivos mágicos.file
. Dessa forma, o arquivo pré-carrega os arquivos mágicos e processa o parâmetro da linha de comando por parâmetro; em vez de mover o carregamento do arquivo mágico para a parte "faça isso imediatamente antes de tentar determinar que tipo de arquivo esse particular" é "parte do código, o que aumentaria a complexidade. Chamarstat()
e agir com base no seu valor de retorno é essencialmente inofensivo; adicionando complexidade para acompanhar riscos internos adicionais do estado, introduzindo bugs.file
relatórios relatam “o arquivo está vazio” é porque ele chamastat
para detectar arquivos especiais (chamados pipes, dispositivos,…) e aproveita a oportunidade para parar de processar arquivos vazios.file -s /proc/version
relata "texto ASCII".-s
dispositivos especiais de bloco / caractere. Finalmente, olhei para afile
fonte e, no final de fsmagic.c, vi esta explicação por que ela retorna emASCII text
vez deempty
:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
Nesse diretório, você pode controlar como o kernel exibe os dispositivos, ajustar as configurações do kernel, adicionar dispositivos ao kernel e removê-los novamente. Nesse diretório, você pode visualizar diretamente o uso da memória e as estatísticas de E / S.
Você pode ver quais discos estão montados e quais sistemas de arquivos são usados. Em resumo, todos os aspectos do seu sistema Linux podem ser examinados nesse diretório, se você souber o que procurar.
O
/proc
diretório não é um diretório normal. Se você fosse inicializar a partir de um CD de inicialização e olhar para esse diretório no disco rígido, verá que está vazio. Quando você o observa no seu sistema em execução normal, ele pode ser bastante grande. No entanto, ele não parece estar usando espaço em disco rígido. Isso ocorre porque é um sistema de arquivos virtual.Como o
/proc
sistema de arquivos é um sistema de arquivos virtual e reside na memória, um novo/proc
sistema de arquivos é criado toda vez que a máquina Linux é reinicializada.Em outras palavras, é apenas um meio de espiar e cutucar facilmente as entranhas do sistema Linux através de uma interface de tipo de arquivo e diretório. Quando você olha para um arquivo no
/proc
diretório, está olhando diretamente para um intervalo de memória no kernel do Linux e vendo o que ele pode ver.As camadas no sistema de arquivos
Exemplos:
/proc
, há um diretório para cada processo em execução, nomeado com seu ID do processo. Esses diretórios contêm arquivos que possuem informações úteis sobre os processos, como:exe
: que é um link simbólico para o arquivo no disco em que o processo foi iniciado.cwd
: que é um link simbólico para o diretório de trabalho do processo.wchan
: que, quando lido, retorna o canal de espera em que o processo está.maps
: que, quando lido, retorna os mapas de memória do processo./proc/uptime
retorna o tempo de atividade como dois valores decimais em segundos, separados por um espaço:/proc/interrupts
: Para informações relacionadas a interrupções./proc/modules
: Para uma lista de módulos.Para informações mais detalhadas, consulte man proc ou kernel.org .
fonte
mount -t procfs procfs /mnt/proc
, verá o / proc do kernel atualmente em execução.Você está correto, eles não são arquivos reais.
Em termos mais simples, é uma maneira de conversar com o kernel usando os métodos normais de leitura e gravação de arquivos, em vez de chamar o kernel diretamente. Está de acordo com a filosofia "tudo é um arquivo" do Unix.
Os arquivos
/proc
não existem fisicamente em lugar algum, mas o kernel reage aos arquivos que você lê e escreve nele e, em vez de gravar no armazenamento, relata informações ou faz alguma coisa.Da mesma forma, os arquivos
/dev
não são realmente arquivos no sentido tradicional (embora em alguns sistemas os arquivos/dev
possam realmente existir no disco, eles não terão muito mais do que o dispositivo a que se referem) - eles permitem que você fale para um dispositivo usando a API de E / S de arquivo Unix normal - ou qualquer coisa que o use, como shellsfonte
Dentro do
/proc
diretório, existem dois tipos de conteúdo, o primeiro diretório numerado e o segundo é o arquivo de informações do sistema./proc
é um sistema de arquivos virtual. Por exemplo, se você fizer issols -l /proc/stat
, notará que ele tem um tamanho de 0 bytes, mas se você fizer "cat / proc / stat", verá algum conteúdo dentro do arquivo.Faça um
ls -l /proc
e verá muitos diretórios com apenas números. Esses números representam os IDs do processo (PIDs). Os arquivos dentro desse diretório numerado correspondem ao processo com esse PID específico.Alguns arquivos disponíveis em
/proc
contém informações do sistema, como cpuinfo, meminfo e loadavg.Alguns comandos do Linux leem as informações desses
/proc
arquivos e as exibem. Por exemplo, o comando free , lê as informações de memória do/proc/meminfo
arquivo, formata-as e exibe-as.Para aprender mais sobre os
/proc
arquivos individuais , faça “man 5 FILENAME”.fonte
Exemplo mínimo executável
A melhor maneira de entender essas coisas na minha opinião é realmente brincar com elas, então aqui está um módulo do kernel que cria uma entrada procfs:
myprocfs.c
e então interagimos com ele como:
e que produz a saída:
Neste exemplo, vemos claramente que os
proc
arquivos nos permitem implementar "chamadas de sistema relacionadas a arquivos" arbitrárias, comoopen
,read
ellseek
.Essas chamadas do sistema podem ser usadas para comunicação arbitrária com o kernel.
Portanto, esses arquivos não precisam ter nada a ver com arquivos reais em sistemas de arquivos, e esse é o caso de quase todos eles.
Em nosso pequeno exemplo, por exemplo, simplesmente criamos um arquivo inútil para o qual
read
sempre retornaabcd\n
.Aqui está minha configuração totalmente automatizada do QEMU + Buildroot para criar e jogar com facilidade e segurança com este módulo do kernel:
Algumas outras interfaces semelhantes incluem:
O debugfs oferece basicamente a mesma interface, mas indica uma API menos estável. Aqui está um exemplo .
os dispositivos de caracteres também são muito semelhantes, mas os arquivos são criados com
mknod
, por exemplo: https://unix.stackexchange.com/questions/37829/how-do-character-device-or-character-special-files-work/371758# 371758sysfs é outra opção mais restrita; consulte esta resposta para obter mais detalhes: https://unix.stackexchange.com/questions/4884/what-is-the-difference-between-procfs-and-sysfs/382315#382315
fonte