Uma discussão de alto nível dos conceitos do sistema de ficheiros Linux

Este artigo pretende ser uma discussão de muito alto nível dos conceitos do sistema de ficheiros Linux. Não pretende ser uma descrição de baixo nível de como um tipo particular de sistema de arquivos, como EXT4, funciona, nem pretende ser um tutorial de comandos de sistemas de arquivos.

Todos os computadores de propósito geral precisam armazenar dados de vários tipos em um disco rígido (HDD) ou algum equivalente, como uma memória USB. Existem algumas razões para isso. Primeiro, a RAM perde o seu conteúdo quando o computador é desligado. Existem tipos de RAM não voláteis que podem manter os dados armazenados após a remoção da energia (como a RAM flash que é usada em pendrives e unidades de estado sólido), mas a RAM flash é muito mais cara que a RAM padrão, volátil como a DDR3 e outros tipos similares.

A segunda razão pela qual os dados precisam ser armazenados em discos rígidos é que mesmo a RAM padrão ainda é mais cara que o espaço em disco. Tanto a RAM quanto os custos do disco têm caído rapidamente, mas a RAM ainda lidera o caminho em termos de custo por byte. Um cálculo rápido do custo por byte, baseado nos custos para 16GB de RAM vs. um disco rígido de 2TB, mostra que a RAM é cerca de 71 vezes mais cara por unidade do que o disco rígido. Um custo típico para a RAM é de cerca de $0,0000000043743750 por byte hoje. Para uma rápida nota histórica para colocar os custos atuais da RAM em perspectiva, nos primeiros dias de computação, um tipo de memória era baseado em pontos em uma tela CRT. Isto era muito caro por cerca de $1.00 por bit!

Definições

Você pode ouvir as pessoas falando sobre sistemas de arquivos de várias maneiras diferentes e confusas. A palavra em si pode ter vários significados, e você pode ter que discernir o significado correto do contexto de uma discussão ou documento.

Tentarei definir os vários significados da palavra “sistema de arquivos” com base em como tenho observado que ela está sendo usada em diferentes circunstâncias. Note que, enquanto tento cumprir com os significados “oficiais” padrão, minha intenção é definir o termo com base em seus vários usos. Estes significados serão explorados com mais detalhes nas seções seguintes deste artigo.

  1. Toda a estrutura de diretórios do Linux começando no diretório raiz (/) superior.
  2. Um tipo específico de formato de armazenamento de dados, como EXT3, EXT4, BTRFS, XFS, e assim por diante. O Linux suporta quase 100 tipos de sistemas de arquivos, incluindo alguns muito antigos, bem como alguns dos mais novos. Cada um desses tipos de sistemas de arquivos usa suas próprias estruturas de metadados para definir como os dados são armazenados e acessados.
  3. Uma partição ou volume lógico formatado com um tipo específico de sistema de arquivos que pode ser montado em um ponto de montagem especificado em um sistema de arquivos Linux.

Funções básicas do sistema de arquivos

O armazenamentoDisk é uma necessidade que traz consigo alguns detalhes interessantes e inescapáveis. Obviamente, um sistema de arquivos é projetado para prover espaço para armazenamento não volátil de dados; essa é a sua função final. No entanto, existem muitas outras funções importantes que derivam dessa necessidade.

Todos os sistemas de arquivos precisam fornecer um namespace – ou seja, uma metodologia de nomeação e organização. Isso define como um arquivo pode ser nomeado, especificamente o comprimento de um nome de arquivo e o subconjunto de caracteres que podem ser usados para nomes de arquivos a partir do conjunto total de caracteres disponíveis. Ele também define a estrutura lógica dos dados em um disco, como o uso de diretórios para organizar arquivos em vez de apenas juntá-los todos em um único e enorme conglomerado de arquivos.

