Hierarquia de Arquivos e Diretórios |
A árvore de diretórios do Linux segue um padrão estabelecido pelo unix durante a maior parte de sua existência, mas controlada por um conjunto de regras estabelecidas pelo Linux Filesystem Standard, ou FSSTND, que atualmente se encontra na versão 2.0.
O FSSTND tenta seguir a tradição Unix, tornando o Linux
semelhante à grande maioria dos sistemas Unix presentes. Seu
particionamento é escolhido em ramificações menores de
forma a permitir o uso de vários dispositivos físicos em cada
ramo principal, ou mesmo tipos de dispositivos diferentes como CDRoms e redes
(via NFS). Partes comuns, por exemplo, podem ser compartilhadas via NFS
(Networking File System) entre várias máquinas, mantendo uma
parte independente em cada máquina.
Porque estudar primeiro a organização dos arquivos? Conhecendo
os arquivos (dados), fica mais fácil entender o que as
aplicações e ferramentas devem fazer, e o que já existe
à disposição destes programas. O administrador de
sistemas muitas vezes é levado a editar (com um editor de textos
convencional) muitos arquivos dos discutidos aqui, pois nem sempre as
ferramentas conseguem automatizar as peculiaridades de qualquer
instalação quando tratamos de um sistema tão complexo
quanto o Linux o é. Mesmo assim, o nível de
documentação desses arquivos possibilitam ao administrador um
total controle sobre a configuração do sistema, com maior
adequação ao seu problema particular.
Uma breve explanação dos diretórios mais importantes:
/var
abaixo de /usr
, torna impossível a
montagem de /usr
como read-only, e deve ser evitado. Uma
solução é cirar um link simbólico de
/var
para /usr/var
.[14]
/root
na maioria
dos sistemas). De certa forma, podemos dizer que aí se localizam todos
os dados reais do sistema. Quando este diretório se torna
excessivamente grande, ele pode ser quebrado em vários, inroduzindo uma
camada de nomes adicional (grupos de usuários), como por exemplo:
/home/suporte, /home/clientes
.
/dev/hda1
(supondo que este seja o seu disco rígido), pode deixar o sistema
inoperante, reescrevendo sobre a partição ext2
do Linux. Evidentemente, para fazer isso, voce precisará ser
um usuário privilegiado (root), portanto muito cuidado quando
voce for o root!
é um diretório com pontos para montagem de dispositivos de bloco, como discos rígidos adicionais, disquetes, cdroms, etc.
/var
. Na realidade o
/tmp
não necessariamente precisa ser salvo entre uma
sessão e outra (após um boot), enquanto que o
/var
normalmente fica com os dados salvos. Programas executados
após o boot do sistema, devem preferencialmente usar o
diretório /var/tmp
, que provavelmente terá mais
espaço disponível, mas nem sempre essa regra é seguida.
/etc/rc.d
, aonde estão os scripts de
inicialização do sistema em seus vários níveis[15], ademais contém os arquivos fstab
(tabela de filesystems), inittab
(configuração da inicialização do sistema para
cada nível), profile
(configuração default
para todos os logins), printcap
(configuração do
spooler de impressão), e um número considerável de
arquivos para configuração de rede e outros aspectos do sistema,
incluindo o X11.
fsck
, isto é clusters (blocos)
orfãos no disco ou que pertenciam a arquivos danificados.
modprobe
ou
insmod
.
/usr
, este
diretório é importante porque é aonde residem os
programas instalados após o "pacote básico" do sistema
operacional, isto é, após a distribuicão Linux é
instalada no seu computador. Alguns programas podem ser instalados em
/usr/local
numa distribuição e em /usr
numa outra, o que não importa muito, portanto confira os dois
locais para verificar aonde o programa desejado está instalado. (o PATH
deve conter tanto /usr/bin
como /usr/local/bin
)
Uma confusão muito grande se encontra entre os diretórios
/var
e /usr
. O primeiro é destinado aos
arquivos que poderão ser modificados livremente durante uma
sessão do computador aonde está instalado, ou seja, normalmente
ele não deverá ser compartilhado. O /usr
por outro
lado, é montado read-only, ou seja sem permissão para
gravação. O porquê disso é a necessidade de
compartilhamento da massa de programas, usualmente vários gigabytes,
entre vários sistemas numa rede local, exportando o diretório
/usr
através de um filesystem
nfs (network file system). Historicamente, foram
colocados no diretório /usr
arquivos que poderiam ser
atualizados dinâmicamente. Para corrigir este problema, esses
diretórios foram movidos para a hierarquia /var
e
colocados no seu local original um link simbólico para a
localização definitiva. Instalações simplificadas
do Linux, adicionalmente, contam com o /usr
residindo em um
CDROM, o que o torna forçosamente read-only.
O diretório /var
pode também ser compartilhado, mas
somente em parte, devido ao seu conteúdo. Por exemplo,
/var/mail
é um diretório variável, mas como
cada máquina tem seus usuários (supostamente com logins
diferentes), este diretório pode ser compartilhado entre várias
máquinas, o mesmo acontecendo com /var/spool/news.
Entretanto, /var/lock
não pode ser compartilhado porque
dois programas em máquinas diferentes poderiam criar simultaneamente
duas "travas" com o mesmo nome.
Devemos notar que o compartilhamento não significa deixar a hierarquia
read-only, mas tão somente indica se o mesmo dispositivo
físico pode ser dividido (utilizado simultaneamente, de forma
compartilhada) por várias máquina numa rede.
A utilização de toda a hierarquiva /usr
montada
read-only, todavia, nem sempre é utilizada, sendo geralmente
montado o /usr
como read-write-execute, portanto, só em
casos especiais devemos cuidar dos detalhes discutidos acima.
O diretório /etc
, como já mencionamos
anteriormente, possui arquivos relacionados com a configuração
dos vários aspectos do sistema. Muitos programas
não-padronizados pelas distribuições de Linux
também se utilizam desse diretório para colocar seus arquivos de
configuração global. Configurações
modificáveis por usuário, residem frequentemente no
diretório /home/<usuário>/
, isto é no
diretório "home" de cada um, variável com o nome de
login de cada usuário.
O arquivo passwd
é o banco de dados de usuários que
podem logar no sistema. Tem um formato de vários campos, separados pelo
caracter ":" (dois pontos) e sempre na mesma ordem:
nome de login do usuário, senha (criptografada, evidentemente), id do usuário (identificação única, semelhante a um número de carteira de identidade), grupo primário deste usuário (o usuário poderá participar de vários grupos), nome completo (nome normal, sem ser de login), diretório home deste usuário, e shell inicial. Um exemplo mostra melhor como são estes valores na prática:
rildo:gfTMTkLpLeupE:500:100:rildo:/home/rildo:/bin/bash
Quando estamos utilizando shadow password (um pacote que evita o acesso de hackers ao conteúdo das senhas, mesmo criptografadas, para dificultar a tentativa de quebra de senha), o segundo campo é substituido por um "*" e a senha é armazenada em outro arquivo, normalmente inacessível.
fstab
O arquivo fstab
contém uma tabela de parâmetros para
a montagem de discos (rígidos, cdrom, disquetes, nfs, e outros
dispositivos em bloco) de forma a ser necessário usar o programa mount
fornecendo apenas o nome do volume ou o diretório default de montagem.
Também é útil para determinar quais filesystems
serão montados automaticamente durante o boot, ou os que o daemon
[16] mountd
(montador
automático) deverá montar quando os seus diretórios
são visitados. O seu formato é em linhas contendo (na ordem):
dispositivo, diretório,
tipo, opcões.
O dispositivo é algum dos dispositivos de bloco do /dev/ (/dev/hda1, /dev/fd0, /dev/hdd3, etc). Opcionalmente, para dispositivos remotos, via nfs, o dispositivo toma a forma de servidor:diretório (servidor e diretório separado por ":"). O diretório dado no fstab, é o local aonde o filesystem será montado. O tipo é o tipo do filesystem: ext2, msdos, vfat, minix, iso9660, nfs, etc. As opcões são várias, separadas por vírgulas: ro (read-only), user (acessível por um usuário normal), noauto (não monta automaticamente na carga do sistema). Para todas as demais, consulte a manpage do fstab(8).
group
Define os grupos aos quais os usuários pertencem. Seu conteúdo
são linhas da forma:
group_name:passwd:GID:user_list
onde group_name é o nome do grupo. Um usuário pode pertencer a
qualquer número de grupos, e herdará todas as permissões
de acesso a arquivos desses grupos. Opcionalmente um grupo pode ter uma senha
(campo passwd). O GID (group id) é um código, como o
user_id (no arquivo passwd
), mas relativo ao grupo. Finalmente,
user_list é a lista (separada por vírgulas) de todos os
usuários que pertencem a este grupo.
inittab
Configuração da partida dos diversos processos (a maioria gerenciadores de login de terminais), que será discutida em um capítulo adiante.
issue
Contém a mesnagem de benvindo ao sistema, ou outras informações apresentadas ao usuário antes do seu login.
fdprm
Parâmetros relativos aos formatos dos discos flexíveis.
motd
Mensagem do dia (abreviatura de message of the day), apresentada ao usuário logo depois do seu login.
magic
"Assinaturas" de arquivos, ou seja, primeiros bytes contidos em um arquivo,
usualmente suficientes para determinar o formato dos dados desses arquivos.
É usado principalmente pelo programa file
, que gera
informações sobre os arquivos desejados (determina o tipo de
arquivo).
mtab
Tabela dos dispositivos correntemente montados. O seu formato é
semelhante ao de fstab.
Note que este arquivo é modificado
dinamicamente, à medida que montamos ou desmontamos discos no
sistema.
shadow
Arquivo usado para as senhas, quando a opção shadow password está instalada.
printcap
Banco de dados de capabilidades das impressoras. Será documentado adiante, quando veremos as configurações de impressoras no Linux.
securetty
Relação de terminais que estão permitidos a logar como superusuário (root). Indica as linhas que são seguras, isto é, não estão conectadas a um modem, por exemplo, o que deixaria o sistema vulnerável a ataques externos. O seu formato é simplesmente uma linha com cada nome de dispositivo seguro.
shells
Relação de shells consideradas seguras, para serem usadas durante um login. Eventualmente, outros shells poderão ser usados, mas como um programa normal, não durante o login dos usuários. A finalidade é evitar shells que, devido a uma implementação defeituosa, admitam brechas que comprometam a segurança do sistema.
termcap
Banco de dados com as capabilidades dos terminais. Atualmente o banco de
dados mais usado para esse fim é o terminfo
. Ambos
serão discutidos no capítulo referente a terminais. Os dados
contidos nestes bancos de dados se referem a sequências de controle para
realizar operações com a tela (limpeza,
movimentação do cursor, etc), bem como quais sequências de
eventos de teclas (keystrokes) são enviados quando uma tecla
especial (por exemplo "Home", "Insert", "F1") é pressionada.
lilo.conf
Arquivo com a configuração do LILO (LInux LOader). Será discutido com detalhes no capítulo sobre a partida do sistema.
ld.so.conf
Arquivo com a configuração do daemon
ld.so (carregador dinâmico de bibliotecas), contendo a
relação de diretórios aonde as bibliotecas formato
DLL ou ELF devem ser procuradas. O comando
ldconfig -p
mostra quais as bibliotecas que atualmente
estão no cache (arquivo /etc/ld.so.cache
), enquanto que
ldconfig
(sem o flag -p
) faz uma
restauração do cache.
syslog.conf
Configuração do daemon syslogd
, que gera
mensagens de log para vários arquivos, usualmente localizados no
diretório /var/log
.
outros arquivos requeridos
Além desses, outros arquivos são necessários para um
sistema Linux obedecer ao Linux Filesystem Standard. Entre eles:
hosts, exports, host.conf, hosts.allow, hosts.deny, hosts.lpd,
hosts.equiv, inetd.conf, networks, resolv.conf. rpc, services, gateways,
ftpusers.
A maioria destes será tratada quando falarmos sobre a
administração de redes
O Linux Filesystem Standard impõe algumas restrições na
organização de arquivos e diretórios para um sistema
Linux.
O diretório /etc
, por exemplo, não deverá
conter nenhum programa executável. Além disso, o
subdiretório /etc/X11
é o local recomendado para a
configuração do X no sistema, apesar de que usualmente temos o
arquivo XF86Config
(que controla a configuração do
servidor X) diretamente no diretório /etc.
Os
binários outrara residentes em /etc
devem ser movidos para
/sbin.
Programas que criam arquivos temporários em /tmp
,
não devem assumir que estes programas continuam existindo na
próxima invocação deste programa. Inclusive, o
recomendado é que no instante de carga do sistema, o diretório
/tmp
seja limpo, removendo todos os arquivos neste.
Para uma visão mais abrangente sobre esse assunto, recomendamos a leitura do FSSTND versão 2.0.