Que tipo de arquivo é / dev / core ou / proc / kcore?

1

Ao verificar um sistema de arquivos em busca de alterações com um script, esqueci de excluir /dev , então core foi testado também. Estranhamente, de qualquer forma que eu teste, não é consistente para um tipo:

$ if [ -f ./core ] ; then echo file ; else echo something else ; fi
file
$ ls -al core
lrwxrwxrwx 1 root root 11 Sep 29 15:40 core -> /proc/kcore
$ file core
core: symbolic link to '/proc/kcore' 
$ if test -f core ; then echo file ; else echo something else ; fi
file
$ if /usr/bin/test -f core ; then echo file ; else echo something else ; fi
file
$ if test -h core ; then echo link ; else echo something else ; fi
link
$ if /usr/bin/test -h core ; then echo link ; else echo something else ; fi
link

O que está acontecendo aqui?

    
por JdeHaan 29.09.2015 / 19:11

2 respostas

2

Primeiro, /dev/core é um link simbólico para o arquivo normal /proc/kcore . Portanto, test -h /dev/core e test -f /dev/core são verdadeiros: -h porque é um link simbólico, -f porque o destino do link simbólico é um arquivo normal.

Agora para o que é /proc/kcore . É um arquivo normal, mas é um pouco diferente dos arquivos comuns aos quais você está acostumado. Sempre que um programa faz algo com um arquivo (abrir, ler, escrever, etc.), isso é feito por meio de uma chamada de sistema , isto é, executando algum código no kernel. O código que é invocado depende do tipo de sistema de arquivos. Para um sistema de arquivos em disco, como ext4 ou FAT, esse código funciona como as partes de dados que compõem o arquivo são organizadas e faz chamadas para a camada de armazenamento subjacente (por exemplo, o driver de disco) para ler e gravar essas partes. Para um sistema de arquivos de rede, como NFS ou Samba, esse código envia pacotes de rede para o servidor de arquivos. Para /proc , que é o ponto de montagem para o sistema de arquivos procfs , esse código exibe ou modifica as estruturas de dados do kernel. p>

A maioria dos arquivos em /proc informa informações sobre o sistema, por exemplo, /proc/mounts informa a lista de pontos de montagem, /proc/modules informa a lista de módulos carregados, /proc/123/stat relata informações de status sobre o processo com PID 123, etc. O arquivo /proc/kcore relata o conteúdo da memória física do sistema , em um formato adequado para um depurador, portanto, a leitura de bytes de /proc/kcore essencialmente lê o conteúdo da memória física.

Arquivos no sistema de arquivos procfs podem ser considerados “mágicos”, um pouco da mesma forma que arquivos do dispositivo são “mágicos” " Arquivos de dispositivos e sistemas de arquivos como procfs e sysfs obtêm sua mágica de diferentes maneiras: arquivos de dispositivo podem ser criados em qualquer (bem, mais ) sistemas de arquivos, eles são mágicos porque sua entrada de diretório diz “dispositivo de bloqueio” de “dispositivo de caractere” ao invés de “arquivo regular”; os arquivos em /proc e /sys são mágicos porque todo o sistema de arquivos em que eles estão é mágico.

Só que, como vimos acima, não há mágica real envolvida. É apenas o código do kernel, se o código calcula layouts de blocos e os lê de um disco ou formata estruturas de dados do kernel.

Você pode ver a documentação do sistema de arquivos procfs na página proc man e a documentação do kernel .

    
por 30.09.2015 / 02:22
0

O arquivo /dev/core é um link para /proc/kcore . O arquivo kcore é um arquivo virtual que existe apenas como parte do sistema de arquivos proc . Ele contém a memória que o kernel pode alocar. Em sistemas de 64 bits, o tamanho de /proc/kcore é de 128TB, porque esse é o limite absoluto do que os sistemas de 64 bits podem alocar. Este arquivo é formatado como um binário ELF . Veja (e observe o tamanho do arquivo):

$ file /proc/kcore 
/proc/kcore: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, [...]
$ ls -lh /proc/kcore 
-r-------- 1 root root 128T Sep 29 20:01 /proc/kcore

Os ctime e mtime são iguais ao tempo que eu chamei o comando ls , porque o arquivo existe apenas como um arquivo, não antes e não depois; apenas naquele momento.

Portanto, parece um arquivo normal, mas, como todos os outros arquivos no sistema de arquivos proc, é apenas virtual . O kernel abaixa a memória alocável como um arquivo, quando você o solicita. Isso significa que é somente disponível quando um read() ou um stat() solicita a chamada do sistema ( stat() acontece quando você usa o utilitário test no arquivo). O kernel então intercepta ou captura a chamada do sistema e fornece valores específicos, em vez do conteúdo real , que não existe. Se você ler /proc/kcore como um arquivo (com cat por exemplo), o kernel lê a memória.

Atrás de cada arquivo no sistema de arquivos proc existe uma função de handler, que é responsável pelo que deve ser devolvido como conteúdo do arquivo.

Como o /proc/kcore está no formato ELF, o conteúdo foi projetado para ser examinado por um depurador, como gdb .

    
por 29.09.2015 / 20:00