Após a definição do namespace, uma estrutura de metadados é necessária para fornecer a base lógica para esse namespace. Isto inclui as estruturas de dados necessárias para suportar uma estrutura hierárquica de diretórios; estruturas para determinar quais blocos de espaço no disco são usados e quais estão disponíveis; estruturas que permitem manter os nomes dos arquivos e diretórios; informações sobre os arquivos, como seu tamanho e tempos de criação, modificação ou último acesso; e a localização ou localizações dos dados pertencentes ao arquivo no disco. Outros metadados são usados para armazenar informações de alto nível sobre as subdivisões do disco, tais como volumes lógicos e partições. Estes metadados de nível superior e as estruturas que representam contêm as informações que descrevem o sistema de arquivos armazenado na unidade ou partição, mas são separados e independentes dos metadados do sistema de arquivos.

Os sistemas de arquivos também requerem uma Interface de Programação de Aplicação (API) que fornece acesso a chamadas de função do sistema que manipulam objetos do sistema de arquivos como arquivos e diretórios. As APIs fornecem tarefas como criação, movimentação e exclusão de arquivos. Ela também fornece algoritmos que determinam coisas como onde um arquivo é colocado em um sistema de arquivos. Tais algoritmos podem ser responsáveis por objetivos como velocidade ou minimização da fragmentação do disco.

Sistemas de arquivos modernos também fornecem um modelo de segurança, que é um esquema para definir direitos de acesso a arquivos e diretórios. O modelo de segurança do sistema de arquivos Linux ajuda a garantir que os usuários só tenham acesso aos seus próprios arquivos e não aos de outros ou ao próprio sistema operacional.

O último bloco de construção é o software necessário para implementar todas estas funções. Linux usa uma implementação de software em duas partes como uma forma de melhorar a eficiência tanto do sistema quanto do programador.


Figure 1: A implementação de software de sistema de arquivos em duas partes do Linux.
A primeira parte desta implementação em duas partes é o sistema de arquivos virtual Linux. Este sistema de arquivos virtual fornece um único conjunto de comandos para o kernel, e desenvolvedores, para acessar todos os tipos de sistemas de arquivos. O software do sistema de arquivos virtual chama o driver de dispositivo específico necessário para fazer a interface com os vários tipos de sistemas de arquivos. Os drivers de dispositivos específicos do sistema de arquivos são a segunda parte da implementação. O driver de dispositivo interpreta o conjunto padrão de comandos do sistema de arquivos para aqueles específicos para o tipo de sistema de arquivos na partição ou volume lógico.

Estrutura de diretórios

Como uma Virgo normalmente muito organizada, eu gosto de coisas armazenadas em grupos menores e organizados ao invés de em um grande balde. O uso de diretórios me ajuda a poder armazenar e depois localizar os arquivos que eu quero quando estou procurando por eles. Os diretórios também são conhecidos como pastas porque eles podem ser pensados como pastas nas quais os arquivos são mantidos em uma espécie de analogia física de desktop.

No Linux e em muitos outros sistemas operacionais, os diretórios podem ser estruturados em uma hierarquia em forma de árvore. A estrutura de diretórios do Linux é bem definida e documentada na Hierarquia Padrão do Sistema de Arquivos Linux (FHS). A referência a esses diretórios ao acessá-los é feita usando os nomes de diretórios sequencialmente mais profundos conectados por barras (/) como /var/log e /var/spool/mail. Estes são chamados caminhos.

A tabela a seguir fornece uma lista muito breve dos diretórios Linux padrão, bem conhecidos e definidos de nível superior e seus propósitos.

