
Guia de Administração do Sistema Linux 
Versão 0.6 

Lars Wirzenius 

Projeto de Documentação do Linux

Esta é a versão 0.6 do Guia de Administração Linux
Publicada em 15 de Novembro de 1997

Traduzido e Adaptado pela Conectiva Informática 
Ltda.





Índice



       

     Introdução

     Visão Geral do Linux
          Diversas partes de um sistema operacional
          Partes importantes do kernel
          Principais serviços do kernel  
               init 
               acesso a partir de terminais
               Mensagens do Sistema 
               Comandos periódicos: cron e at               
                Interface gráfica
               Rede 
               Acesso via Rede 
               Sistema de Arquivos de Rede (NFS) 
               Correio eletrônico
               Impressão
          A estrutura do sistema de arquivos 
Visão geral da árvore de diretórios 
          Background
          O sistema de arquivos raiz
              O diretório /etc
              O diretório /dev
         O sistema de arquivos /usr
         O sistema de arquivos /var
         O sistema de arquivos /proc

Utilizando discos rígidos e outros dispositivos de 
armazenamento
          Dois tipos de dispositivos
          Discos rígidos
          Discos flexíveis
          CD-ROM’s
          Fitas
          Formatação
          Partições 
               MBR, setores de inicialização e 
tabela de partições
               Partições lógicas e estendidas
               Tipos de partição
               Particionando um disco rígido
               Arquivos de dispositivos e partições
          Sistema de arquivos
              O que é um sistema de arquivos?
               Diversidade de sistemas de arquivos 
               Qual  sistema de arquivos deve ser 
usado?
               Criando um sistema de arquivos
               Montando um sistema de arquivos
               Verificando a integridade de um 
sistema de arquivos com fsck
               Verificando blocos com erro em 
discos rígidos
                Evitando fragmentação
                Outras ferramentas para todos 
sistemas de arquivos 
                Outras ferramentas para sistemas de 
arquivos ext2
          Discos sem sistemas de arquivos
          Alocando espaço em disco
               Esquemas de particionamento
               Requisitos de espaço      
               Exemplos de alocação de espaço em 
disco  
               Adicionado espaço em disco ao Linux
               Dicas para economizar espaço 
     Gerenciamento de Memória
               O que é memória virtual?
               Criando uma área de swap
               Usando a área de swap
               Compartilhando área de swap com 
outros sistemas operacionais
               Alocando área de swap
               O cache de buffer 
      Iniciando e Desligando
           Uma visão geral da inicialização e 
encerramento do sistema
           O processo de inicialização em maiores 
detalhes
           Reinicializando
           Mais informações sobre o encerramento do 
sistema
           Modo monousuário
           Disquetes de emergência    
      init 
          init vem em primeiro lugar
          configurando o init: o arquivo 
/etc/inittab
          níveis de execução
          configurações especiais no /etc/inittab
          iniciando em modo monousuário

     Entrando e saindo do sistema 
          Acesso via terminais
          Acesso via rede
          O que o acesso ao sistema faz
          X e xdm
          Controle de acessos
          Ativação do ambiente de trabalho (shell)
     Gerenciando contas de usuários
          O que é uma conta?
          Criando um usuário
                /etc/passwd e outros arquivos
               Escolhendo um  número de usuário e 
identificação de grupo
                Ambiente inicial: /etc/skel
                Criando um usuário manualmente
           Alterando as características de um 
usuário
           Removendo um usuário
           Desabilitando um usuário temporariamente
       
     Cópias de Segurança
         O que é importante copiar?
          Selecionando o dispositivo de backup
          Selecionando a ferramenta de backup
          Cópias simples
                Cópias de segurança com tar
                Restaurando arquivos com tar
          Cópias em diversos níveis
          O que copiar
          Arquivos compactados
     Manutenção de Data/Hora
           Zonas de tempo
           Os relógios de hardware e software
           Quando o relógio está errado
     Medidas de Segurança   
     Comandos e Programas Relacionados
     HOWTOS relacionados 
     Glossário (DRAFT) 
     Referências 
     Índice 
     Sobre este documento ... 
     Sobre esta tradução.. 



Lars Wirzenius 




Conteúdo  

