Olá pessoal! Continuamos a lançar novos threads nos cursos que você já ama e tem pressa de informar que estamos iniciando um novo conjunto no curso
Linux Administrator , que começará no final de abril. Uma nova publicação será programada para coincidir com este evento. O material original pode ser
encontrado aqui .
Os sistemas de arquivos virtuais agem como um tipo de abstração mágica que permite à filosofia Linux dizer que "tudo é um arquivo".

O que é um sistema de arquivos? Com base nas palavras de um dos primeiros colaboradores e autores do Linux,
Robert Love , “Um sistema de arquivos é um armazém de dados hierárquico, montado de acordo com uma estrutura específica”. Seja como for, essa definição é igualmente adequada para VFAT (Tabela de alocação de arquivo virtual), Git e
Cassandra (
banco de dados NoSQL ). Então, o que exatamente define um conceito como "sistema de arquivos"?
Noções básicas do sistema de arquivosO kernel do Linux possui requisitos específicos para uma entidade que pode ser considerada um sistema de arquivos. Ele deve implementar os métodos
open()
,
read()
e
write()
para objetos persistentes que possuem nomes. Do ponto de vista da
programação orientada a
objetos , o kernel define um sistema de arquivos genérico (sistema de arquivos genérico) como uma interface abstrata, e essas três grandes funções são consideradas "virtuais" e não possuem uma definição específica. Por conseguinte, a implementação padrão do sistema de arquivos é chamada de sistema de arquivos virtual (VFS).

Se pudermos abrir, ler e gravar em uma entidade, essa entidade será considerada um arquivo, como vemos no exemplo no console acima.
O fenômeno VFS apenas ressalta a característica de observação dos sistemas do tipo Unix, que afirma que "tudo é um arquivo". Pense em como é estranho que o pequeno exemplo acima com / dev / console mostre como o console realmente funciona. A imagem mostra uma sessão interativa do Bash. O envio de uma sequência para o console (dispositivo do console virtual) a exibe em uma tela virtual. O VFS possui outras propriedades ainda mais estranhas. Por exemplo, torna possível pesquisar por
eles .
Sistemas familiares como ext4, NFS e / proc têm três funções importantes na estrutura de dados C chamadas
file_operations . Além disso, certos sistemas de arquivos estendem e redefinem as funções do VFS de maneira familiar e orientada a objetos. Como observa Robert Love, a abstração do VFS permite que os usuários do Linux copiem alegremente arquivos de ou para sistemas operacionais de terceiros ou entidades abstratas, como pipes, sem se preocupar com o formato de dados interno. No lado do usuário (espaço do usuário), usando uma chamada do sistema, um processo pode copiar de um arquivo para as estruturas de dados do kernel usando o método
read()
de um sistema de arquivos e, em seguida, use o método
write()
de outro sistema de arquivos para gerar dados.
As definições de função que pertencem aos tipos básicos de VFS são encontradas nos arquivos
fs / *. C da fonte do kernel, enquanto os subdiretórios
fs/
contêm sistemas de arquivos específicos. O kernel também contém entidades, como
cgroups
,
/dev
e
tmpfs
, necessárias durante o processo de inicialização e, portanto, são definidas no subdiretório
init/
kernel. Observe que
cgroups
,
/dev
e
tmpfs
não chamam as três grandes funções de
file_operations
, mas lê e grava diretamente na memória.
O diagrama abaixo mostra como o espaço do usuário acessa os vários tipos de sistemas de arquivos normalmente montados em sistemas Linux. Não são mostradas estruturas como
pipes
,
dmesg
e
POSIX clocks
, que também implementam a estrutura
file_operations
, cujo acesso passa pela camada VFS.

VFS é a "camada de shell" entre chamadas do sistema e implementações de determinadas
file_operations
de
file_operations
, como
ext4
e
procfs
. As funções
file_operations
podem interagir com drivers de dispositivo ou dispositivos de acesso à memória.
tmpfs
,
devtmpfs
e
cgroups
não usam
file_operations
, mas acessam a memória diretamente.
A existência do VFS oferece a capacidade de reutilizar o código, pois os métodos básicos associados aos sistemas de arquivos não precisam ser reimplementados por cada tipo de sistema de arquivos. Reutilizar código é uma prática amplamente aceita para engenheiros de software! No entanto, se o código reutilizável contiver
erros sérios , todas as implementações que herdam métodos comuns sofrem com eles.
/ tmp: dica simplesUma maneira fácil de detectar se o VFS está presente no sistema é entrar
mount | grep -v sd | grep -v :/
mount | grep -v sd | grep -v :/
mount | grep -v sd | grep -v :/
, que mostra todos os sistemas de arquivos montados que não são residentes no disco e não o NFS, o que é verdade na maioria dos computadores. Uma das montagens VFS listadas acima será, sem dúvida,
/tmp
, certo?