Diretório Descrição
/ (sistema de arquivos raiz) O sistema de arquivos raiz é o diretório de nível superior do sistema de arquivos. Ele deve conter todos os arquivos necessários para inicializar o sistema Linux antes que outros sistemas de arquivos sejam montados. Ele deve incluir todos os executáveis necessários e bibliotecas necessárias para inicializar os sistemas de arquivos restantes. Após o sistema ser inicializado, todos os outros sistemas de arquivos são montados em pontos de montagem padrão, bem definidos, como subdiretórios do sistema de arquivos raiz.
/bin O diretório /bin contém arquivos executáveis do usuário.
/boot Contém o bootloader estático e os arquivos executáveis do kernel e de configuração necessários para inicializar um computador Linux.
/dev Este diretório contém os arquivos de dispositivos para cada dispositivo de hardware conectado ao sistema. Estes não são drivers de dispositivo, mas sim arquivos que representam cada dispositivo no computador e facilitam o acesso a esses dispositivos.
/etc Contém os arquivos de configuração do sistema local para o computador host.
/home Armazenamento do diretório home para os arquivos do usuário. Cada usuário tem um subdiretório em /home.
/lib Contém arquivos de biblioteca compartilhados que são necessários para inicializar o sistema.
/media Um lugar para montar dispositivos de mídia removíveis externos, como unidades USB que podem ser conectadas ao host.
/mnt Um ponto de montagem temporário para sistemas de ficheiros normais (como em suportes não removíveis) que pode ser usado enquanto o administrador está a reparar ou a trabalhar num sistema de ficheiros.
/opt Os ficheiros opcionais, tais como os programas de aplicação fornecidos pelo fornecedor, devem ser localizados aqui.
/root Este não é o sistema de ficheiros raiz (/). É o diretório home para o usuário root.
/sbin Arquivos binários do sistema. Estes são executáveis usados para administração do sistema.
/tmp Diretório TEMPORÁRIO. Usado pelo sistema operacional e por muitos programas para armazenar arquivos temporários. Os usuários também podem armazenar arquivos aqui temporariamente. Note que arquivos armazenados aqui podem ser excluídos a qualquer momento sem aviso prévio.
/usr Estes são arquivos compartilháveis, somente leitura, incluindo binários executáveis e bibliotecas, arquivos man, e outros tipos de documentação.
/var Arquivos de dados variáveis são armazenados aqui. Isto pode incluir coisas como arquivos de log, MySQL, e outros arquivos de banco de dados, arquivos de dados do servidor web, caixas de entrada de e-mail, e muito mais.

Tabela 1: O nível superior da hierarquia do sistema de arquivos Linux.
Os diretórios e seus subdiretórios mostrados na Tabela 1, juntamente com seus subdiretórios, que têm um fundo de teal são considerados parte integrante do sistema de arquivos raiz. Ou seja, eles não podem ser criados como um sistema de arquivos separado e montados no momento da inicialização. Isto é porque eles (especificamente, seu conteúdo) devem estar presentes no momento do boot para que o sistema inicialize corretamente. Os diretórios /media e /mnt são parte do sistema de arquivos raiz, mas eles nunca devem conter nenhum dado. Ao invés disso, eles são simplesmente pontos de montagem temporários. Os demais diretórios, aqueles que não têm cor de fundo na Tabela 1 não precisam estar presentes durante a sequência de inicialização, mas serão montados mais tarde, durante a sequência de inicialização que prepara o host para executar um trabalho útil. Certifique-se de consultar a página oficial do Linux Filesystem Hierarchy Standard (FHS) para obter detalhes sobre cada um desses diretórios e seus muitos subdiretórios. A Wikipedia também tem uma boa descrição do FHS. Este padrão deve ser seguido o mais próximo possível para garantir a consistência operacional e funcional. Independentemente dos tipos de sistemas de arquivos usados em um host, esta estrutura hierárquica de diretórios é a mesma.

Linux unified directory structure

Em alguns sistemas operacionais de PCs não-Linux, se houver múltiplos discos rígidos físicos ou múltiplas partições, a cada disco ou partição é atribuída uma letra de drive. É necessário saber em qual disco rígido um arquivo ou programa está localizado, como C: ou D:. Então você emite a letra da unidade como um comando, D:, por exemplo, para mudar para a unidade D:, e então você usa o comando cd para mudar para o diretório correto para localizar o arquivo desejado. Cada disco rígido tem a sua própria árvore de directórios separada e completa.

O sistema de ficheiros Linux unifica todos os discos rígidos físicos e partições numa única estrutura de directórios. Tudo começa no topo – o directório raiz (/). Todos os outros diretórios e seus subdiretórios estão localizados sob o diretório raiz único do Linux. Isto significa que existe apenas uma única árvore de directórios na qual procurar por ficheiros e programas. Isto só pode funcionar porque um sistema de ficheiros, tal como /home, /tmp, /var, /opt, ou /usr pode ser criado em discos rígidos físicos separados, numa partição diferente, ou num volume lógico diferente do sistema de ficheiros / (raiz) e depois ser montado num ponto de montagem (directório) como parte da árvore do sistema de ficheiros raiz. Mesmo drives removíveis, como uma unidade USB ou um disco rígido externo USB ou ESATA, serão montados no sistema de arquivos raiz e se tornarão parte integrante dessa árvore de diretórios.