Os fontes do documento original em LaTex e outros 
formatos pode ser encontrado na Internet, via FTP 
anônimo em sunsite.unc.edu, no diretório 
/pub/Linux/docs/LDP.  Encontra-se também disponível 
nos formatos  Postscript e TeX.DVI. A página 
oficial deste livro encontra-se em 
texttt{http://www.iki.fi/liw/linux/sag/}.A versão 
atualizada também pode ser encontrada naquela 
localização.

 Copyright © 1993-1997 Lars Wirzenius. 

Marcas registradas são de propriedade dos seus 
autores.

É permitido reproduzir e distribuir cópias deste 
manual , desde que acompanhadas 
dos devidos registros de direitos e este aviso seja 
divulgado em todas as cópias.

É permitido processar este documento em TeX ou 
outros formatos e imprimir os 
resultados, e distribuir os documentos impressos, 
desde que acompanhados de permissões expressas  e  
que este aviso esteja presente em todas as cópias, 
incluindo-se as referências das fontes onde estas 
informações foram encontradas e o endereço da 
página oficial na Internet.    

É permitidos copiar e distribuir diferentes versões 
deste manual sob as mesmas 
condições acima mencionadas, e desde que o trabalho 
daí derivado seja distribuído sob os mesmos termos 
desta permissão e que este aviso esteja presente.
 
É permitido a cópia e distribuição deste manual  em 
outras línguas, sob as 
mesmas condições mencionadas para cópias 
modificadas.

O autor gostaria de ser avisado das modificações, 
traduções e  versões 
impressas. 

Obrigado.


Adendo

A Conectiva Informática Ltda., no seu papel de 
buscar popularizar o uso Linux no Brasil, buscou 
traduzir da melhor forma o conteúdo dessa 
publicação do LDP - Projeto de Documentação Linux, 
assim como agregou comentários e informações 
adicionais que pudessem enriquecer o seu uso.

Quaisquer incorreções ou problemas detectados, 
pedimos que sejam comunicados por email para 
info@conectiva.com.br, a fim de que os ajustes 
sejam realizados para as próximas versões.

Agradecemos a todos aqueles que tem participado 
ativamente no desenvolvimento dos  trabalhos de 
tradução, internacionalização, divulgação e 
adaptação do Linux à realidade brasileira, pois 
muito de nosso esforço está calcado no processo 
participativo desta comunidade.

Esperamos que esse livro seja de utilidade ao 
administradores de sistemas que busquem uma 
ferramenta de auxílio às suas atividades diárias, e 
que possa enriquecer e facilitar os seus 
conhecimentos.

Linux: Quem Compara, Usa!


Conectiva Informática Ltda.
1998

  




Introdução

“No começo o arquivo foi escrito sem  forma e void; 
e  o vácuo estava sobre a face dos bits. E os Dedos 
do Autor moveram-se sobre o teclado. E o Autor 
disse: que haja palavras, e fizeram-se as 
palavras.”


O Guia de Administração Linux, descreve aspectos da  
administração do sistema Linux e está voltado para 
usuários  com pouco conhecimento de administração 
de sistemas, mas que tenham uma base mínima. Este 
manual não descreve como instalar o Linux,  o que é 
apresentado no Guia do Servidor Linux. 

Administração de sistemas é o conjunto de tarefas 
necessárias para manter o computador em boas 
condições de uso. Isso inclui atividades como 
efetuar cópias de segurança (e restaurá-las, se 
necessário), instalar novos programas, criar contas 
de usuários (e apagá-las quando não mais forem 
necessárias), estar certo que os sistemas de 
arquivos estão íntegros, e assim por diante. Se um 
computador fosse, por exemplo, uma casa,  
administração do sistema poderia ser comparada a 
manutenção, a qual inclui a limpeza, arrumar 
vidraças quebradas, e coisas do gênero. 
Administração de sistemas não é chamada de 
manutenção, por que encerra outros aspectos, não 
abrangidos por este conceito.

A estrutura deste manual permite que muitos 
capítulos possam ser utilizados de maneira 
independente, isto é, caso sejam necessárias por 
exemplo informações sobre cópias de segurança, 
pode-se ler somente aquele capítulo. Espera-se com 
isto tornar este livro um manual de referência e 
treinamento, e dentro do possível, que somente 
partes pequenas sejam consultadas quando 
necessário, ao invés de exigir a sua leitura 
completa. Ainda assim o fato deste manual ser ainda 
uma ferramenta de ajuda e de referência é, para 
mim, uma uma feliz coincidência.   

Este manual não pretende ser usado com única 
ferramenta de consulta. Muitas informações  
importantes para a administração de sistemas podem 
ser encontradas nos documentos Linux. Além disso o 
administrador do sistema é somente um usuário com 
privilégios e tarefas especiais. Um dos recursos 
importantes são as páginas de manual on-line, que 
devem  servir de referência sempre que um comando 
não for familiar.

O processo de tradução e adaptação do manual buscou 
acrescentar os comandos e HOWTOS relacionados aos 
temas aqui abordados, os quais estão em Apêndices 
específico.  

Enquanto este manual está voltado para o Linux, 
princípios gerais de administração podem ser 
utilizados em outros sistemas UNIX. Infelizmente 
pelo fatos das variações serem grandes entre 
diferentes versões de UNIX, a possibilidade de 
cobrir completamente o tema é muito pequena. O 
próprio Linux é difícil de ser abrangido em todas 
as suas possibilidades, dada à natureza de seu 
desenvolvimento.

Não há uma distribuição oficial do Linux, e pessoas 
diferentes utilizam diferentes configurações da 
mesma distribuição, e muitos ainda possuem as suas 
próprias personalizadas. Este livro não pretende 
fixar-se em uma distribuição específica,  apesar do 
autor utilizar o Debian GNU/Linux e o tradutor o 
Conectiva Linux exclusivamente. Sempre que possível 
procurar-se-á apresentar as diferenças entre elas. 

Tentou-se descrever como as coisas funcionam, ao 
invés de descrever-se somente 
“cinco passos simples” para cada executar uma 
tarefa. Isso significa que muita informação aqui 
pode não ser necessária, mas pode ser simplesmente  
ignorada para utilização em um sistema pré-
configurado. Uma leitura completa naturalmente 
aprimorará o conhecimento do sistema e poderá 
tornar a administração mais agradável.      

Como todo o desenvolvimento do Linux, que funciona 
através de trabalho 
voluntário, este trabalho foi realizado porque 
pensamos que seria agradável e porque nós sentimos 
que ele precisava ser realizado. Ainda assim, como 
em qualquer trabalho voluntário há limites de tempo 
despendido e de  conhecimento. Isso significa que 
este manual pode não ser necessariamente tão bom 
quanto desejaríamos, porém pensamos que ele seja 
muito bom e que as informações aqui contidas devam 
ser divulgadas. 

Outro ponto que deve ser ressaltado é que muitas 
coisas já documentadas em 
outros manuais não foram aqui exploradas 
profundamente. Isso aplica-se especialmente à 
documentação de programas específicos, como por 
exemplo a documentação do mkfs (n.t.: na edição 
brasileira adaptada os programas são apresentados 
em Apêndice específico). Foi descrito somente o 
propósito e o seu uso como ferramenta dentro dos 
princípios deste manual. Para maiores informações, 
é sugerido ao gentil leitor o uso de outros 
manuais, normalmente os referenciados no projeto de 
documentação do Linux. 

Fizemos um grande esforço para tornar este manual o 
melhor possível, porém gostaríamos de ouvir 
qualquer sugestão que possa melhorá-lo. Erros de 
linguagem, informações incorretas, idéias para 
novos tópicos, seções reescritas, informações sobre 
como os diversos sistemas UNIX funcionam, são bem-
vindas. O email para correspondências em inglês 
pode ser encontrado em  http://www.iki.fi/liw/mail-
to-lasu.html. É necessário ler aquelas páginas para 
ultrapassa os filtros de emails indesejados. Para 
sugestões em português, por favor envie  as 
mensagens para info@conectiva.com.br.

Muitas pessoas ajudaram no desenvolvimento deste 
livro, direta ou indiretamente. Eu gostaria de 
agradecer especialmente a Matt Welsh pela 
inspiração e liderança na LDP, Andy Oram por levar-
me a trabalhar novamente com o seu valioso 
feedback,  Olaf Kirch por mostrar que isso poderia 
ser executado, e Adam Richter da Yggdrasil e 
diversas outras pessoas por me mostrarem que este 
trabalho poderia ser útil e interessante.  

Stephen Tweedie, H. Peter Anvin, Rémy Card, 
Theodore Ts'o, e Stephen Tweedie que me emprestaram 
seus trabalhos (e tornaram este livro menor e mais 
rico). Estou muito agradecido e peço desculpas por 
versões anteriores que possam estar sem os devidos 
créditos.

Adicionalmente gostaria de agradecer a Mark 
Komarinski por enviar seu material em 1993 e às 
muitas colunas de administração de sistemas do 
Linux Journal. Foram muito instrutivas e 
inspiradoras.

Muitos comentários úteis foram enviados por um 
grande número de pessoas. Não poderia enumerar 
todos eles, mas alguns, em ordem alfabética devem 
ser lembrados: Paul Caprioli, Ales Cepek, Marie-
France Declerfayt, Dave Dobson, Olaf Flebbe, Helmut 
Geyer, Larry Greenfield e seu pai, Stephen Harris, 
Jyrki Havia, Jim Haynes, York Lam, Timothy Andrew 
Lister, Jim Lynch, Michael J. Micek, Jacob 
Navia,Dan Poirier, Daniel Quinlan, Jouni K 
Seppänen, Philippe Steindl, G.B. Stotte. 

Peço desculpas aqueles que por ventura não tenham 
sido citados.


O Projeto de Documentação Linux (LDP)

O Projeto de Documentação Linux ou LDP, é um time 
de escritores, leitores e 
editores que trabalham juntos para prover uma 
documentação completa do sistema operacional Linux. 
O coordenado geral do projeto é Greg Hankins. 

Este manual é um de um conjunto  distribuído pela 
LDP, incluindo Guia do Usuário 
Linux, Guia de Administração do Sistema, Guia de 
Administração de Rede, e o Guia de Programadores. 
Estes manuais estão disponíveis em formatos LaTeX, 
dvi e postscript e disponíveis para FTP no 
sunsite.unc.edu, no diretório /pub/Linux/docs/LDP. 

Nós encorajamos qualquer um com pendor para escrita 
ou editoração, a juntar-se a 
nós para melhorar a documentação Linux. Caso você 
tenha um endereço email, pode contactar Greg 
Hankins em gregh@sunsite.unc.edu. 

Os Versos da LDP 

Algo  imenso
E belo,
Isto é escrever
Um livro.

Eu gostaria de cantar
Sobre o suor,
O sangue e as lágrimas,
Que foram derramados.

Começou no passado,
Mil novecentos e noventa e dois,
Quando usuários proclamavam
“Nós não podemos fazer nada!”

Ele queriam saber
Qual era a causa de seus problemas
E como resolvê-los
(para ontem).

Nós pusemos as respostas
Em um Linux FAQ,
Esperando termos resolvido
Qualquer necessidade de escrever novamente.

Isto é muito grande
Difícil de pesquisar
E não podemos ler,
De nenhum modo!

Então alguns de nós
Juntaram-se
(virtualmente, você sabe)
e começamos a LDP.

Começamos a escrever,
Ou a planejar, no mínimo,
Diversos livros,
Um para cada necessidade.

O começo foi divertido,
Muita conversa,
Uma  manchete,
Então freou!

O silêncio veio,
O trabalho começou,
Alguns escreveram menos,
Outros escreveram mais. 

Uma tela em branco,
Ó, isto é horrível,
Ela  prostada  lá
Rindo na minha cara.

Ainda esperamos,
O dia final.
Quando tudo estará pronto.

Até lá
Tudo o que temos
É um rascunho,
Para você comentá-lo!



Visão Geral do Linux

Deus olhou sobre tudo o que ele fez e viu que 
estava bom!
Genesis 1:31 


Este capítulo apresenta uma visão geral do Linux. 
Primeiramente, dos principais 
serviços disponibilizados pelo sistema operacional 
e após os programas que os implementam, porém sem 
um detalhamento muito profundo. O propósito deste 
capítulo é dar um entendimento do sistema como um 
todo, onde cada parte será descrita em detalhes 
mais adiante.


      
Diversas partes de um sistema operacional
          Partes importantes do kernel
          Principais serviços do kernel  
               init 
               acesso a partir de terminais
               Mensagens do Sistema 
               Comandos periódicos: cron e at               
                Interface gráfica
               Rede 
               Acesso via Rede 
               Sistema de Arquivos de Rede (NFS) 
               Correio eletrônico
               Impressão
A estrutura do sistema de arquivos 


Diversas partes de um sistema operacional

Um sistema operacional UNIX consiste de um kernel 
(kernel) e alguns programas de 
sistema. Há ainda aplicações que executam diversas 
tarefas. O kernel é o coração do sistema 
operacional. Ele mantém o controle dos arquivos em 
disco, programas que iniciam e são executados 
simultaneamente, aloca memória e outros recursos 
para os diversos processos, recebe e envia pacotes 
da rede, etc... O kernel faz muito pouco sozinho, 
na verdade ele provê ferramentas com as quais os 
serviços podem ser executados. Ele ainda evita que 
qualquer um possa acessar diretamente os 
componentes de hardware, forçando o uso das 
ferramentas disponíveis, provendo assim alguma 
proteção para os usuários. As ferramentas 
disponibilizadas pelo kernel são utilizadas através 
das chamadas de sistema  (system calls). Para 
maiores informação veja o Apêndice Comandos e 
Programas Relacionados ou páginas de manual on-
line, seção 2, para maiores informações sobre elas.

Os programas de sistema utilizam as ferramentas 
disponibilizadas pelo kernel 
para implementar os diversos serviços necessários 
para o sistema operacional. Programas de sistema e 
todo os demais, são executados “sobre o kernel”, o 
que é denominado em modo usuário. A diferença entre 
programas do sistema e aplicações 
está no seu objetivo: as últimas visam que coisas 
úteis sejam realizadas (como  por ex. brincar, caso 
seja um jogo), enquanto os primeiros são 
necessários para que o sistema operacional possa 
funcionar. Um editor de textos é uma aplicação, 
telnet é um programa do sistema. A diferença é 
algumas vezes muito pequena, e somente é importante 
para classificadores compulsivos.

Um sistema operacional pode ainda conter 
compiladores e suas bibliotecas correspondentes 
(GCC e C no caso do Linux), ainda que nem todas as 
linguagens devam ser parte integrante do sistema 
operacional. Documentação e mesmo jogos podem  
fazer parte. Tradicionalmente o sistema operacional 
tem sido definido como o  conteúdo nos discos de 
instalação, o que no Linux pode variar bastante, 
já que ele pode ser encontrado em diverso sites ao 
redor do mundo. 

Partes importantes do kernel

O kernel do Linux é formado por diferentes partes: 
gerenciador de processos, gerenciador de memória, 
controle de dispositivos de hardware, controle de 
sistemas de arquivos, gerenciador de rede e vários 
outros. A figura 2.1 mostra alguns deles.

  
Figura 2.1: algumas das partes mais importantes do 
kernel do Linux

Provavelmente as partes mais importantes do kernel 
(nada funciona sem elas) são o gerenciador de 
memória, responsável pela liberação de memória para 
a área de swap (swap),  para os processos, para os 
demais componentes do kernel e para o cache de 
disco,  e o gerenciador de processos, responsável 
por criar os processos e implementar a capacidade 
de execução de diversas tarefas simultaneamente, 
através da swap dos processos ativos no 
processador. 

No  nível mais baixo, o kernel contém componentes 
de controle (drivers) para 
cada dispositivo de hardware suportado. Uma vez que 
existem inúmeros hardwares, o número de programas 
de controle também é muito grande. A similaridade 
de funcionalidades permite que se tenham classes de 
programas de controle para suportar funções 
similares, ou seja cada membro de uma determinada 
classe de hardwares tem a mesma interface com o 
resto do kernel, mas diferem somente no que é 
necessário para implementar as suas características 
específicas. Por exemplo todos os discos rígidos 
parecem iguais para o resto do kernel, isto é todos 
têm operações como “inicializar o dispositiivo” , 
“ler setor N” e “gravar setor N”.

Alguns serviços de softwares disponibilizados pelo 
kernel tem propriedades similares, e podem ser 
também derivados em classes. Por exemplo, os 
diversos protocolos de rede são abstraídos em uma 
interface de programação, a biblioteca BSD. Outros 
exemplo é a camada do sistema virtual de arquivos 
(VFS), a qual abstrai as operações dos diversos 
sistemas de arquivos. Quando alguma entidade tenta 
utilizar um sistema de arquivos, a requisição é 
direcionada ao VFS, a qual  a reencaminha  para o 
dispositivo de controle adequado ao sistema de 
arquivos solicitado.    


Principais serviços em um sistema Unix

Esta seção descreve como partes importantes dos 
serviços UNIX são implementadas. Elas são descritas 
mais detalhadamente nos próximos capítulos.


===================================================
====================

  
               init 
               acesso a partir de terminais
               Mensagens do sistema 
               Comandos periódicos: cron e at               
               Interface gráfica
               Rede 
               Acesso via Rede 
               Sistema de Arquivos de Rede (NFS) 
               Correio eletrônico
               Impressão



init

O mais importante serviço isolado disponível em um 
sistema UNIX é denominado init. Init é o primeiro 
processo iniciado em todos os sistemas UNIX, após a 
carga do kernel do sistema. Quando o init começa, 
ele continua o processo de inicialização do 
sistema, executando diversas tarefas necessárias ao 
funcionamento do sistema (checando e montando 
sistemas de arquivos, iniciando programas 
residentes, etc...)

A lista exata de tarefas que o init realiza depende 
do nível de execução do sistema. Ele provê o 
conceito de modo monousuário, no qual ninguém além 
do superusuário (root) pode entrar no sistema, 
sendo utilizado somente o ambiente de trabalho da 
console do sistema, ou o modo multiusuário, o modo 
padrão de início do sistema. Algumas versões 
generalizam isso, denominando como níveis de 
execução; sendo os modos mono e multiusário 
considerados como níveis, podendo existir diversos 
outros, como por exemplo, aquele que permita a 
execução do X (interface gráfica) na console. 

Em uma operação normal, o init certifica-se que os 
programas getty estão sendo 
executados (para permitir o acesso dos usuários) e 
“adota processos órfãos” (processos cujos programas 
que os iniciaram (chamados pais) “morreram” (não 
estão mais sendo executados)). Em UNIX todos os 
processos (programas) estão em uma estrutura em 
árvore, devendo todos eles terem um "pai".

Quando um sistema é desligado, é o init que se 
encarrega de finalizar todos os outros processos, 
desmontando todos os sistemas de arquivos e parando 
o processador junto com tudo o mais que esteja 
sendo executado.


acesso a partir de terminais

Os accessos a partir de terminais (via linhas 
seriais) e através da console (quando não se está 
executando o X (interface gráfica)) são 
disponibilizados pelo programa getty. O init inicia 
uma instância distinta do getty para cada terminal, 
nos quais o acesso é permitido. O programa getty lê 
o nome do usuário e executa o programa de acesso 
(login), o qual por sua vez processa a validação da 
senha do usuário. Caso usuário e senha sejam 
válidos, o programa de acesso inicia o shell do 
usuário (programa de ambiente de trabalho). Quando 
um shell é finalizado, isto é, o usuário sai do 
sistema, ou quando o  login é finalizado porque 
usuário ou senha são incorretos, o init avisa do 
ocorrido na sáida padrão e inicia uma nova 
instância do getty. O kernel não tem conhecimentos 
dos acessos, pois tudo isso é controlado pelos 
programas de sistema. 

Mensagens do Sistema

O kernel e muitos programas do sistema produzem 
avisos, mensagens de erro, e outros comunicados. É 
importante que estas mensagens sejam lidas 
freqüentemente, mesmo que muito tempo após da sua 
ocorrência. Para que isso seja possível elas são 
gravadas pelo programa syslog em um arquivo. O 
syslog pode ser configurado para ordenar as 
mensagens em diferentes arquivos de acordo com o 
nível de importância ou origem. Por exemplo, 
mensagens do kernel são freqüentemente direcionadas 
para arquivos distintos, desde que esse tipo de 
mensagem é mais importante e é necessário que seja 
lida com mais freqüência do que as de outras 
origens.   


Comandos periódicos: cron e at

Tanto administradores do sistema como usuários 
comuns necessitam, com freqüência executar 
periodicamente determinados programas ou comandos. 
Por exemplo o administrador do sistema pode 
executar um comando para limpar os diretórios que 
contenham arquivos temporários antigos (/tmp e 
/var/tmp), evitando assim que os discos rígidos 
fiquem cheios de arquivos sem utilizadade, uma vez 
que nem todos os programas apagam os arquivos 
temporários após a sua execução.  

O serviço cron foi criado para atender a essa 
demanda. Cada usuário tem uma tabela do cron 
(crontab) à sua disposição, onde se pode listar os 
comandos desejados e a freqüência com que eles 
devem ser executados. O programa residente (daemon) 
cron é o encarregado de executar os comandos no 
dias e horários definidos.

O serviço at é similar ao cron, mas está limitado à 
uma única execução: o comando é executado em um 
determinado horário fornecido, mas não repetidas 
vezes.


Interface gráfica

UNIX e Linux não incorporam a interface do usuário 
ao kernel. Ela é implementada pelos programas a 
nível de usuário, tanto a interfaces texto como a 
gráfica.

Esta configuração ganha em flexibilidade, mas tem a 
desvantagem de, pela facilidade de implementação,  
se ter uma multiplicidade exagerada de interfaces, 
uma para cada programa, tornando o sistema mais 
complexo de ser utilizado.  

O ambiente gráfico primário usado com Linux é 
chamado X Window (resumido por X), o qual na 
verdade não implementa a interface gráfica, somente 
disponibiliza as ferramentas para tal. As 
interfaces gráficas mais populares para Linux são: 
KDE, Gnome, Motif, Open Look, etc...  

Rede

Rede pode ser definida como a conexão entre dois ou 
mais computadores, de forma que eles possam 
comunicar-se entre si. Os métodos de conexão e 
comunicação são um pouco complexos, porém os 
resultados são muito úteis.

Sistemas UNIX têm muitas facilidades para 
implantação de redes. Os serviços mais básicos, 
como impressão, cópias de segurança, sistemas de 
arquivos, etc... podem ser realizados por seu 
intermédio. Isso pode tornar a administração do 
sistema mais simples, uma vez que permite a sua 
realização de forma centralizada, mantendo os 
benefícios do processamento distribuído e do uso de 
microcomputadores, como por exemplo menores custos 
e melhor tolerância à falhas.  
 
Ainda que este livro aborde superficialmente o 
tema, veja o Guia do Administrador de Redes para 
maiores informações, inclusive uma descrição mais 
profunda sobre o funcionamento de redes.

Acesso via Rede

Acessos via rede são um pouco diferentes dos 
acessos normais, onde há uma linha serial distinta 
para cada terminal, através da qual é possível 
acessar o sistema. Nos casos de acesso via rede, 
para cada usuário que conecta-se ao sistema, há uma 
conexão virtual separada, podendo haver 
(teoricamente) um número ilimitado delas. Não é 
mais possível executar um getty para cada conexão 
virtual possível, pois além disso há muitas formas 
diferentes de conectar-se via rede, sendo o telnet 
e rlogin os serviços TCP/IP mais utilizados. 

Acessos via rede, ao invés de um único programa 
getty, utilizam um programa residente para cada 
tipo de acesso (por exemplo telnet e rlogin 
utilizam programas diferentes), os quais monitoram 
as tentativas de acesso. Quando percebem alguma, 
iniciam uma nova instância de si próprios para 
controlar uma única conexão, enquanto a instância 
original continua monitorando novas tentativas. As 
novas instâncias funcionam de maneira similar ao 
getty. 


Sistema de Arquivos de Rede (NFS)
  
Uma das maiores facilidades disponibilizadas pelos 
serviços de rede é o compartilhamento de arquivos 
através de sistemas de arquivos em rede. O mais 
usado é conhecido como NFS (Network File System), 
tendo sido desenvolvido pela Sun.

Com um sistema de arquivos em rede, qualquer 
operação com arquivos executada por um programa em 
uma determinada máquina, pode ser enviada pela rede 
para outro computador. Esse procedimento pode 
“enganar” o programa, levando-o a “pensar” que 
todos os arquivos encontram-se no mesmo equipamento 
onde ele está sendo executado. Isso torna o 
compartilhamento de informações muito simples, já 
que não requer nenhuma modificações na programação.  
 
Correio eletrônico

Correio eletrônico é normalmente o mais importante 
meio de comunicação entre os usuários. Uma mensagem 
eletrônica fica armazenada em arquivos com formatos 
especiais, e programas de correio específicos são 
utilizados para ler e enviar mensagens.

Cada usuário tem uma caixa de entrada de mensagens 
(um arquivo com um formato especial) onde todas as 
novas mensagens são armazenadas. Quando alguém 
envia uma nova mensagem, o programa de correio 
localiza a caixa do destinatário e adiciona a nova 
mensagem ao arquivo de recebidas. Caso a caixa de 
entrada esteja em outra máquina, a mensagem é 
enviada através da rede para o equipamento que 
mantém os arquivos de correio do destinatário.    

O sistema de correio é constituído por uma série de 
programas. A entrega de mensagens para usuário 
remotos é realizada por um programa específico (o 
agente de transferência de mensagens – MTA, como 
por exemplo sendmail ou qmail), enquanto os 
programas de usuários são também distintos (agente 
de correio do usuário – MUA, como por exemplo pine, 
elm, kmail, Netscape,...). As caixas postais são 
normalmente armazenadas no diretório 
/var/spool/mail.


Impressão

Hoje somente um usuário pode utilizar uma 
impressora a cada vez, mas seria antieconômico não 
compartilhar esse recurso entre os demais usuários 
da rede. A impressora é então gerenciada por um 
software que implementa o conceito de fila de 
impressão: todos os trabalhos são colocados em uma 
fila e toda vez que a impressora finaliza um 
trabalho de impressão, o seguinte é iniciado 
automaticamente.  Isso evita que os usuários tenham 
que organizar esta fila ou que haja problemas no 
controle do uso da impressora. 

O software de fila de impressão também grava os 
trabalhos de impressão em disco, ou seja os textos 
são mantidos em um arquivo enquanto estejam na fila 
de impressão. Isso permite que uma aplicação 
transfira rapidamente os trabalhos de impressão 
para o software gerenciador da fila, não tendo que 
esperar que o trabalho de impressão seja finalizado 
para continuar a sua execução. 


A estrutura do sistema de arquivos 


O sistema de arquivos é dividido em diversas 
partes, normalmente utilizando uma estrutura em 
árvore, com um sistema de arquivos chamado raiz 
(root), simbolizado por '/'. Debaixo deste podemos 
ter diversos outros, como  por exemplo: /bin, /lib, 
/etc, /dev, etc.... Um sistema de arquivos /usr 
pode conter programas e dados não atualizáveis, o 
/var pode conter dados variáveis (como arquivos de 
históricos) e um sistema /home pode ter arquivos 
pessoais de todos os usuários. Dependendo da 
configuração de hardware e das definições do 
administrador do sistema, a divisão pode variar 
substancialmente, sendo possível inclusive que 
todos os conteúdos estejam em um único sistema de 
arquivos. 

Adiante apresentaremos a estrutura dos sistemas de 
arquivos em mais detalhes, sendo que o documento 
que descreve o Sistema de Arquivos Padrão do Linux 
cobre o tema mais profundamente.



Visão geral da árvore de diretórios 

“ Dois dias depois, havia Pooh,
sentado em seu banco, balançando suas pernas,
e havia ainda, ao seu lado, quatro potes de mel...”
(A.A. Milne) 

Este capítulo descreve a importância dos 
componentes padrões da árvore de diretórios Linux, 
baseado no Sistema de Arquivos Padrão do Linux - 
FSSTND. Ele descreve a forma usual de dividir a 
árvore de diretórios em diferentes sistemas de 
arquivos com diferentes propósitos, justificando a 
adoção de cada divisão. Algumas opções alternativas 
são também descritas.


===================================================
=====================
       
         Background
         O sistema de arquivos raiz
              O diretório /etc
              O diretório /dev
         O sistema de arquivos /usr
         O sistema de arquivos /var
         O sistema de arquivos /proc



Background

Este capítulo está de certa forma baseado no 
Sistema de Arquivos Padrão do Linux  (FSSTND), 
versão 1.2, o qual busca definir uma padronização 
para a organização da árvore de diretórios Linux. 
Tal padrão tem a função de facilitar o 
desenvolvimento e o porte para o Linux, assim como 
a administração de máquinas Linux, uma vez que tudo 
estará localizado em caminhos conhecidos. Não há 
obrigatoriedade da adoção desta padronização,  nem 
nada que obrigue quem quer que seja a utilizá-la, 
além do bom senso, uma vez que ela tem o apoio da 
maioria, senão da totalidade, das distribuições 
Linux. Portanto não é aconselhável alterar o padrão 
da árvore de diretórios, a menos que se tenha 
razões muito fortes para isso. O FSSTND busca 
manter os padrões antigos do UNIX, conciliando-os 
com novas demandas, fazendo com o que o Linux 
torne-se mais familiar para aqueles com alguma 
experiência em outros UNIX e vice e versa.

Este capítulo não é tão detalhado como o FSSTND. Um 
administrador de sistemas deveria  ler aquela 
especificação  para seu um completo entendimento. 
Também não são descritos todos os arquivos em 
detalhes. A intenção é de apresentar uma visão 
geral, sob um ponto de vista de sistemas de 
arquivos. Maiores informações sobre cada arquivo 
podem ser encontradas em outros pontos deste manual 
ou nas páginas de manual on-line do Linux.

A árvore de diretórios deve ser dividida em partes 
menores, cada uma com o seu próprio disco ou 
partição, facilitando questões como limites de 
tamanhos de disco ou a geração de cópias de 
segurança. Os maiores sistemas de arquivos são o 
raiz (root), /usr , /var , e /home (vide figura 
3.1). Cada parte tem um propósito diferente. O 
desenho da árvore foi idealizado para funcionar 
também em rede, tanto em máquinas que necessitem 
compartilhar partes do sistemas de arquivos com 
autorização somente de leitura (por exemplo um CD-
ROM), assim como 
em máquinas com sistemas de arquivos de rede (NFS). 


Figura 3.1: Partes da árvore de diretórios Unix. 
Linhas tracejadas indicam os limites da partições.

As regras para tal divisão são descritas a seguir.

O sistema de arquivos raiz (root) é específico de 
cada máquina (é geralmente armazenado em um disco 
local, apesar de poder estar presente em um disco 
em memória ou em uma unidade de rede) e contém os 
arquivos necessários para a inicialização do 
sistema e para permitir o acesso aos demais 
sistemas de arquivos. O conteúdo do raiz deverá ser 
suficiente ainda para que o sistema possa ser 
executado em modo monousuário. Ele contém ainda 
ferramentas para resolver eventuais problemas e 
recuperar arquivos a partir das cópias de 
segurança. 

O sistema de arquivos /usr contém os comandos, 
bibliotecas, páginas de manual e outros arquivos 
imutáveis, necessários para a operação normal do 
sistema. Os arquivos em /usr não devem ser 
específicos para uma determinada máquina e não 
devem ser alterados durante o uso normal. Isso 
permite que estes arquivos possam ser 
compartilhados através da rede, o que pode ser 
bastante interessante pela possível economia de 
espaço em disco (o /usr pode conter facilmente 
centenas de megabytes) e torna a administração mais 
simples (uma vez que somente o /usr na máquina 
principal necessita ser atualizado e mantido em 
dia). Mesmo que este sistema de arquivos esteja no 
disco local, ele deve ser montado com autorização 
somente de leitura, para diminuir a chance de 
corrupção de arquivos durante um eventual acidente.   

O sistema de arquivos /var contém arquivos 
mutáveis, como diretórios de arquivos temporários 
(spool) para correio eletrônico, impressões, logs, 
páginas de manual formatadas, etc... 
Tradicionalmente o conteúdo de /var estaria em 
algum lugar sob o /usr, poprém isso torna 
impossível montar o /usr com permissões somente de 
leitura  

O sistema de arquivos /home contém os diretórios 
pessoais dos usuários, ou seja, todas as 
informações armazenadas por estes no sistema. 
Separar diretórios pessoais em sua própria árvore 
de diretórios ou sistema de arquivos simplifica a 
geração de cópias de segurança, uma vez que outras 
partes do sistema normalmente não necessitam serem 
copiadas com a mesma frequência. Um /home muito 
grande pode ser dividido em diversos sistemas de 
arquivos que requerem um nível adicional na sua 
denominação, como por exemplo /home/alunos ou 
/home/funcionários.

Apesar das diferentes partes acima serem chamadas  
de sistemas de arquivos, não há obrigatoriedade de 
elas estejam assim separadas. Elas podem facilmente 
estarem no mesmo sistema em uma pequena máquina 
utilizada por um único usuário que deseje mantê-las 
de uma forma mais simplificada. A árvore de 
diretórios pode estar dividida ainda em diferentes 
sistemas de arquivos, dependendo do tamanho de cada 
disco e de quanto espaço será alocado para cada 
finalidade. A parte importante é que os nomes 
padrões sejam mantidos e sejam utilizados da forma 
correta.   
 
A estrutura dos sistemas de arquivos Unix prevê um 
agrupamento de acordo com o propósito. Ou seja os 
comandos estão todos em uma determinada área, todos 
os arquivos de dados em uma outra, documentação em 
uma terceira, e assim por diante. Uma alternativa 
seria agrupar os arquivo de acordo com os programas 
a que eles pertençam, isto é, os arquivo do Emacs 
estariam todos em um único diretório, todos os 
arquivos de TeX em outro, e assim por diante. O 
problema dessa abordagem reside no compartilhamento 
de arquivos (um arquivo de programas contém todos 
os tipos de arquivos: estáticos, dinâmicos, 
compartilhados e não compartilhados,...) e algumas 
vezes em encontrar alguns desse arquivos (por 
exemplo uma página de manual a ser pesquisada em um 
grande número de diretórios).   


O Sistema de arquivos raiz (root)

O sistema de arquivos raiz deve geralmente ser 
pequeno, deste que contém  somente os arquivos 
fundamentais para o início e funcionamento do 
sistema. Um sistema pequeno e pouco modificado tem 
uma chance maior de não ter problemas. Um sistema 
de arquivos raiz corrompido pode geralmente 
significar que o sistema não poderá ser 
inicializado, exceto através de medidas especiais 
(como por exemplo, por disquetes).

O diretório raiz geralmente não contém nenhum 
arquivos, exceto talvez pela imagem de 
inicialização (boot) do sistema, normalmente 
chamada /vmlinuz. Todos os outros arquivos estão em 
subdiretórios do raiz:

/bin  
Comandos necessários durante a inicialização do 
sistema que podem ser utilizados pelos usuários 
(provavelmente após a ativação do sistema).
/sbin  
Similar ao /bin, porém os comandos não são 
destinados aos usuários comuns, apesar de poderem 
ser utilizados por estes se necessário.
/etc  
Arquivos de configuração específicos da máquina.
/root  
O diretório pessoal do superusuário (root).
/lib  
Bibliotecas compartilhadas necessárias aos 
programas residentes no sistema de arquivos raiz.
/lib/modules  
Módulos dinâmicos e carregáveis pelo kernel, 
especialmente aqueles necessários para inicializar 
o sistema em caso de acidentes (por exemplo 
programas de controle de sistemas de arquivos de 
redes).
/dev  
Arquivos de controle de dispositivos. 
/tmp  
Arquivos temporários. Programas que são executados 
após a ativação do sistema devem usar o /var/tmp e 
não o /tmp, uma vez que provavelmente encontrarão 
mais espaço disponível naquele sistema de arquivos.
/boot  
Arquivos utilizados pelo carregador de 
inicialização do sistema, por exemplo, LILO. 
Imagens do kernel são normalmente mantidas aqui ao 
invés de no diretório raiz. Casa haja inúmeras 
imagens, o diretório pode facilmente crescer 
demasiadamente, sendo aconselhável mantê-lo em um 
sistema de arquivos à parte. Outra razão é estar 
seguro de que as imagens do kernel estejam nos 
primeiros 1024 cilindros de um disco IDE.
/mnt 
Ponto para montagens temporárias realizadas pelo 
administrador do sistema. Programas usualmente não 
prevêem a montagem automática em /mnt. Este deve 
estar dividido em subdiretórios, como por exemplo 
/mnt/dosa sendo uma unidade de disquetes utilizando 
um sistemas de arquivos MS-DOS, e /mnt/exta pode 
ser a mesma unidade,porém com uma extensão ext2.
/proc, /usr, /var e /home
Pontos de montagem para outros sistemas de 
arquivos.

O diretório /etc 

O diretório /etc contém inúmeros arquivos. Alguns 
deles estão descritos a seguir. Para outras 
descrições é necessário determinar a quais 
programas eles pertencem e ler as páginas de manual 
daqueles programas. Muitos arquivos de configuração 
de programas de rede estão em /etc, assim como 
encontram-se descritos no Guia de Administração de 
Rede.  

/etc/rc  ou /etc/rc.d  ou /etc/rc?.d  
São arquivos de lote (scripts) ou os diretórios de 
arquivos de lote que são executados no início do 
sistema. Veja o capítulo sobre o processo init para 
maiores informações.  

/etc/passwd  
A base de dados de usuários, cujos campos definem 
nome do usuário, nome real, diretório pessoal, 
senha cifrada e outras informações específicas de 
cada usuário. O formato está documentado na página 
de manual do comando passwd (man passwd) ou no 
Apêndice de Comandos e Programas Relacionados.

/etc/fdprm  
A tabela de parâmetros de disquetes. Descreve os 
diferentes formatos disponíveis. É utilizada pelo 
programa setfdprm. Para maiores informações veja a 
página de manual on-line setfdprm ou no Apêndice de 
Comandos e Programas Relacionados. 

/etc/fstab  
Lista os sistemas de arquivos montados 
automaticamente, durante a inicialização do 
sistema, pelo comando mount -a (em etc/rc ou 
arquivo de inicialização similar). Sob Linux, 
contém ainda informações sobre as áreas de swaps 
(swap) usadas automaticamente pelo comando swapon -
a. Veja a página de manual do comando mount para 
maiores informações ou o Apêndice de Comandos e 
Programas Relacionados.

/etc/group  
Similar ao /etc/passwd, porém descreve grupos ao 
invés de usuários. Veja a página de manual de grupo 
para maiores informações ou o Apêndice de Comandos 
e Programas Relacionados.

/etc/inittab  
Arquivo de configuração do init.

 /etc/issue  
Saída do programa getty antes do prompt de acesso 
ao sistema. Normalmente contém uma breve descrição 
ou mensagens de boas-vindas. O conteúdo fica a 
critério do administrador do sistema.

/etc/magic  
O arquivo de  configuração para o comando file. 
Contém as descrições de vários formatos de 
arquivos. Veja as páginas de manual de magic e file 
para maiores informações ou o Apêndice de Comandos 
e Programas Relacionados.
 
/etc/motd  
A mensagem do dia, automaticamente apresentada após 
um acesso bem sucedido. Conteúdos são a critério do 
administrador do sistema. Normalmente são usadas 
para enviar informações para os usuários, como por 
exemplo avisos de desligamentos planejados.

/etc/mtab  
Lista dos sistemas de arquivos montados. 
Inicialmente configurado por programas de lotes e 
posteriormente atualizado pelo comando mount. Usado 
quando uma lista de sistemas de arquivos é 
necessária, como por exemplo pelo comando df.

/etc/shadow  
Arquivos de segurança de senhas em sistemas onde o 
software shadow password esteja instalado. Esta 
opção move as senhas cifradas de /etc/passwd para o 
arquivo /etc/shadow, o qual somente pode ser lido 
pelo superusuário (root). Isso dá uma maior 
segurança às senhas dos usuários.

/etc/login.defs  
Arquivo de configuração do programa de acesso ao 
sistema (login).

/etc/printcap  
Similar ao /etc/termcap, mas direcionado a 
impressoras e com sintaxe diferente.  

/etc/profile , /etc/csh.login , /etc/csh.cshrc  
Arquivos executados no acesso ou em tempo de início 
do sistema pelos ambientes de trabalho Bourne Shell 
ou C Shell. Estes permitem ao administrador 
utilizar padrões de variáveis para todos os 
usuários. Veja as páginas de manual específicas dos 
respectivos ambientes ou o Apêndice de Comandos e 
Programas Relacionados.

/etc/securetty  
Identifica terminais seguros, ou seja aquele nos 
quais é permitido que o superusuário acesso o 
sistema. Normalmente somente as consoles virtuais 
são listadas, tornando muito difícil obter os 
privilégios de superusuário do sistema através da 
rede ou de uma conexão via modem.

/etc/shells  
Lista os ambientes de trabalho (shells) 
autorizados. O comando chsh permite que os usuários 
mudem o ambiente padrão durante o acesso ao 
sistema, porém somente para aqueles listados neste 
arquivo. ftpd, o servidor de processos que provê os 
serviços de transferência de arquivos em uma 
máquina, checará se o ambiente do usuário está 
listado em /etc/shells e não aceitará acessos que 
não estejam lá presentes.

/etc/termcap  
O arquivo de configuração de terminal. Descreve as 
diversas seqüências de "escape" para os diversos 
terminais. Os programas ao invés de escreverem 
diretamente uma seqüência que somente funcionaria 
em determinado tipo de terminal, devem buscar a 
seqüência correta para fazer o que quer que seja em 
/etc/termcap, resultando que devem funcionar na 
maioria dos terminais suportados. Veja as páginas 
de manual termcap, curs_termcap e terminfo para 
maiores informações ou no Apêndice de Comandos e 
Programas Relacionados. 
	
O diretório /dev 
O diretório /dev contém arquivos especiais 
(drivers) de controle de todos os dispositivos. 
Estes arquivos utilizam uma denominação especial 
descrita na lista Device. Os arquivos de controle 
são criados durante a instalação, e posteriormente 
através do programa /dev/MAKEDEV. O 
/dev/MAKEDEV.local é um programa de lotes escrito 
pelo administrador do sistema e que cria somente os 
arquivos de controles de dispositivos locais que 
não façam parte do padrão do MAKEDEV, como arquivos 
de controle para dispositivos especiais.

O sistema de arquivos /usr
O sistema de arquivos /usr normalmente tem um 
tamanho razoável, uma vez que todos os programas 
estão ali instalados. Todos os arquivos em /usr 
normalmente vem com a distribuição Linux, sendo que 
programas instalados localmente estão normalmente 
em /usr/local. Isso torna a atualização do sistema 
possível para uma nova versão da distribuição ou 
mesmo para uma distribuição completamente nova, sem 
que seja necessário instalar todos os programas 
novamente. Alguns dos subdiretórios de /usr estão 
listados a seguir (outros menos importantes podem 
ser encontrados no FSSTND para maiores 
informações). 

/usr/X11R6  
Os arquivos do sistema X Window. Para simplificar o 
desenvolvimento e a instalação do X, seus arquivos 
não foram integrados ao restante do sistema. Há uma 
árvore de diretórios sob /usr/X11R6 similar ao 
/usr.

/usr/X386  
Similar ao /usr/X11R6 , mas destinado a versão 5 do 
X11.
 
/usr/bin  
Praticamente todos os comandos de usuários. Alguns 
outros podem ser encontrados em /bin ou 
/usr/local/bin.

/usr/sbin  
Comandos de administração do sistema que não 
necessitem estar no sistema de arquivos raiz, como 
por exemplo programas de servidores.

/usr/man , /usr/info , /usr/doc  
Páginas de manual, documentos Info GNU e diversos 
outros documentos, respectivamente.
 
/usr/include  
Arquivos header para a linguagem de programação C. 
Este diretório deveria estar sob /usr/lib, porém 
por tradição tem sido suportado neste formato.

/usr/lib  
Arquivos estáticos de dados para programas e 
subsistemas, incluindo alguns arquivos de 
configuração de todo o site. O nome lib vem de 
library (biblioteca), pois originalmente as 
bibliotecas de programação eram armazenadas neste 
subdiretório.
 
/usr/local  
O local para softwares instalados localmente e 
outros arquivos.

O sistema de arquivos /var 
O sistema de arquivos /var contém dados que são 
alterados quando o sistema está sendo executado. É 
específico de cada sistema, ou seja, não 
compartilhado através da rede com outros 
equipamentos.

/var/catman  
Um cache para páginas de manual que são formatadas 
quando solicitadas. Os fontes para as páginas são 
armazenados em /usr/man/man*, sendo que algumas 
páginas podem vir pré-formatadas, estando 
armazenadas em /usr/man/cat*.  Outras páginas 
necessitam ser formatadas quando acessadas, sendo 
que a versão final fica armazenada em /var/man, 
fazendo com outro usuário que necessite de uma 
versão formatada, tenha ela pronta e disponível. O 
diretório /var/catman é freqüentemente esvaziado, 
da mesma forma que os arquivos temporários.   

/var/lib  
Arquivos que mudam enquanto o sistema é executado 
normalmente.
 
/var/local  
Dados variáveis para programas que estejam 
instalados em /usr/local, por exemplo programas que 
foram instalados pelo administrador do sistema. 
Note-se que mesmo quando instalado localmente estes 
programas podem usar ainda outros diretórios /var, 
como por exemplo /var/lock.

/var/lock  
Arquivos de controle. Muitos programas seguem uma 
convenção de criarem arquivos em /var/lock para 
indicar que eles estão utilizando um dispositivo em 
particular ou um determinado arquivo. Outros 
programas perceberão a existência do arquivo de 
controle e não tentarão utilizar o mesmo 
dispositivo ou arquivo enquanto o arquivo existir.

/var/log  
Arquivos de históricos de vários programas, 
especialmente o de acesso (var/log/wtmp, o qual 
registra todas as entradas e saídas do sistema) e 
syslog (var/log/messages, o qual contém as 
mensagens do kernel e programas do sistema). 
Arquivos em /var/log podem crescer indefinidamente 
com frequência e podem requerer limpezas 
periódicas.  

/var/run  
Arquivos que contém informações sobre o sistema e 
que são válidas até a próxima inicialização. Por 
exemplo /var/run/utmp contém informações sobre os 
usuários atualmente conectados.

/var/spool  
Diretórios de mensagens, notícias, filas de 
impressão e outros trabalhos em fila. Cada 
funcionalidade tem o seu próprio subdiretório sob 
/var/spool, como por exemplo as mensagens de 
correio eletrônico estão armazenadas em 
/var/spool/mail.  

/var/tmp  
Arquivos temporários que sejam muito grandes ou que 
necessitem existir por um período maior que o 
definido para /tmp. Note-se que o administrador do 
sistema poder não permitir arquivos muitos antigos 
também em /var/tmp.  

O sistema de arquivos /proc 

O sistema de arquivos /proc contém um conjunto de 
arquivos virtual. Na verdade ele não existe em um 
disco rígido, mas ao invés é criado em memória pelo 
kernel, sendo usado para prover informações sobre o 
sistema (originalmente sobre os processos, daí a 
origem de seu nome). Alguns dos arquivos mais 
importantes e diretórios são detalhados abaixo. 
Este sistema de arquivos é descrito mais 
detalhadamente na página de manual proc ou no 
Apêndice de Comandos e Programas Relacionados.

/proc/1  
Um diretório com as informações do processo número 
1 (init). Cada processo tem um diretório embaixo de 
/proc, cujo nome equivale ao seu número de 
identificação.

/proc/cpuinfo  
Informações sobre o processador, tais como tipo, 
fabricante, modelo, e performance.
 
/proc/devices  
Lista de programas de controle de dispositivos 
configurados no kernel atualmente em execução.

/proc/dma  
Mostra quais canais DMA estão sendo utilizados no 
momento.
 
/proc/filesystems  
Sistemas de arquivos configurados no kernel.
 
/proc/interrupts  
Mostra quais interrupções estão em uso  e quantas 
existem.
 
/proc/ioports  
Apresenta quais portas de entrada e saída estão em 
uso no momento.
 
/proc/kcore  
Imagem da memória física do sistema. Tem exatamente 
o mesmo tamanho da memória física, mas não ocupa 
toda aquela área, sendo normalmente gerada durante 
o acesso por um determinado programa.

/proc/kmsg  
Mensagens de saída do kernel. São direcionadas 
também para o syslog.

 /proc/ksyms  
Tabela de símbolos para o kernel. 
 
/proc/loadavg  
A carga média do sistema, contendo três indicadores 
de quanto trabalho o sistema está executando no 
momento.

/proc/meminfo  
Informações sobre o uso de memória, tanto física 
como de virtual de swap (swap)

/proc/modules  
Descreve quais módulos estão carregados no momento.
 
/proc/net  
Informações sobre a situação dos protocolos de 
rede.
 
/proc/self  
Uma ligação simbólica para o diretório de processos 
(/proc). Quando dois processos acessam /proc, podem 
utilizar diferentes ligações, o que é conveniente 
para programas que utilizem este diretório como seu 
diretório de processos.
 
/proc/stat  
Diversas estatísticas sobre o sistema, como o 
número de páginações desde seu início, I/O, 
processos executados, etc...
 
/proc/uptime  
Tempo que o sistema está ativo.
 
/proc/version  
Versão do kernel do sistema.

Note-se que enquanto os arquivos acima são de fácil 
leitura, por estarem em formato texto, eles podem 
eventualmente estar em outros formatos, de leitura 
mais complexa. Há muitos comandos que lêem os 
arquivos acima e formatam o seu conteúdo para um 
melhor entendimento. Por exemplo o programa free lê 
o conteúdo de /proc/meminfo e converte as 
quantidades dadas em bytes em kilobytes, com  
algumas pequenas informações adicionais.





Usando discos e outros dispositivos de 
armazenamento

" Em um disco vazio pode-se pesquisar eternamente"

Ao instalar ou atualizar o sistema, é necessário 
ter uma quantidade razoável de espaço em disco. Ao 
gerar-se sistemas de arquivos em disco, inúmeros 
arquivos podem ser armazenados e espaços podem ser 
reservados para as diferentes partes do sistema. 
 
Este capítulo explica todas estas atividades. 
Normalmente, uma vez que o sistema esteja 
configurado, não é necessário executar esta 
atividade novamente, exceto ao se utilizar 
disquetes. Será necessário retornar a este capítulo 
caso um novo disco seja adicionado ao sistema ou se 
deseje refinar a utilização do disco já instalado.


As atividades básicas na administração dos discos 
são:
? Formatar o disco. Nesta atividade várias tarefas 
são executadas, como por exemplo a  checagem de 
setores defeituosos (a formatação hoje não é 
mais necessária para diversos discos rígidos).
? Particionar o disco. Indicado caso estejam 
previstas a execução de diversas tarefas 
independentes entre si. Uma razão para o 
particionamento é manter diferentes sistemas 
operacionais no mesmo disco, outra seria a 
manutenção de arquivos de usuários separados de 
arquivos do sistema, simplificando a geração de 
cópias de segurança e auxiliando na proteção dos 
arquivos do sistema operacional.
? Gerar um sistema de arquivos (de tipo mais 
adequado) para cada disco ou partição. O disco 
em si não tem significado para o Linux, até que 
um sistema de arquivos seja criado e acessado.
? Organizar diferentes sistemas de arquivos para 
formar uma única árvore de diretórios, 
automática ou manualmente montadas (note-se que 
sistemas de arquivos montados manualmente, 
necessitam ser desmontados da mesma forma). 

O capítulo 5 contém ainda informações sobre memória 
virtual e cache de disco, as quais são necessárias 
para se conhecer o correto uso do disco.

Neste capítulo explicaremo todo o necessário para 
conhecer discos rígidos, disquetes, CD-ROMs e 
unidades de fita.


=================================================== 

          Dois tipos de dispositivos
          Discos rígidos
          Discos flexíveis
          CD-ROM’s
          Fitas
          Formatação
          Partições 
               MBR, setores de inicialização e 
tabela de partições
               Partições lógicas e estendidas
               Tipos de partição
               Particionando um disco rígido
               Arquivos de dispositivos e partições
          Sistema de arquivos
              O que é um sistema de arquivos?
               Diversidade de sistemas de arquivos 
               Qual  sistema de arquivos deve ser 
usado?
               Criando um sistema de arquivos
               Montando um sistema de arquivos
               Verificando a integridade de um 
sistema de arquivos com fsck
               Verificando blocos com erro em 
discos rígidos
                Evitando fragmentação
                Outras ferramentas para todos 
sistemas de arquivos 
                Outras ferramentas para sistemas de 
arquivos ext2
          Discos sem sistemas de arquivos
          Alocando espaço em disco
               Esquemas de particionamento
               Requisitos de espaço      
               Exemplos de alocação de espaço em 
disco  
               Adicionado espaço em disco ao Linux
               Dicas para economizar espaço 
     

Dois tipos de dispositivos

Unix, e também o Linux, reconhecem dois tipos de 
dispositivos: de acesso randômico em blocos (como 
discos rígidos) e dispositivos a caracter (como 
fitas e linhas seriais), alguns dos quais podem 
também ser de acesso randômico, sendo outros de 
acesso sequencial. Cada dispositivo suportado é 
representado no sistema de arquivos como um arquivo 
de dispositivo. Ao ler ou gravar em um arquivo de 
dispositivo, as informações vão e vem para o 
dispositivo por ele representado. Desta forma 
nenhum programa especial (e nenhum método especial 
de programação, como descobrir interrupções ou 
vasculhar portas seriais) é necessário para acessar 
os dispositivos. Por exemplo para enviar um arquivo 
para uma impressora pode-se simplesmente comandar: 

     $ cat filename > /dev/lp1 
     $ 

e o conteúdo do arquivo será impresso (o arquivo 
obviamente deve estar em um formato ininteligível 
para a impressora). Note-se que não é exatamente 
uma boa idéia ter-se diversos arquivos direcionados 
para a impressora através do comando cat. Deve-se 
utilizar o comando lpr, que assegura que somente um 
arquivo será impresso por vez, e enviará o arquivo 
seguinte imediatamente após a conclusão da 
impressão do anterior. Algo similar pode ser 
necessário para a maioria dos dispositivos. Na 
verdade, raramente os arquivos de dispositivos são 
utilizado diretamente. 

Desde que os dispositivos são apresentados como 
arquivos no sistema de arquivos (no diretório 
/dev), é fácil verificar quais dispositivos existem 
utilizando-se por exemplo  o comando ls ou outro 
similar. Na saída do comando ls -l, a primeira 
coluna indica o tipo de arquivo e suas permissões. 
Um exemplo ao examinar-se um dispositivo serial:

$ ls -l /dev/cua0 
crw-rw-rw- 1 root uucp 5, 64 Nov 30 1993 /dev/cua0 
$ 

O primeiro caracter na primeira coluna acima, isto 
é `c' em crw-rw-rw-, mostra-nos o tipo do arquivo, 
neste caso um dispositivo a caracter. Para arquivos 
comuns o primeiro caracter será `-', para 
diretórios será 'd' e para dispositivos em blocos 
será 'b'. Verifique a página de manual on-line do 
comando ls para maiores detalhes ou o Apêndice de 
Comandos e Programas Relacionados.

Veja que normalmente todos os arquivos de 
dispositivos existem mesmo que o dispositivo em si 
não esteja instalado. Quer dizer que mesmo que 
exista um arquivo /dev/sda, não significa que 
realmente haja um disco SCSI instalado. Ter-se 
todos os arquivos de dispositivos gerados durante a 
instalação torna-a mais simples, assim como 
facilita a adição de novos componentes de hardware, 
pois não há necessidade de encontrar os parâmetros 
corretos para criar os arquivos de novos 
dispositivos.

Discos Rígidos

Esta sub-seção introduz terminologias relacionadas 
com discos rígidos. Caso estes termos e conceitos 
já sejam de seu conhecimento, pode-se passar 
diretamente para a próxima sub-seção. 


A figura 4.1 apresenta um esquema das partes 
importantes de um disco rígido. Ele consiste em um 
ou mais pratos circulares, cada um com ambas as 
faces coberta por uma substância magnética usada 
para a gravação de dados. Para cada face, há uma 
cabeça de leitura e gravação que examina ou altera 
os dados ali gravados. Os pratos giram em um eixo 
comum e tipicamente a velocidade é de 3.600 
rotações por minuto, sendo que discos de alta 
performance atingem velocidades maiores. As cabeças 
movimentam-se ao longo do raio dos pratos, cujo 
movimento combinado com a rotação dos pratos 
permite o acesso pelas cabeças a qualquer parte da 
superfície.

O processador (CPU) e o disco comunicam-se através 
da controladora de discos. Isso retira dos outros 
componentes do computador o trabalho de saber como 
acessar o dispositivo, uma vez que as controladoras 
para diferentes tipos de discos podem utilizar a 
mesma interface com o restante do computador. Assim 
o restante do sistema somente necessita solicitar 
as informações necessárias, ao invés de enviar uma 
série complexa de sinais elétricos para mover as 
cabeças para o local adequado e esperar pelo 
correto posicionamento dos pratos e todos os demais 
passos necessários. Na realidade a interface da 
controladora é bastante complexa, mas muito menos 
do que poderia ser um acesso direto ao disco. A 
controladora pode ainda executar outras tarefas 
como cache e realocação de setores defeituosos.  

Estas são as informações necessárias para entender 
o funcionamento do hardware. Há ainda muitos outros 
aspectos, como o motor que gira os pratos e move as 
cabeças, o qual eletronicamente controla as partes 
mecânicas do disco, porém estes aspectos não são 
relevantes para o processo de entendimento dos 
princípios básicos do disco. 

A superfície dos pratos é normalmente dividida em 
anéis concêntricos, chamados trilhas e estes por 
sua vez estão divididos em setores. Esta divisão é 
utilizada para especificar as localizações dentro 
do disco e para alocação de espaço para os 
arquivos. Para encontrar um determinado ponto em um 
disco, deve-se dizer "face 3, trilha 5, setor 7". 
Normalmente o número de setores é o mesmo em todas 
as trilhas e todos os setores tem o mesmo tamanho 
físico, cabendo nas trilhas externas maiores. 
Tipicamente um setor comporta 512 bytes de dados. O 
disco por si só não pode manipular quantidades 
menores de dados em um setor.
 
Figura 4.1: Desenho esquemático de um disco rígido

Cada face é dividida em trilhas (e setores) de 
mesma formato. Assim quando uma cabeça está sobre 
uma trilha, as cabeças das outras faces estão na 
mesma trilha correspondente. Todas as trilhas 
correspondentes formam um cilindro. O movimento das 
cabeças de uma trilha (ou cilindro) para outro 
utiliza um determinado intervalo de tempo. Então se 
os dados que são normalmente acessados de forma 
conjunta (digamos um arquivo) estiverem em 
localizações contíguas dentro do disco, o movimento 
das cabeças será menor, melhorando a performance do 
sistema. Porém nem sempre é possível armazenar os 
arquivos desta forma, e arquivos que estão 
dispostos em diversos locais do disco são chamados 
de fragmentados.  

O número de faces (ou cabeças, que é o mesmo), 
cilindros e setores varia bastante. A especificação 
deste número é chamada geometria do disco rígido. A 
geometria é normalmente arquivada de forma 
especial, em uma posição da memória alimentada por 
pilhas, chamada CMOS RAM, da qual o sistema 
operacional pode recuperar durante a inicialização 
do sistema.

Infelizmente a BIOS tem um desenho limitado, o que 
torna impossível especificar na CMOS RAM um número 
de trilhas maiores que 1.024, o que é muito pouco 
para poder controlar discos maiores. A saída 
encontrada para isso foi a controladora "mentir" 
sobre a geometria e converter os endereços dados 
pelo computador em endereços corretos. Por exemplo, 
consideremos que um disco rígido tenha 8 cabeças, 
2048 trilhas e 35 setores por trilha. A 
controladora pode informar que o disco tem 16 
cabeças, 1024 trilhas e 35 setores por trilha, não 
excedendo o limite do número de trilhas e dividindo 
por 2 o número de cabeças e multiplicando por dois 
o de trilhas para chegar à capacidade exata do 
disco. Na realidade a matemática pode ser um pouco 
mais complicada, porque os números podem não ser 
tão exatos como no nosso exemplo, porém estes 
detalhes não são relevantes para o entendimento do 
princípio. Esta conversão distorce a visão do disco 
pelo sistema operacional, tornando impraticável o 
uso de todos os dados em um cilindro para o 
incremento da performance.   

A conversão é somente um dos problemas em discos 
IDE. Discos SCSI tem um número seqüencial de 
setores, isto é a controladora traduz o número 
seqüencial do setor  em um endereço composto po 
cabeça, cilindro e setor, e usa um método 
completamente diferente de comunicação entre a CPU 
e a controladora, não tendo este tipo de problema. 
Note-se que de qualquer forma o computador pode 
também não saber também a real geometria de um 
disco SCSI. 

Desde que o Linux com frequência não conhecerá a 
real geometria de um disco, seus sistemas de 
arquivos sequer tentarão manter os arquivos em um 
único cilindro. Ao invés disso ele tentará utilizar 
setores consecutivos, o que proporciona quase a 
mesma performance. O tema um pouco mais complicado 
é o cache de disco  e acessos automáticos feitos 
pela controladora.  

Cada disco rígido é representado por um arquivo de 
dispositivo distinto. Eles podem (normalmente) ser 
somente um ou dois para discos IDE, e são 
conhecidos como /dev/hda, /dev/hdb, /dev/hdc e 
/dev/hdd, respectivamente. Discos SCSI são 
conhecidos como /dev/sda, /dev/sdb, /dev/sdc e 
/dev/sdd. Convenções similares para nomes existem 
para outros tipos de discos (que podem ser 
conhecidos na lista Linux de dispositivos de Peter 
Anvin). Note-se que os arquivos de dispositivos de 
discos rígidos dão acesso a todo o disco, sem 
preocupar-se com as partições (que serão discutidas 
adiante), e pode ser simples misturar as 
informações entre as partições caso não se tenha 
cuidado. Os arquivos de dispositivos de discos são 
normalmente utilizados somente para a obtenção de 
dados do registro mestre de inicialização (MBR). 

Disquetes

Um disquete consiste em uma membrana flexível 
coberta em um ou ambos os lados com uma substância 
magnética similar a de um disco rígido. O disquete 
por si só não tem uma cabeça de leitura e gravação, 
a qual está na unidade de disquetes. Um disquete 
corresponde a um prato do disco rígido, porém  é 
removível e uma unidade de disquetes pode tratar 
diferentes disquetes, enquanto um disco rígido é 
uma unidade indivisível.

Como um disco rígido, um disquete está dividido em 
trilhas e setores (e as trilhas de ambos os lados 
do disquete equivalem a um cilindro), mas muito 
menores e em menor quantidade que em um disco 
rígido.

Uma unidade de disquetes pode normalmente tratar 
diferentes formatos de disquetes de forma 
automática, como por exemplo, uma unidade de 3.5" 
pode usar tanto discos de 720 Kb como de 1.44 Mb. 
Porém o dispositivo terá que operar de forma um 
pouco diferente e o sistema operacional deverá 
saber qual o real tamanho do disquete. Para tanto  
há diversos arquivos de dispositivos para unidades 
de disquetes, uma para cada combinação de 
dispositivo e tipo de disquete. Há /dev/fd0H1440 
que é o primeiro dispositivo de disquetes (fd0), 
que serve para uma unidade de 3.5", de alta 
densidade (high - H) e com a capacidade de 1440 Kb. 

Os nomes dos arquivos de controle de unidades de 
disquetes são complexos, porém no Linux há tipos 
especiais de dispositivos que podem detectar 
automaticamente o tipo de disco na unidade. Isso 
funciona através da tentativa de ler o primeiro 
setor de um disquete recém inserido, usando 
diferente tipos, até que um deles consiga ler o 
disquete corretamente. Isso naturalmente requer que 
o disquete esteja formatado. Os dispositivos 
automáticos são chamados /dev/fd0, /dev/fd1 e assim 
por diante. 

Os parâmetros dos dispositivos automáticos a serem 
utilizados podem ser configurados através do 
programa setfdprm. Isso pode ser útil caso não se 
utilizem tamanhos usuais de discos, ou se, por 
exemplo, eles têm um número diferente de setores, 
ou se a autodetecção falhou por alguma razão.

Linux pode manusear diversos formatos de disquetes 
não padronizados, além dos padrões. Alguns desses 
formatos requerem a utilização de programas 
especiais de formatação. Não comentaremos esses 
tipos, porém pode-se conhecê-los ao se examinar o 
arquivo /etc/fdprm. Ele especifica os parâmetros 
que o comando setfdprm reconhece. 

O sistema operacional deve saber toda a vez que o 
disquete for substituído na unidade, para, por 
exemplo, evitar, manter dados no cache de um 
disquete não mais disponível. Infelizmente a linha 
de sinalização utilizada para transmitir esta 
informação algumas vezes pode não estar disponível 
ou pior nem sempre haverá notificação ao se usar o 
dispositivo dentro do DOS. Caso problemas estranhos 
estejam ocorrendo, esta pode ser uma possível 
razão. O único meio de corrigir este problema é 
substituir a unidade de disquetes. 
 
CD-ROM

Um dispositivo CD-ROM utiliza um leitor ótico e um 
disco recoberto de plástico. A informação é gravada 
na superfície do disco  em pequenos “orifícios” 
alinhados ao redor de uma espiral do centro para a 
borda. O dispositivo direciona um feixe laser na 
espiral para poder ler os dados contidos no disco. 
Quando o laser atinge um dos “orifícios”, o laser é 
refletido de uma determinada forma, quando ele 
atinge a superfície lisa é refletido de outra. Isso 
permite a criação de um código de bits e portanto 
de informação. O restante é simples, mera mecânica.

Dispositivos de CD-ROM são lentos, quando 
comparados a discos rígidos. Onde um disco rígido 
típico tem um tempo médio de acesso de menos de 15 
milisegundos, um CD-ROM rápido pode chegar a 
décimos de segundos a cada leitura. A taxa atual de 
transferência está acima das centenas de kilobytes 
por segundo. A lentidão dos CD-ROM significa que 
eles não são tão agradáveis de usar quanto os 
discos rígidos. Porém para instalações de novos 
softwares, CD-ROMs são muito indicados , uma vez 
que a velocidade não é essencial nestes momentos. 
Algumas distribuições de Linux provêem sistemas de 
arquivos prontos para execução em CD-ROMs, tornando 
a instalação mais simples e economizando bastante 
espaço em disco.   

Há muitas formas de arrumar os dados em um CD-ROM. 
O mais popular é o especificado pelo padrão 
internacional ISO 9660. Este padrão especifica um 
sistema de arquivos mínimo, que é mais rudimentar 
do que o do DOS. Por outro lado, é tão simples que 
qualquer sistema operacional poderá mapeá-lo em 
modo nativo.
 
Para uso normal em Unix, o sistema de arquivos ISO 
9660 não é muito útil, sendo que foram produzidas 
extensões denominadas Rock Ridge. Estas extensões 
permitem nomes longos de arquivos, ligações 
simbólicas e uma série de outras facilidades, 
tornando o CD-ROM similar a qualquer sistema de 
arquivos Unix. E melhor ainda, um sistema de 
arquivos Rock Ridge é ainda um sistema de arquivos 
válido para o ISO 9660, tornando-o passível de 
utilização também sob sistemas não-Unix. Linux 
suporta ambos os formatos: ISSO 9660 e Rock Ridge, 
sendo as extensões reconhecidas automaticamente.
  
O sistema de arquivos é somente metade da questão. 
Muitos CD-ROMs contém dados que requerem programas 
especiais de acesso e muitos desse programas podem 
não ser compatíveus com Linux (exceto, 
possivelmente, sob o dosemu, a emulação Linux do 
MS-DOS).

Um dispositivo de CD-ROM é acessado através do 
arquivo de dispositivo correspondente. Há muitas 
formas de conectar uma unidade de CD-ROM ao 
computador: via SCSI, via placa de som, ou via 
EIDE. Os detalhes de hardware estão fora do escopo 
deste livro. Porém o tipo de conexão definirá o 
arquivo de dispositivo.  Consulte a lista de 
dispositivos de Peter Anvin para maiores detalhes.



Fitas

Uma unidade de fitas utiliza fita similares aos 
cassetes usados para música. Uma fita é serial por 
natureza, o que significa que para obter qualquer 
informação ali armazenada, é necessário passar por 
todas as outras partes que estejam antes do ponto 
desejado. Um disco pode ser acessado 
randomicamente, isto é, pode buscar-se um dado 
diretamente, independente do ponto em que esteja no 
disco. O acesso serial torna as fitas bastante 
lentas, quando comparadas com disco rígidos.

Por outro lado, fitas são relativamente baratas, 
uma vez que elas não necessitem ser rápidas. Elas 
podem facilmente ser geradas em um período longo, 
porém contendo uma grande quantidade de dados. Isso 
torna as fitas muito apropriadas para atividades 
como arquivamentos ou cópias de segurança, os quais 
não requerem grandes velocidades, devido aos 
benefícios de custos baixos e alta capacidade de 
armazenamento. 

Formatando
Formatar é o processo de inicializar uma mídia 
magnética, gerando-se as marcas de trilhas e 
setores. Antes de um disco ser formatado, a sua 
superfície magnética é uma total confusão de sinais 
magnéticos. Após a sua formatação, alguma ordem é 
dada a esse caos, basicamente delineando-se as 
linhas onde as trilhas estarão presentes e onde 
elas estarão divididas em setores. O detalhamento 
deste processo mostra algumas diferenças em relação  
ao princípio, porém dentro do escopo deste manual 
isto não e relevante. O que realmente importa é que 
um disco não pode ser utilizado até que seja 
formatado. 

A terminologia pode ser um pouco confusa aqui: no 
DOS a palavra formatação é utilizada com a 
abrangência também da criação dos sistemas de 
arquivos (o qual será discutido a seguir). E estes 
dois processo estão geralmente combinados, 
especialmente em disquetes. Quando uma distinção 
faz-se necessária, a real formatação é chamada de 
baixo nível, enquanto que a geração de sistemas de 
arquivos é denominada de alto nível. Em Unix as 
duas são denominadas: formatação e criação de 
sistemas de arquivos, e é assim que utilizaremos 
neste livro. 

Para discos IDE e alguns SCSI, a formatação é 
realizada na fábrica e não necessita ser repetida, 
ou não há porque preocupar-se com o tema. Na 
verdade formatar um disco rígido pode causar 
problemas no seu funcionamento, por exemplo, por 
ser necessário formatar de uma forma especial ou 
diferente para permitir a realocação automática de 
setores defeituosos.

Discos que necessitem ser formatados freqüentemente 
requerem um programa especial, uma vez que a 
interface de formatação lógica dentro do 
dispositivo varia de disco para disco. O programa 
de formatação é normalmente fornecido com a 
controladora ou através de um programa DOS, sendo 
que nenhum dos dois tende a ser de simples 
utilização sob o Linux.  

Durante a formatação pode-se encontrar pontos ruins 
no disco, chamados de blocos ou setores 
defeituosos. Algumas vezes isso é administrado pelo 
próprio dispositivo, mas mesmo assim, caso o seu 
número seja muito grande,  algo precisará ser feito 
para evitar o uso destas partes do disco.  A 
solução para essa situação reside nos sistemas de 
arquivos, ou seja em manter as informação acima 
descritas. Alternativamente pode-se criar uma 
pequena partição que abrigue somente os setores 
defeituosos do disco, sendo essa abordagem mais 
adequada caso existam porções substanciais do disco 
com defeitos, uma vez que essas grande áreas 
normalmente geram problemas em outros sistemas de 
arquivos.   

Disquetes são formatados com fdformat. O arquivo de 
dispositivos da unidade de disquetes é informado 
através de parâmetro. Por exemplo. O seguinte 
comando é dado para formatar um disco de 3.5” e de 
alta densidade na primeira unidade de disquetes:

     $ fdformat /dev/fd0H1440 
     Double-sided, 80 tracks, 18 sec/track. Total 
capacity 1440 kB. 
     Formatting ... done 
     Verifying ... done 
     $ 

Note-se que caso se necessite auto-detectar o tipo 
de dispositivo (por exemplo /dev/fd0), deve-se 
configurar os parâmetros com o comando setfdprm 
primeiramente. Para atingir o resultado desejado, 
deve-se observar os seguintes passos:   

$ setfdprm /dev/fd0 1440/1440 
$ fdformat /dev/fd0 
Double-sided, 80 tracks, 18 sec/track. Total 
capacity 1440 kB. 
Formatting ... done 
Verifying ... done 
$ 

Normalmente é mais conveniente escolher o arquivo 
de dispositivo que se adequa com o tipo de 
disquete. Note-se que isto não pode ser usado para 
formatar disquetes com uma capacidade maior de  
armazenamento do que aquela original de fábrica.

fdformat validará o disquete, isto é, verificará os 
blocos defeituosos, e ainda tentará arrumá-los 
diversas vezes (pode-se ouvir isto quando o barulho 
da unidade cresce substancialmente). Se o disquete 
tem somente problemas superficiais (como sujeira na 
cabeça de leitura e gravação, alguns erros podem 
ser falsos), e fdformat será executado normalmente, 
mas se um erro real for encontrado, o processo será 
finalizado imeadiatamente. O kernel apresentará 
mensagens de erro para cada um que seja encontrado, 
as quais serão apresentadas na console, ou, caso o 
syslog esteja sendo usado,  no arquivo 
/usr/adm/messages. fdformat não identificará nem 
apresentará a localização exata do erro, pois um 
disquete é barato o suficiente para que possa ser 
substituído imediatamente.    

$ fdformat /dev/fd0H1440 
Double-sided, 80 tracks, 18 sec/track. Total 
capacity 1440 kB. 
Formatting ... done 
Verifying ... read: Unknown error 
$ 
O comando badblocks pode ser utilizado para 
pesquisar qualquer disco ou partição na detecção de 
blocos defeituosos (inclusive em um disquete). Ele 
não formata o disco, portanto pode ser utilizado 
mesmo para sistemas de arquivos já existentes. O 
exemplo a seguir verifica um disquete de 3.5” que 
apresentou dois blocos com defeitos: 


$ badblocks /dev/fd0H1440 1440 
718 
719 
$ 

A saída do programa apresenta o número dos blocos 
defeituosos encontrados. Muitos sistemas de 
arquivos podem evitar tais blocos. Eles mantém uma 
lista destes, a qual é inicializada quando o 
sistema de arquivos é gerado e posteriormente 
atualizada. A pesquisa inicial por blocos 
defeituosos pode ser realizada pelo comando mkfs 
(que inicializa sistemas de arquivos), mas 
posteriormente deve ser realizada pelo comando 
badblocks e novos blocos podem ser adicionados com 
o comando fsck. Estes comandos serão descritos 
posteriormente. 

Muitos discos modernos avisam sobre blocos 
defeituosos e tentam consertá-los, usando em seu 
lugar um bloco especial, que não tenha problemas e 
reservado  para estas situações. Isso é 
transparente para o sistema operacional e tal 
facilidade deve estar documentada nos manuais do 
disco rígido. Mesmo discos podem falhar caso o 
número de blocos defeituosos cresça demasiadamente, 
o que deve provavelmente ocasionará a inutilização 
do dispositivo.  


Partições

Um disco rígido pode ser divido em diversas 
partições. Cada partição funciona como se fosse um 
disco rígido em separado. A idéia é que se há 
somente um disco rígido, e se deseje ter por 
exemplo dois sistemas operacionais, pode-se dividi-
lo em duas partições. Cada sistema operacional 
teria a sua partição própria, sem interferir nos 
dados do outro sistema. Desta forma eles podem 
coexistir pacificamente no mesmo dispositivo. Sem 
partições deveriam haver dois discos, um para cada 
sistema.

Disquetes não são particionados. Não há razões 
técnicas contrárias, porém pelo fato de serem tão 
pequenos, partições não têm aplicação prática nesta 
mídia. CD-ROMs também normalmente não são 
particionados, uma vez que é muito simples utilizá-
los como um grande disco, e dificilmente haverá 
mais de um sistema operacional em um CD.

===================================================

       
               MBR, setores de inicialização e 
tabela de partições
               Partições lógicas e estendidas
               Tipos de partição
               Particionando um disco rígido
               Arquivos de dispositivos e partições


MBR, setores de inicialização e tabela de partições

As informações de como um disco rígido está 
particionado é armazenada no seu primeiro setor 
(isto é, no primeiro setor, da primeira trilha do 
primeiro prato). O primeiro setor é o registro 
mestre de inicialização (MBR) do disco. Este é o 
setor que a BIOS lê e inicializa,  quando a máquina 
é ligada. O registro mestre de inicialização contém 
um pequeno programa que lê a tabela de partições, 
verifica quais partições estão ativas (isto é, 
marcadas como inicializáveis) e lê o primeiro setor 
de cada partição, o setor de inicialização da 
partição (o MBR também é um setor de inicialização, 
mas tem um nome diferente por executar diferentes 
funções). O setor de inicialização contém outro 
pequeno programa que lê a primeira parte do sistema 
operacional armazenado naquela partição (assumindo 
que ela seja inicializável, ou seja, que possa 
iniciar o sistema operacional) e ativa o sistema 
operacional lá armazenado.

O esquema de particionamento não é definido pelo 
hardware, muito menos pela BIOS. É somente uma 
convenção que diversos sistemas operacionais 
seguem. Os poucos que não a seguem são considerados 
exceções. Alguns sistemas operacionais suportam 
partições, mas uma partição que ocupe todo um disco 
e usam métodos de particionamento interno naquela 
partição. Esse tipo de partição pode conviver 
pacificamente com outros sistemas operacionais, 
inclusive com o Linux, e não requerem medidas 
especiais, porém um sistema operacional que não 
suporte esta facilidade não poderá coexistir no 
mesmo disco. 

Uma medida preventiva é anotar-se as partições em 
um papel, assim mesmo que a tabela de partições 
esteja corrompida não se perderão todos os arquivos 
(uma tabela defeituosa pode ser consertada com 
fdisk). A informação relevante é fornecida pelo 
comando fdisk –l: 

$ fdisk -l /dev/hda 

Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders 
Units = cylinders of 855 * 512 bytes 

Device Boot Begin Start End Blocks Id System 
/dev/hda1 1 1 24 10231+ 82 Linux swap 
/dev/hda2 25 25 48 10260 83 Linux native 
/dev/hda3 49 49 408 153900 83 Linux native 
/dev/hda4 409 409 790 163305 5 Extended 
/dev/hda5 409 409 744 143611+ 83 Linux native 
/dev/hda6 745 745 790 19636+ 83 Linux native 
$

Partições Lógicas e estendidas

O esquema original de partições  para discos 
rígidos de PCs permite somente quatro partições . 
Isso rapidamente tornou-se muito reduzido para o 
atendimento das necessidades do mundo real, 
principalmente porque as pessoas desejavam utilizar 
diversos sistemas operacionais (Linux, MS-DOS, 
OS/2, Minix, FreeBSD, NetBSD, ou Windows/NT, para 
enumerar alguns), assim como particionar o disco 
mesmo com um único sistema operacional é uma boa 
idéia. Por exemplo a área de swap (swap), por 
questões de performance, deve ter a sua própria 
partição no Linux, ao invés de utilizar a partição 
principal. 

Para solucionar estes problemas de projeto, foram 
criadas as partições estendidas. Este truque 
permite que a partição primária seja particionada 
em subpartições. A partição primária subdividida é 
uma partição estendida, a subpartição é uma  
partição lógica. Elas comportam-se exatamente como 
partições primárias, mas são criadas de forma 
deferente, não havendo diferença de velocidade 
entre elas.  

A estrutura de partições de um disco rígido pode 
aparentar algo similar à figura 4.2. O disco é 
dividido em três partições primárias, a segunda das 
quais é dividida em duas partições lógicas. Parte 
do disco não está particionado. O disco como um 
todo e cada partição primária tem um setor de 
inicialização. 


Figura 4.2: Exemplo de particionamento de disco

Tipos de Partições

As tabelas de partições (uma no MBR e outras nas 
partições estendidas) contem um byte que identifica 
o tipo da partição. É uma tentativa de identificar 
o sistema operacional que utiliza aquela partição 
ou para qual a sua finalidade. O propósito primeiro 
era tornar possível que dois sistemas operacionais 
utilizassem a mesma partição. Na verdade, sistemas 
operacionais não se importam com o byte de tipo de 
partição. Pior,  alguns deles o utilizam 
incorretamente como o DR-DOS.
Não há um padrão internacional para especificar o 
que cada byte significa, mas os mais comuns e 
aceitos estão descritos na tabela 4.1 A mesma lista 
está disponível no programa fdisk do Linux.
 
Particionando um disco rígido

Há muitos programas para criação e remoção de 
partições. A maioria dos sistemas operacionais tem 
o seu próprio, e pode ser uma boa idéia usá-los, 
para evitar situações não suportadas pelos outros. 
Muitos programas são chamados fdisk, inclusive o 
programa do Linux, ou suas variações. Detalhes 
sobre a utilização do fdisk são apresentadas na 
página de manual on-line ou no Apêndice de Comandos 
e Programas Relacionados. O comando cfdisk é 
similar ao fdisk porém mais agradável, por possuir 
uma interface mais amigável ao usuário. No 
Conectiva Linux pode ainda ser encontrado o 
DiskDruid, um utilitário extremamente poderoso.

Ao utilizar discos IDE, a partição de inicialização 
(aquela que contém os arquivos de imagem do kernel 
do sistema) deve residir inteiramente nos primeiros 
1024 cilindros. Isso deve-se ao fato que a partição 
é utilizada pela BIOS no início do sistema ( e 
antes de carregar o sistema operacional) e a BIOS 
não pode gerenciar mais que 1024 cilindros. Pode-se 
ainda usar uma partição que esteja somente 
parcialmente nos  1024 cilindros iniciais, desde 
que todos os arquivos necessários à inicialização 
do sistema estejam dentro do limite da BIOS. Porém 
esta é uma prática desaconselhada pois novas 
compilações do kernel ou fragmentações do disco 
podem colocar os arquivos fora deste limite. De 
qualquer forma há que se estar seguro de os 
arquivos necessários à inicialização do sistema 
estejam nos primeiros 1024 cilindros.

Algumas versões novas de BIOS e discos IDE 
conseguem efetivamente gerenciar discos com mais de 
1024 cilindros. Caso se tenha um sistema desses 
disponível, este problema não existirá e os 
arquivos de inicialização podem estar em qualquer 
ponto do disco. 

Cada partição deve ter um número par de setores, 
uma vez que os sistemas de arquivos Linux usam 
blocos de 1 Kb de tamanho, ou seja dois setores. Um 
número ímpar resultará na não utilização do último 
setor. Isso não é necessariamente um problema, 
porém é bastante desagradável e algumas versões de 
fdisk podem alertar sobre o problema.

Alterar o tamanho de uma partição normalmente 
requer que primeiramente seja efetuada uma cópia de 
segurança de tudo o que se deseje salvar e que 
esteja presente na partição (preferencialmente do 
disco todo como medida preventiva), apagá-la, criar 
uma nova, e restaurar os arquivos na nova partição. 
Se a partição estiver crescendo, pode-se ter que 
também ajustar o tamanho de partições relacionadas 
(assim como das cópias de segurança). 

Uma vez que alterar o tamanho das partições é 
bastante trabalhoso, é preferível tê-las bem 
dimensionadas desde o início, ou ter-se um 
eficiente sistema de cópias de segurança 
implementado. Caso a instalação seja a partir de 
uma mídia que não requeira muita intervenção humana 
(digamos CD-ROM comparado com disquetes), é 
aconselhável testar diferentes configurações num 
primeiro momento, já que não há dados para serem 
copiados, tornando menos trabalhoso modificar o 
tamanho das partições diversas vezes.

Há um programa para partições MS-DOS chamado fips, 
que não requer cópias e restaurações de arquivos, 
mas para outro tipo de sistema arquivos o 
procedimento completo ainda será necessário.

Arquivos de dispositivos e partições

Cada partição e partição estendida tem o seu 
próprio arquivo de dispositivo. A convenção da 
nomenclatura destes arquivos é formada por um 
número adicionado após o nome do disco, variando de 
1 a 4 para partições primárias (independentes de 
quantas elas sejam) e de 5 a 8 para as partições 
lógicas (independente de onde elas residam). Por 
exemplo o /dev/hda1 é o primeira partição primária 
no primeiro disco IDE e /dev/sdb7 é a terceira 
partição estendida no segundo disco SCSI.

Sistemas de Arquivos

 
               O que é um sistema de arquivos?
               Diversidade de sistemas de arquivos 
               Qual  sistema de arquivos deve ser 
usado?
               Criando um sistema de arquivos
               Montando um sistema de arquivos
               Verificando a integridade de um 
sistema de arquivos com fsck
               Verificando erros no disco com 
badblocks
                Evitando fragmentação
                Outras ferramentas para todos 
sistemas de arquivos 
                Outras ferramentas para sistemas de 
arquivos ext2

O que são sistemas de arquivos?

Um sistema de arquivos é o método e a estrutura de 
dados que um sistema operacional utiliza para 
administrar arquivos em um disco ou partição, ou 
seja a forma pela qual os arquivos estão 
organizados em um disco. A expressão também é 
utilizada para se referenciar a uma partição ou 
disco que seja usado para armazenar os arquivos ou 
outros tipos de sistemas de arquivos. Alguém pode 
dizer que há dois sistemas de arquivos, 
significando que tem duas partições nas quais 
armazena arquivos.  

A diferença entre um disco ou partição e um sistema 
de arquivos é bastantes significativa. Poucos 
programas (inclusive os programas que criam 
sistemas de arquivos) operam diretamente em setores 
não inicializados de um disco ou partição, e caso 
exista um sistema de arquivos ele será destruído ou 
danificado seriamente. Muitos programas operam em 
um sistema de arquivos e não funcionam em uma 
partição que não contenha um (ou que contenha um de 
tipo errado).  

Antes de uma partição ou disco ser usado como um 
sistema de arquivos ele necessita se inicializado, 
e a estrutura básica de dados necessita ser gravada 
no disco. Este processo é chamado criação de um 
sistema de arquivos.

Muitos sistemas de arquivos Unix tem uma estrutura 
geral similar, apesar dos detalhes exatos variarem 
um pouco. Os conceitos básicos de superbloco, 
inode, bloco de dados, bloco de diretórios e bloco 
de indireção são similares. O superbloco contém as 
informações sobre o sistema de arquivos como um 
todo, como por exemplo seu tamanho (a informação 
exata depende do sistema de arquivos). Um inode 
contém as informações sobre um determinado arquivo, 
exceto seu nome, o qual está armazenado no 
diretório, junto com o número do inode. Uma entrada 
de diretório é formada pelo nome e pelo número do 
inode que representa o arquivo. O inode contém o 
número de diversos blocos de dados usados para 
armazenar as informações do arquivo. Há espaço 
somente para uns poucos números de blocos de dados 
no inode, e,  caso um número maior seja necessário, 
mais espaço para ponteiros será liberado 
dinamicamente. Esta alocação dinâmica é composta 
pelos blocos de indireção que, como o nome indica, 
contém endereços para outros blocos.         

Sistemas de arquivos Unix normalmente permitem a 
criação de espaços vazios em um arquivo (isso é  
feito com o comando lseek; veja a página de manual 
para maiores informações ou o Apêndice Comandos e 
Programas Relacionados), o que significa que o 
sistema de arquivos simplesmente “aloca” um espaço 
de zero bytes para uma determinada parte do 
arquivo, mas nenhum setor de disco é reservado (o 
que significa que o arquivo usará um pouco menos de 
espaço em disco). Isso ocorre freqüentemente para 
pequenos binários, bibliotecas compartilhadas, 
algumas bases de dados e outros poucos casos 
especiais. Espaços são implementados através do 
armazenamento de valores especiais de endereços de 
blocos de dados no bloco de indireção ou no inode. 
Este endereço especial significa que não há blocos 
de dados realmente alocados para aquela parte do 
arquivo, ou seja há um “buraco” .   
 
Espaços vazios são razoavelmente úteis. No sistema 
do autor, uma medição mostrou uma economia de pelo 
menos 4 Mb de espaço em disco, de um total de 200 
Mb utilizado com o sistema (2%). Veja que este 
sistema contém relativamente poucos programas e 
bases de dados. A ferramenta de medição está 
descrita no Apêndice A. 

Classificação de Sistemas de Arquivos

O Linux suporta diversos tipos de sistemas de 
arquivos. Dentre esses destacamos:

minix 
O mais antigo e presumivelmente o mais confiável, 
mas bastante limitado em facilidades (algumas datas 
não aparecem , máximo de 30 caracteres para nome de 
arquivos,etc...) e restrições de armazenamento (no 
máximo 64 Mb por sistema de arquivos).
 
xia 
Uma versão modificada do sistema de arquivos minix, 
o qual aumenta os limite de nomes de arquivos e de 
sistemas de arquivos, mas não introduz novas 
facilidades. Não é muito popular, mas comenta-se 
que funcione muito bem.

ext2 
O mais poderoso e popular sistema de arquivos 
nativo do Linux. Desenhado para ser facilmente 
compatível com os avanços das novas versões, sem a 
necessidade de refazimento dos sistemas de arquivos 
já existentes.   

ext 
Uma versão antiga do ext2 que não é mais compatível 
comn versões atuais. É raro vê-las instalada em 
sistemas novos e mesmo os mais antigos tem sido 
convertidos para ext2. 

Adicionalmente há o suporte a diversos outros 
sistemas de arquivos, para simplificar a swap de 
informações com outros sistemas operacionais. Estes 
sistemas de arquivos funcionam como se fossem 
nativos, exceto pela perda de algumas facilidades 
presentes no Unix, ou apresentam algumas 
particularidades.    

msdos 
Compatibilidade com MS-DOS (e OS/2 e Windows NT) 
através de sistemas de arquivos FAT.

umsdos 
sistemas de arquivos msdos estendidos para suportar 
nomes longos, donos, permissões, ligações e 
arquivos de dispositivos do Linux. Isso permite que 
um sistema de arquivos msdos possa ser usado como 
se fosse um sistema Linux, removendo a necessidade 
de uma partição distinta para o Linux.

iso9660 
O sistema de arquivos padrão do CD-ROM. A extensão 
Rock Ridge que permite nomes longos também é 
suportada automaticamente.

nfs 
Sistemas de arquivos de redes que permitem o 
compartilhamento e o fácil acesso aos arquivos 
entre diversos computadores da rede.
 
hpfs 
O sistema de arquivos do OS/2.
 
sysv 
Sistema de arquivos do System V/386, Coherent e 
Xenix. 

A opção do sistema de arquivos a ser usado depende 
da situação. Caso compatibilidade ou outras razões 
tornam um dos sistemas de arquivos não nativos 
necessários, então este deve ser utilizado. Caso a 
opção seja livre, então provavelmente a decisão 
mais acertada seja usar o ext2, uma vez que ele 
traz diversas facilidades sem sofrer perda de 
performance.  

Há ainda o sistema de arquivos proc, normalmente 
acessível através do diretório /proc, o qual não é 
um sistema de arquivos real, apesar de parecer um. 
O sistema de arquivos proc torna mais simples o 
acesso a determinadas estruturas do kernel, como 
por exemplo a lista de processos. Isso torna a 
estrutura de dados parecer um sistema de arquivos 
que pode ser manipulado com as ferramentas usuais. 
Por exemplo para obter uma lista de todos os 
processos pode-se usar o comando: 

$ ls -l /proc 
total 0 
dr-xr-xr-x 4 root root 0 Jan 31 20:37 1 
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63 
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94 
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95 
dr-xr-xr-x 4 root users 0 Jan 31 20:37 98 
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99 
-r--r--r-- 1 root root 0 Jan 31 20:37 devices 
-r--r--r-- 1 root root 0 Jan 31 20:37 dma 
-r--r--r-- 1 root root 0 Jan 31 20:37 filesystems 
-r--r--r-- 1 root root 0 Jan 31 20:37 interrupts 
-r-------- 1 root root 8654848 Jan 31 20:37 kcore 
-r--r--r-- 1 root root 0 Jan 31 11:50 kmsg 
-r--r--r-- 1 root root 0 Jan 31 20:37 ksyms 
-r--r--r-- 1 root root 0 Jan 31 11:51 loadavg 
-r--r--r-- 1 root root 0 Jan 31 20:37 meminfo 
-r--r--r-- 1 root root 0 Jan 31 20:37 modules 
dr-xr-xr-x 2 root root 0 Jan 31 20:37 net 
dr-xr-xr-x 4 root root 0 Jan 31 20:37 self 
-r--r--r-- 1 root root 0 Jan 31 20:37 stat 
-r--r--r-- 1 root root 0 Jan 31 20:37 uptime 
-r--r--r-- 1 root root 0 Jan 31 20:37 version 
$ 
(Podem haver alguns mais, porém o exemplo acima foi 
resumido por questões didáticas).

Note-se que apesar de ser chamado como sistema de 
arquivos, o proc não acessa o disco rígido. Ele 
existe somente no kernel do sistema. Toda vez que 
alguém tente acessar alguma parte do sistema de 
arquivos proc, o kernel torna esta parte visível em 
algum lugar. Então mesmo que pareça existir um 
arquivo com diversos megabytes denominado 
/proc/kcore, ele não utiliza um único byte do disco 
rígido. 
 
Qual sistema de arquivos deve ser usado?

Faz pouco sentido utilizar muitos sistemas de 
arquivos diferentes. Atualmente ext2fs é o mais 
popular , e provavelmente a decisão mais acertada. 
Dependendo da necessidade de recursos adicionais na 
manutenção das estruturas, velocidade, segurança, 
estabilidade, compatibilidade e diversas outras 
razões, pode ser desejável utilizar outro tipo de 
sistema de arquivos. Esta necessidade deve ser 
analisada caso a caso.

Criando um Sistema de Arquivos

Sistemas de arquivos são criado, ou melhor 
inicializados, através do comando mkfs. Atualmente 
há um comando específico para cada tipo de sistema 
de arquivos. mkfs é somente uma interface que 
executa o programa adequado ao tipo desejado. 

O tipo pode ser selecionado através da opção –t 
tipo.

Os programas acionados pelo mkfs podem ter uma 
interface de linha de comando ligeiramente 
diferente. As opções comuns e mais importantes 
estão resumidas a seguir (veja a página de manual 
on-line para maiores informações ou consulte o 
Apêndice Comandos e Programas Relacionados).

-t tipo_sistema_arquivos
   seleciona o tipo do sistema de arquivos 
-c pesquisa blocos defeituosos e inicializa a lista                      
de blocos ruins 
-l nome_do_arquivo 
   Lê a lista de blocos ruins a partir do arquivo 
informado.
 
Para criar um sistema de arquivos do tipo ext2 em 
um disquete, basta executar o comando:

$ fdformat -n /dev/fd0H1440 
Double-sided, 80 trilhas, 18 set/trilha. Capacidade 
Total 1440 Kb. 
Formatando ... feito 
$ badblocks /dev/fd0H1440 1440 > blocos-def 
$ mkfs -t ext2 -l blocos-def /dev/fd0H1440 
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 
360 inodes, 1440 blocos 
72 blocos (5.00%) reservados para o superusuário 
Primeiro bloco de dados=1 
Tamanho do bloco=1024 (log=0) 
Tamanho de fragmento=1024 (log=0) 
1 grupo de blocos 
8192 blocos por grupo, 8192 fragmentos por grupo 
360 inodes por grupo 

Gravando tabela de inodes: Feito
Gravando estatísticas de superblocos e sistemas de 
arquivos: Feito 
$

Inicialmente o disquete foi formatado (a opção –n 
inibe a checagem de blocos defeituosos). Após o 
comando badblocks faz a checagem e redireciona as 
mensagens de saída para o arquivo blocos-def, e 
finalmente o sistema de arquivos é criado, com a 
lista de blocos defeituosos inicializada com o que 
quer que o comando badblocks tenha encontrado.

A opção –c pode ser utilizada em conjunto com o 
comando mkfs, ao invés do comando badblocks e de um 
arquivo em separado, conforme o exemplo a seguir: 

$ mkfs -t ext2 -c /dev/fd0H1440 
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 
360 inodes, 1440 blocos 
72 blocos (5.00%) reservados para o superusuário 
Primeiro bloco de dados=1 
Tamanho do bloco=1024 (log=0) 
Tamanho de fragmento=1024 (log=0) 
1 grupo de blocos 
8192 blocos por grupo, 8192 fragmentos por grupo 
360 inodes por grupo

Pesquisando setores defeituosos (teste de leitura): 
feito 
Gravando tabela de inodes: Feito
Gravando estatísticas de superblocos e sistemas de 
arquivos: Feito 
$ 

A opção –c é mais conveniente que o uso do comando 
badblocks em separado, porém este último é 
necessário para uma verificação mais acurada, após 
a criação do sistema de arquivos. 
 
O processo de preparar sistemas de arquivos em 
discos rígidos ou partições é o mesmo para 
disquetes, exceto pelo fato da formatação não ser 
necessária.

Montando e Desmontando Sistemas de Arquivos

Antes de um sistema de arquivos poder ser 
utilizado, ele necessita ser montado. O sistema 
operacional executa diversas verificações para 
estar seguro de que tudo está funcionando bem. Uma 
vez que todos os arquivos em Unix estão em uma 
árvore de diretórios, a operação de montagem fará 
com que o novo sistema de arquivos pareça um 
subdiretório existente em algum sistema de arquivos 
já montado.    
  
Por exemplo, a figura 4.3 mostra três diferentes 
sistemas de arquivos, cada qual com o seus próprio 
diretório raiz. Quando os dois últimos são montados 
sob /home e /usr, respectivamente, no primeiro 
sistema de arquivos, temos somente uma única árvore 
de diretórios e suas entradas, conforme a figura 
4.4.

 
Figura 4.3: Três sistemas de arquivos distintos.

  
Figura 4.4: /home e /usr foram montados.

As montagens podem ser executadas, por exemplo, da 
seguinte forma: 

$ mount /dev/hda2 /home 
$ mount /dev/hda3 /usr 
$ 

O comando mount tem dois argumentos. O primeiro é o 
arquivo de dispositivo correspondente ao disco ou 
partição que contenha o sistema de arquivos. O 
segundo é o diretório sob o qual ele será montado. 
Após esse comando o conteúdo dos dois sistemas de 
arquivos parecerão simplesmente dois diretórios: 
/home e /usr respectivamente. Pode-se então dizer 
que /dev/hda2 está montado em /home e similarmente 
/dev/hda3 está montado em /usr. Para examinar estes 
sistemas de arquivos, pode-se acessar estes 
diretórios exatamente da mesma forma que qualquer 
outro. É importante ressaltar a diferença entre os 
arquivos /dev/hda2 e o diretório montado /home. 
Enquanto o primeiro dá acesso ao dados brutos do 
disco, o diretório permite o acesso aos arquivos 
contidos no mesmo disco. O diretório montado é 
chamado ponto de  montagem.

O Linux suporta diversos tipos de sistemas de 
arquivos. A montagem tenta verificar qual o tipo de 
sistema de arquivos está sendo montado. Pode-se 
utilizar opcionalmente a opção –t 
tipo_sistema_arquivos para especificar o tipo 
diretamente na montagem. Isso pode ser útil quando 
a verificação automática não funcione corretamente. 
Por exemplo para montar um disquete MS-DOS, pode-se 
usar o seguinte comando:   

$ mount -t msdos /dev/fd0 /floppy 
$ 

O diretório montado não necessita estar vazio, na 
verdade ele somente deve existir. Alguns arquivos 
porém podem estar inacessíveis enquanto o sistema 
de arquivos é montado (qualquer arquivo que já 
tenha sido aberto estará disponível. Arquivos que 
contém ligações diretas com outros diretórios 
também podem ser acessados através daqueles nomes). 
Nenhum dano será causado ao sistema de arquivos e 
isso pode, por vezes, ser bastante útil. Por 
exemplo caso se deseje ter /tmp e /var/tmp como 
sinônimos, faz-se uma ligação simbólica de /var/tmp 
para /tmp. Quando o sistema é inicializado, antes 
que o sistema de arquivos /usr seja montado, o 
diretório /var/tmp residente no diretório raiz é 
usado em seu lugar. Quando /usr é montado, ele 
tornará o diretório /var/tmp no raiz indisponível. 
Caso este diretório não existisse no raiz seria 
impossível usar arquivos temporários antes de 
montar /var.    

Caso não se pretenda gravar absolutamente nada no 
sistema de arquivos,pode-ese usar o parâmetro –r 
para montar o sistema de arquivos permitindo 
somente operações de leitura. Isso fará com que o  
kernel do sistema bloqueie qualquer tentativa de 
gravação naquele sistema de arquivos. Montagens de 
leitura somente são necessárias para mídias não 
graváveis como por exemplo CD-ROMs. 

O leitor mais atento perceberá um pequeno problema 
logístico. Como o primeiro sistema de arquivos 
(chamado raiz, por conter o diretório raiz (/)) é 
montado, uma vez que obviamente ele não pode ser 
montado a partir de outros sistemas de arquivos? 
Isso é feito de maneira automática. O sistema de 
arquivos raiz é montado automaticamente durante a 
inicialização do sistema operacional e pode-se 
estar certo de que ele sempre estará disponível, 
pois de outra forma o sistema não poderá ser 
inicializado. O nome do sistema de arquivos que é 
montado como / é compilado junto com o kernel do 
sistema ou configurado no LILO ou através do 
comando rdev. 

O sistema de arquivos raiz normalmente é montado 
com permissões somente de leitura. Os programas de 
lote iniciais executarão o comando fsck para 
verificar sua integridade e se por ventura há algum 
problema. Caso tudo corra bem, ele será montado 
novamente, agora com permissões de gravação. O 
programa fsck não deve ser executado em sistemas de 
arquivos montados, pois quaisquer alterações no 
sistema durante a sua execução podem causar 
problemas. Uma vez que o sistema de arquivos raiz é 
montado com permissões somente de leitura, fsck 
pode ser executado e regularizar qualquer 
anormalidade encontrada, uma vez que após a 
remontagem com permissões de gravação, os eventuais 
ajustes serão efetuados automaticamente. 
 
Em muitos sistemas, há outros sistemas de arquivos 
que devem ser montados automaticamente durante a 
sua inicialização. Estes sistemas de arquivos devem 
ser especificados no arquivo /etc/fstab (veja a 
página de manual do fstab para maiores informações 
sobre seu formato ou o  Apêndice Comandos e 
Programas Relacionados). Os detalhes exatos de como 
cada sistema de arquivos será montado depende de 
muitos fatores e pode ser efetuado de acordo com a 
necessidade de cada administrador. Após o capítulo 
de inicialização do sistema, pode-se obter mais 
informações sobre o tema. 

Quando um sistema de arquivos não necessita mais 
estar montado, ele pode ser desmontado através do 
comando umount. Este comando necessita de somente 
um argumento: ou o arquivo de dispositivo ou o 
ponto de montagem. Por exemplo para desmontar os 
diretórios do exemplo anterior deve-se comandar:   

     $ umount /dev/hda2 
     $ umount /usr 
     $ 

Para maiores informações sobre este comando, 
sugerimos a leitura da página de manual on-line ou  
o Apêndice Comandos e Programas Relacionados. É 
fundamental que um disquete sempre seja desmontado. 
Não se deve simplesmente retirar o disquete da 
unidade, pois dados podem estar em memória e ainda 
não terem sido gravados. Isso somente ocorre após a 
execução do comando umount. Retirá-lo antes pode 
danificar o conteúdo do disquete. Caso se esteja 
somente lendo do disquete isso pode não ser tão 
crítico, mas caso se esteja gravando algum conteúdo 
o resultado pode ser catastrófico.

Montar e desmontar sistemas de arquivos requer 
privilégios de superusuário, isto é, somente o 
usuário root pode fazê-lo. A razão para isso é que 
se qualquer usuário pudesse montar um disquete como 
um sistema de arquivos, o nível de segurança do 
sistema seria muito menor, pois esse diretório 
poderia conter por exemplo um programa do tipo 
Cavalo de Tróia  disfarçado como um /bin/sh, ou 
como  muitos outros programas utilizados com 
frequência. Há muitas formas de resolver isto:

? Dar aos usuários a senha do superusuário. Esta é 
obviamente a pior solução, mas é a mais simples. 
Deve funcionar bem caso não haja outras 
necessidades de segurança no equipamento, no 
caso de máquinas fora da rede ou sistemas de uso 
pessoal. 

? Usar um programa como o sudo que permite aos 
usuários utilizar o comando mount. Ainda não é 
uma solução segura, mas não dá privilégios de 
superusuário a todos os usuários.

? Indicar o uso das ferramentas mtools, um pacote 
de manipulação de sistemas de arquivos DOS, sem 
ter que montá-los. Isso funciona bem  para 
arquivos MS-DOS, mas ainda não é a solução 
ideal. 

? Listar as unidade de disquetes e os pontos de 
montagem permitidos no arquivo /etc/fstab.


Esta última alternativa pode ser implementada 
adicionando-se um linha similar à seguinte no 
/etc/fstab:

     /dev/fd0 /a: msdos user,noauto 0 0 

As colunas são: arquivo do dispositivo a ser 
montado, diretório de montagem, tipo do sistema de 
arquivos, opções, frequência da realização de 
cópias de segurança (usado pelo comando dump), e 
número de passagem do fsck (especifica a ordem em 
que o sistema de arquivos deve ser verificados após 
a inicialização. 0 significa sem checagem). 
 
A opção noauto inibe a montagem automática na 
inicialização do sistema (ou seja inibe a ação do 
comando mount –a no arquivo fstab). A opção user 
permite que qualquer usuário possa montar o sistema 
de arquivos e, por razões de segurança, desabilita 
a execução de programas (em modo normal ou através 
de setuid) e a interpretação de arquivos de 
dispositivos a partir do sistema de arquivos 
montado. Após isso, para montar o disquete com um 
sistema de arquivos DOS, basta utilizar o comando:

     $ mount /a: 
     $ 

O disquete pode  (e deve, conforme exposto acima) 
ser desmontado com o comando umount correspondente. 

Caso seja necessário prover acesso a diversos tipos 
de disquetes, pode-se ter diversos pontos de 
montagem. Os parâmetros podem ser diferentes para 
cada um. Por exemplo para dar acesso a disquetes 
DOS e ext2, pode-se fazer o seguinte: 

/dev/fd0    /dos_a:    msdos   user,noauto  0  0
/dev/fd0    /ext2_a:   ext2    user,noauto  0  0

Para sistemas de arquivos DOS (não somente em 
disquetes), provavelmente queira-se restringir o 
acesso usando opções de máscaras de usuários, uid e 
gid, descritos na página de manual do comando 
mount. Caso estas precauções não sejam tomadas, 
qualquer usuário poderá no mínimo ler todos os 
arquivos DOS daquele sistema de arquivos, o que não 
parece ser uma boa idéia. 

Verificando a integridade de um sistema de arquivos 
com fsck

Sistemas de arquivos são estrutura complexas, e 
devem estar livres de erros para o perfeito 
funcionamento do sistema. A validação e correção de 
erros  de um sistema de arquivos podem ser 
realizadas através do comando fsck. Ele pode ser 
configurado para resolver qualquer tipo de problema 
que ele encontre e para alertar o usuário sobre 
erros incorrigíveis. Felizmente os programas que 
implementam os sistemas de arquivos são muito bem 
desenvolvidos e é muito raro ter-se problemas desta 
natureza, porém ocorrências causadas por falhas de 
energia, falhas de hardware ou erros de operação  
por exemplo, podem desligar o sistema de maneira 
imprópria.
 
Muitos sistemas estão configurados para executarem 
o fsck automaticamente no momento de sua 
inicialização, sendo que vários problemas podem ser 
encontrados e corrigidos desta forma, antes da 
utilização do sistema. O uso de sistemas de 
arquivos corrompidos tende a piorar o problema: se 
as estruturas de dados contém erros, utilizar o 
sistema de arquivos pode provocar uma perda ainda 
maior de dados. Ainda que o fsck possa demorar um 
pouco em grandes sistemas de arquivos e desde que 
problemas raramente ocorrem quando se desliga a 
máquina apropriadamente, alguns truques são usadas   
para evitar a checagem nestes casos. O primeiro é 
baseado na existência do arquivo /etc/fastboot; 
caso ele exista, nenhuma checagem é realizada. O 
segundo consiste em utilizar o e2fsck (a versão do 
fsck para sistemas de arquivos do tipo ext2). Os 
sistemas de arquivos ext2 têm uma marca especial no 
superbloco, a qual informa se o sistema foi 
desligado de maneira apropriada. Caso positivo, o 
programa não checará todo o sistema de arquivos. 
Ainda que o uso do fastboot dependa dos programas 
de inicialização do sistema, o e2fsck não irá 
validar o sistema de arquivos, desde que o sistema 
tenha sido desligado corretamente (veja a página de 
manual do e2fsck  para maiores informações ou o 
Apêndice Comandos e Programas Relacionados).

A checagem automática funciona somente para os 
sistemas de arquivos que são montados 
automaticamente na inicialização do sistema. Para 
os demais, como por exemplo disquetes, o programa 
fsck deve ser executado manualmente.

Caso o fsck encontre problemas irreparáveis, será 
necessário um conhecimento profundo de como os 
sistemas de arquivos funcionam e em especial do 
tipo de sistema corrompido, ou então trazer sempre 
de forma atualizada as cópias de segurança do 
sistema. A segunda opção é mais simples de ser 
posta em prática, já a primeira pode depender de 
pesquisas em grupos de notícias, listas de 
discussão e serviços de suporte. O programa debugfs 
de Theodore T'so pode ajudar nesta tarefa. 
 
fsck deve ser executado somente em sistemas de 
arquivos desmontados e nunca naqueles que já 
estejam montados (exceto o sistema de arquivos 
raiz, montado com permissões somente de leitura, 
durante a inicialização do sistema). Isso se deve 
ao fato do fsck acessar diretamente os dados brutos 
do sistema, podendo inclusive modificá-los sem que 
o sistema operacional perceba. Caso outro programa 
tente acessar ou alterar os dados durante a 
checagem, os resultados são imprevisíveis.

Verificando erros em disco com  badblocks

É aconselhável checar periodicamente o disco 
rígido. Isto poder ser feito através da execução do 
programa badblocks. Ele gera uma lista com os 
números dos blocos defeituosos encontrados. Esta 
lista pode servir de entrada, por exemplo, para o 
comando fsck, a fim de informar as estruturas de 
dados do sistema de arquivos que tenham problemas, 
a fim de que o sistema não armazene dados naqueles 
blocos. O seguinte exemplo mostra como isso pode 
ser feito:   

$ badblocks /dev/fd0H1440 1440 > bad-blocks 
$ fsck -t ext2 -l bad-blocks /dev/fd0H1440 
Parallelizing fsck version 0.5a (5-Apr-94) 
e2fsck 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 
Pass 1: Checking inodes, blocks, and sizes 
Pass 2: Checking directory structure 
Pass 3: Checking directory connectivity 
Pass 4: Check reference counts. 
Pass 5: Checking group summary information. 

/dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED 
***** 
/dev/fd0H1440: 11/360 files, 63/1440 blocks 
$
Caso algum bloco defeituoso já esteja em uso, 
e2fsck tentará mover o bloco para outro local. Caso 
o problema seja realmente grave  e não somente um 
erro superficial, o arquivo poderá estar 
definitivamente corrompido.

Evitando Fragmentação

Quando um arquivo é gravado em disco, ele nem 
sempre pode ser gravado em blocos consecutivos. Um 
arquivo que não esteja armazenado em blocos 
consecutivos estará fragmentado.  Um arquivo com 
essa organização leva mais tempo para ser lido, uma 
vez que as cabeças do disco rígido levarão mais 
tempo, já que terão que  movimentar-se mais. É 
desejável evitar a fragmentação, apesar de não ser 
exatamente um problema grave quando se utiliza um 
bom buffer de dados  de leitura avançada.

Os sistemas de arquivos ext2 tentam manter a 
fragmentação no mínimo, mantendo todos os blocos de 
um arquivo juntos, mesmo que eles não possam ser 
armazenados em setores consecutivos, pois ext2 
efetivamente sempre aloca o bloco livre mais 
próximo dos demais blocos do arquivo. Para ext2,  é 
muito raro preocupar-se com fragmentação. Há um 
programa para desfragmentação de sistemas de 
arquivo do tipo ext2. Para maiores detalhes, 
consulte  ftp://sunsite.unc.edu/pub/Linux/system/ 
Filesystems/defrag-0.6.tar.gz. 

Para sistemas DOS há diversos programas de 
desfragmentação que movem os blocos dentro do 
sistema de arquivos, diminuindo o nível de 
fragmentação. Para outros sistema de arquivos, a 
desfragmentação pode ser realizada através da 
realização de cópias de segurança do sistema de 
arquivos, recriação do sistema e restauração dos 
arquivos. Realizar uma cópia de segurança do 
sistema de arquivos antes de desfragmentá-lo é uma 
boa medida,  uma vez que muitas coisas ocorrem 
durante esse processo.


Outras ferramentas para sistemas de arquivos

Algumas ferramentas são ainda muito úteis no 
gerenciamento de sistemas de arquivos.  O comando 
df apresenta o espaço livre em disco para um ou 
mais sistemas de arquivos. du  mostra o espaço 
ocupado por um diretório e todos os seus arquivos, 
e pode ser usado para encontrar os grandes usuários 
de espaço em disco. 

sync força a gravação  de todos 
os blocos não gravados e que estejam em memória (no 
cache). É raro executá-lo manualmente , o programa 
residente encarregado de sua execução faz isso 
automaticamente, mas pode ser útil em problemas 
como a  “morte”  dos programas update ou bdflush, 
ou case se deseje desligar o equipamento 
imediatamente, sem esperar pela sua execução. 

Outras Ferramentas para Sistemas de Arquivos Ext2

Em adição ao criador de sistemas de arquivos 
(mke2fs) e ao verificador (e2fsck) acessados 
diretamente ou através de uma interface, o sistema 
de arquivos ext2 tem algumas ferramentas que podem 
ser de grande utilidade.

Tune2fs ajusta os parâmetros do sistema de 
arquivos. Alguns parâmetros interessantes são:

? Um contador do número de vezes que o sistema de 
arquivos foi montado. E2fsck força uma checagem 
toda vez que o sistema seja montado n vezes, 
mesmo que o indicador de normalidade esteja 
assinalado. Para um sistema que é usado em 
desenvolvimento ou testes, é sugerido reduzir 
este número.
? Um tempo máximo entre as checagens. e2fsck pode 
ser executado automaticamente caso o tempo 
máximo tenha transcorrido, mesmo que o indicador 
de normalidade esteja assinalado. Esta opção 
pode ser desabilitada, a critério do 
administrador.
? Número de blocos reservado para o raiz. Ext2 
reserva alguns blocos para o sistema de arquivos 
raiz, que mesmo que ele esteja cheio, pode-se 
ter ainda algo em torno de 5% de espaço 
adicional sem ter-se que apagar nenhum arquivo. 
Para disquetes esta facilidade não é 
disponibilizada.

Veja a página de manual do tune2fs para maiores 
informações sobre o assunto ou o Apêndice Comandos 
e Programas Relacionados.

Dumpe2fs apresenta algumas informações sobre um 
sistema de arquivos ext2, a maioria extraída a 
partir do superbloco. Algumas informações são 
extremamente técnicas e exigem um certo 
conhecimento de como o sistema de arquivos 
funciona, mas muitas das informações são do alcance 
da maioria dos administradores.

Figura 4.5: exemplo da saída do programa  dumpe2fs 

Debugfs é um programa destinado à validação de um 
sistema de arquivos. Ele permite o acesso direto às 
estruturas  de dados armazenadas em disco e pode 
ser usado para reparar problemas em discos, que 
talvez nem mesmo o fsck possa corrigir 
automaticamente. Também é utilizado para recuperar 
arquivos apagados. Porém ele exige um alto nível de 
conhecimento das tarefas que estão sendo 
executadas; uma falha no entendimento pode destruir 
todos os dados do disco. 

Dump e restore podem ser 
usados para geração de cópias de segurança de um 
sistema de arquivos ext2. Elas são versões 
específicas para o ext2 de tradicionais ferramentas 
Unix. Veja o capítulo 10 para maiores informações 
sobre cópias de segurança.

Aqui aqui aqui 


Discos sem sistemas de arquivos

Nem todos os discos ou partições são usadas como 
sistemas de arquivos. Uma partição de swap (swap), 
por exemplo, não conterá um sistema de arquivos. 
Muitos disquetes são usados como uma emulação de um 
dispositivo de fita, podendo o comando tar e outro 
gravar os dados em formato imagem diretamente no 
dispositivo, sem um sistema de arquivos. Os 
disquetes de inicialização do Linux não contém um 
sistema de arquivos, mas somente a imagem do 
kernel.

Evitar a utilização de um sistema de arquivos tem a 
vantagem de tornar uma maior parte do disco 
utilizável, uma vez que o sistema de arquivos 
sempre traz algum trabalho extra de manutenção. 
Isso também torna o disco mais compatível com 
outros sistemas: por exemplo o formato de arquivo 
tar é o mesmo em todos os sistemas, enquanto que os 
sistemas de arquivos são diferentes na maioria. Um 
administrador rapidamente acostuma-se ao uso de 
discos sem sistemas de arquivos, caso necessário. 
Disquetes inicializáveis do Linux também não têm 
sistemas de arquivos, apesar de isso ser possível.

Uma razão para usar discos de forma direta é a de 
fazer imagens deles. Por exemplo, se um disco tem 
parte do sistema de arquivos danificada, é uma boa 
idéia fazer-se uma cópia antes de tentar consertá-
lo, podendo o trabalho ser reiniciado caso as 
tentativas tenham danificado os dados restantes. 
Uma forma de fazer-se isso é através do comando dd:
 
$ dd if=/dev/fd0H1440 of=floppy-image 
2880+0 records in 
2880+0 records out 
$ dd if=floppy-image of=/dev/fd0H1440 
2880+0 records in 
2880+0 records out 
$ 

O primeiro dd gera uma imagem exata do disquete 
para o arquivo floppy’image, o segundo grava a 
imagem para o disquete (o usuário presumivelmente 
substituiu o disquete antes do segundo comando. De 
outra forma o procedimento torna-se inútil).


Alocando Espaço Em Disco

   Esquemas de particionamento


Não é fácil particionar um disco na melhor maneira possível. Pior, não há
uma forma correta universal de fazê-lo, devido ao número de fatores
envolvidos. 

O modo tradicional sugere um pequeno sistema de arquivos raiz,
quem contém os diretórios /bin, /etc, /dev, /lib, /tmp e outros
necessários para o sistema ser inicializado e para que ela permaneça
ativo. Desta forma o sistema de arquivos raiz (na sua própria partição e
no seu próprio disco) contém todo o necessário para manter o sistema
ativo. A razão par a o raiz ter um tamanho reduzido é porque ele é pouco
usado, correndo-se assim um risco menor de ter-se arquivos ou blocos
corrompidos caso o sistema tenha algum problema. Após criam-se partições
separadas para a árvore de diretórios sob /usr, para os dir etórios
pessoais (normalmente sob /home) e para a área de swap (swap).
Separando-se a área de diretórios pessoais em sua própria partição torna
as cópias de segurança mais simples, uma vez que não é necessário copiar
os programas (que estão normalmente e m /usr). Em um ambiente de rede é
possível ainda compartilhar o /usr entre diversas máquinas (usando NFS por
exemplo), reduzindo-se assim o espaço total de disco requerido entre todas
as máquinas, gerando economia de dezenas ou centenas de megabytes, depe
ndendo do número de máquinas. 

O problema de ter-se muitas partições é que
elas dividem o espaço livre total do disco em pequenas parte menores,
sendo muito mais simples a manutenção de cópias de segurança. Hoje, que os
discos e sistemas operacionais são mais confiáveis, e muitos prefe rem ter
somente uma partição com todos os arquivos. Para um disco pequeno, talvez
a melhor opção seja esta. Para discos grandes, é preferível ter-se poucas
partições grandes, para os casos em que algo de anormal ocorra. Note-se
que pequenas ou grandes sã o usadas aqui em um sentido relativo, já que
dependem das necessidades e dos equipamentos disponíveis. 

Caso haja vários discos disponíveis é aconselhável se ter o sistema de 
arquivos raiz (inclusive o /usr) em um e os diretórios pessoais em outro.  

É interessante ainda estar preparado para experimentar diferentes esquemas
de particionamento. Pode ser bastante trabalhoso instalar um sistema desde
seu início diversas vezes, porém pode ser a única forma de estar seguro do
resultado final mais adequado. 
     


Requisitos de Espaço

A distribuição Linux que for instalada trará algumas indicações do espaço
necessário para sua instalação. Programas instalados em separado
provavelmente façam a mesma coisa. Isso ajudará no planejamento da
utilização do espaço em disco, porém deve-se esta r preparado para o
futuro, reservado-se algum espaço para extra para as demandas que
surgirão.  

A quantidade de espaço necessária para os usuários dependem das
tarefas que eles executarão. Algumas pessoas fazem somente edição de
textos e necessitam de alguns megabytes, outros podem fazer processamento
de imagens e utilizarem gigabytes. 

Por oportuno ao comparar tamanhos de
arquivos em kilobytes e megabytes e espaço em disco dado em megabytes, é
importante saber-se que são unidades diferentes. Alguns fabricantes de
discos deixam a entender que um kilobyte é igual a 1.000 bytes e um
megabyte igual a 1.  000 kilobytes, enquanto o resto do mundo usa 1.024 em
ambos os fatores. Em assim sendo um disco de aparentemente 345 Mb, tem na
verdade 330 Mb disponíveis.

A alocação de espaço em disco para a área de swap (swap) é discutida na
seção 5.5. 


Exemplo de Alocação de Discos

Eu estou acostumado a um disco rígido de 109 Mb, porém tenho agora um
disco de 330 Mb, e apresentarei como este disco está particionado. 

O disco de 109 Mb foi particionado de diversas formas, à medida as
necessidades e o sistema operacional foram mudando. Apresentarei dois
cenários básicos. Primeiro, executando-se DOS em conjunto com Linux. Para
isso foram utilizados 20 Mb, para conter, no
 mínimo, o MS-DOS, um compilador C, um editor e algumas outras utilidades,
um programa em desenvolvimento , e algum espaço em disco para não criar
"claustrofobia". Para o Linux foi reservado um espaço de 10 Mb para a área
de swap e os 79 Mb restantes, fo ram alocados em uma única partição com
todos os arquivos do Linux. Foi experimentado o particionamento em raiz,
/usr e /home, mas como havia pouco espaço disponível em disco, uma única
partição tornou-se a opção mais interessantes. 

Quando o DOS não era ma is
necessário, o disco foi reparticionado, e foi criada uma área de swap de
12 Mb, e novamente o espaço restante foi alocado em uma única partição. 

O disco de 330 Mb foi particionado em diversas partições, como por
exemplo: 


A partição de testes está designada 
para atividade que requerem uma 
partição própria, como por exemplo, 
testar diferentes distribuições Linux 
ou comparar a velocidade de diferentes 
sistemas de arquivos. Quando é 
necessário algo adicional, pode-se 
utilizar a área de swap (eu gosto de 
ter uma série de janelas abertas).

Adicionando mais espaço em disco para o 
Linux
Adicionar  mais espaço ao Linux é 
simples, ao menos após o hardware ter 
sido adequadamente instalado (a 
instalação de hardware esta além do 
escopo deste livro). Basta formatar, 
criar as partições e os sistemas de 
arquivos conforme descrito 
anteriormente, e adicionar as linhas 
adequadas ao /etc/fstab que os montará 
automaticamente.

Dicas para Economizar Espaço em Disco
A melhor dica para economizar espaço em disco é 
evitar a instalação de programas desnecessários. 
Muitas distribuições Linux tem opções de instalação 
de somente alguns componentes ou pacotes dos 
inúmeros disponíveis, e analisando as suas 
necessidades, perceberá que não necessitará muitos 
deles (talvez a maioria). Isso ajudará a salvar 
muito espaço em disco, já que muitos programas são 
muito grandes. Mesmo que você necessite de um 
determinado programa, talvez somente alguns 
componentes já sejam suficientes. Por exemplo, 
alguma documentação on-line pode ser desnecessária, 
assim como alguns dos arquivos Elisp para o GNU 
Emacs, alguns fontes do X11, ou bibliotecas de 
programação.

Caso não seja possível desinstalar algum pacote, 
deve-se tentar comprimi-los. Programas de 
compressão como gzip ou zip irão comprimir (e 
descomprimir) arquivos em grupo ou individuais. O 
sistema gzexe irá comprimir e descomprimir 
programas automaticamente para o usuário (programas 
sem uso são compactados, e descompactados quando 
utilizados). O programa experimental DouBle irá 
comprimir todos os arquivos do sistema de arquivos, 
automaticamente e de forma transparente para os 
usuários e programas que os utilizem (princípio 
similar ao  produto Stacker para MS-DOS, por 
exemplo).


mem/mem.tex

Gerenciamento de Memória

Minnet, jag har tappat mitt minne, 
är jag svensk eller finne 
kommer inte ihåg...
(Bosse Österberg) 

Esta seção descreve como l Linux gerencia as 
funcionalidade de memória, isto é, memória virtual 
e o cache de disco. Os aspectos necessários para o 
administrador do sistema estão descritos neste 
capítulo.

               O que é memória virtual?
               Criando uma área de swap
               Usando a área de swap
               Compartilhando área de swap com 
outros sistemas operacionais
               Alocando área de swap
               O cache 


O que é memória virtual?  

O Linux suporta a funcionalidade de memória
virtual, isto é, utilizar o disco como extensão da memória RAM, fazendo
com que o tamanho de memória disponível cresça consideravelmente. O kernel
irá gravar o conteúdo de blocos de memória sem uso no disco rígido,
podendo aquela área agora ser utilizada para outros propósitos. Quando o
conteúdo original faz-se necessário, eles são lidos e colocados novamente
na memória. Isso é feito de maneira totalmente transparente para o
usuário, programas sendo executados sob Linux somente vêem a quantidade
total de memória disponível, sem perceber que partes dela residem no disco
de tempos em tempos. Obviamente, ler e gravar em disco é mais lento (na
ordem de 1.000 vezes mais lento) que utilizar memória real, tornando
portando os programas também mais lentos. A parte do disco que é usada
como memória virtual é chamada área de swap (swap space). 


Linux pode usar tanto um arquivo normal de um sistema de arquivos ou uma
partição separada para a área de swap. Uma partição dedicada é mais
rápida, porém é mais fácil mudar o tamanho de um arquivo de swap (não há
necessidade de reparticionar o disco inteiro, e possivelmente instalar o
sistema desde o início). Quando se sabe a quantidade de espaço de swap
necessária, o mais indicado é utilizar uma partição dedicada, mas em caso
de dúvida, deve-se utilizar um arquivo de swap inicialmente, até que se
esteja seguro sobre a quantidade necessária. Após então é indicada a
criação de uma partição específica.  

Cabe salientar que o Linux permite a
utilização simultânea de diversas partições e arquivos de swap. Isso
significa que caso seja necessário ocasionalmente uma área de swap maior,
pode-se criar um arquivo com esta finalidade, ao invés de gerar uma
partição com todo o espaço necessário. 

Nota sobre termos em sistemas
operacionais: ciência da computação normalmente faz distinção entre swaps
(gravar todo o conteúdo de um processo em uma área de swap) e paginação
(gravas partes fixas da memória, normalmente poucos kilobytes, de cada
vez). Paginação é normalmente mais eficiente e é o que o Linux faz, mas
por tradição a terminologia em Linux foi mantida como swap (swapping). 


Criando uma Área de Troca 

Uma área de swap é um arquivo comum, sem nenhum
tratamento especial para o kernel. A única coisa que importa para o kernel
é que não há espaços, e ele foi preparado para uso pelo utilitário mkswap.
Ele deve residir em um disco local, ainda que possa estar em um sistema de
arquivos que foi montado via NFS devido à razões de implementação.  

A questão sobre ausência de espaços é importante. A área de swap reserva um
espaço em disco para que o kernel possa rapidamente swapr uma página sem
ter que checar itens necessários para gravar um arquivo, como alocação de
setores e outros. O kernel simplesmente utiliza qualquer setor que tenha
sido alocado para o arquivo. Como um espaço vazio no arquivo significa que
não há setores de disco alocados (naquele local), não é interessante para
o kernel utilizá-lo.  

Uma boa maneira de criar uma área de swap sem
espaços vazios é utilizar o seguinte comando: 
 
$ dd if=/dev/zero of=/extra-swap 
bs=1024 count=1024
1024+0 records in 
1024+0 records out 
$ 

Onde /extra-swap é o nome do arquivo de swap e o tamanho é dados pelo
parâmetro count=. O tamanho mais indicado deve ser múltiplo de 4, uma vez
que o kernel utiliza páginas de memória de 4 Kb de tamanho. Caso não seja
múltiplo alguns kilobytes não serão utilizados. 

Uma partição de swap também não tem nada de especial. É criada como
qualquer outra partição, a única diferença é que ela é acessada de maneira
direta, isto é não contém nenhum sistema de arquivos. É aconselhável
marcar a partição de swap como de tipo 82 (Troca – Linux), isso tornará
mais claro na lista das partições, mesmo que não seja necessário para o
kernel. 

Após criar a partição de swap ou um arquivo de swap, é
necessário gravar uma assinatura no seu início, que contém algumas
informações administrativas utilizadas pelo kernel. O comando utilizado é
o mkswap, da seguinte forma:

$ mkswap /extra-swap 1024
Setting up swapspace, size = 1044480 bytes 
$

Note-se que o espaço de swap ainda não está sendo utilizado; ele existe,
mas o kernel não o está utilizando para prover a memória virtual. 

Deve-se ser extremamente cuidados com o comando mkswap, uma vez que ele não 
checa se o arquivo ou a partição já está sendo utilizada para outra finalidade,
ou seja pode-se facilmente sobrescrever arquivos importantes ou mesmo
partições inteiras. Felizmente este comando somente é necessário durante a
instalação do sistema. 

O gerenciador de memória do Linux limita o tamanho da área de swap em
cerca de 127 Mb (por várias razões técnicas, o limite atual é em bytes, ou
exatamente 127.6875 Mb). Pode-se porém utilizar até 16 áreas de swaps
simultaneamente, totalizando cerca de 2 Gb. 



Usando a área de swap

Uma área de swap é ativada através do comando swapon. Este comando diz ao
kernel que a área de swap pode ser usada. O caminho para a área de swap
é dado como um argumento. Para iniciar o processo de swap em um arquivo
temporário pode-se usar o seguinte comando:  $ swapon /extra-swap $

Áreas de swaps podem ser usadas automaticamente ao serem listadas no
arquivo /etc/fstab: 
 
/dev/hda8 none swap sw 0 0 
/swapfile none swap sw 0 0 

Os programas de lotes executarão o comando swapon – a, inicializará o
processo de swap em todas as áreas listadas no arquivo /etc/fstab. O
comando swapon pode ser usado ainda quando se deseje áreas extras de
swap.  Pode-se monitorar o uso de área das áreas de swap através do
comando free. Ele apresentará o total de área de swap disponível:  

$ free
total used free shared buffers Mem: 15152 14896 256 12404 2528 -/+
buffers: 12368 2784 Swap: 32452 6684 25768 $

O primeiro item da saída (Mem:) mostra a memória física. A coluna de total
não apresenta a memória física usada pelo kernel, a qual gira em torno de
um megabyte. A segunda coluna apresenta a memória utilizada. A coluna de
memória livre mostra a quantidade de memória sem uso. A coluna de memória
compartilhada mostra a memória utilizada por diversos processos. A coluna
de buffers apresenta o tamanho atual do cache de buffer de disco. 

A última linha (Swap:) mostra informações similares sobre a área de swap.  

As mesmas informações podem ser obtidas através do comando top ou através do
arquivo /proc/meminfo no sistema de arquivos proc.  É um pouco difícil
obter informações de uso de uma determinada área de swap.  

Uma área de swap pode ser desativada através do comando swap0ff. Normalmente isso não
é necessário, exceto para áreas temporárias. Qualquer página em uso na
área será devolvida à memória primeiro, e caso não haja memória física
disponível para manter todas as páginas, Linux começará a dispensá-las,
após um período ela pode ser recuperada, mas neste meio tempo estará
indisponível. Pode-se checar, com o comando free por exemplo, se há
memória livre suficiente para remover a área de swap em uso.  

Todas as
áreas de swap que são usadas automaticamente através do comando swapon –a
podem ser removidas pelo comando swapoff –a, o qual verufica o conteúdo do
arquivo /etc/fstab para descobrir quais arquivos devem ser removidos. As
áreas de swap manualmente ativadas permanecerão em uso. 

Algumas vezes uma
grande quantidade de área de swap pode ser usada, apesar de existir uma
grande quantidade de memória física livre. Isso pode ocorrer por exemplo
quando se em determinado momento há necessidade de efetuar uma swap,
porém logo após um processo que ocupava muita memória física foi
concluído, liberando a memória física em uso. Os dados que foram gravados
na área de swap não são automaticamente retornados para a memória física
até que isso seja necessário, podendo a memória física ficar um longo
tempo sem uso. Não há com o que se preocupar em relação a esta situação,
porém é bom saber que ela ocorre. 
 

Compartilhando área de swap com outros sistema 
operacionais

Memória virtual é uma funcionalidade disponível em diversos sistemas
operacionais. Uma vez que cada sistema somente a utiliza quando estiver
rodando, ou seja, nunca ao mesmo tempo, pois não é possível executar mais
de um sistema ao mesmo tempo, uma idéia mais eficiente seria compartilhar
uma única área de swap. Isso é possível, mas requer um conhecimento
avançado. O Tips-HOWTO contém algumas orientações sobre a forma de
implementar isto.



Alocando espaço para área de swap

Algumas pessoas dirão que se deve alocar o dobro da memória física para a
área de swap, mas esta é uma regra simplista. 

Para estimar isso
corretamente deve-se:  

1. Estimar o total de memória necessária. Ou seja a
maior quantidade de memória necessária ao mesmo tempo, ou seja a soma dos
requisitos de memória de todos os programas que podem rodar
simultaneamente. Isso pode ser feito através ao se executar ao mesmo tempo
todos os programas que podem rodar ao mesmo tempo. 

Por exemplo, caso se
deseje executar o X, deve-se alocar ao redor de 8 Mb para ele, gcc usa
diversos megabytes (alguns arquivos necessitam grandes quantidades de
memória, até dezenas de megabytes, mas normalmente ao redor de 4 Mb deve
ser suficiente, e assim por diante. O kernel utiliza ao redor de 1 Mb, e o
ambiente de trabalho padrão e outros pequenos utilitários usam alguns
poucos kilobytes (digamos 1 Mb se somados). Não há necessidade de ser
exato, estimativas aproximadas são suficientes, mas neste caso deve-se
sempre estimar pelo ponto máximo. 

Note-se que se há diversos usuários
utilizando o sistema ao mesmo tempo, eles irão consumir memória, ainda que
neste caso não se deve imaginar um consumo em dobro, pois as páginas de
código e bibliotecas compartilhadas existem em somente uma instância. Os
comandos free e ps são muito úteis para estimar a memória necessária.  

2.
Adicionar uma margem de segurança à estimativa do passo 1. Isso porque
certamente há outros programas que serão necessários e provavelmente não
foram lembrados e para se ter uma certa margem de segurança. Alguns
megabytes devem atender (é melhor alocar uma área de swap de sobra do que
uma área muito pequena, mas não há necessidade de alocar o disco inteiro,
pois afinal a área de swap é um espaço perdido, pois não pode ser
utilizado para outras finalidades). Uma vez que números pares são mais
indicados, pode-se arredondar o valor para o próximo megabytes.  

3.
Baseado nos cálculos acima, pode-se saber quanta memória será necessária
ao total. Então para alocar a área de swap, basta somente subtrair o
tamanho da memória física do total de memória necessária e se obterá o
tamanho necessário para a área de swap (em alguns sistemas Unix, é
necessário alocar espaço para uma imagem da memória física,. Então o valor
encontrado no passo 2 é o valor necessário para a área de swap).  

4. Caso
a área de swap seja muito maior que a memória física (algumas vezes
maior), será necessário possivelmente aumentar o total de memória física
instalada, pois de outra forma a performance será sofrível.

É aconselhável ter ao menos alguma área de swap, mesmo que os cálculo
indiquem que nenhuma área é necessária. Linux usa a área de swap de forma
agressiva, então é desejável manter o máximo possível de memória física
livre. Linux irá transferir para a área de swap as páginas de memória que
não estejam sendo utilizadas, mesmo que a memória física não esteja sendo
requisitada para outra tarefa. Isso evita esperas quando a memória for
necessária – a swap pode ser feita mais cedo, quando o disco está
disponível.  

A área de swap pode ser dividida em diversos discos. Isso
pode eventualmente aumentar a performance, dependendo da velocidade
relativa dos discos e do tipo de acesso aos discos. Pode-se experimentar
alguns esquemas, mas é importante salientar que as experiências podem ser
bastante complexas. Não se deve crer que um esquema é superior ao outro
sem antes verificar a sua real aplicabilidade. 




Cache de buffer

A leitura do disco é muito lenta quando comparada com o acesso á memória
real. Adicionalmente, é comum ler-se a mesma parte do disco diversas vezes
durante um período de tempo relativamente curto. Por exemplo alguém que
esteja lendo um email, o acessará novamente no editor de mensagens para
reenviá-lo ou respoder, e colocará o mail em uma pasta para arquivamento.
Ou deve se considerar quão frequentemente o comando ls é executado em um
sistema com diversos usuários. Ao ler as informações do disco e
mantendo-os em memória até que não mais seja necessário, pode agilizar
todos os acessos posteriores ao primeiro. Isso é chamado de buffering de
disco, e a memória usada para este fim é chamada de cache de buffer.  

Uma
vez que a memória é infelizmente finita, digamos, um recurso escasso, o
cache de buffer pode não ser grande o suficiente, ou seja pode não conter
todos os dados que os usuários necessitam. Quando o cache está cheio, os
dados sem uso há mais tempo são descartados e a memória é liberada para
uso por dados novos.  


Buffering de disco funciona também para gravação.
Por outro lado dados que são gravados são também lidos com muita
frequência (por exemplo o código fonte de um programa, salvo em um
arquivo, e após lido pelo compilador). Então colocar os dados gravados em
um cache é também uma boa idéia. Por outro lado, colocar os dados a serem
gravados somente em memória, sem gravá-los efetivamente em disco, agiliza
o programa que deveria gravá-los. A gravação pode então ser feita em
segundo plano, sem diminuir a velocidade de gravação dos outros programas. 


Muitos sistemas operacionais têm cache de buffer (apesar de às vezes
receber outro nome), mas nem todos funcionam dentro dos mesmos princípios.
Alguns são de gravação imediata: os dados são gravados no disco
imediatamente (e são mantidos no cache obviamente), outros são de gravação
posterior, isto é a gravação somente é feita após intervalos de tempo.
Gravação posterior é mais eficiente, mas mais suscetível a erros: caso uma
máquina tenha algum problema, ou a energia elétrica é cortada em um mau
momento, ou o disquete é removido sem ser desmontado, as mudanças
registradas no cache são perdidas. Isso pode significar que o sistema de
arquivos não funcionará bem, talvez devido a dados não gravados que
continham informações críticas a manutenção do sistema. 

Por causa disso,
nunca deve-se desligar um equipamento sem seguir os procedimentos
adequados ou remover um disquete da unidade sem que o dispositivo esteja
desmontado ou após o que quer que o programa tenha realizado. O comando
sync esvazia o buffer, isto é força a gravação de dados ainda não
atualizados, e pode ser utilizado quando se quer ter certeza que tudo está
em segurança e atualizados. Em sistemas Unix tradicionais, há um programa
chamado update que roda em segundo plano, não sendo normalmente necessário
o uso do comando sync. Linux tem ainda um programa residente chamado
bdflush, o qual executa uma sincronização imperfeita mais frequentemente
para evitar travamentos súbitos devido ao grande tráfego de entrada e
saída gerado pelo comando sync. 

No Linux, o bdflush é ativado pelo update. Não há razão para perocupar-se
sobre isso, mas se o bdflush finalizar por alguma razão, o kernel emitirá
um aviso sobre a ocorrência e ele deverá ser reinicialidao (/sbin/update).
O cache não põem arquivos no buffer, mas sim blocos, que são as menores
partes de um disco (em Linux, normalmente com 1 Kb de tamanho). Dessa
forma diretórios, superblocos, outros sistemas de arquivos e discos sem
sistemas de arquivos são colocados em cache de buffer.

A efetividade do cache é definida basicamente pelo seu tamanho. Um cache
pequeno é quase inútil:  ele manterá tão pouca informação que toda a
informação será retirada do cache antes de ser usada novamente. O tamanho
correto depende do volume de dados que é lido e gravado simultaneamente. A
única forma de saber é experimentando.  Caso o cache tenha um tamanho
fixo, é melhor não defini-lo com um tamanho muito grande, pois isso pode
diminuir demasiadamente a memória livre e causar um volume excessivo de
swaps (e consequentemente lento). Para tornar mais eficiente o uso da
memória real, Linux automaticamente usa toda a memória livre como cache de
buffer, mas também a diminui quando os programas necessitam de mais
memória. Em Linux não há o que fazer para utilizar o cache, tudo acontece
automaticamente. Exceto por seguir os procedimentos de desligamento e
remoção de disquetes, não há com o que se preocupar. 
 

Iniciando e Desligando

Inicie-me
Ah...você tem que fazê-lo...você tem que fazê-lo
Nunca, nunca, nunca pare
Inicie-o
Ah...inicie-o, nunca, nunca, nunca
Você fará um homem adulto chorar,
Você fará um homem adulto chorar
(Rolling Stones)
       
Esta seção explica como um sistema Linux pode ser inicializado e
desligado, e como isto pode ser feito adequadamente. Caso os procedimentos
adequados não sejam seguidos, os arquivos podem se corrompidos ou
perdidos. 

           O processo de inicialização em maiores 
detalhes
           Reinicializando
           Mais informações sobre o encerramento do 
sistema
           Modo monousuário
           Disquetes de emergência    




Visão Geral da Inicialização e Encerramentos do 
Sistema

O ato de ligar o computador e carregar o sistema operacional é chamado
inicialização (booting - calçar). O nome vem da imagem do computador
puxando a si próprio, mas o ato em si mesmo é um pouco mais realista.


Durante a arrancada, o computador carrega inicialmente uma pequena porção
de código chamada carregador da inicialização, o qual carrega e inicia o
sistema operacional. O carregador da inicialização é normalmente
armazenado em uma localização fixa no disco rígido ou disquete. A razão
para estes dois passos é que o sistema operacional é grande e complicado,
mas a primeira parte a ser carregada tem que ser muito pequena (poucas
centenas de bytes), evitando-se a necessidade de fabricação de firmwares
muito complicados. 

Diferentes computadores têm carregadores diferentes.
Para PCs, o computador (a BIOS) lê o primeiro setor (chamado setor de
inicialização) do disquete e disco rígido. O carregador de inicialização
esté neste setor. Ele carrega o sistema operacional, onde quer que ele
esteja no disco (ou em qualquer outro local onde ele esteja).  

Após a
carga do Linux, o hardware é inicializado e os arquivos de controles de
dispositivos são inicializados, e é então executado o processo init, o
qual inicia os demais processos que permitem o acesso aos usuários e que
eles possam executar outros programas. Os detalhes desta fase serão
discutidas a seguir.  

Para desligar o sistema, inicialmente todos os
processos recebem o aviso para desligarem-se (isso faz com que os arquivos
sejam fechados e todos os procedimentos para que tudo fique em ordem sejam
tomados), após, os sistemas de arquivos e áreas de swap são desmontados e
finalmente uma mensagem é apresentada na console, de que a alimentação
elétrica pode ser desligada. Caso o procedimento correto não seja seguido,
coisas muito desagradáveis podem ocorrer e às vezes ocorrem, como por
exemplo a perda de todos os dados no cache de buffer de disco, sendo que o
sistema de arquivos em disco pode ficar incosistente e até mesmo
inutilizado. 




O processo de inicialização em maiores detalhes

Pode-se iniciar o Linux a partir de um disquete ou do disco rígido. A
seção de instalação do guia Instalação e Começando em Linux descreve como
instalar o Linux e iniciá-lo da forma que se queira. 

Quando um PC é
inicializado, a BIOS executará diversos testes para checar se tudo está em
perfeita ordem, buscando a seguir a inicialização atual. Ela escolherá o
disco rígido (tipicamente o primeiro dispositivo de disquete, se houver um
instalado; a ordem porém pode ser configurada) e lerá o primeiro setor.
Este é chamado de setor de inicialização, e no caso de discos rígidos é
chamado de registro mestre de inicialização, uma vez que um disco rígido
pode conter diversas partições, cada qual com o seu próprio setor de
inicialização. 

O setor de inicialização contém um pequeno programa,
pequeno o suficiente para caber em um setor, o qual tem a função de ler o
sistema operacional instalado e inicializá-lo. Quando a inicialização é
realizada a partir de um disquete, o setor de inicialização contém um
determinado código que apenas lê algumas centenas de blocos (dependendo do
tamanho do kernel) em uma determinada área da memória. Em um disquete de
carga do Linux, não há sistema de arquivos, o kernel está armazenado em
setores consecutivos, uma vez que isso simplifica o processo de
inicialização. É possível, porém, inicializar a partir de um disco que
contenha um sistema de arquivos, utilizando-se o LILO, o carregador Linux.

Ao inicializar a partir de um disco rígido, o código do registro mestre de
inicialização examinará a tabela de partições (também localizada no
registro mestre), identificará a partição ativa (a partição indicada como
inicializável), lerá o setor de inicialização daquela partição e iniciará
o programa gravado naquele setor. O código no setor de inicialização faz
exatamente o que o setor do disquete faz: lerá o kernel de uma partição e
o executará. Os detalhes variam, uma vez que não é muito útil ter uma
partição separada somente para manter uma imagem do kernel, uma vez que o
código no setor de inicialização não pode simplesmente ler o disco
seqüencialmente , e sim tem que encontrar os setores aonde quer que o
sistema de arquivos o tenha colocado. Há diversas soluções para o
problemas, mas o mais utilizado é utilizar o LILO (os detalhes sobre como
fazer isso são irrelevantes, para maiores informações verifique a
documentação do LILO). 

Quando o sistema é iniciado utilizado o LILO, ele
normalmente segue adiante e lê a inicialização padrão. É possível
configurar o LILO para iniciar um dos possíveis kernels, ou mesmo iniciar
outros sistemas diferentes do Linux, sendo possível usá-lo para escolher
toda vez que o sistema for ligado, qual sistema ou kernel utilizar. Para
tanto pode-se pressionar alt, shift ou ctrl durante a inicialização do
sistema (quando o LILO é carregado) e serão apresentadas as opções
disponíveis, ao invés da inicialização automática com o sistema definido
como padrão.  Alternativamente, o LILO pode ser configurado para sempre
perguntar qual sistema deve ser carregado, e após um tempo máximo
configurável de espera carregar o sistema definido como padrão.  Como o
LILO é possível ainda enviar linhas de comando ao kernel do sistema,
imediatamente após o nome do sistema operacional. 

Note-se que há outros gerenciadores de inicialização, além do LILO, como
por exemplo o loadlin. Informações sobre estes sistemas podem ser
adicionadas em futuras versões deste manual. 

O sistema pode ser inicializado a partir de disquetes ou de discos
rígidos, porém a segunda alternativa tende a ser a melhor, uma vez que
evita os problemas inerentes aos disquetes, além de ser mais rápido. Ainda
assim pode haver um certo nível de problemas ao instalar-se a partir de um
disco rígido, fazendo com que muitos usuários utilizem disquetes para uma
primeira inicialização do sistema, executem a sua instalação no disco
rígido, assim como a do LILO, e somente a partir daí passem a utilizar o
disco rígido como unidade de início do sistema. 

Após a carga do kernel do Linux em memória, independente da forma, e o
sistema estando efetivamente em execução, ocorrem os seguintes eventos: 

? kernel do Linux é instalado inicialmente em um formato compactado, sendo
então descompactado de forma automática, através de um pequeno programa
que está localizado no início da imagem do kernel. 

? Caso se esteja utilizando uma placa de vídeo Super VGA, Linux faz o seu
reconhecimento e pode adotar alguns procedimentos especiais (como utilizar
100 colunas por 40 linhas), perguntando que modo se deseja utilizar.
Durante a compilação do kernel, é possível pré-definir um modo de vídeo, e
essa pergunta nunca será apresentada. Isso pode ser feito também através
do LILO ou do comando rdev. 

? Após, o kernel verifica os demais hardwares (discos rígidos, disquetes,
placas de rede, etc...) e configura os arquivos de controle de
dispositivos mais adequados. AO encontrar os arquivos de controle diversas
mensagens são apresentadas, como por exemplo: 

LILO boot:
Loading linux.
Console: colour EGA+ 80x25, 8 
virtual consoles
Serial driver version 3.94 with 
no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 
16450
tty01 at 0x02f8 (irq = 3) is a 
16450
lp_init: lp1 exists (0), using 
polling driver
Memory: 7332k/8192k available 
(300k kernel code, 384k reserved, 
176k data)
Floppy drive(s): fd0 is 1.44M, 
fd1 is 1.2M
Loopback device init
Warning WD8013 board not found at 
i/o = 280.
Math coprocessor using irq13 
error reporting.
Partition check:
  hda: hda1 hda2 hda3
VFS: Mounted root (ext 
filesystem).
Linux version 0.99.pl9-1 
(root@haven) 05/01/93 14:12:20

O texto exato difere de equipamento para equipamento, dependendo do
hardware disponível, assim como da versão do Linux e de como ele esteja
configurado.  

? kernel tentará então montar o sistema de arquivos raiz. A
origem deste sistema pode ser configurada em tempo de compilação, ou a
qualquer tempo através do LILO ou do rdev. O tipo de sistema de arquivos é
detectado automaticamente. Caso a sua montagem falhe, por exemplo devido
ao esquecimento de inclusão do sistema de arquivos raiz no kernel, este
dará uma mensagem de erro fatal (panic) e abortará a inicialização do
sistema. 


O sistema de arquivos raiz é normalmente montado com parâmetros
de acesso limitados a somente leitura (o que pode ser configurado de
acordo com a necessidade do administrador).  É possível validar o sistema
de arquivos enquanto ele é montado, porém não é uma boa idéia para
sistemas de arquivos com acesso somente de leitura.  

? Após o kernel
executará o programa init (localizado em /sbin/init) em modo de execução
secundário (e ele sempre terá o número de processo igual a 1). init
executa a ativação de diversos serviços. O que ele fará exatamente depende
de como ele está configurado. No mínimo ele iniciará alguns programas
residentes essenciais.  

? init então passará o sistema para o modo
multiusuário e iniciará o programa getty, permitindo o uso de consoles
virtuais e linhas seriais. getty é o programa que permite que os usuários
acesse o sistema e pode também iniciar outros programas, dependendo de
como esteja configurado. ? Após estes passos o sistema estará ativo e
pronto para uso. 



@@@@@@ linhas em branco (ou preto :-) )@@@@@@@@@@@@


Este procedimento, avisará a todos os usuários que o sistema será
desligado em dez minutos, e que eles poderão perder seus dados. O aviso é
apresentado em todo o terminal que estiver conectado, inclusive terminais
X

     Broadcast message from root (ttyp0) Wed Oct 28 
01:03:25 1998... 

     Iremos instalar um novo disco rígido.
     O sistema estará ativo em 1 hora
     The system is going DOWN for system halt in 10 
minutes !! 


O procedimento é automaticamente repetido algumas vezes antes do
desligamento, e a intervalos cada vez menores, à medida que o tempo passe. 

Quando o desligamento do sistema tem início, todos os sistemas de arquivos
(exceto o raiz) são desmontados, os processos de usuários (casa haja algum
ainda utilizando o sistema) são finalizados, programas residentes são
encerrados, e finalmente o sistemas de arquivos raiz é desmontado. Quando
isso ocorre o processo init apresenta a mensagem de autorização do
desligamento da máquina. Agora, e jamais antes disso, pode-se desligar o
equipamento. 

Algumas vezes, apesar disso ser muito raro em bons sistemas, é impossível
desligar o sistema de forma adequada. Por exemplo, caso ocorra um erro
fatal com o kernel, pode ser impossível emitir qualquer novo comando,
tornando o desligamento correto inviável, e tudo o que se pode fazer é
esperar que nenhum dano maior ocorra e então desligar a máquina. Caso os
problemas sejam menos sérios (digamos que alguém quebrou o seu teclado com
um machado (), e o kernel está rodando normalmente, é aconselhável
aguardar alguns minutos para que os dados sejam atualizados, esvaziando
assim o cache de disco, e somente após desligar o equipamento. 

Alguns usuários gostam de utilizar o comando sync três vezes, aguardando
pelo final do E/S, e somente após desligar o equipamento. Caso não haja
programas sendo executados, esse procedimento equivale ao shutdown. Ainda
assim nenhum sistema de arquivos é desmontado o que pode gerar problemas
com o marcador de sistema de arquivos do tipo ext2fs. Em assim sendo este
método não é recomendado. 

(A razão dos três comandos sync remonta aos primeiros tempos do UNIX, onde
os comandos eram digitados separadamente, o que dava tempo suficiente para
que as operações de E/S fossem finalizadas).



Modo monousuário

O comando shutdown também pode ser usado para colocar o sistema em modos
monousuário, o qual ninguém, além do superusuário (root), pode acessar, e
assim mesmo somente na console. Isso é muito útil para tarefas de
administração que não podem ser executadas caso o sistema esteja sendo
executado normalmente. Este modo de operação é melhor discutido mais
adiante neste livro. 



Disquetes de Emergência

Nem sempre pode ser possível inicializar o sistema a partir do disco
rígido. Por exemplo um erro grave na configuração do LILO, pode tornar o
sistema incapaz de ser iniciado. Para essas situações, é necessário ter
uma alternativa de inicialização que funcione sempre (desde que o hardware
também funcione). Para PCs típicos, isso pode significar inicializar o
sistema a partir da unidade de disquetes.

Muitas distribuições de Linux, inclusive o Conectiva Red Hat Linux,
permite a criação de disquetes de emergência durante a instalação. É uma
excelente idéia criá-los, ainda que algumas vezes ele possa conter somente
o kernel do sistema, e presuma que os programas serão utilizados a partir
dos discos de instalação da distribuição, para corrigir o que quer que
seja. Algumas vezes isso pode não ser suficiente, como por exemplo, quando
se deseje restaurar alguns arquivos a partir de cópias de segurança feitos
através de softwares não presentes nos discos de instalação.

Pode ser necessário então criar-se um disquete raiz personalizado. O HOWTO
de Disco de Inicialização desenvolvido por Graham Chapman contém as
instruções de como fazer isso. Mas deve-se atentar para manter-se os
disquetes de emergência e raiz atualizados. 

Não se pode utilizar a unidade de disquetes utilizada para montar o
disquete raiz para qualquer outra finalidade. Isso pode ser incoveniente
caso se tenha somente uma unidade de disquetes. Ainda assim, caso haja
memória suficiente, pode-se configurar o disquete raiz para carregar o seu
conteúdo para a memória (o disco de inicialização do kernel necessita ser
especialmente configurado para isso). Uma vez que o disquete tenha sido
carregado em memória, a unidade estará liberada para montar outros discos. 



Init

Uuno on numero yksi 

Este capítulo descreve o processo init, o qual é o primeiro processo de
nível de usuário que é iniciado pelo kernel. init tem diversas tarefas
importantes, como iniciar o getty (após o qual os usuário podem acessar o
sistema), implementar os níveis de execução, e tomar conta dos processos
órfãos. Este capítulo explica como o nit é configurado e como fazer uso
dos diferentes níveis de execução. 

      
          init vem em primeiro lugar
          configurando o init: o arquivo 
/etc/inittab
          níveis de execução
          configurações especiais no /etc/inittab
          iniciando em modo monousuário



init vem em primeiro lugar

init é um dos programas absolutamente essenciais para a operação de um
sistema Linux, mas que o usuário pode ainda ignorar. Uma boa distribuição
Linux conterá a configuração de um init que funcionará com a maioria dos
sistemas, e não haverá necessidade de fazer absolutamente nada.
Usualmente, o administrador somente irá preocupar- se com o init caso
necessite lidar com terminais seriais, modems configurados para
atendimento (e não para chamadas) ou caso deseje mudar o nível de execução
padrão do sistema. 

Quando o kernel se auto inicializa (é carregado em memória, começa a
rodar, inicia todos os arquivos de controles de dispositivos e estrutura
de dados), ele finaliza as suas tarefas na inicialização do sistema ao
iniciar o programa de nível de usuário init. E init é sempre o primeiro
processo do sistema (o seu número de processo é sempre igual a 1). 

O kernel procura pelo init em algumas localizações que vem sendo usadas
historicamente para isso, porém a localização correta em um sistema Linux
é o /sbin/init. Caso o kernel consiga encontrá-lo, ele executará o
programa /bin/sh e caso ocorra algum problema, a inicialização do sistema
é abortada. 

Quando o init começa, ele finaliza o processo de inicialização ao executar
uma série de tarefas administrativas, como a checagem dos sistemas de
arquivos, limpeza do /tmp, início de vários serviços e do getty para cada
terminal e console virtual através dos quais os usuários serão autorizados
a acessar o sistema.

Após o sistema ter sido adequadamente inicializado, o init reinicia um
getty para cada terminal após a saída do usuário do sistema (permitindo
que o próximo usuário possa acessar o sistema). Além disso, init adota
também todos os processos órfãos: quando um processo inicia um processo
filho e é finalizado antes de seu filho, imediatamente o processo restante
torna-se filho do init. Isso é importante por várias razões técnicas, mas
é importante conhecer para entender as listas de processos e a árvore de
processos.

Há poucas variantes disponíveis do init. Muitas distribuições Linux usam o
sysvinit (escrita por Miquel van Smoorenburg), a qual é baseada no desenho
do init do System V. AS versões BSD tem um init diferente. As diferenças
básicas residem nos níveis de execução presentes somente no System V.
Essas diferença não é essencial e nós examinaremos somente o sysvinit. 



configurando o init: o arquivo /etc/inittab


Quando é inicializado, o processo init lê o arquivo de configuração
/etc/inittab. Enquanto o sistema estiver no ar, ele será lido novamente,
caso seja enviado um sinal HUP, tornando desnecessário inicializar todo o
sistema para que as mudanças do init façam efeito. 

O arquivo /etc/inittab é um pouco complicado, porém começaremos pelos
casos mais simples, ou seja configurando as linhas do getty. Linhas do
arquivo /etc/inittab consistem de quatro campo delimitados por dois
pontos: 

     id:nível_de_execução:ação:processo 


Os campos são descritos a seguir. Em adição o /etc/inittab podem conter
algumas linhas vazias, e linhas que comecem com # serão consideradas
comentários. 

id Identifica a linha no arquivo. Para linhas referentes ao getty
especifica o terminal em que eles são executados (os caracteres após o
/dev/tty no nome do arquivo de dispositivo). Para outras linhas não tem
efeito (exceto pelas restrições de tamanho), e devem ser únicas, ou sejam
não pode haver mais de uma linha com o mesmo número. 

nível_de_execução Os níveis de execução que devem ser considerados para a
linha. Os níveis de execução são definidos através de dígitos sem
delimitadores e são melhor descritos na próxima seção. 

ação Define ação que deve ser executara pela linha. Por exemplo, respawn
para executar novamente o comando do próximo campo, quando ele existir ou
once para executá-lo somente uma única vez. 

processo
O comando a ser executado
 
Para iniciar o getty no primeiro terminal virtual (/dev/tty1), em todos os
modos de execução multiusuário (de 2 a 5), deve-se informar a seguinte
linha. 

     1:2345:respawn:/sbin/getty 9600 tty1 


O primeiro campo diz que a linha deve ser executada para /dev/tty1; o
segundo que ele aplica-se aos níveis de execução de 2 a 5; o terceiro que
o comando deve ser executado diversas vezes, ou seja reinicializado
diversas vezes (ou seja quando um usuário desconectar-se de um terminal, o
processo getty será executado novamente para que outro usuário possa
conectar-se). O último campo executa o processo getty no primeiro terminal
virtual.

Caso deseje-se adicionar terminais ou modems para recebimento de chamadas
ao sistema, deve-se adicionar mais linhas ao arquivo /etc/inittab, uma
para cada terminal ou modem. Para maiores detalhes veja as páginas de
manual init (8), inittab (5) and getty (8). 

Caso o comando falhe ao ser executado, e o init esteja configurado para
reinicializá-lo, isso certamente consumirá uma grande quantidade de
recursos pois o processo de iniciar o comando se repetirá indefinidamene.
Para prevenir esse tipo de problema, init verificará a frequência de
reinicialização do comando e caso esta seja muito grande, o init aguardará
automaticamente por cinco minutos antes de iniciá-lo novamente. 



Níveis de Execução

Nível de execução é o estado do init e de todo o sistema que define que
serviços estarão operacionais. Eles são identificados por números, de
acordo com a tabela a seguir. Não há nenhum consenso de como utilizar os
níveis definidos pelo usuário (de 2 a 5). Alguns administradores de
sistema utilizam os níveis de execução para definir quais subsistemas
serão executados, por exemplo se o X estará disponível ou as
funcionalidades de rede e assim por diante. Outros tem todos os
subsistemas sendo ativados e sendo finalizados individualmente, sem mudar
o nível de execução, já que este pode ser um pouco complexo para controlar
seus sistemas. Cada administrador deve definir qual o método mais adequado
às suas necessidades, porém seguir a forma definida pela distribuição em
uso deve ser o meio mais simples.

0 - Parar o sistema
1 - Monousuário (para tarefas de administração do 
sistema)
2-5 - Operação normal (definida pelo usuário)
6 - Reinicializar

Tabela de Níveis de Execução

Níveis de execução são configurados no /etc/inittab 
por linhas como as seguintes:

l2:2:wait:/etc/init.d/rc 2 

O primeiro campo é uma etiqueta arbitrária; o segundo significa que ele se
aplica ao nível de execução 2. O terceiro significa que o init deve
executar o comando contido no quarto campo quando o nível de execução for
informado, e que o init deve aguardar que ele seja concluído. O
/etc/init.d/rc executa todos comandos necessários para iniciar e parar os
serviços previstos para este nível.

O comando no quarto campo executa todo o trabalho duro de configurar um
nível de execução. Ele inicia os serviços que ainda não estejam sendo
executados e finaliza os serviços que não devem rodar neste nível.
Exatamente qual o comando a ser utilizado ou como o nível está configurado
depende de cada distribuição Linux. 

Quando o init é iniciado, ele procura por uma linha no /etc/inittab que
especifique o nível de execução padrão: 

     id:2:initdefault: 


Pode-se informar ao init para iniciar o sistema em um nível de execução
fora do padrão, informando ao kernel um comando com argumentos de
inicialização em nível monousuário ou de emergência. Isso permite escolher
o nível 1, descrito na próxima seção. 

Enquanto o sistema está sento executado o comando telinit pode mudar o
modo de execução, o que faz com que o init execute o comando apropriado
definido no /etc/inittab. 



Configurações especiais no /etc/initttab


O arquivo /etc/inittab tem algumas funcionalidades especiais que permitem
ações diferenciadas em situações especiais. Estas funcionalidades são
definidas através de palavras chaves utilizadas no terceiro campo. Alguns
exemplos: 

powerwait permite que o init desligue o sistema, na falta de energia
elétrica. Assume que o sistema está utilizando uma unidade de alimentação
extra (no- break) e que o software da unidade informará sobre a falta de
enrgia. 

ctrlaltdel permite o init reinicializar o sistema, quando as teclas
control-alt-del do teclado forem pressionadas simultaneamente. Veja que o
administrador pode configurar C-A-D ou qualquer outra combinação para
funcionarem desta forma, aplicável por exemplo, nos casos em que o sistema
esteja em uma localização pública. 


sysinit 

comando que deve ser executado quando o sistema for inicializado. Por
exemplo, limpar o conteúdo de /tmp. 

Esta lista não é completa. Veja a página de manual on-line do inittab (5)
para todas as possibilidades e detalhes de como utilizá-las. 


iniciando em modo monousuário

Um nível de execução extremamente importante é o modo monousuário (nível
1), no qual somente o administrador do sistema utiliza a máquina e o menor
número possível de serviços (como número de acessos ao sistema) estarão
disponíveis. Este modo de execução é necessário para algumas pequenas
tarefas administrativas, tais como na execução do fsck na partição /usr, o
que requer que a partição esteja desmontada, o que não pode ocorrer a
menos que todos os serviços do sistemas estejam finalizados. 

Um sistema em execução pode ser alterado para o nível de execução
monousuário através do comando telinit. Durante a inicialização do sistema
a palavra single ou emergency na linha de comando do kernel faz com que o
init seja informado do nível de execução (a linha de comando do kernel
pode variar de sistema para sistema). 

Inicializando em modo monousuário pode ser necessário para executar-se o
comando fsck manualmente, antes de que qualquer montagem ou processo
acesse a partição /usr (qualquer atividade em um sistema de arquivos
inconsistente somente pode trazer mais problemas, devendo o fsck ser
executado o mais rapidamente possível). 

Os programas de lote de inicialização do init automaticamente entrarão em
modo monousuário caso o comando fsck executado de forma automática
apresente algum problema durante a inicialização do sistema. Esta é uma
tentativa de prevenir que o sistema utilize um sistema de arquivos
danificado e que o fsck não possa corrigir automaticamente. Tais casos são
relativamente raros e usualmente envolvem um disco rígido com problemas ou
uma versão experimental do kernel, porém é desejável que se esteja
preparado. 

Como medida de segurança, um sistema adequadamente configurado pedirá a
senha do superusuário (root)  antes de iniciar um ambiente de trabalho
monousuário. De outra forma seria simples simplesmente informar uma linha
ao LILO e ganhar acesso ao sistema como superusuário. Caso o problemas
esteja no arquivo /etc/passwd, o melhor e ter-se à mão um disquete de
inicialização. 



Entrando e saindo do sistema

Este capítulo necessita de um comentário. 
Sugestões, alguém?

Esta seção descreve o que acontece quando um usuário acessa ou sai de um
sistema. As várias interações entre os processos executados em segundo
plano, arquivos de históricos, arquivos de configuração, etc... são
descritos em detalhes. 

          Acesso via terminais
          Acesso via rede
          O que o acesso ao sistema faz
          X e xdm
          Controle de acessos
          Ativação do ambiente de trabalho (shell)

       



Acesso via terminais

A figura a seguir mostra como acontece o acesso via terminal.
Primeiramente o init assegura-se de que há um programa getty para aquele
terminal ou console. O programa getty fica aguardando que o usuário
informe que ele está pronto para acessar o sistema (normalmente através da
digitação de qualquer de qualquer coisa). Ao detectar um usuário, getty
apresenta uma mensagem de boas vindas (armazenada em /etc/issue) e
solicita a identificação do usuário e finalmente executa o programa login.
Este recebe o nome do usuário como parâmetro e solicita ao usuário a sua
senha. Caso a senha esteja correta, o programa login iniciará o ambiente
de trabalho (shell) que está configurado para o usuário. Caso a senha não
confira ele simplesmente encerra o processo (talvez após dar ao usuário
outra chance de informar seus dados). O processo init percebe que o
processo foi concluído e inicia um novo getty para o terminal. 


 

  
Figura 8.1: Acesso via terminal: a interação do 
init, getty, login e shell. 

Note-se que o único processo novo é criado pelo init (usando a chamada de
sistema fork); getty e login somente substituem o programa que estava
sendo executado pelo processo (através da chamada de sistema exec). 


Um programa em separado, para detectar usuários é necessário para linhas
seriais, desde que pode (e tradicionalmente é) mais complicado detectar
quando um terminal se torna ativo. getty adota ainda a velocidade e outros
parâmetros de comunicação, os quais são importantes para receber as
requisições de conexão, onde esses parâmetros pode variar de conexão para
conexão. 

Há ainda diversas versões do getty e init em uso, todas com pontos
favoráveis e desfavoráveis. É aconselhável aprender sobre as versões do
sistema em uso, e também sobre outras versões (pode-se usar o Mapa de
Softwares Linux para pesquisas). Caso não se tenha recebimento de
chamadas, provavelmente getty não será tão importante, porém o init é
ainda muito importante. 



Acessos Via Rede 

Dois computadores na mesma rede estão normalmente conectados através de um
único cabo físico. Quando ele comunicam-se através da rede, os programas
em cada computador que interagem na comunicação estão interligados por uma
conexão virtual, algo como um cabo imaginário. Até aonde os programas e a
conexão virtual interessam, eles tem o monopólio de seu próprio cabo. Uma
vez que o cabo não é real, somente imaginário, o sistema operacionadl de
cada computador pode Ter diversas conexões virtuais compartilhando o mesmo
cabo físico. Desta forma usando somente um único cabo, diversos programas
podem comunicar-se sem ter que preocupar-se com as outras conexões. É
posssível ainda ter-se diversos computadores no mesmo cabo; as conexões
virtuais existentem entre dois computadores, e os demais ignoram aquelas
conexõeas das quais eles não fazem parte. 

Esta é uma descrição resumida da realidade, porém deve ser boa o
suficiente para o entendimento do porque acesso via rede são bastante
diferentes de acessos normais. As conexões virtuais são estabelecidas
quando há dois programas em diferentes computadores que desejam
comunicar-se. Desde que, a princípio, qualquer computador pode
comunicar-se com qualquer outro, há um grande número de potenciais
comunicações virtuais. Devido a isso, não é muito prático iniciar um
processo getty para cada acesso em potencial.

Há somente um único processo denominado inted (correspondente ai getty)
que administra todos os acessos de rede. Quando é detectada um pedido de
acesso via rede (isto é, a detecção de uma requisição de abertura de nova
conexão virtual com algum outro computador), é iniciado um novo processo
que administra aquela conexão. O processo original é mantida e continua
atendendo a novos pedidos de acesso. 

Para tornar as coisas um pouco mais complexas, há diversos protocolos de
acesso via rede. Os dois mais utilizados são telnet e rlogin. Em adição
aos acessos há diversos outros tipos de conexões virtuais que podem ser
realizadas (como FTP, Gopher, HTTP, e outros serviços de rede). É
desnecessária a manutenção de processos separados para diferentes tipos de
conexões. Então ao invés disso, há somente um processo quepode reconhecer
o tipo de conexão e iniciar o tipo correto de programa para atender o
serviço solicitado. Para maiores informações sobre o inetd consulte o Guia
de Administração de Redes Linux. 



Como funciona o acesso ao sistema

O programa de acesso ao sistema preocupa-se com a autenticação do usuário
(assegurando que o nome do usuário e a senha conferem), e por configurar
um ambiente inicial para o usuário através das configurações de permissões
para a linha serial e início do ambiente de trabalho (shell). 

Parte da configuração inicial é a apresentação do conteúdo do arquivo
/etc/motd (mensagens do dia) e da checagem do correio eletrônico. Isso
pode ser desabilitado através da criação de um arquivo chamado .hushlogin
no diretório pessoal do usuário. 

Caso o arquivo /etc/nologin exista, os acessos estarão desabilitados. Este
arquivo é criado tipicamente através do comando shutdown e comandos
relacionados. O login verifica a existência desse arquivos e irá recusar
qualquer acesso, caso ele exista. Caso ele exista, o processo login
apresentará o seu conteúdo no terminal antes de ser finalizado. 

As falhas de logins são registradas em um arquivos de histórico do sistema
(via syslog). Ele ainda armazena todos os acessos realizados pelo
superusuário (root). Ambos podem ser úteis na detecção de intrusos. 

Os usuário conectados em determinado momento estão listado no arquivo
/var/usr/utmp. Este arquivo é válido somente até a próxima inicialização
do sistema, pois a cada evento desta natureza é reinicalizado. Ele lista
cada usuário e terminal (ou conexão de rede) que esteja sendo utilizada,
em conjunto com algumas outras informações adicionais. O comando w - who -
e outros similares lêem o conteúdo de utmp a fim de verificar quem está
conectado. 

Todos os acessos bem sucedidos são gravados em /var/log/wtmp. Este arquivo
é incrementado sem limites, devendo-se ser limpo periodicamente, por
exemplo através de uma tarefa semanal programada no cron. O comando last
mostra o conteúdo de wtmp. 

Tanto utmp quanto wtmp estão em formato binário (vide a página de manual
on-line de utmp); o que torna incoveniente o seu acesso sem o uso de
programas especiais. 



X e xdm

X implementa acessos via xdm. Maiores informações podem ser obtidas na
página de manual on-line dos comandos xterm e xdm. 


Controle de acesso

A base de dados de usuários está normalmente localizado no arquivo
/etc/passwd. Alguns sistemas utilizam a opção shadows, a qual move as
senhas para o arquivo /etc/shadow. Localizações que tenham muitos
computadores que compartilhem contas de acesso podem usar NIS ou outros
métodos de armazenamento da base de dados de usuários, podendo copiar
automaticamente a base de dados de uma localização central para todos os
computadores da rede.

A base de dados de usuários não contém somente as senhas, mas contém
também informações adicionais sobre os usuários, como os seus nomes reais,
diretórios pessoais e ambientes de trabalho no acesso ao sistema. Estas
informações são públicas, logo qualquer usuário pode lê-las, sendo que a
senha dos usuários ''e armazenada encriptada no sistema. Isso produz o
incoveniente de que qualquer usuário que tenha acesso ao sistema e algum
conhecimento técnico, possa usar métodos criptográficos para descobrir as
senhas dos demais, sem o uso de tentativas de acessos não autorizados.  A
opção shadow tenta evitar isso, movendo as senhas para outro arquivo, o
qual somente pode ser acessado pelo superusuários (root), sendo que as
senhas ainda permanecem cifradas. Cabe ressalatar que a instalação dsta
opção em sistemas que não tem suporte a esta funcionalidade pode ser um
tanto difícil. 

É importante assegurar-se e orientar os usuários para que todas as
existentes sejam complexas o suficiente para que não sejam facilmente
quebradas.  Os programas de quebra de senha tentam adivinhar a senha do
usuário através de procedimentos comuns de criação de senhas (datas, nomes
comuns, etc...). Uma vez que um programa de quebra possa ser rodado por um
invasor, deve ser executado também pelo administrador, para verificar o
nível de segurança das senhas utilizadas no sistema. Boas senhas podem ser
fornecidas pelo programa passwd,pois exigirão muito mais esforço
computacional para quebrá-las.

A base da dados dos grupos é mantida no /etc/group, e para sistemas com a
opção shadow ativa, é mantida em /etc/shadow.group. 

O superusuário não pode normalmente conectar-se via rede, somente nos
terminais listados em /etc/securetty. Isso obriga ao acesso físico a um
desses terminais. É possível ainda conectar-se via qualquer terminal como
um outro usuário, e utilizar o comando su para tornar-se o superusuário
(root). 



Ativação do ambiente de trabalho (shell)

Quando um ambiente de trabalho (shell) interativo é iniciado,
automaticamente são executados um ou mais arquivos pré-definidos.
Diferentes ambientes podem executar diferentes arquivos. Para maiores
informações, deve ser examinada a documentação de cada ambiente.

Muitos ambientes executam inicialmente um arquivo global, por exemplo o
Bourne shell (/bin/sh) e seus derivados executam o /etc/profile, e
adicionalmente executam o arquivo .profile no diretório pessoal do
usuário. O arquivo /etc/profile permite que o administrador do sistema
possa definir algum item de ambiente comum a todos os usuários,
especialmente a variável PATH para inclusão de diretórios de programas e
comandos em adição aos diretórios padrões. Por outro lado o arquivo
.profile permite que o usuário possa customizar o ambiente de acordo com
as suas próprias necessidades, e se necessário alterar as opções padrão de
ambiente. 




Gerenciando contas de usuários


As semelhanças entre os administradores de sistemas e os traficantes de
drogas: ambos medem as coisas em K's e ambos têm usuários (velha e surrada
piada de informáticos). 
 
Este capítulo explica como criar novas contas de usuários, como modificar
suas propriedades e como remevê-las. Diferentes sistemas Linux tem
diferentes ferramentas para execução destas tarefas. 

    O que é uma conta?
          Criando um usuário
                /etc/passwd e outros arquivos
               Escolhendo um  número de usuário e 
identificação de grupo
                Ambiente inicial: /etc/skel
                Criando um usuário manualmente
           Alterando as características de um 
usuário
           Removendo um usuário
           Desabilitando um usuário temporariamente




O que é uma conta?


Quando o computador é usado por muitas pessoas é usualmente necessário
diferenciar os usuários, como por exemplo, permitir que os arquivos
pessoais permaneçam privativos aos seus dosnos. Isto é importante mesmo
que o computador seja usado somente por um usuário por vez, o que ocorre
em muitos microcomputadores. Além disso, cada usuário tem um nome único
que é utilizado na sua identificação ao acessar o sistema.

Há mais coisa relacionadas a um usuários do que somente seu nome. Uma
conta compreende todos os arquivos, recursos e informações pertencentes a
um usuário. O termo aproxima-se da sua utilização na área bancária, e como
em uma conta em um banco que tem alguma disponibilidade associada, uma
conta em Linux tem uma série de recursos associados, que podem ser gastos
em diferentes velocidades à medida que se utilize o sistema. Por exemplo,
o espaço em disco pode Ter uma limitação de uso em megabytes ao dia, e o
processamento pode ter um preço por segundo. 



Criando um usuário

O kernel do sistema trata usuários como números.  Cada usuário é
identificado como um número inteiro único, denomidado identificação do
usuário (user id ou uid), poruqe números são mais simples e rápidos de
serem processados do que os nomes dos usuários. Um banco de dados separado
do kernel relaciona cada usuário a um nome textual, o nome do usuário
(username), a uma identificação do usuário. O arquivo contém ainda outras
informações. 

Para criar um usuário, é necessário informar algumas informações
adicionais sobre o usuário para inclusão na base de dados e criar um
diretório pessoal para ele. Pode ser necessário ainda auxiliar o usuário e
configurar algumas varáveis de ambiente iniciais. 

Muitas distribuições Linux vêm com um programa para criação de usuários.
Há diversos programas disponíveis. Dois programas muito utilizados são o
adduse e useradd, que podem ter inclusive uma interface gráfica.
Independente do programa o resultado é muito similar para todos eles.
Todavia este manual descreve como fazê-lo manualmente. Mesmo que os
detalhes possam parecer um pouco intrincados, esses programas fazem tudo
parecer mais trivial. 


/etc/passwd e outros arquivos

A base de dados de usuários básica está em formato texto e está localizada
em /etc/passwd (chamada arquivos de senhas), a qual contém todos os nomes
válidos de usuários e as informações associadas a estes. O arquivo contém
um nome de usuário pode linhas e está dividido em sete colunas delimitadas
por dois pontos: 

   1.Nome do usuário. 
   2.Senha em formato encriptado. 
   3.Identificação numérica do usuário 
   4.Identificação numérica do grupo 
   5.Nome completo ou outra descrição da conta. 
   6.Diretório pessoal. 
   7.Ambiente de trabalho (programa que será 
executado no acesso ao sistema (shell)). 

O formato é explicado em mais detalhes nas páginas de manual do sistema em
passwd (5). 


Qualquer usuário de sistema pode ler o arquivo passwd, podendo conhecer
por exemplo, o nome de outros usuários do sistema. Isso significa que a
senha (segundo campo) também está disponível para qualquer usuário. O
arquivo de senhas encripta as senhas, que em teoria estarão seguras. Ainda
assim a criptografia pode ser quebrada, especialmente se a senha for muito
simples (por exemplo uma senha muito curta ou pertencente ao dicionário).
Logo não é aconselhável manter as senhas no arquivo passwd.

Muitos sistemas Linux tem a opção de shadow para senhas. Este pode ser um
meio alternativo de armazenamento: as senhas criptografas são armazenadas
em um arquivo em separado, o /etc/shadow, o qual pode ser lido somente
pelo superusuário (root). O arquivo /etc/passwd contém somente uma marca
especial no campo se senha.  Qualquer programa que necessite verificar a
senha do usuário tem a identificação do dono do programa alterada, podendo
então acessar o arquivo de senhas shadow. Programas normais que necessitem
somente usar os demais campos do arquivo passwd , não precisam ter acesso
às senhas dos usuários. 



Escolhendo um  número de usuário e identificação de 
grupo

Em muitos sistemas não faz diferença qual a identificação do usuário ou do
grupo utilizadas, mas caso se esteja utilizando um sistema de arquivos em
rede (NFS), será necessário Ter o mesmo uid e gid em todos os sistemas.
Isso deve-se ao fato do NFS identificar os usuários com uids numéricas.
caso não se esteja utilizando NFS, pode- se permitir que o programa de
criação de contas escolha um número de forma automática. 

Caso se esteja utilizando NFS, terá que ser criado um mecanismo de
sincronismo de informações de contas. Uma alteranativa é utiliza o sistema
NIS. 


Deve-se evitar a reutilização de uids numéricas e nomes de usuários,porque
os novos usuários poderiam ter acesso aos arquivos dos antigos donos da
conta. 


Ambiente inicial: /etc/skel
                

Quando um diretório pessoal é criado, ele é inicializado com arquivos
oriundos do diretório /etc/skel. O administrador do sistema pode criar
arquivos em /etc/skel que podem prover um excelente padrão de ambiente
para os usuários. Por exemplo, ele pode criar um arquivo
/etc/skel/.profile que inicializa a variável de ambiente EDITOR com algum
editor que seja amigável para novos usuários. 

É importante tentar mante o /etc/skel o menor possível, uma vez que poderá
ser extremamente trabalhoso ter que atualizar todos os arquivos dos
usuários já existentes. Por exemplo, se o nome do editor mudar, todos os
usuários com a variável inicializada em seus arquivos .profile terão que
ser alteradas. Pode-se tentar fazer isso automaticamente, mas a
possibilidade de gerar algum problema para alguns usuários é muito grande. 

Sempre que possível, é melhor colocar alguma configuração genérica em
arquivos de configuração global, como por exemplo o /etc/profile. Assim é
possível realizar atualizações sem alterar diretamente as configurações
dos usuários. 



Criando um usuário manualmente

Para criar um usuário manualmente, devem ser seguidos os seguntes passos: 

Editar o arquivo /etc/passwd com o utilitário vipw (vide a página de
manual on-line para maiores informações) e adicionar uma nova linha para a
nova conta. Atentar para a sintaxe do arquivo. Não editar diretamente com
outro editor, pois o vipw trava o arquivo, não permitindo a sua
atualização ao mesmo tempo por outros aplicativos. Deve-se informar '*' no
campo senha, assim o acesso não será possível.  

De formar similar editar o
arquivo /etc/group com o utilitário vigr, caso seja necessário criar
também um novo grupo.  Criar um diretório pessoal com o comando mkdir. 
Copiar os arquivos do diretório /etc/skel para o novo diretório pessoal
criado.  Ajustar as permissões e donos através dos comandos chown e chmod.
A opção -R pode ser muito útil. As permissões corretas podem variar de um
local para outros, mas normalmente os seguintes comandos devem atender: 
          
    cd /home/nome_do_usuário 
          chown -R nome_do_usuário.grupo . 
          chmod -R go=u,go-w . 
          chmod go= .
 
6. Ajustar a senha através do comando passwd (1).


Após a configuração da senha, a conta estará apta a funcionar. Não se deve
configurá-la até que todo os demais passos tenham sido executados, de
outra maneira o usuário poderá ter acesso ao sistemas, enquanto os
arquivos estão sendo copiados. 

Algumas vezes pode ser necessário criar contas anônimas que não são
utilizadas por qualquer usuário. Por exemplo para configurar um servidor
FTP anônimo (permitindo que qualquer usuário possa fazer a cópia de
arquivos a partir do servidor, sem a obrigatoriedade de ter-se uma conta
criada para o usuário) deve-se criar uma conta chamada ftp. Neste casos
não é necessário configurar uma senha (último passo acima). Ao contrário,
é melhor não fazê- lo,pois nimguémpoderá usar a conta, a menos que antes
se torne o superusuário, uma vez que o root pode transformar-sem em
qualquer usuário (comando su). 



Alterando as características de um usuário

Há poucos comandos para alterar as várias características de uma conta (ou
seja, os campos relevantes do arquivo /etc/passwd): 

chfn - altera o nome completo do usuário 
chsh - altera o ambiente de trabalho inicial 
(shell) do usuário 
passwd - altera a senha

O superusuário pode usar ester comando para alterar as propriedades de
qualquer conta. Usuário normais podem somente alterar as propriedades de
sua própria conta. Algumas vezes é necessário desabilitar estes comandos
(com chmod) para usuários normais, por exemplo em ambientes com muitos
usuários iniciantes. 

Outras tarefas necessárias deverão ser executadas manualmente. Por exemplo
para alterar o nome do usuário é necessário editar o arquivo /etc/passwd
diretamente (com vipw). Da mesma forma, para adicionar ou remover o
usuários de grupos, é necessário editar o arquivo /etc/group (com vigr).
Tal procedimento tende a ser raro, devendo porém ser realizado com extrema
atenção, pois a swap do nome de um usuário poderá fazer com que ele, por
exemplo, não receba mais mensagens, e assim por diante. 


Romovendo um usuário


Para rremover um usuário, deve-se inicialmente remover todos os seus
arquivos, caixas de correio, nomes alternativos para mail, trabalhos de
impressão, trabalhos programados via cron e at, e todas as referências que
existirem ao usuário. Após, pode-se remover as linhas relevantes dos
arquivos /etc/passwd e /etc/group (deve-se retirar quaisquer referências
ao usuário em todos os grupos que ele tenha sido adicionado). É indicado
antes de iniciar este processo desabilitar o usuário, previnindo assim o o
uso da conta enquanto ela está sendo removida. 

Lembre-se que usuários podem ter arquivos fora do diretório pessoal. O
comando find pode encontrá- los, através da seguinte síntaxe:

     find / -user username 

Note-se que se há um disco rígido muito grande, o comando acima pode levar
um tempo maior para a sua execução. Caso se tenha discos montados em rede,
tem-se que tomar certas precauções em não carregar toda a rede no
servidor. 

Algumas distribuibuições Linux vêm com comandos especiais para esta
tarefa; verifique o comando deluser ou userdel. No Conectiva Linux pode
ser utilizado o comando XXXXXX. Ainda que esses comandos possam ser úteis,
algumas vezes eles não fazem todo o trabalho necessário. 



Desabilitando tem

Desabilitando um usuário temporariamente

Algumas vezes é necessário desabilitar temporariamente uma conta, sem
necessariamente removê-la. Por exemplo, o usuário pode não ter pago suas
dívidas, ou o administrador do sistema pode suspeitar que a senha daquela
conta tenha sido violada. 

A melhor forma de fazer isso é alterar o ambiente de trabaho da conta para
um programa especial que somente apresente uma mensagem. Desta forma, toda
vez que se tente acessar o sistema utilizando esta conta, ocorrerá um
falha, e a mensagem pode indicar, por exemplo, que o administrador do
sistema seja contactado. 

Pode ainda ser possível alterar o nome do usuário ou a senha para algum
outro valor, mas então o usuário não saberá o que está ocorrendo, podendo
gerar uma certa confusão. 

Uma forma simples de criar programas especiais é gravar ‘scripts’: 


     #!/usr/bin/tail +2
     Esta conta foi fechada devido a questões de 
segurança.
     Por favor chame a 332-1234 e aguarde a chegada 
do homens de preto.      

Os primeiros dois caracteres (`#!') dizem ao kernel que o restante da
linha é um comando que deve ser executado. O comando tail, neste caso,
imprime na saída padrão as duas últimas linhas. 

Caso o usuário hboy seja suspeito de um furo de segurança, o administrador
do sistema pode fazer algo como: 

     # chsh -s /usr/local/lib/no-login/security 
hboy 
     # su - tester 
     Esta conta foi fechada devido a questões de 
segurança.
     Por favor chame a 332-1234 e aguarde a chegada 
do homens de preto.      
     # 

O propósito do comando su é testar se a mudança de ambiente de trabalho
não apresentou problemas. 

Scripts como estes, utilizando tail, devem ser mantidos em diretórios
separados, assim os seus nomes não interferirão com os comandos normais de
usuários. 



Cópias de Segurança

Hardware é indeterminadamente confiável,
Software é indeterminadamente confiável,
Pessoas são indeterminadamente confiáveis,   
Natureza é determinadamente confiável. 


Este capítulo explilca porue, como e quando fazer cópias de segurança, e
como restaurar itens das cópias realizadas. 
 

O que é importante copiar?
          Selecionando o dispositivo de backup
          Selecionando a ferramenta de backup
          Cópias simples
                Cópias de segurança com tar
                Restaurando arquivos com tar
          Cópias em diversos níveis
          O que copiar
          Arquivos compactados


