Sistemas de arquivos virtuais Linux: por que eles são necessários e como eles funcionam? Parte 1

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 arquivos

O 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 simples

Uma 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! Fonte

Por 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 / sys

Alé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.

Source: https://habr.com/ru/post/pt446614/


All Articles