Uma boa razão para fazer isso é aparente durante uma atualização de uma versão de uma distribuição Linux para outra, ou mudando de uma distribuição para outra. Em geral, e além de qualquer utilitário de atualização como o dnf-upgrade no Fedora, é sábio reformatar ocasionalmente o(s) disco(s) rígido(s) contendo o sistema operacional durante uma atualização para remover positivamente qualquer cruft que tenha se acumulado ao longo do tempo. Se a /home for parte do sistema de arquivos raiz, ela também será reformatada e então terá que ser restaurada a partir de um backup. Ao ter a /home como um sistema de arquivos separado, ela será conhecida pelo programa de instalação como um sistema de arquivos separado e a formatação dele pode ser ignorada. Isto também pode se aplicar ao /var, onde banco de dados, caixas de entrada de e-mail, website e outras variáveis de dados de usuário e sistema são armazenados.

Existem outras razões para manter certas partes da árvore de diretórios do Linux como sistemas de arquivos separados. Por exemplo, há muito tempo atrás, quando eu ainda não estava ciente dos potenciais problemas em torno de ter todos os diretórios Linux necessários como parte do sistema de arquivos / (raiz), eu consegui preencher meu diretório home com um grande número de arquivos muito grandes. Como nem o diretório /home nem o diretório /tmp eram sistemas de arquivos separados, mas simplesmente subdiretórios do sistema de arquivos raiz, o sistema de arquivos raiz inteiro se preencheu. Não havia mais espaço para o sistema operacional criar arquivos temporários ou expandir arquivos de dados existentes. No início, os programas da aplicação começaram a reclamar que não havia espaço para salvar arquivos, e então o próprio SO começou a agir de forma muito estranha. Arrancar para o modo de utilizador único e limpar os ficheiros ofensivos no meu directório pessoal permitiu-me voltar a funcionar. Eu então reinstalei o Linux usando uma configuração padrão de multi-filesystem e fui capaz de evitar que travamentos completos do sistema ocorressem novamente.

I uma vez tive uma situação em que um host Linux continuou a rodar, mas impediu que o usuário entrasse usando o desktop GUI. Eu fui capaz de fazer log in usando a interface de linha de comando (CLI) localmente usando um dos consoles virtuais, e remotamente usando SSH. O problema era que o sistema de arquivos /tmp tinha preenchido e alguns arquivos temporários requeridos pela GUI desktop não podiam ser criados no momento do login. Como o login no CLI não exigia que os arquivos fossem criados em /tmp, a falta de espaço lá não me impediu de fazer o login usando o CLI. Neste caso, o diretório /tmp era um sistema de arquivos separado e havia muito espaço disponível no grupo de volume do qual o volume lógico do /tmp fazia parte. Eu simplesmente expandi o volume lógico /tmp para um tamanho que acomodava meu novo entendimento da quantidade de espaço de arquivo temporário necessário naquele host e o problema foi resolvido. Note que esta solução não requereu uma reinicialização, e assim que o sistema de arquivos /tmp foi ampliado o usuário foi capaz de fazer login no desktop.

Ocorreu outra situação enquanto eu estava trabalhando como administrador de laboratório em uma grande empresa de tecnologia. Um dos nossos desenvolvedores tinha instalado uma aplicação no local errado (/var). A aplicação estava travando porque o sistema de arquivos /var estava cheio e os arquivos de log, que estão armazenados em /var/log naquele sistema de arquivos, não puderam ser anexados com novas mensagens devido à falta de espaço. Entretanto, o sistema permaneceu em funcionamento porque os sistemas de arquivos / (root) e /tmp críticos não encheram. Remover a aplicação ofensiva e reinstalá-la no sistema de arquivos /opt resolveu esse problema.

Filesystem types

