1 Sistemas de Arquivos no Linux (Linux File System) 1.0 ­ Arquivos no Linux Conceitualmente, arquivos são mecanismos de abstração que fornece uma forma de armazenar e recuperar informações em disco. A características mais importante de qualquer mecanismo abstração é a forma de identificar os objetos como os quais o mecanismo trata. Quando um processo cria um arquivo, é preciso que tal arquivo receba um nome, normalmente dado pelo processo. Quando tal processo termina sua execução, o arquivo continua a existir, podendo ser acessado por outros processos, usando para tanto o nome atribuído ao arquivo. 1.1 – Organização de arquivos O Linux organiza suas informações em arquivos. Esses arquivos podem conter textos, informações de programação, scripts de Shell ou qualquer outro tipo de informação. Algumas características sobre o sistema de arquivos no Linux: ­ na plataforma Windows® os dispositivos de armazenamento de drives são representados por letras: A: , B: , C: , D: , E: e etc. No Linux, eles são representados por diretórios cuja posição na hierarquia de diretórios é definida no momento de montagem, por exemplo: /mnt/floppy , /mnt/cdrom; ­ na plataforma Windows® (MS­DOS, 3.x, 9.x)os nomes dos arquivos se encontravam no formato 8.3, por exemplo: arquivo.txt. No Linux, podemos utilizar nomes de arquivos com até 256 caracteres e mais de um ponto, por exemplo: programa.src.tar.gz ; ­ O Linux, como qualquer sistema operacional UNIX, diferencia letras maiúsculas de minúsculas (Case Sensitive), portanto, RELATÓRIO, Relatório e relatório são arquivos diferentes; ­ É possível inserir espaços no meio do nome dos arquivos; ­ Os seguintes caracteres não podem ser utilizados em nome de arquivos: ! @ # $ % ^ & * ( ) { } [ ] ‘ “ ? | < > ` + ­ = \ / .. ­ Não há extensões compulsórias como .com, .exe para programas, .bat para arquivos de lote, .bak para arquivos de backup entre outros: ­ Arquivos executáveis são marcados com um caractere “*” ; ­ Arquivos de backup são marcados com “~” ; ­ Arquivos de diretórios (diretórios também são arquivos no Linux) são marcados com 2 um “/” ; ­ Arquivos do tipo link simbólico são marcados com um “@” ; ­ Arquivos do tipo socket são marcado com um “=” ; ­ Arquivos do tipo pipe são marcados com um “|” ; ­ E arquivos e ou diretórios ocultos começam com “.” ; Obs: para visualizar arquivos com as terminações * , ~ , @ , = , | utilizamos o comando ls –Fe para visualizar arquivos e ou diretórios ocultos, o comando ls –a 1.2 ­ Diretórios Para tratar dos arquivos, o sistema operacional normalmente lança mão do diretórios, no caso do Linux diretórios hierárquico, vide figura. Os diretórios são um tipo de arquivo. No Linux todos os arquivos fazem parte de um diretório, assim eles são mantidos e organizados, os diretórios são meios de oferecer endereços dos arquivos, de maneira que o SO possa acessá­los rapidamente e facilmente, ao entrar pela primeira vez em sua conta, o usuário já esta em um subdiretório denominado subdiretório de entrada, sempre com o nome do usuário que se logar. 1.3 – Sistema de Arquivos no Linux Quando do desenvolvimento do Linux, Linus Torvalds tinha a pretensão de evitar problemas encontrados durante o seu uso do Minix. Dessa maneira, o sistema de arquivos adotado no Linux baseia­se numa camada virtual (VFS – Virtual File System), construída para suportar múltiplos sistemas de arquivos. Essa estrutura permitiu ao Linux um gerenciamento poderoso desse recurso. O Linux suporta vários tipos de sistemas de arquivos, dentre os quais podem ser destacados: ­ fat (MS­DOS e Windows 3.x); ­ vfat (Windows 9.x); ­ ntfs (Windows NT/2000); ­ ntfs2 (Windows 2003); ­ ext2 (nativo do Linux); ­ ext3 (nativo do Linux nas novas distribuições); ­ ext4 (promessa de novo sistema de arquivos); ­ iso9660 (para manipulação de CDs); ­ nfs (Network File System – para dispositivos remotos, via rede); 3 ­ JFS – IBM; ­ XFS – Sun/Solaris; ­ ZFS (Sistema de arquivos potente); ­ e etc. 1.3.1 – EXT2 Pelo fato de ser nativo, um dos sistemas de arquivos mais importante no Linux é o ext2. O ext2, assim como todos os sistemas de arquivos derivados do UNIX, utiliza o conceito básico de que os arquivos são mapeados por i­nodes e diretórios simplesmente arquivos que contém uma lista de entradas e de dispositivos que poderão ser acessados. I­nodes são estruturas que contém as descrições dos arquivos, tais como: ­ direitos de acessos; ­ proprietário; ­ momento de criação; ­ ponteiros aos blocos de dados; Figura 1.1.3.a – Encadeamento de I­nodes. Sob o ponto de vista de implementação, cada i­node armazena uma lista de endereços físicos que representam o posicionamento da informação no, por exemplo, disco. Caso o arquivo seja pequeno, todos os endereços físicos poderão estar armazenados no próprio i­node. Caso contrário, o i­node apontará para um bloco que conterá informações 4 adicionais sobre os outros endereços físicos do arquivo. Esse bloco é denominado como Single Indirect Block (Bloco Indireto Único). Caso ainda não seja suficiente para abranger um arquivo com o Single Indirect Block, um novo bloco é evocado, o Double Indirect Block (Blocos Duplos Indiretos). Um dos atributos contidos na estrutura do I­nodes consiste no número de Hard­Links (Ligações rígidas) do campo i­nlink da estrutura inode. Esse campo informa a quantidade de hard­links associados a um i­node específico. Em um Hard­link é realizado um mapeamento direto entre os i­nodes (ao contrário dos link simbólico onde é feita uma tradução de nome para se achar o i­node associado), ou seja, hard­links são mapeados com o mesmo i­node em relação ao arquivo referenciado, como pode ser visto na figura abaixo: Figura 1.1.3.b – Hard Link. Como pode ser verificado na figura, um hard­link pode ser entendido como o “nome” do arquivo. Assim um arquivo com dois hard­links pode, a grosso modo, ser enxergado como um arquivo com dois “nomes”. É importante salientar que hard­links somente são possíveis dentro de um mesmo dispositivo e são aplicáveis somente a arquivos para evitar loops. Os hard­links apresentam a vantagem de não consumirem espaços adicionais para o seu mapeamento e podem ser criados com o comando ln e removidos com o comando rm. 1.3.2 – EXT3 Outro sistema de arquivos extremamente importante é representado pelo ext3 (que equipa as atuais distribuições Linux), que apresenta como principal vantagem sobre o ext2 o fato de ser mais consistente em ralação a falhas, o que resulta em um tempo de manutenção extremamente menor, não sendo geralmente, necessário executar aplicativos como o fsck. O sistema de arquivos ext3 é uma versão journaling do sistema de arquivos ext2 do Linux. Desenvolvido por Stephen Tweedie da Red Hat, ele tem uma vantagem significativa que 5 nenhum outro sistema journaling de arquivos tem ­ é totalmente compatível com o sistema de arquivos ext2. Pode conseqüentemente empregar todas as aplicações existentes desenvolvidas já para manipular o sistema de arquivos ext2. O sistema de arquivos ext3 é suportado na versão 2.4 do kernel do Linux e mais novos, mas deve ser ativado usando a caixa de configuração de Sistema de arquivos ao construir o kernel. No ext3, o código de journaling usa uma API especial chamada camada de Journaling Block Device, ou JBD. A JBD foi criada com o propósito de implementar journal em qualquer tipo de dispositivo em blocos. O ext3 implementa seu journaling chamando a API JDB. Por exemplo, o código do sistema de arquivos ext3 informa à JDB as mudanças que está efetuando e vai ainda pedir permissão à JDB antes de modificar qualquer dado em disco. Fazendo isso, o sistema dá à JDB a oportunidade de gerenciar o journal. É um arranjo interessante, e como a JDB é desenvolvida como uma entidade independente, ela pode futuramente ser usada para adicionar capacidade de journaling a outros sistemas de arquivos. O journal do ext3 é armazenado em um i­node ­ um arquivo, basicamente. Dependendo da forma como você habilitou seu sistema de arquivos, você pode visualizar esse arquivo, localizado em /.journal. É claro que, armazenando o journal em um i­node, o ext3 pode adicionar o journal necessário ao sistema de arquivos sem exigir extensões incompatíveis com o metadata do ext2. Esse é um dos pontos chaves pelo qual o ext3 pode oferecer compatibilidade com ext2. Características: • É uma alternativa para usuários do sistema de arquivos ext2 que desejam obter asvantagens do journaling; • Permite a conversão entre os sistemas de arquivos ext2 e ext3 sem a necessidade de reformatação, podendo­se utilizar ferramentas como o tune2fs e mke2fs, respectivamente; • Desde a versão 2.4 encontra­se disponível como parte integrante do kernel do sistema operacional Linux; • O suporte a ele já se encontra disponível em várias, distribuições Linux, incluindo Conectiva 8.0, RedHat 7.2 e Mandrake 8.0 e acima; • O suporte também pode ser adicionado através de uma recompilação do kernel v2.4 com os seguintes parâmetros: CONFIG_EXT3_FS=m ou CONFIG_EXT3_FS=y 1.3.3 – Outros Sistemas de arquivos (File Systems) Outros exemplos de Journaling File System compatíveis com o Linux são: ­ JFS for Linux: desenvolvido pela IBM, suporta limite de tamanho de arquivo de 4 PT (Peta bytes); 6 ­ XFS: desenvolvido pela Silicon Graphics, também suporta limite de tamanho de arquivo de 4 PT (Peta bytes); ­ ReiserFS: desenvolvido com o apoio da SUSE, muito utilizado e adotado atualmente nas distribuições baseadas no Debian; Características do Sistema de arquivos ReiserFS ­ Projetado por Hans Reiser, tem a grande vantagem de ser o primeiro sistema de arquivos baseado em journaling a ser incluído como parte integrante do kernel do Linux; ­ Utiliza uma abordagem radicalmente diversa da alocação baseada em blocos usada no ext2 para armazenar as informações, usando balanced trees; ­ Ainda não oferece suporte a quotas para usuários e grupos; ­ Permite arquivos com até 2 Gb de tamanho; ­ Possui otimizações para trabalhar com arquivos pequenos, reduzindo a fragmentação; 1.3.4 – Tipos de arquivos Em sistemas derivados do UNIX, os arquivos são utilizados sob várias denotações relacionadas com o armazenamento de informações do próprio usuário, código de aplicativos e estruturas utilizadas pelo sistema operacional. Grande parte das distribuições dos sistemas UNIX­like define os seguintes tipos de arquivos, os quais são: ­ Arquivos regulares: são os tipos mais simples de arquivos, estão relacionados aos arquivos de dados dos usuários, código executável, bibliotecas e demais arquivos afins; ­ Diretórios: representam a estrutura organizacional dos sistemas de arquivos. Assim como os arquivos regulares, os diretórios podem também ser mapeados como links simbólicos. Em Linux (UNIX) existem duas entradas especiais representados por “.” e “..” Tais entradas nunca poderão ser apagadas e representam o diretório corrente e o diretório anterior (diretório pai), respectivamente. ­ Arquivos de dispositivos: arquivos de dispositivos representam o elo de ligação entre o hardware (incluindo­se os periféricos) e os aplicativos. Tais arquivos são gerenciados pelos drivers dos dispositivos e neles são escritos os dados que serão gerados ou consumidos pela aplicação. Figura 1.1.4.a – Noenclatura de dispositivos mais usuais. ­ Sockets: são mecanismos que habilitam a comunicação entre os processos em execução dentro de um computador (Inter­process Comuncation –IPC). A vantagem deste tipo de comunicação é que processos baseados em redes podem se comunicar por intermédio de arquivos. Outra característica importante é que os Sockets permitem serviços baseados em conexão. 7 ­ Pipes (FIFO) – são utilizados para comunicação entre dois processos dentro de um mesmo escopo computacional, ou seja não habilitam comunicação inter­processos por conexão, apenas local. Para tanto, a comunicação é realizada através de um arquivo especial de Pipe. ­ Links simbólicos: um link simbólico ou Soft Link, faz referência a um arquivo ou diretório através do nome enquanto que o Hard Link faz referência direto ao arquivo ou diretório alvo utilizando a estrutura dos i­nodes. Sendo uma referência pelo nome o kernel ao encontrar um soft link, apenas faz uma troca de path corrente apontando para o link e continua normalmente seu processamento.