3/14/2008

Conceitos em Linux (V)

5 - O Padrão de Hierarquia de Sistema de Arquivos

Este texto é apenas uma amostra do padrão para sistemas derivados ou compatíveis com sistemas UNIX com finalidade didática, apenas para familiarizar leitores sem conhecimento prévio com a organização dos diretórios do Linux. Para uma exposição detalhada visite:
http://www.pathname.com/fhs

Diferentemente de outros sistemas operacionais, cuja organização depende muito do usuário, sistemas Linux (na realidade sistemas UNIX em geral, mas como nossa discussão é Linux, vou omitir de agora em diante este fato, presumindo que o leitor tenha entendido) têm uma organização própria na qual cada parte tem seu lugar bem definido. Isso simplifica a localização de executáveis, bibliotecas compartilhadas, arquivos de configuração, arquivos de usuários, etc. dando ao sistema mais coerência. Na opinião deste pobre escritor, está aqui a parte mais bela de um sistema Linux, o que faz realmente com que seja mais fácil de utilizar e administrar do que outros sistemas.
O padrão classifica arquivos utilizando dois critérios, cada um dando origem a duas categorias distintas. Arquivos podem ser compartilháveis ou não e podem ser estáticos ou mutáveis (variáveis). Não entrarei em detalhes, mas é com estes critérios que toda esta divisão é feita no sistema de arquivos.
Como vimos, um sistema é composto de arquivos de dispositivos, arquivos executáveis (programas), diretórios e arquivos comuns de usuários. Entretanto, programas podem ser compilados estaticamente, formando um grande executável ou utilizando bibliotecas compartilhadas. Este último método é preferível pois apesar de colocar uma carga extra na administração do sistema, melhora o desempenho geral. Uma biblioteca compartilhada é um trecho de executável que pode estar presente em vários executáveis de forma idêntica. Isso é muito comum em programação, onde as funções são construídas para ser de uso mais geral possível, evitando desperdício de codificação (codificação leva tempo, o que significa recursos e dinheiro). Um programador pode aproveitar as funções fornecidas por outro e assim reduzir seu trabalho total, tornando a produção mais ágil e robusta, qualquer erro de codificação pode ser resolvido alterando-se a biblioteca, não sendo necessário (ou pelo menos não devendo ser necessário) alterar todos os executáveis. As bibliotecas são carregadas quando o primeiro executável que a usa a chamar (é feita uma ligação dinâmica) e a partir deste instante outros executáveis que a usarem não precisarão mais carregá-las, economia de tempo de carga, memória, enfim, economia. Obviamente outros sistemas usam bibliotecas compartilhadas, mas no Linux este uso é mais racional e organizado.
Além disso, executáveis muitas vezes necessitam de arquivos de configuração estáticos ou variáveis. O próprio núcleo é construído em módulos (bibliotecas de ligação dinâmica) e depende de arquivos de configuração, mesmo que indiretamente. Aos puristas, tudo bem, podemos construir um núcleo Linux estático, mas quem quer fazer isso num PC? Certamente tal construção é conveniente em muitas ocasiões (dispositivos embarcados, por exemplo), mas não é este o foco deste texto.
Um sistema Linux possui um diretório raiz do qual partem todas as outras hierarquias. Não há construção por dispositivos (C:, D:, por exemplo). Todos os diretórios e caminhos devem ser “montados” como subdiretórios do diretório raiz, simbolizado por “/”.
Neste ponto é interessante o leitor acompanhar o texto utilizando um sistema Linux, pois assim poderá verificar o conteúdo dos diretórios em seu sistema. Não há pretexto para não faze-lo, pois se não tiver um Linux instalado, basta utilizar um “live-CD”.
Dentro de “/” temos:
/bin: aqui devem estar os binários essenciais para a utilização do sistema pelos usuários. Exemplos: ls, mkdir, grep, login, mount.
/boot: aqui devem estar os arquivos necessários para a inicialização do sistema. Exemplos: system.map, vmlinuz-, initrd-, config-, grub/ (se estiver usando grub, obviamente).
/dev: diretório para acomodar nós de dispositivos. Exemplos: hda, sda, cdrom, console, random, urandom, ram0, null, audio.
/etc: aqui devem estar os arquivos de configuração do sistema (bem como scripts de configuração e serviços). Exemplos importantes são: bashrc, crontab, fstab, gshadow, shadow, passwd, modules, profile, rc.local, rc.modules, rc.sysinit, inittab, resolv.conf, xinetd.conf. Subdiretórios importantes: init.d/, rcn.d/ (onde n é um número de 0 a 6), X11/.
/home: diretório dos usuários (opcional).
/lib: aqui devem estar as bibliotecas compartilhadas dos executáveis em /bin e módulos do kernel. Exemplos: modules//, libc.so.6.
/media: ponto de montagem para dispositivos removíveis. Exemplos: dvd, floppy.
/mnt: ponto de montagem para sistemas de arquivos temporários.
/opt: diretório para instalação de programas que não estão presentes em sua distribuição.
/root: diretório home do superusuário (opcional).
/sbin: aqui devem estar os binários de administração do sistema. Exemplos: arp, clock, dump, fdisk, hdparm, halt, portmap, route, runlevel, shutdown.
/srv: diretório reservado para dados de serviços oferecidos pelo sistema.
/tmp: diretório reservado para arquivos temporários. É recomendável que seja limpo em cada carga do sistema.
/usr: recursos do sistema UNIX. Esta é na verdade uma hierarquia de diretórios e como tal deve ser estudada com mais detalhe.
/usr/bin: aqui devem estar os binários compartilhados por todos os usuários, não essenciais ao sistema.
/usr/include: diretório para conter os cabeçalhos de programas.
/usr/lib: reservado para as bibliotecas compartilhadas dos executáveis em /usr/bin.
/usr/local: hierarquia local.
/usr/sbin: binários para administração do sistema que não são essenciais. Exemplos: biosdecode, chroot, crond, cupsd, dmidecode.
/usr/share: dados independentes de arquitetura.
Há ainda uma outra hierarquia importante, a /var.
/var: hierarquia para acomodar dados variáveis do sistema.
/var/cache: cache das aplicações do sistema.
/var/lib: informações sobre variáveis de estado.
/var/local: variáveis dos programas em /usr/local.
/var/lock: arquivos de trava. São importantes para evitar que programas que compartilham recursos deixem uns aos outros em estado inconsistente.
/var/log: diretório para arquivos de registro de atividades e erros do sistema. Exemplos importantes: /var/log/kernel/errors, /var/log/kernel/warning, /var/log/dmesg.
/var/opt: dados variáveis dos programas em /opt.
/var/run: dados relevantes para processos em execução.
/var/spool: dados de transferência de arquivos.
/var/tmp: dados temporários que são preservados a cada carga do sistema.
Fora do padrão da hierarquia de sistemas de arquivos para UNIX, sistemas Linux exibem alguma particularidade, como os seguintes diretórios:
/proc: hierarquia para o sistema de arquivos virtual do kernel. É uma maneira de gerenciar processos e serviços, fornecendo uma comunicação direta com o núcleo.
/sys: sistema de arquivos virtual com informações sobre os subsistemas da máquina (sysfs, utilizado por um aplicativo que gerencia conexões dinâmicas de dispositivos, o udev).
/initrd: pasta geralmente vazia mas essencial para o processo de carga, caso utilize uma ramdisk (e certamente utiliza, creia em mim).