Linux suporta a leitura de cerca de 100 tipos de partições; ele pode criar e escrever em apenas algumas delas. Mas é possível – e muito comum – montar sistemas de arquivos de tipos diferentes no mesmo sistema de arquivos raiz. Neste contexto, estamos falando de sistemas de arquivos em termos das estruturas e metadados necessários para armazenar e gerenciar os dados do usuário em uma partição de um disco rígido ou em um volume lógico. A lista completa de tipos de partições de sistemas de arquivos reconhecidos pelo comando fdisk do Linux é fornecida aqui, para que você possa ter uma idéia do alto grau de compatibilidade que o Linux tem com muitos tipos de sistemas.

 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT

O principal objetivo em suportar a capacidade de ler tantos tipos de partições é permitir a compatibilidade e pelo menos alguma interoperabilidade com os sistemas de arquivos de outros sistemas de computador. As escolhas disponíveis ao criar um novo sistema de arquivos com o Fedora são mostradas na lista a seguir.

  • btrfs
  • cramfs
  • ext2
  • ext3
  • ext4
  • fat
  • gfs2
  • hfsplus
  • minix
  • msdos
  • ntfs
  • reiserfs
  • vfat
  • xfs

Outras distribuições suportam a criação de diferentes tipos de sistemas de ficheiros. Por exemplo, o CentOS 6 suporta a criação apenas daqueles sistemas de arquivos destacados em negrito na lista acima.

Montagem

O termo “montar” um sistema de arquivos no Linux se refere aos primeiros dias de computação quando uma fita ou pacote de discos removíveis precisaria ser fisicamente montado em um dispositivo de unidade apropriado. Após ser fisicamente colocado na unidade, o sistema de arquivos no pacote de discos seria logicamente montado pelo sistema operacional para disponibilizar o conteúdo para acesso pelo SO, programas aplicativos e usuários.

Um ponto de montagem é simplesmente um diretório, como qualquer outro, que é criado como parte do sistema de arquivos raiz. Assim, por exemplo, o sistema de arquivos home é montado no diretório /home. Sistemas de arquivos podem ser montados em pontos de montagem em outros sistemas de arquivos não-root, mas isto é menos comum.

O sistema de arquivos raiz do Linux é montado no diretório raiz (/) muito cedo na seqüência de inicialização. Outros sistemas de arquivos são montados mais tarde, pelos programas de inicialização do Linux, seja pelo rc em SystemV ou pelo systemd em versões mais recentes do Linux. A montagem dos sistemas de arquivos durante o processo de inicialização é gerenciada pelo arquivo de configuração /etc/fstab. Uma maneira fácil de lembrar que fstab significa “tabela de sistema de arquivos”, e é uma lista de sistemas de arquivos que devem ser montados, seus pontos de montagem designados, e quaisquer opções que possam ser necessárias para sistemas de arquivos específicos.

Filesystems são montados em um diretório/ponto de montagem existente usando o comando mount. Em geral, qualquer diretório que é usado como ponto de montagem deve estar vazio e não ter nenhum outro arquivo contido nele. O Linux não impedirá que os usuários montem um sistema de arquivos sobre um que já esteja lá ou em um diretório que contenha arquivos. Se você montar um sistema de arquivos em um diretório ou sistema de arquivos existente, o conteúdo original será escondido e somente o conteúdo do sistema de arquivos recém montado será visível.

Conclusion

I espero que alguma da possível confusão em torno do termo sistema de arquivos tenha sido esclarecida por este artigo. Levou muito tempo e um mentor muito útil para eu realmente entender e apreciar a complexidade, elegância e funcionalidade do sistema de arquivos Linux em todos os seus significados.

Se você tiver perguntas, por favor adicione-as aos comentários abaixo e eu tentarei respondê-las.

Próximo mês

Outro conceito importante é que para o Linux, tudo é um arquivo. Este conceito tem algumas aplicações práticas interessantes e importantes para os usuários e administradores do sistema. A razão pela qual menciono isto é que você pode querer ler o meu artigo “Tudo é um arquivo” antes do artigo que estou planejando para o próximo mês no diretório /dev.

Deixe uma resposta

O seu endereço de email não será publicado.