Todo mundo sabe que armazenar
/tmp
em um meio físico é uma loucura!
FontePor que é indesejável armazenar
/tmp
na mídia física? Como os arquivos em
/tmp
são temporários e os dispositivos de armazenamento são mais lentos que a memória em que o tmpfs é criado. Além disso, a mídia física é mais suscetível a substituir o desgaste do que a memória. Finalmente, os arquivos em / tmp podem conter informações confidenciais, portanto, seu desaparecimento a cada reinicialização é uma função integral.
Infelizmente, alguns scripts de instalação de distribuição do Linux criam / tmp no dispositivo de armazenamento padrão. Não se desespere se isso aconteceu com o seu sistema. Siga algumas instruções simples do
Arch Wiki para corrigir isso e lembre-se de que a memória alocada para
tmpfs
se torna inacessível para outros fins. Em outras palavras, um sistema com tmpfs gigantes e arquivos grandes pode ficar sem memória e travar. Outra dica: ao editar o
/etc/fstab
, lembre-se de que ele deve terminar com uma nova linha, caso contrário, seu sistema não inicializará.
/ proc e / sysAlém do
/tmp
, os VFS (sistemas de arquivos virtuais) com os quais os usuários do Linux estão mais familiarizados são
/proc
e
/sys
. (
/dev
está localizado na memória compartilhada e não possui
file_operations
). Por que exatamente esses dois componentes? Vamos analisar esse problema.
procfs
tira um instantâneo do kernel e dos processos que ele monitora para o
userspace
do
userspace
. No
/proc
kernel exibe informações sobre quais ferramentas ele possui, por exemplo, interrompe, memória virtual e o planejador. Além disso,
/proc/sys
é o local em que as opções configuradas com o comando
sysctl
estão disponíveis para o
userspace
do
userspace
. O status e as estatísticas dos processos individuais são exibidos nos diretórios
/proc/
.

Aqui
/proc/meminfo
é um arquivo vazio que, no entanto, contém informações valiosas.
O comportamento dos arquivos
/proc
mostra como os sistemas de arquivos em disco VFS podem ser diferentes. Por um lado,
/proc/meminfo
contém informações que podem ser exibidas com o comando
free
. Por outro lado, está vazio lá! Como é isso? A situação se assemelha a um famoso artigo intitulado
"A lua existe quando ninguém a olha?" Realidade e teoria quântica ”, escrita pelo professor de física da Universidade Cornell, David Mermin, em 1985. O fato é que o kernel coleta estatísticas de memória quando uma solicitação é feita para
/proc
e, de fato, não há nada nos arquivos
/proc
quando ninguém está olhando para lá. Como
Mermin disse: "A doutrina quântica fundamental afirma que a medição, em regra, não revela o valor preexistente da propriedade medida". (Pense na pergunta da lua como lição de casa!)
O aparente vazio dos
procfs
faz sentido, porque as informações são dinâmicas. Uma situação ligeiramente diferente com o
sysfs
. Vamos comparar quantos arquivos de pelo menos um byte estão em
/proc
e
/sys
.

Procfs
possui um arquivo, a configuração do kernel exportado, que é uma exceção, pois precisa ser gerado apenas uma vez por inicialização.
/sys
por outro lado, contém muitos arquivos mais volumosos, muitos dos quais ocupam uma página inteira de memória. Normalmente, os arquivos
sysfs
contêm exatamente um número ou linha, diferente das tabelas de informações obtidas pela leitura de arquivos como
/proc/meminfo
.
O objetivo do
sysfs
é fornecer propriedades legíveis e
«kobjects»
do que o kernel chama de
«kobjects»
no espaço do usuário. O único objetivo dos
kobjects
é contar os links: quando o último link para o kobject for excluído, o sistema restaurará os recursos associados a ele. No entanto,
/sys
compõe a maior parte do famoso kernel
"ABI estável para espaço de usuário" , que ninguém pode, em nenhuma circunstância
, quebrar . Isso não significa que os arquivos no sysfs sejam estáticos, o que contradiz a contagem de links para objetos instáveis.
A interface estável de aplicativo de kernel de um kernel (ABI estável do kernel) limita o que pode aparecer em
/sys
, não o que está realmente presente neste momento específico. A listagem de permissões de arquivo no sysfs fornece um entendimento de como as configurações configuráveis para dispositivos, módulos, sistemas de arquivos etc. pode ser personalizado ou lido. Concluímos que procfs também faz parte do kernel ABI estável, embora isso não esteja explicitamente declarado na
documentação .

Os arquivos no
sysfs
descrevem uma propriedade específica para cada entidade e podem ser legíveis, regraváveis ou ambos ao mesmo tempo. Um "0" no arquivo indica que o SSD não pode ser excluído.
Começamos a
segunda parte da tradução com como observar o VFS usando as ferramentas eBPF e cco, e agora aguardamos seus comentários e, tradicionalmente, convidamos você para o
seminário on-line aberto , que será realizado pelo professor
Vladimir Drozdetsky em 9 de abril.
A segunda parte.