Com toda esta rigidez na padronização é nítido que algum esforço tem de ser feito pelos programadores para que seja seguido, mas a recompensa é um sistema claro, limpo e rápido, onde se evita ao máximo redundâncias. Obviamente a escolha de se manter todas as bibliotecas compartilhadas juntas requer atenção para que não haja conflito entre versões. Isto não é fácil e freqüentemente é um dos pontos fracos do Linux, pois a resolução das dependências dos executáveis e suas bibliotecas nem sempre é uma tarefa agradável e isenta de erros de programação, o que pode tornar a instalação de um programinha bobo em um verdadeiro pesadelo. É aí que entram as distribuições e seus gerenciadores de pacotes específicos. Instalar um programa a partir do código fonte pode requerer horas (ou dias) de pesquisa para resolver todas as bibliotecas compartilhadas requeridas, instalando-as uma a uma, na ordem em que dependem umas das outras. Então empresas e fundações (ou gente doida com tempo livre) se preocupam em compilar os programas e colocar informações sobre as dependências em “pacotes” de software para que um programa instalador possa resolver as dependências automaticamente, e se não houver disponibilidade local dos programas, até mesmo procurá-los em sites mantidos por eles na Internet.
Cada distribuição lida com isso de uma forma diferente. O Debian, por exemplo tem repositórios organizados e divididos em categorias de programas e um instalador esperto – o apt-get. Os pacotes têm uma extensão de identificação como .deb e um sistema de controle de versões. Isso torna fácil instalar um programa que já esteja em seus repositórios. Basta configurar de onde gostaria adquirir os pacotes (pode ser de um DVD ou pela Internet) e digitar “apt-get install nome_do_pacote” ou ainda utilizar um dos instaladores gráficos disponíveis se você não gosta de terminais em modo texto e pronto, seu programa está instalado. Se o programa que você quer não estiver nos repositórios... compre analgésicos, terá dor de cabeça.
O Mandriva possui medias (repositórios) e pacotes com extensão .rpm. O instalador é o urpmi, mas também há alternativas gráficas. Recomendo alguns sites para ver sobre a árvore de distribuições do Linux no final deste texto.
Há um projeto para unificar todos estes processos de instalação – o autopackage – mas ainda não tem muitos adeptos. Em minha opinião, é essencial que este projeto entre na base de padrões Linux pois assim muitos problemas de distribuição de pacotes seriam resolvidos. Instalar programas no Linux é ainda um de seus pontos fracos e uma melhoria neste sentido poderia ser crucial para que tenha vantagem sobre sistemas comerciais amplamente difundidos, que possuem um sistema de instalação de software simples (mas meio burro).

Para ver o padrão FHS leia:
Pathname
Para saber sobre as distribuições do Linux visite:
Br-Linux
Linux.org
Distrowatch
TI Experience
Para informações gerais sobre hardware, software e configurações relacionadas ao Linux continuo recomendando:
www.guiadohardware.net
www.vivaolinux.com.br
Para um excelente guia de comandos e configurações recomendo:
www.guiafoca.org

Próximo tópico: processo de carga do Linux

Creative Commons License
This work is licensed under a Creative Commons Attribution-NoDerivs 2.5 License.