COMO FAZER um Disco de Inicialização Linux
Tom Fawcett (fawcett@croftj.net
v3.2, Junho de 1998
Este documento descreve como definir e construir o seu próprio
disquete de inicialização e do sistema de arquivos raiz para o Linux.
Estes discos podem ser usados como disquetes de emergência ou no teste
de novos componentes do sistema. Caso não se tenha lido o FAQ do Linux
e outros relacionados, como o Tutorial de Instalação Linux e o Guia de
Instalação Linux, não é indicada a construção de discos de
inicialização. Caso se deseje somente criar discos de emergência, veja
o Anexo ``Discos de inicialização pré-configurados ''.
______________________________________________________________________
Índice geral
1. Prefácio
1.1 Notas
1.2 Opiniões e Créditos
1.3 Política de Distribuição
2. Introdução
3. Discos de Inicialização e o Processo de Inicialização do Sistema
3.1 O Processo de Inicialização
3.2 Tipos de Discos
4. Construíndo um Sistema de Arquivos Raiz
4.1 Visão Geral
4.2 Criando o Sistema de Arquivos
4.3 Ocupando o Sistema de Arquivos
4.4 Módulos
4.5 Alguns detalhes finais
4.6 Empacotando
5. Escolhendo um kernel
6. Colocando tudo junto: Construindo o(s) disco(s)
6.1 Transferindo o kernel com o LILO
6.2 Transferindo o kernel sem o LILO
6.3 Configurando o disco em memória
6.4 Transferindo o sistema de arquivos raiz
7. Problemas
8. Diversos
8.1 Reduzindo o tamanho do sistema de arquivos raiz
8.2 Sistemas de arquivos raiz não residentes em discos na memória
8.3 Construindo um disquete de utilitários
9. Como os profissionais fazem isso
10. Lista das Perguntas Mais Frequentes (FAQ)
11. Recursos e Endereços
11.1 Discos de Inicialização Pré-Configurados
11.2 Discos de Emergência
11.3 Programas de Lote de Graham Chapman
11.4 LILO --- O carregador Linux
11.5 Perguntas Mais Freqüentes e Como Fazer
11.6 Uso do Disco em Memória
11.7 O processo de inicialização do Linux
12. Códigos de Erros de Inicialização do LILO
13. Listas de exemplo do conteúdo do disco de inicialização
14. Listas de exemplo do conteúdo do disco de utilitários
______________________________________________________________________
11.. PPrreeffáácciioo
NNoottaa:: eessttee ddooccuummeennttoo ppooddee nnããoo eessttaarr aattuuaalliizzaaddoo.. Verifique na página do
Projeto de Documentação Linux se há
alguma versão mais recente deste documento.
Apesar deste documento estar em formato texto, ele pode ser
visualizado de maneira muito _m_a_i_s agradável em formato Postscript
(.ps) ou HTML, em virtude dos comandos de notação tipográfica
utilizados. Nós sugerimos a utilização de um destes formatos.
11..11.. NNoottaass
Graham Chapman (grahamc@zeta.org.au) escreveu a versão original e a
suportou até a versão 3.1. Tom Fawcett (fawcett@croftj.net) adicionou
uma grande quantidade de informações do kernel 2.0 e é o mantenedor
atual da versão 3.2, porém muito da versão original ainda permanece.
Este documento está voltado para usuários da versão 22..00 ddoo KKeerrnneell ddoo
LLiinnuuxx oouu ppoosstteerriioorr. Caso se esteja utilizando uma versão anterior
(1.2.xx ou mais antiga), é aconselhável utilizar versões do COMOFAZER-
Bootisk arquivadas na Página Pessoal de Graham Chapman
.
As informações aqui apresentadas estão voltadas para os usuários da
plataforma IInntteell, porém muito do aqui descrito aplica-se ainda a
outros processadores, porém não podemos ser conclusivos a respeito
disso. Caso alguém tenha essa experiência, por favor nos contacte.
11..22.. OOppiinniiõõeess ee CCrrééddiittooss
Quaisquer comentários ou sugestões, positivas ou negativas, sobre o
conteúdo deste documento são bem-vindas. Fizemos o melhor possível
para garantir que as informações aqui contidas sejam confiáveis e
acuradas. Por favor avise-nos caso sejam encontrados erros ou
omissões.
Agradecemos às inúmeras pessoas que enviaram as suas sugestões e
correções. A sua contribuição certamente tornou este documento muito
melhor, do que se tivéssemos feito tudo sozinhos.
Por favor envie comentários, correções e dúvidas ao autor no
endereço-eletrônico apresentado mais acima. Não me incomodo em
responder dúvidas, porém por favor leia primeiramente a seção
``Problemas''.
11..33.. PPoollííttiiccaa ddee DDiissttrriibbuuiiççããoo
Copyright © 1995,1996,1997,1998 de Tom Fawcett and Graham Chapman.
Este documento pode ser distribuído sob os termos da Licença do
Projeto de Documentação Linux disponível em
. Por favor contacte os
autores caso não seja possível obter uma licença.
Esta é uma documentação livre. É distribuída na expectativa de ser
útil, porém sem qquuaallqquueerr ggaarraannttiiaa; mesmo as garantias inerentes de
ccoommeerrcciiaalliizzaaççããoo ou aaddeeqquuaaççããoo aa uumm pprrooppóóssiittoo ppaarrttiiccuullaarr.
22.. IInnttrroodduuççããoo
Discos de inicialização do Linux são úteis em diversas situações, tais
como:
· Testes de um novo kernel.
· Recuperação de falhas de disco -- qualquer coisa que pode variar
desde um setor de inicialização à uma quebra de cabeça de disco.
· Consertando um sistema defeituoso. Um pequeno erro como
superusuário pode tornar o sistema sem condições de uso, e pode
ser necessário inicializar o sistema a partir um disquete, para
consertá-lo.
· Atualizar arquivos críticos do sistema, tais como o libc.so.
Há várias formas de se obter discos de inicialização (boot):
· Usar um de uma distribuição como Slackware, Red Hat, Conectiva
Linux, o qual permitirá que ao menos o sistema seja inicializado.
· Usar um pacote desenvolvido para a criação de discos de
emergência.
· Aprender o que é necessário para cada tipo de disco operar e
construir um por conta própria.
Algumas pessoas escolhem a última opção, construindo os seus próprios
discos de emergência. Desta forma, na ocorrência de algum problema,
eles podem saber o que deve ser corrigido. Mais ainda, é uma grande
maneira de aprender como o Linux funciona.
Este documento assume alguma familiaridade com os conceitos básicos de
administração de sistemas Linux. Por exemplo, deve-se conhecer os
conceitos de diretórios, sistemas de arquivos e disquetes. Deve-se
saber ainda utilizar os comandos mount e tt/df/, bem como o
significado dos arquivos /etc/passwd efstab e como eles estão
constituídos, assim como saber que a maioria dos comandos deste COMO
FAZER devem ser executados como superusuário (root).
A construção de um disco de inicialização do nada pode ser bem
complexa. Caso não se tenha lido os conteúdos do FAQ do Linux e
documentos relacionados, como por exemplo, o COMO FAZER Instalação
Linux e o Guia de Instalação Linux, não é aconselhável tentar-se a
construção dos discos desta forma. Caso se necessite somente de um
disco de emergência que funcione, será _m_u_i_t_o mais simples utilizar
um pré-existente. Veja o Apêndice ``Discos de Inicialização
Pré-Configurados'', abaixo, a fim de verificar onde encontrá-los .
33.. DDiissccooss ddee IInniicciiaalliizzaaççããoo ee oo PPrroocceessssoo ddee IInniicciiaalliizzaaççããoo ddoo SSiisstteemmaa
Um disco de inicialização é basicamente uma miniatura de um sistema
completo, ou seja é um sistema Linux contido em um disquete. Ele deve
executar muitas das funções que o sistema completo permite. Antes de
tentar construir um, deve-se conhecer os conceitos básicos do processo
de inicialização do sistema, apresentados a seguir, os quais são
suficientes para o entendimento do restante deste documento. Alguns
detalhes e opções foram omitidos por não serem significativos para o
conteúdo deste documento.
33..11.. OO PPrroocceessssoo ddee IInniicciiaalliizzaaççããoo
Todos os sistemas em microcomputadores começam o processo de
inicialização executando o código existente na ROM (especificamente
no BIOS O BIOS tenta então executar este setor. Em muitos discos
inicializáveis, o setor 0, cilindro 0, pode conter ainda:
· código de um carregador de sistemas, como o LILO, o qual localiza o
kernel do sistema escolhido, carrega e executa, de acordo com a
opção definida.
· o início de um kernel de um sistema operacional, como por exemplo o
Linux.
Caso o kernel do Linux tenha sido copiado fisicamente para um
disquete, o primeiro setor do disco será o primeiro setor do kernel do
Linux. O primeiro setor continuará o processo de inicialização,
carregando o restante do kernel contido no dispositivo.
Uma vez que o kernel tenha sido completamente carregado, ele executa
alguma inicialização básica de dispositivos. Ele tenta carregar e
montar o ssiisstteemmaa ddee aarrqquuiivvooss rraaiizz
Em algumas situações de início do sistema, freqüentemente na
inicialização a partir de disquetes, o sistema de arquivos é montado
em um ddiissccoo eemm mmeemmóórriiaa ssiisstteemmaa ddee aarrqquuiivvooss ccoommppaaccttaaddooss
Uma vez que o sistema de arquivos raiz é montado, pode-se visualizar
uma mensagem similar a:
VFS: Raiz montado (sistema de arquivos ext2) somente para leitura.
· Execução do comando fsck em todos os discos
· Carga dos módulos
· Inicialização da área de troca
· Inicialização da rede
· Montagem dos discos descritos em fstab.
Este programa normalmente aciona diversos outros, tornando o processo
de inicialização modular. Por exemplo, na estrutura comum do SysVinit,
o diretório /etc/rc.d/ contém uma estrutura complexa de subdiretórios,
cujos arquivos definem como iniciar e desligar a maior parte dos
serviços do sistema. De qualquer forma, um programa sysinit em um
disco de inicialização é normalmente muito simples.
Quando o programa sysinit termina, o controle retorna ao init, o
qual entrará no _n_í_v_e_l _d_e _e_x_e_c_u_ç_ã_o _p_a_d_r_ã_o, especificado em inittab,
através da palavra chave initdefault. A linha de nível de execução
normalmente especifica um programa como getty, o qual é responsável
pelo gerenciamento das comunicações através do console e dos ttys. É o
programa getty que apresenta a expressão familiar ``login:''. O
programa getty por sua vez, chama o programa login para administrar o
processo de validação e iniciar as sessões dos usuários.
33..22.. TTiippooss ddee DDiissccooss
Após a revisão do processo básico de inicialização, podemos agora
definir diversos tipos de discos envolvidos. Podemos classificar os
discos em quatro tipos. A discussão aqui contida e através de todo o
documento do uso do termo disco refere-se a disquetes, a menos que
seja especificado o contrário, observando-se que na verdade, o
conceito pode ser aplicado sem distinção a discos rígidos.
iinniicciiaalliizzaaççããoo
Um disco contendo um kernel do sistema que pode ser
inicializado. O disco pode ser usado para iniciar o kernel do
sistema, o qual pode carregar o sistema de arquivos raiz a
partir de outro disco. O kernel em um disco de inicialização
pode receber informações sobre a localização do sistema de
arquivos raiz.
Freqüentemente um disco de inicialização carrega o sistema de
arquivos raiz a partir de outro disquete, porém é possível
configurar a carga a partir de um sistema de arquivos raiz
residente em um disco rígido, por exemplo. Isso é comumente
feito quando se está testando um novo kernel (na verdade ``make
zdisk'' criará um disco de inicialização automaticamente a
partir dos fontes do kernel).
rraaiizz
Um disco com um sistema de arquivos raiz contém os arquivos
necessários para a execução de um sistema Linux. Tal disco pode
não conter necessariamente nem o kernel e tão pouco o carregador
de sistemas disco raiz
Um disco raiz pode ser usado para executar o sistema
independentemente de outros discos, uma vez que o kernel do
sistema tenha sido inicializado. Normalmente o disco raiz é
automaticamente copiado para um disco em memória, o que torna o
acesso às suas informações muito mais rápido e libera a unidade
de disquetes para outras atividades.
iinniicciiaalliizzaaççããoo//rraaiizz
Um disco pode conter tanto o kernel
uuttiilliittáárriioo
É um disco que contém um sistema de arquivos, mas que não será
montado como um sistema raiz. É um disco de dados adicionais, e
pode ser utilizado para a disponibilização de utilitários, caso
o disco raiz não tenha mais espaço disponível.
Em geral, quando falamos de "construir um disco de inicialização"
significa a criação das funções de carga do kernel e do sistema de
arquivos raiz. Elas podem estar juntas (em um único disco de
inicialização e raiz) ou separados (disco de inicialização e disco
raiz). A abordagem mais flexível para discos de emergência é
provavelmente usar disquetes separados, e um ou mais disquetes de
utilitários para gerenciar o que não foi possível colocar nos
primeiros.
44.. CCoonnssttrruuíínnddoo uumm SSiisstteemmaa ddee AArrqquuiivvooss RRaaiizz
Criar um sistema de arquivos raiz envolve a seleção dos arquivos
necessários para que o sistema possa ser executado. Nesta seção
descreveremos como construir um _s_i_s_t_e_m_a _d_e _a_r_q_u_i_v_o_s _r_a_i_z _c_o_m_p_a_c_t_a_d_o
44..11.. VViissããoo GGeerraall
Um sistema de arquivos raiz deve conter todo o necessário para
suportar um sistema Linux completo. Para tanto, o disco deve incluir
os requisitos mínimos de um sistema Linux:
· A estrutura básica do sistema de arquivos
· Conjunto mínimo de diretórios: /dev, /proc, /bin, /etc, /lib, /usr,
/tmp
· Conjunto básico de utilitários: sh, ls, cp, mv, etc.
· Conjunto mínimo de arquivos de configuração: rc, inittab, fstab,
etc...
· Dispositivos: /dev/hd*, /dev/tty*, /dev/fd0, etc...
· Biblioteca que disponibilize as funções básicas necessárias aos
utilitário
Evidentemente, qualquer sistema somente torna-se útil quando permite a
execução de algum programa, e um disquete raiz somente é útil quando
permite que sejam executadas funções como:
· Verificar um sistema de arquivos em outro dispositivo, por exemplo
para checar o sistema de arquivos raiz em um disco rígido será
necessário carregar o sistema operacional a partir de outro
dispositivo, o que pode ser feito com um sistema de arquivos raiz
em disquete. Pode-se então executar fsck no dispositivo original
que contém o sistema raiz enquanto ele não estiver montado.
· Restauração total ou parcial do dispositivo raiz original a partir
de uma cópia de segurança usando arquivamento ou utilitários de
compactação, tais como cpio, tar, gzip e ftape.
Descreveremos como construir um sistema de arquivos _c_o_m_p_a_c_t_a_d_o, assim
chamado porque é arquivado compactado no disco e é descompactado do
disco para memória. Um sistema de arquivos compactado pode conter
diversos arquivos (aproximadamente 2 megabytes) em um disquete padrão
1.440 Kb. Como o arquivo é muito maior que o disquete, não se pode
construí-lo diretamente no dispositivo. Deve-se construí-lo em outro
local qualquer, compactá-lo, e então copiá-lo para o disquete.
44..22.. CCrriiaannddoo oo SSiisstteemmaa ddee AArrqquuiivvooss
Para construir-se um sistema de arquivos raiz, deve-se ter um
dispositivo extra, grande o suficiente para conter todos os arquivos
antes da compactação. Deve-se ter à mão um dispositivo capaz de conter
pelo menos 4 Mb. Há diversas opções:
· Usar um ddiissccoo eemm mmeemmóórriiaa
RAMDISK_SIZE = nnn
Verifique a existência de um dispositivo como por exemplo /dev/ram0,
/dev/ram ou /dev/ramdisk. Caso não exista, crie /dev/ram0 com mknod
(maior numero 1, menor 0).
· Caso se tenha uma partição de disco rígido grande o suficiente
(diversos megabytes) disponível, esta certamente será uma boa
solução. Caso se tenha memória RAM disponível, pode-se desligar as
funções de troca e utilizar a partição de troca (swap).
· Usar uma ssiimmuullaaccaaoo ddee ddiissppoossiittiivvoo
PPaarraa ffaazzeerr uussoo ddaa ssiimmuullaaççããoo ddee ddiissppoossiittiivvooss,, ddeevvee--ssee uuttiilliizzaarr ooss
pprrooggrraammaass mount e unmount especialmente alterados para isso. Eles
podem ser encontrados no diretório:
ftp://ftp.win.tue.nl/pub/linux/util/mount/
Caso não se tenha uma simulação de dispositivos (/dev/loop0,
/dev/loop1, etc...) no sistema, pode-se criar uma através do
comando ``mknod /dev/loop0 b 7 0''. Uma vez instalados os binários
especiais de mount e umount , deve-se criar um arquivo temporário
em um disco rígido com capacidade suficiente (por exemplo,
/tmp/fsfile). Pode-se, por exemplo, utilizar o comando:
dd if=/dev/zero of=/tmp/fsfile bs=1k count=_n_n_n
para criar um arquivo com _n_n_n blocos.
Deve-se utilizar então o nome do arquivo no lugar do DISPOSITIVO a
seguir. Ao utilizar o comando mount deve-se incluir a opção``-o loop''
para definir uma simulação de dispositivo.
mount -o loop -t ext2 /tmp/fsfile /mnt
irá montar /tmp/fsfile (através de uma simulação de dispositivo) no
ponto de montagem /mnt. Através do comando df pode-se obter a
confirmação disso.
Após a escolha de alguma dessas opções, deve-se preparar o DISPOSITIVO
com o seguinte comando:
dd if=/dev/zero of=DISPOSITIVO bs=1k count=3000
Este comando inicializa com zeros o DISPOSITIVO. Este passo é
importante pois o sistema de arquivos será compactado posteriormente e
as partes não utilizadas e preenchidas com zeros, atingirão o máximo
de compactação.
O comando necessário será algo similar a:
mke2fs -m 0 -i 2000 DISPOSITIVO
(Caso se esteja usando uma simulação de dispositivos, o arquivo em
disco que se esteja utilizando deve ser informado no lugar do
DISPOSITIVO.
O comando mke2fs automaticamente detectará o espaço disponível e fará
a configuração automaticamente. O parâmetro -m 0 evita a alocação de
espaço para o raiz, e adicionalmente provê mais espaço útil em disco.
A seguir deve-se montar o dispositivo:
mount -t ext2 DISPOSITIVO /mnt
(Deve-se criar um ponto de montagem mnt caso ele ainda não exista).
Nas próximas seções, todos os nomes de diretórios são assumidos como
relativos a /mnt.
44..33.. OOccuuppaannddoo oo SSiisstteemmaa ddee AArrqquuiivvooss
Segue um razoável número mínimo de diretórios no sistema de arquivos
raiz:
· /dev Dispositivos, necessários para as operações de
Leitura/Gravação
· /proc Diretório temporário requerido pelo sistema de arquivos proc
· /etc Arquivos de configuração do sistema
· /sbin Binários fundamentais do sistema
· /bin Binários básicos e considerados parte do sistema
· /lib Bibliotecas compartilhadas que provêem suporte à execução dos
binários
· /mnt Um ponto de montagem para manutenção em outros discos
· /usr Utilitários adicionais e aplicações
(A estrutura de diretórios aqui apresentada é somente para uso no
disquete raiz. Sistemas Linux têm uma política mais complexa e
disciplinada, chamada Padrões de Sistemas de Arquivos, para determinar
quais arquivos devem estar presentes e aonde.)
Três destes diretórios devem estar vazios no sistema de arquivos raiz,
devendo somente serem criados com o comando mkdir. O diretório /proc
é basicamente um ponto de referência onde o sistema de arquivos proc
está localizado. Os diretórios /mnt e /usr são somente pontos de
montagem para uso após a inicialização do sistema e a carga do sistema
de arquivos raiz. Mais uma vez, estes diretórios somente precisam ser
criados.
Os quatro diretórios remanescentes estão descritos nas seções a
seguir:
/dev
Um diretório /dev contendo um arquivo especial com todos os
dispositivos a serem utilizados pelo sistema é fundamental para o
Linux. O diretório em si é um diretório comum e pode ser criado com o
comando mkdir da forma usual. Os arquivos especiais de dispositivos
devem ser criados de uma forma especial, utilizando-se o comando
mknod.
Há um atalho, podendo-se copiar o conteúdo do diretório /dev e
apagando-se o que for desnecessário. A única exigência é que a cópia
seja efetuada com a utilização do parâmetro -R. Isso copiará o
diretório sem copiar o conteúdo dos arquivos. _E_s_t_e_j_a _s_e_g_u_r_o _d_e
_u_t_i_l_i_z_a_r _u_m _R _m_a_i_ú_s_c_u_l_o. Caso seja utilizado r em formato minúsculo,
provavelmente será copiado o conteúdo completo de todo o disco rígido
-- ou no mínimo, o que couber no disquete! De qualquer forma, é
importante estar atento ao comando:
cp -dpR /dev /mnt
Assumindo-se que o disquete esteja montado em /mnt. A opção dp
garante que ligações simbólicas serão copiadas como ligações, ao invés
de usar um arquivo de destino, e que os atributos originais do arquivo
serão preservados, assim como as informações sobre os donos.
Alternativamente, pode-se usar o programa cpio com a opção -p, uma
vez que o cpio lida com arquivos especiais corretamente, e não
tentará copiar o seu conteúdo. Pode-se por exemplo, utilizar o
seguinte comando:
cd /dev
find . -print | cpio -pmd /mnt/dev
o qual irá copiar todos os arquivos especiais de /dev para /mnt/dev.
Na verdade, irá copiar todos os arquivos da árvore de diretórios
iniciada em /dev, e criará todos os subdiretórios necessários na
árvore de diretórios de destino.
Caso se deseje fazer da forma mais difícil, deve-se usar ls -l para
mostrar os números maior e menor dos dispositivos desejados, e
criá-los no disquete através do comando mknod.
Uma vez que os dispositivos estejam copiados, é aconselhável verificar
se todos os arquivos de dispositivos necessários foram copiados no
disco de emergência. Por exemplo, o ftape é utilizado por unidades de
fitas, sendo necessário copiar todos eles, caso se pretenda acessar um
dispositivo desse tipo a partir do disco de inicialização.
Note que um inode é necessário para cada tipo de arquivo especial de
dispositivo, e
_D_e_v_e_-_s_e _n_e_c_e_s_s_a_r_i_a_m_e_n_t_e _t_e_r _o_s _s_e_g_u_i_n_t_e_s _a_r_q_u_i_v_o_s _n_e_s_t_e _d_i_r_e_t_ó_r_i_o_:
console, kmem, mem, null, ram, tty1.
/etc
Este diretório deve conter uma série de arquivos de configuração. Na
maioria dos sistemas este pode estar dividido em três grupos:
1. Sempre requeridos, _p_o_r _e_x_e_m_p_l_o rc, fstab, passwd
2. Podem ser requeridos, mas não há como assegurar
3. Arquivos desnecessários
Arquivos que não são essenciais podem ser identificados através do
comando:
ls -ltru
Este comando gera uma lista em ordem inversa de último acesso,
dependendo de que arquivos não são acessados ou utilizados e que,
podem não estar presentes no disquete raiz.
Nos nossos disquetes raiz, temos um número de arquivos de configuração
inferior a 15. Isso reduz o trabalho de lidar com um conjunto de três
tipos de arquivos.
1. Os arquivos que devem ser configurados para um sistema:
a. rc.d/* início do sistema e definição dos programas de cada nível
de execução
b. fstab lista dos sistemas de arquivos que devem ser montados
c. inittab parâmetros para o processo init , o primeiro que é
executado em tempo de inicialização do sistema.
2. Estes devem ser customizados para a inicialização de um sistema:
a. passwd lista de usuários, diretórios pessoais, etc...
b. group grupos de usuários
c. shadow senha dos usuários. Eventualmente pode não existir.
Caso a segurança seja um item importante do sistema específico,
passwd e shadow devem ser suprimidos, a fim de evitar a cópia de
senhas de usuários para fora do sistema, e quando o sistema for
inicializado através de disquetes, acessos indesejados serão
rejeitados. De qualquer forma, há uma razão para _n_ã_o suprimir
passwd e group. O tar (e provavelmente outros programas de
arquivamento) armazenam o usuário e o grupo junto com os dados dos
arquivos. Caso estes arquivos sejam restaurados no disco rígido a
partir de uma fita, os arquivos serão restaurados com seus nomes
originais. Caso os nomes dos donos e grupos não existam em
passwd/group durante a restauração, as identificações de usuários
e grupos (UID e GID) não estarão corretas.
Esteja certo de que o arquivo passwd contém ao menos o superusuário
(root). Caso se pretenda utilizar outros usuários para acessar o
sistema, deve-se estar seguro da existência de seus diretórios
pessoais e interpretadores de comando (shell).
3. Os demais: verificaremos mais adiante as informações sobre este
tópico.
Além disso, deve-se somente configurar dois arquivos, e o que eles
devem conter é surpreendentemente pequeno.
· rc deve conter
#!/bin/sh
/bin/mount -av
/bin/hostname Conectiva
Deve-se estar seguro de que os diretórios estão corretos. A execução
de hostname não é obrigatória, somente dá um melhor acabamento ao
trabalho.
· fstab deve conter, no mínimo:
/dev/ram0 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
Pode-se copiar as entradas de um arquivo fstab, já existente, mas não
se deve montar automaticamente qualquer partição do disco rígido;
usando-se então o parâmetro noauto, pois o disco rígido pode estar
danificado ou sem condições de uso no momento da inicialização do
sistema.
O inittab deve ser alterado, de outra forma a linha sysinit executará
o rc ou qualquer outro programa básico de inicialização que seja
indicado. Ainda para assegurar-se de que usuários em portas seriais
não poderão acessar o sistema, pode-se comentar todas as entradas em
getty que incluam dispositivos ttys ou ttyS ao final da linha. Deve-
se deixar as portas tty para poder-se acessar o sistema a partir do
console.
Um arquivo inittab mínimo contém:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
O arquivo inittab define o que o sistema executará nos vários estados,
inclusive no seu início, em modo multiusuário, etc... Um ponto no qual
deve-se ter muito cuidado é o de verificar se todos os comandos
informados em inittab referem-se a programas presentes e se o
diretório está corretamente indicado. Caso se coloque no disco de
emergência os arquivos de comandos apresentados na Seção ``Listas de
exemplo do conteúdo do disco de inicialização'' como um guia, e após
se copie o inittab para o disco sem uma verificação cuidadosa,
provavelmente ele falhará, e o problema terá origem na ausência de
arquivos ou indicações erradas de diretórios.
Note que alguns comandos não podem ser movidos para qualquer outro
lugar, porque têm a sua localização dentro de seu código. Por exemplo
em nosso sistema, o /etc/shutdown tem a sua localização definida no
fonte do comando /etc/reboot. Caso reboot seja movido para
/bin/reboot, e após seja executado o comando shutdown, ele falhará,
porque o arquivo reboot não pode ser localizado.
Para todo o restante, deve-se simplesmente copiar os arquivos texto no
diretório /etc, mais os executáveis do mesmo diretório que não possam
ser definidos como desnecessários. Como um guia, pode-se consultar os
exemplos na Seção ``Listas de exemplo do conteúdo do disco de
inicialização''. Provavelmente será suficiente copiar somente aqueles
arquivos, porém sistemas podem ser muito diferentes, então não se pode
estar seguro de que a lista apresentada seja suficiente. O único
método de estar seguro é iniciar o sistema com inittab e verificar o
que é solicitado.
Muitos sistemas utilizam um diretório /etc/rc.d/ contendo roteiros do
interpretador de comandos de diferentes níveis de execução. O mínimo é
um simples programa rc, mas pode ser mais simples copiar o inittab e o
diretório /etc/rc.d de um sistema já existente, e suprimir os roteiros
no diretório rc.d para remover os processamentos não relevantes do
ambiente de sistema em disquete.
/bin e /sbin
O diretório /bin é um lugar adequado para utilitários extras
necessários à execução de atividades básicas. Utilitários como ls, mv,
cat e dd.Veja o Apêndice ``Listagem de exemplo de conteúdo do disco de
inicialização'' para um exemplo da lista de arquivos que podem estar
presentes nos diretórios /bin e /sbin. Ela não inclui nenhum
utilitário requerido para restaurar cópias de segurança, tais como
cpio, tar e gzip. Isso porque estes programas foram colocados em um
disquete de utilitários em separado, visando economizar espaço no
disquete de inicialização e raiz. Uma vez que o disquete de
inicialização tenha sido carregado, ele é copiado para o disco em
memória, deixando a unidade de disquetes livre para montar outro
disquete, o disquete de utilitários. Normalmente montamos esse
disquete como /usr.
A criação de um disquete de utilitários
_E_s_t_e_j_a _s_e_g_u_r_o _d_e _i_n_c_l_u_i_r _o_s _s_e_g_u_i_n_t_e_s _p_r_o_g_r_a_m_a_s_: init, getty ou
equivalente, login, mount, algum interpretador que possa executar os
programas rc, e uma ligação de sh para o interpretador de comandos.
/lib
No diretório /lib deve-se colocar as bibliotecas compartilhadas e seus
carregadores. Caso as bibliotecas necessárias não sejam encontradas no
diretório /lib, o sistema não poderá ser iniciado. Com um pouco de
sorte pode-se receber uma mensagem de erro dizendo a razão.
Praticamente todos os programas requerem no mínimo a biblioteca libc,
libc.so._N, onde _N é o número da versão corrente. Ao verificar o
diretório /lib, libc.so.5 é normalmente uma ligação simbólica para um
arquivo com o número completo da versão.
% ls -l /lib/libc.so*
lrwxrwxrwx 1 root root 14 Nov 1 20:34 /lib/libc.so.5 -> libc.so.5.4.33*
-rwxr-xr-x 1 root root 573176 Jun 12 02:05 /lib/libc.so.5.4.33*
Neste caso, tem-se disponível o arquivo libc.so.5.4.33. Para encontrar
outras bibliotecas deve-se verificar todos os binários necessários e
verficar as suas dependências com o comando ldd . Por exemplo:
% ldd /sbin/mke2fs
libext2fs.so.2 => /lib/libext2fs.so.2
libcom_err.so.2 => /lib/libcom_err.so.2
libuuid.so.1 => /lib/libuuid.so.1
libc.so.5 => /lib/libc.so.5
O arquivo apresentado na coluna da direita é necessário, tendo-se em
mente que as bibliotecas listadas podem ser ligações simbólicas.
Em /lib deve-se ainda incluir um carregador de bibliotecas. ou ld-
linux.so (para bibliotecas ELF).
% file /lib/libc.so.5.4.33 /lib/libc.so.4.7.2
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 386, version 1, stripped
QMAGIC indica que 4.7.2 é para bibliotecas a.out, e ELF indica que
5.4.33 é para ELF.
Deve-se então copiar o(s) carregador(es) necessário(s) para o sistema
de arquivos raiz em construção. Bibliotecas e carregadores devem ser
checados _c_u_i_d_a_d_o_s_a_m_e_n_t_e com o binários incluídos. Caso o kernel não
possa carregar a biblioteca necessária, normalmente haverá um
travamento sem mensagens de erro.
44..44.. MMóódduullooss
Caso se tenha um kernel modular, deve-se considerar quais módulos
devem ser carregados a partir do disco de inicialização após o início
do sistema. Pode-se incluir os módulos ftape e zftape caso cópias de
segurança tenham sido feitas em um fita, módulos para dispositivos
SCSI caso eles estejam presentes, e módulos para suporte a PPP ou SLIP
caso se queira acesso a rede em uma emergência.
Estes módulos podem ser colocados em /lib/modules. Deve-se ainda
incluir insmod, rmmod e lsmod.
Caso se deseje carregar os módulos automaticamente, pode-se incluir
ainda modprobe, depmod e swapout. E caso se use o kerneld, deve-se
incluir ainda o /etc/conf.modules.
A principal vantagem de utilizar módulos reside no fato de poder mover
módulos não essenciais para um disco de utilitários e carregá-los
quando necessário, usando menos espaço no disco raiz. Porém, caso seja
necessário lidar com muitos dispositivos diferentes, uma abordagem
mais adequada pode residir em construir um único kernel com diversos
módulos integrados.
_N_o_t_e _q_u_e _p_a_r_a _s_e _t_e_r _u_m _s_i_s_t_e_m_a _d_e _a_r_q_u_i_v_o_s _e_x_t_2 _c_o_m_p_a_c_t_a_d_o_, _é
_o_b_r_i_g_a_t_ó_r_i_a _a _e_x_i_s_t_ê_n_c_i_a _d_e _s_u_p_o_r_t_e _a _d_i_s_c_o _e_m _m_e_m_ó_r_i_a _e _s_i_s_t_e_m_a_s _d_e
_a_r_q_u_i_v_o_s _e_x_t_2. Estes não podem ser disponibilizados como módulos.
44..55.. AAllgguunnss ddeettaallhheess ffiinnaaiiss
Alguns programas de sistema, como o login, apresentam mensagem de
advertência caso o arquivo /var/run/utmp e o diretório /var/log não
existam.
mkdir -p /mnt/var/{log,run}
touch /mnt/var/run/utmp
Finalmente, após ter-se configurado todas as bibliotecas necessárias,
deve-se executar o ldconfig para gerar novamente o /etc/ld.so.cache
no sistema de arquivos raiz. O cache diz ao carregador onde encontrar
as bibliotecas. Para reconstruir o ld.so.cache, execute os seguintes
comandos:
chdir /mnt; chroot /mnt /sbin/ldconfig
O comando chroot é necessário porque ldconfig sempre gera o cache
para o sistema de arquivos raiz.
44..66.. EEmmppaaccoottaannddoo
Uma vez concluída a construção do sistema de arquivos raiz, ele deve
ser desmontado, copiado para um arquivo e compactado:
umount /mnt
dd if=DISPOSITIVO bs=1k | gzip -v9 > saraiz.gz
Isso pode levar diversos minutos. Ao finalizar estará disponível um
arquivo saraiz.gz que é o sistema de arquivos raiz compactado. Deve-
se verificar se o arquivo cabe em um disquete. Caso não caiba, deve-se
retornar aos passos anteriores e eliminar alguns arquivos. A Seção
``Reduzindo o tamanho de um sistema de arquivos raiz'' fornece algumas
dicas sobre a redução de tamanho do sistema de arquivos raiz.
55.. EEssccoollhheennddoo uumm kkeerrnneell
Neste ponto tem-se disponível um sistema de arquivos raiz compactado.
O próximo passo é construir um kernel ou selecionar um kernel. Em
muitos casos é possível copiar o kernel atual e inicializar o sistema
a partir do disquete. Porém em muitos casos poderá ser necessário
construir um em separado.
Uma das razões é o tamanho. Caso se esteja construindo um único
disquete de inicialização e raiz, o kernel será um dos maiores
arquivos no disquete e será necessário reduzí-lo o máximo possível.
Caso se esteja construindo dois discos (um de inicialização e um
raiz), isso não será problema pois o kernel irá em um disquete
separado.
Para reduzir seu tamanho, deve-se construir um kernel com o mínimo de
facilidades necessárias ao suporte do sistema desejado. Isso
significa, deixar de lado tudo que não seja absolutamente necessário.
Suporte a rede é um dos prováveis candidatos, assim como suporte a
unidades de disco e outros dispositivos desnecessários durante o
início do sistema. Conforme descrito anteriormente, o kernel _d_e_v_e ter
suporte a disco em memória e ext2 .
Após incluir somente o mínimo necessário de facilidades no kernel,
deve-se verificar o que deve retornar. Provavelmente um dos usos mais
comuns a um disquete de inicialização e raiz é a restauração de
sistemas de arquivos raiz com problemas, e para que isso seja possível
é necessário suporte no kernel do sistema. Por exemplo, caso as cópias
de segurança tenham sido efetuadas em fita, utilizando Ftape para
acessar uma unidade de fita, então será obrigatória a presença de
suporte a dispositivos de fitas para efetuar uma restauração. Caso não
esteja presente, poderá ser necessário reinstalar o Linux, copiar e
reinstalar ftape, e então tentar ler as cópias de segurança.
O ponto aqui é, qualquer suporte a leitura e gravação que seja
adicionado ao kernel para suportar cópias de segurança, deve também
ser adicionado ao kernel de inicialização do sistema em disquete de
emergência.
O procedimento para construir um kernel é descrito na documentação que
o acompanha. É relativamente simples, podendo-se verificar o conteúdo
de /usr/src/linux. Note que caso se tenha problemas construindo um
novo kernel, então provavelmente não se deve tentar construir um disco
de inicialização. Deve-se lembrar de compactar o kernel através do
comando ``make zImage''.
66.. CCoollooccaannddoo ttuuddoo jjuunnttoo:: CCoonnssttrruuiinnddoo oo((ss)) ddiissccoo((ss))
Neste ponto, tem-se um kernel e um sistema de arquivos raiz. Caso se
esteja construindo um único disco de inicialização e raiz, deve-se
verificar o seu tamanho e estar seguro de que eles caberão em um único
disco. Caso se esteja construindo dois discos, deve-se verificar se o
sistema de arquivos cabe em um único disquete.
Deve-se decidir pelo uso ou não do LILO no disquete de inicialização
do kernel. A alternativa será copiar o kernel diretamente no disquete
e iniciar o sistema sem o LILO. A vantagem de utilizar o LILO reside
na possibilidade de passagens de parâmetros para o kernel, o que pode
ser necessário para inicializar algum equipamento (deve-se verificar o
conteúdo do arquivo /etc/lilo.conf. Caso exista alguma linha do tipo
``append=...'', provavelmente esta facilidade será necessária). A
desvantagem de usar o LILO é que a construção do disco de
inicialização torna-se mais complexa e mais espaço é necessário.
Deve-se construir um pequeno sistema de arquivos em separado, o qual
nós denominamos ssiisstteemmaa ddee aarrqquuiivvooss ddoo kkeerrnneell, para onde se pode
transferir o kernel e algumas outras coisas necessárias para o LILO.
Caso se vá utilizar o LILO, siga adiante, caso contrário pode-se ir
diretamente para a seção ``Transferindo o kernel sem o LILO''.
66..11.. TTrraannssffeerriinnddoo oo kkeerrnneell ccoomm oo LLIILLOO
O primeiro item que deve ser criado é um pequeno arquivo de
configuração do LILO. Ele deve ser similar ao seguinte:
______________________________________________________________________
boot =/dev/fd0
install =/boot/boot.b
map =/boot/map
read-write
backup =/dev/null
compact
image = KERNEL
label = Disquete_Inic
root =/dev/fd0
______________________________________________________________________
Para obter detalhes destes parâmetros, por favor verifique a
documentação de usuário do LILO. Pode ser desejável ainda adicionar a
linha append=... copiada do arquivo /etc/lilo.conf existente em
disco.
Deve-se salvar o arquivo como bdlilo.conf e a seguir criar um pequeno
sistema de arquivos, o qual será denominado
Inicialmente, deve-se verificar o tamanho que o sistema de arquivos
terá. Verifique o tamanho do kernel em blocos (o tamanho é mostrado
através do comando ``ls -l KERNEL'' dividido por 1024 e arredondado
para cima) e acrescido de 50, referentes ao espaço necessário aos
inodes e outros arquivos. Pode-se calcular o número exato ou
simplesmente utilizar 50. Caso se esteja criando um conjunto com dois
disquetes, pode-se superestimar o espaço usado pelo kernel.
Denominaremos este número de NÚCLEO_BLOCOS.
Deve-se colocar um disquete no dispositivo (para simplificar
assumiremos que será em /dev/fd0) e após criar um sistema de arquivos
tipo ext2 para o kernel:
mke2fs -i 8192 -m 0 /dev/fd0 NÚCLEO_BLOCOS
O parâmetro ``-i 8192'' especifica que desejamos um inode para cada
8192 bytes. Após, deve-se montar o sistema de arquivos, remover o
diretório lost+found e criar os diretórios dev e boot para o LILO:
mount /dev/fd0 /mnt
rm -rf /mnt/lost+found
mkdir /mnt/{boot,dev}
Após, deve-se criar os dispositivos /dev/null e /dev/fd0. Ao invés de
procurar pelos números dos dispositivos, pode-se simplesmente copiá-lo
do disco rígido utilizando-se -R:
cp -R /dev/{null,fd0} /mnt/dev
O LILO necessita de uma cópia de seu carregador de inicialização,
boot.b, o qual pode ser encontrado no disco rígido, normalmente no
diretório /boot .
cp /boot/boot.b /mnt/boot
Finalmente, deve-se copiar os arquivos de configuração do LILO criado
conforme a seção anterior, assim como o kernel. Ambos devem estar
presentes no diretório raiz:
cp bdlilo.conf KERNEL /mnt
Todo o necessário para que o LILO possa ser executado está presente no
sistema de arquivos do kernel. Deve-se então executar o LILO com o
parâmetro -r para instalar o carregador de inicialização :
lilo -v -C bdlilo.conf -r /mnt
O LILO deverá ser executado sem erros, após o qual o sistema de
arquivos do kernel deve ter a seguinte aparência:
______________________________________________________________________
total 361
1 -rw-r--r-- 1 root root 176 Jan 10 07:22 bdlilo.conf
1 drwxr-xr-x 2 root root 1024 Jan 10 07:23 boot/
1 drwxr-xr-x 2 root root 1024 Jan 10 07:22 dev/
358 -rw-r--r-- 1 root root 362707 Jan 10 07:23 vmlinuz
boot:
total 8
4 -rw-r--r-- 1 root root 3708 Jan 10 07:22 boot.b
4 -rw------- 1 root root 3584 Jan 10 07:23 map
dev:
total 0
0 brw-r----- 1 root root 2, 0 Jan 10 07:22 fd0
0 crw-r--r-- 1 root root 1, 3 Jan 10 07:22 null
______________________________________________________________________
Não há motivos para preocupação caso os tamanhos de arquivos sejam um
pouco diferentes.
Pode-se ir agora para a seção ``Configurando o disco em memória''.
66..22.. TTrraannssffeerriinnddoo oo kkeerrnneell sseemm oo LLIILLOO
Caso _n_ã_o se esteja utilizando o LILO, o kernel pode ser transferido
para o disco de inicialização com o comando dd :
% dd if=KERNEL of=/dev/fd0 bs=1k
353+1 records in
353+1 records out
Neste exemplo, dd gravou 353 registros completos e 1 parcialmente,
concluindo-se que o kernel ocupou 354 blocos do disquete.
Denominaremos este número como NÚCLEO_BLOCOS , o qual será utilizado
na próxima seção.
Finalmente, deve-se configurar o disquete como o dispositivo raiz e
dar-lhe permissões de leitura e gravação:
rdev /dev/fd0 /dev/fd0
rdev -R /dev/fd0 0
Deve-se ter o máximo cuidado ao usar o -R maiúsculo no comando rdev .
66..33.. CCoonnffiigguurraannddoo oo ddiissccoo eemm mmeemmóórriiaa
Dentro da imagem do kernel está a ppaallaavvrraa ((ddooiiss oouu mmaaiiss bbyytteess)) ddee
ccoonnffiigguurraaççããoo ddoo ddiissccoo eemm mmeemmóórriiaa que especifica onde o sistema de
arquivos raiz deve ser encontrado, em conjunto com as suas opções. A
palavra é definida em /usr/src/linux/arch/i386/kernel/setup.c e é
interpretada da seguinte forma:
bits 0-10: deslocamento para início da memória, em blocos de 1024 bytes
bits 11-13: sem utilização
bit 14: Indicador se o disco em memória deve ser carregado
bit 15: Indicador de prompt antes da carga do sistema de arquivos raiz
Caso o bit 15 esteja configurado, no processo de inicialização será
solicitada a inserção de um novo disquete na unidade. Isso é
necessário no caso de conjuntos de dois disquetes de inicialização.
Há dois casos, dependendo da construção de um único disquete ou de um
conjunto de dois disquetes (inicialização e raiz).
1. Caso se esteja construindo um único disco, o sistema de arquivos
raiz será colocado exatamente após o kernel, sendo o deslocamento
então igual ao primeiro bloco livre (o que deve ser igual a
NÚCLEO_BLOCOS). O bit 14 será configurado com 1 e o bit 15 com
zero.
2. Caso se esteja construindo um conjunto de dois disquetes, o sistema
de arquivos raiz começará no bloco zero e o deslocamento será igual
a zero. Bit 14 será igual a 1 e o bit 15 também será igual a 1.
Após calcular cuidadosamente o valor da palavra de disco em
memória, deve-se configurá-la com rdev -r.
rdev -r NÚCLEO_OU_UNIDADE_DE_DISQUETE
Caso se esteja utilizando o LILO, a unidade de disquetes deve ser
desmontada agora.
66..44.. TTrraannssffeerriinnddoo oo ssiisstteemmaa ddee aarrqquuiivvooss rraaiizz
O último passo é a transferência do sistema de arquivos raiz.
· Caso o sistema de arquivos raiz seja colocado no _m_e_s_m_o disco que o
kernel, a transferência deve ser efetuada utilizando-se o comando
dd com a opção seek, a qual especifica quantos blocos devem ser
ignorados até que a gravação tenha início:
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=BLOCOS_NÚCLEO
· Caso o sistema de arquivos raiz seja colocado em um _s_e_g_u_n_d_o disco,
deve-se remover o primeiro disquete e colocar o segundo na unidade,
transferindo-se o sistema de arquivos raiz:
dd if=rootfs.gz of=/dev/fd0 bs=1k
Parabéns, serviço concluído!
DDEEVVEE--SSEE SSEEMMPPRREE TTEESSTTAARR UUMM DDIISSCCOO DDEE IINNIICCIIAALLIIZZAAÇÇÃÃOO AANNTTEESS DDEE GGUUAARRDDÁÁ--LLOO,,
PPAARRAA UUSSOO EEMM UUMMAA EEMMEERRGGÊÊNNCCIIAA
77.. PPrroobblleemmaass
Na construção de discos de inicialização, as primeiras tentativas
normalmente gerarão discos com problemas. A abordagem de construção de
um disco raiz é montar seus componentes a partir de um sistema já
existente e tentar construir um disquete baseado nele que viabilize a
carga do sistema até o momento em que mensagens possam ser
apresentadas na console. Após esse passo, cabe verificar as mensagens
e os erros apresentados, e ir corrigindo um a um, de acordo com o
apresentado no console. Caso o sistema simplesmente trave, sem maiores
explicações, encontrar a causa será um pouco mais difícil. Para ter-se
um sistema que possa chegar ao estágio de enviar mensagens para o
console, são requeridos diversos componentes, que devem estar
presentes e corretamente configurados. O procedimento recomendado na
investigação de um problema onde o sistema não apresente a sua causa é
o seguinte:
· Verificar se o disco raiz contém realmente os diretórios
necessários. É comum copiar de níveis errados e ter algo como
/discoraiz/bin ao invés de /bin no disquete.
· Verificar se existe /lib/libc.so com a mesma ligação que aparece no
diretório /lib do disco rígido.
· Verificar se todas as ligações simbólicas no diretório /dev
existem no sistema de arquivos raiz do disquete, onde aquelas
ligações devem ser para dispositivos que estão inclusos no disco
raiz. Em particular, ligações para /dev/console são fundamentais em
diversos casos.
· Verificar se os arquivos /dev/tty1, /dev/null, /dev/zero, /dev/mem,
/dev/ram e /dev/kmem foram incluídos.
· Verificar se a configuração do kernel suporta todos os recursos
requeridos até o momento de acesso ao sistema e se estão
adicionados ao kernel de forma residente e não como módulos.
_S_u_p_o_r_t_e _a _d_i_s_c_o_s _e_m _m_e_m_ó_r_i_a _e _e_x_t_2 _d_e_v_e_m _e_s_t_a_r _r_e_s_i_d_e_n_t_e_s.
· Verificar se as configurações do dispositivo raiz e do kernel e o
disco em memória estão corretas.
Alguns deste aspectos gerais são melhor detalhados a seguir:
1. Esteja certo de que init foi incluído como /sbin/init ou
/bin/init e que tem permissão de execução.
2. Execute ldd init para checar as bibliotecas necessárias à execução
do init. Normalmente é necessária somente libc.so. Esteja certo de
que todas as bibliotecas e carregadores foram incluídos.
3. Esteja certo de utilizar o carregador correto para as bibliotecas
--- ld.so para a.out ou ld-linux.so para ELF.
4. Verificar se o arquivo /etc/inittab no sistema de arquivos do
disquete de inicialização, aponta para o programa getty (ou algum
programa similar a getty, como por exemplo agetty, mgetty ou
getty_ps).
5. Assim como realizado com init, execute ldd em getty para verificar
as dependências, esteja certo de que as bibliotecas necessárias e
carregadores estão presentes no sistema de arquivos raiz.
6. Esteja seguro de ter incluído um shell script (por exemplo, bash ou
ash), capaz de executar todos os programas rc .
7. Caso se tenha um arquivo /etc/ld.so.cache no disco de emergência,
refaça-o.
Caso init comece, mas seja obtida a seguinte mensagem:
Id xxx respawning too fast: disabled for 5 minutes
ela é oriunda do init, normalmente indicando que os programas getty
ou login estão sendo encerrados imediatamente após o seu início.
Caso ao se tentar executar algum programa, tal como df, presente no
disco de emergência, e obtêm-se mensagens como: df: não encontrado,
deve-se verificar: (1) o diretório que contém o comando está
configurado na variável de ambiente PATH, e (2) todas as bibliotecas e
carregadores necessários ao programa estão presentes.
88.. DDiivveerrssooss
88..11.. RReedduuzziinnddoo oo ttaammaannhhoo ddoo ssiisstteemmaa ddee aarrqquuiivvooss rraaiizz
Algumas vezes o sistema de arquivos raiz é muito grande para caber em
um disquete, mesmo após a sua compactação. Seguem algumas formas de
reduzir seu tamanho, listadas em ordem decrescente de efetividade:
AAuummeennttaarr aa ddeennssiiddaaddee ddoo ddiissccoo
Por padrão, disquetes são formatados em 1400K, mas formatos de
maior densidade estão disponíveis. fdformat poderá formatar nos
seguintes tamanhos: 1600, 1680, 1722, 1743, 1760, 1840, e 1920.
Muitos dispositivos de 1440K suportarão 1722K, e é este que
sempre usamos para disquetes de inicialização. A página de
manual fdformat e o arquivo
/usr/src/linux/Documentation/devices.txt fornecem maiores
informações sobre o tema.
AAlltteerraarr oo iinntteerrpprreettaaddoorr ddee ccoommaannddooss
Alguns dos mais populares interpretadores de comando para Linux,
como bash e tcsh, são grandes e requerem diversas bibliotecas.
DDiimmiinnuuiirr aass bbiibblliiootteeccaass ee ooss bbiinnáárriiooss
objcopy --strip-all FROM TO
Ao copiar bibliotecas deve ser usado:
objcopy --strip-debug FROM TO
MMoovveerr aarrqquuiivvooss nnããoo ccrrííttiiccooss ppaarraa uumm ddiissccoo ddee uuttiilliittáárriiooss
Caso alguns binários não sejam necessários durante a
inicialização ou no acesso ao sistema, eles podem ser movidos
para um disquete adicional. Veja a Seção ``Construindo um
disquete de utilitários'' para maiores detalhes. Deve-se ainda
considerar também a movimentação de módulos.
88..22.. SSiisstteemmaass ddee aarrqquuiivvooss rraaiizz nnããoo rreessiiddeenntteess eemm ddiissccooss nnaa mmeemmóórriiaa
A Seção ``Construindo um sistema de arquivos raiz'' apresenta
instruções sobre como construir um sistema de arquivos raiz compactado
o qual é carregado em um disco em memória quando o sistema é iniciado.
Este método tem diversas vantagens e é o mais comumente utilizado. De
qualquer forma, alguns sistemas com pouca memória podem não suportar
toda a RAM necessária para isso; e nestes casos o sistema de arquivos
raiz é montado diretamente ao invés de ser copiado para um disco em
memória.
Tais sistemas de arquivos são na verdade mais simples de serem
construídos do que sistemas compactados, uma vez que eles podem ser
construídos tanto em disquetes como em qualquer outro dispositivo, e
não têm que ser compactados. Apresentaremos os procedimentos
necessários e as suas diferenças em relação ao descrito até aqui. Caso
seja esta a sua opção, deve-se ter em mente que se terá _m_u_i_t_o _m_e_n_o_s
_e_s_p_a_ç_o disponível.
1. Calcular o espaço disponível para os arquivos do sistema de
arquivos raiz.
Caso se esteja construindo um único disco de inicialização e raiz,
todos os blocos do kernel mais os do sistema de arquivos raiz devem
caber em um disquete.
2. Utilizar o programa mke2fs, para criar um sistema de arquivos raiz
em um disquete com o tamanho apropriado.
3. Incluir os arquivos do sistema de arquivos conforme descrito acima.
4. Ao finalizar, desmontar o sistema de arquivos e transferi-lo para
um arquivo de disco, _s_e_m _c_o_m_p_a_c_t_a_ç_ã_o.
5. Transferir o kernel para um disquete, conforme descrito
anteriormente. Ao calcular a palavra do disco em memória,
ccoonnffiigguurraarr oo bbiitt 1144 ppaarraa zzeerroo, para indicar que o sistema de
arquivos raiz não será carregado para um disco em memória. Executar
o comando rdev conforme descrito.
6. Transferir o sistema de arquivos raiz conforme descrito
anteriormente.
Há diversos atalhos que podem ser executados. Caso se esteja
construindo um conjunto de dois disquetes, pode-se construir o
sistema de arquivos raiz diretamente no segundo disquete, não sendo
necessário transferi-lo para o disco rígido e após para o disquete
novamente. Ainda, caso se esteja construindo um único disquete de
raiz e inicialização utilizando-se o LILO, pode-se construir um
_ú_n_i_c_o sistema de arquivos no disco inteiro, contendo o kernel,
arquivos do LILO e do raiz, e simplesmente executar o LILO como o
último passo.
88..33.. CCoonnssttrruuiinnddoo uumm ddiissqquueettee ddee uuttiilliittáárriiooss
Construir um disquete de utilitários é bastante simples, basta
simplesmente criar um sistema de arquivos em um disquete formatado e
copiar os arquivos para ele. Para usá-lo com o disco de inicialização,
deve-se montá-lo manualmente após o sistema ser carregado.
Conforme descrito anteriormente, o disquete de utilitários pode ser
montado como /usr. Neste caso, os binários podem ser colocados no
diretório /bin no disquete de utilitários, sendo que uma indicação a
/usr/bin na variável de ambiente de caminho permitirá o acesso direto
a eles. Bibliotecas adicionais podem ser colocadas no diretório /lib
no disquete de utilitários.
Há vários pontos importantes para atentar-se ao se construir um disco
de utilitários, a saber:
1. _N_ã_o colocar binários ou bibliotecas que sejam críticos para o
início do sistema, uma vez que o disquete não será montado antes da
inicialização do sistema.
2. Não é possível acessar uma unidade de disquete e uma unidade de
fita simultaneamente. Isso significa que caso se tenha uma unidade
de fita, não será possível acessá-la enquanto o disco de
utilitários estiver montado.
3. O acesso aos arquivos no disco de utilitários será lento.
Apêndice ``Listas de exemplo do conteúdo do disco de utilitários''
mostra um lista de exemplo de arquivos em um disquete de utilitários.
Aqui estão colocadas algumas idéias que podem ser úteis: programas
para examinar e manipular discos ( (format, fdisk) e sistemas de
arquivos (mke2fs, fsck, isofs.o), um editor de textos leve (elvis,
jove), utilitários de compactação e arquivamento (gzip, tar, cpio,
afio), utilitários para fitas (mt, tob, taper), comunicação (ppp.o,
slip.o, minicom) e dispositivos (setserial, mknod).
99.. CCoommoo ooss pprrooffiissssiioonnaaiiss ffaazzeemm iissssoo
É possível perceber que os discos de inicialização das maiores
distribuições, tais como Conectiva Linux, Red Hat, Slackware ou
Debian, parecem ser mais sofisticados do que o descrito neste
documento. Discos de inicialização de distribuições profissionais são
baseados nos mesmos princípios aqui descritos, mas empregam alguns
detalhes adicionais, uma vez que devem atender a um número maior de
sistemas e situações. Inicialmente, eles devem ser capazes de
funcionar com uma grande variedade de hardwares, sendo necessário
então interagir com o usuário e carregar diversos arquivos de
dispositivos. Segundo, eles devem ser preparados para trabalhar com
diversas opções de instalação, com diferentes níveis de automação.
Finalmente, distribuições normalmente combinam funcionalidades de
instalação e emergências.
Alguns discos de inicialização contém uma funcionalidade chamada
iinniittrrdd (ddiissccoo eemm mmeemmóórriiaa iinniicciiaall).
.
As informações a seguir são um resumo dos discos de instalação de cada
uma das distribuições, baseado na inspeção de seus sistemas de
arquivos e dos códigos fontes. Não podemos garantir a exata acuidade
das informações aqui descritas, ou se elas forem alteradas em novas
versões.
Slackware (v.3.1) usa uma inicialização similar a um LILO descrito na
seção ``Transferindo o kernel com o LILO''. O disco de inicialização
do Slackware apresenta uma mensagem (``Bem-vindo ao disco de
inicialização do kernel do Slackware Linux!'') usando o parâmetro
message do LILO. Após, o usuário é instruído a entrar com os
parâmetros de inicialização, se necessários. Após a inicialização, um
sistema de arquivos raiz é carregado de um segundo disco. O usuário
executa o programa setup que inicia a instalação. Ao invés de usar um
kernel modular, Slackware provê uma série de diferentes kernels e
depende do usuário a escolha do mais adequado aos seus requisitos de
hardware.
RedHat (v.4.0) também utiliza a inicialização do LILO. Ele carrega um
disco em memória compactado a partir do primeiro disco, o qual executa
um programa init customizado. Este programa solicita os arquivos de
controle de dispositivos e carrega-os de um disco suplementar quando
necessário.
Debian (v.1.3) é provavelmente o mais sofisticado disco de instalação.
Ele utiliza o carregador SYSLINUX para permitir várias opções de
inicialização, usando então uma imagem do initrd para guiar o usuário
pelo processo de instalação. Aparenta usar tanto um init quanto um
interpretador customizados.
1100.. LLiissttaa ddaass PPeerrgguunnttaass MMaaiiss FFrreeqquueenntteess ((FFAAQQ))
QQ.. EEuu ccaarrrreeggoo mmeeuuss ddiissccooss ddee iinniicciiaalliizzaaççããoo ee rraaiizz ee nnaaddaa aaccoonntteeccee.. OO
qquuee ppoossssoo ffaazzeerr??
Veja a Seção ``Problemas''.
QQ.. CCoommoo oo ddiissccoo ddee iinniicciiaalliizzaaççããoo ddaa CCoonneeccttiivvaa//RReedd HHaatt//SSllaacckkwwaarree//DDeebbiiaann
ffuunncciioonnaamm??
Veja a Seção ``Como os profisisonais fazem isso''.
QQ.. CCoommoo eeuu ppoossssoo ccoonnssttrruuiirr uumm ddiissqquueettee ddee iinniicciiaalliizzaaççããoo ccoomm oo aarrqquuiivvoo
ddee ccoonnttrroollee ddee ddiissppoossiittiivvooss XXYYZZ??
A forma mais simples é obter um kernel do Slackware em um site espelho
mais próximo. Os kernels do Slackware são genéricos e tentam incluir
arquivos de controle para o maior número de dispositivos possível.
Então caso se tenha uma controladora IDE ou SCSI, as chances são
grandes de se ter um arquivo de controle para elas em um kernel do
Slackware. Vá para o diretório a1 e selecione IDE ou SCSI
dependendo do tipo de controladora que se tenha. Verifique o arquivo
xxxxkern.cfg do kernel selecionado para ver os arquivos de controle
que foram incluídos neste kernel. Caso o dispositivo que se deseje
instalar esteja incluído na lista, então o kernel correspondente deve
inicializar o seu computador. Transfira o arquivo xxxxkern.tgz e
copie para o seu disquete de inicialização conforme descrito acima, na
seção de construção de discos de inicialização.
Deve-se checar o dispositivo raiz no kernel usando-se o comando rdev:
rdev zImage
rdev mostrará o dispositivo raiz atual do kernel. Caso este não seja o
mesmo desejado, deve-se usar o rdev para alterá-lo. Por exemplo, um
kernel testado apontava para /dev/sda2, porém a partição raiz SCSI era
/dev/sda8. Para usar um disquete raiz, deve-se utilizar o comando:
rdev zImage /dev/fd0
Caso se queira saber como configurar um disquete de inicialização do
Slackware, sugere-se verificar o Guia de Instalação Linux ou obter uma
distribuição Slackware. Veja a seção denominada "Referências".
QQ.. CCoommoo aattuuaalliizzaarr uumm ddiissccoo ddee iinniicciiaalliizzaaççããoo ccoomm uumm nnoovvoo kkeerrnneell??
Simplesmente copie o novo kernel em um disquete de inicialização
utilizando o comando dd para um disquete sem sistema de arquivos, ou
através do comando cp para um disco de inicialização e raiz. Verifique
a seção denominada "inicialização" para detalhes sobre a criação de um
disquete de inicialização. A descrição aplica-se perfeitamente à
atualização do kernel em um disquete de inicialização.
QQ.. CCoommoo aattuuaalliizzaarr oo ddiissqquueettee rraaiizz ccoomm nnoovvooss aarrqquuiivvooss??
A maneira mais simples é copiar o sistema de arquivos do disco raiz de
volta ao DISPOSITIVO utilizado, seção ``Criando um sistema de
arquivos''. Após monte o sistema de arquivos e faça as alterações
necessárias. Deve-se lembrar sempre onde o sistema de arquivos começa
e quantos blocos ele ocupa:
dd if=/dev/fd0 bs=1k skip=INÍCIO_RAIZ count=BLOCOS | gunzip > DISPOSITIVO
mount -t ext2 DISPOSITIVO /mnt
Após as alterações serem concluídas, proceda de acordo com a Seção
``Empacotando'' e transfira o sistema de arquivos raiz de volta para o
disco. Não se deve retransferir o kernel ou recalcular a palavra do
disco em memória caso não tenha havido alterações do ponto de início
do novo sistema de arquivos raiz.
QQ.. CCoommoo rreemmoovveerr oo LLIILLOO ppaarraa sseerr ppoossssíívveell uuttiilliizzaarr aa iinniicciiaalliizzaaççããoo DDOOSS
nnoovvaammeennttee??
No Linux pode-se executar:
/sbin/lilo -u
Pode-se ainda usar o comando dd para utilizar a cópia de segurança
salva pelo LILO do setor de inicialização. Veja na documentação do
LILO maiores informações.
No DOS ou Windows pode-se executar o seguinte comando DOS:
FDISK /MBR
MBR significa Registro Mestre de Inicialização (Master Boot Record), e
após o comando acima o setor de inicialização recebe registros DOS sem
alterar a tabela de partições. Alguns puristas não concordam com essa
abordagem, mas mesmo o autor do LILO, Werner Almesberger, sugere
isso, além de ser simples e funcional.
QQ.. CCoommoo iinniicciiaalliizzaarr oo ssiisstteemmaa ssee oo kkeerrnneell _e oo ddiissccoo ddee iinniicciiaalliizzaaççããoo
ffoorraamm ppeerrddiiddooss??
Caso não se tenha um disco de inicialização extra, provavelmente o
método mais simples será obter um kernel do Slackware para a sua
controladora de discos ((IDE ou SCSI) conforme descrito anteriormente
em "Como construir um disco de inicialização com o arquivo de controle
de dispositivos XYZ?". Pode-se iniciar o sistema com esse kernel e
procurar reparar o que estiver danificado.
O kernel obtido pode não conter o tipo de disco e a partição que se
deseje. Por exemplo, kernel genérico do Slackware para controladoras
SCSI tem o dispositivo raiz configurado para /dev/sda2, e
eventualmente a partição raiz pode estar em /dev/sda8. Neste caso o
dispositivo raiz do kernel deve ser alterado.
Pode-se mudar os parâmetros de dispositivo raiz e disco em memória no
kernel, mesmo que tudo o que tenha seja um kernel ou mesmo a partir de
outro sistema operacional, como por exemplo DOS.
rdev altera o kernel através de alterações de valores de deslocamentos
fixos do arquivo do kernel, então pode-se utilizar um editor em
hexadecimal em qualquer sistema disponível, como por exemplo o Editor
de Disco de Utilitários Norton sob DOS. Deve-se checar se é necessário
mudar os valores do kernel nos seguintes deslocamentos:
HEX DEC DESCRIPTION
0x01F8 504 Byte inferior da palavra do disco em memória
0x01F9 505 Byte superior da palavra do disco em memória
0x01FC 508 Número menor do dispositivo raiz - vide abaixo
0X01FD 509 Número maior do dispositivo raiz - vide abaixo
A interpretação da palavra do disco em memória está descrita na seção
``Configurando o disco em memória''.
O número maior e menor do dispositivo devem ser configurados caso se
deseje montar o sistema de arquivos raiz nele. Alguns valores
importantes são:
DISPOSITIVO MAIOR MENOR
/dev/fd0 2 0 primeira unidade de disquetes
/dev/hda1 3 1 partição 1 no primeiro disco IDE
/dev/sda1 8 1 partição 1 no primeiro disco SCSI
/dev/sda8 8 8 partição 8 no primeiro disco SCSI
Uma vez que estes valores estejam configurados, pode-se gravar o
arquivo utilizando tanto o editor Norton, quanto um programa chamado
rawrite.exe. Este programa é incluído em todas as distribuições, e é
executado em ambientes DOS, sendo capaz de gravar os dados de forma
direta, ao invés de gravar através do sistema de arquivos. Caso se
utilize o Norton deve-se gravar o arquivo em um disco físico com
início igual ao do disco de inicialização.
QQ.. CCoommoo ffaazzeerr ccóóppiiaass aaddiicciioonnaaiiss ddooss ddiissqquueetteess ddee iinniicciiaalliizzaaççããoo ee rraaiizz??
Como a mídia magnética pode deteriorar-se com o tempo, deve-se manter
diversas cópias dos discos de emergência, para as situações em que o
original não funcione.
A forma mais simples de fazer cópias de qualquer disquete, inclusive
disquetes que podem ser inicializados e disquetes de utilitários, é
através da utilização do comando dd para cópia do disquete original
em um disco rígido e após o mesmo comando para copiar do disco rígido
para os diversos disquetes. Note que não se deve montar os disquetes,
porque o comando dd utiliza o acesso direto ao dispositivo.
Para copiar o disquete original, execute o comando:
dd if=NOME_DISPOSITIVO of=NOME_ARQUIVO
onde NOME_DISPOSITIVO é o nome da unidade de disquetes
e NOME_ARQUIVO é o nome do arquivo de saída (no disco rígido)
Omitindo-se o parâmetro count faz com que o comando copie todo o
disquete (2880 blocos de alta densidade).
Para copiar o arquivo resultante para um novo disquete, deve-se
inserir o disquete na unidade e executar o comando:
dd if=NOME_ARQUIVO of=NOME_DISPOSITIVO
Note que o exemplo acima assume que se tenha somente uma unidade de
gravação de disquetes. Caso se tenha duas de mesmo tipo, pode-se
copiar o disquete usando-se o comando:
dd if=/dev/fd0 of=/dev/fd1
QQ.. CCoommoo iinniicciiaalliizzaarr oo ssiisstteemmaa sseemm tteerr qquuee ddiiggiittaarr ""aahhaaxxxxxxxx==nnnn,,nnnn,,nnnn""
ttooddaa vveezz??
Quando um dispositivo não pode ser detectado automáticamente, é
necessário fornecer ao kernel os parâmetros através do comando de
dispositivos, como por exemplo:
aha152x=0x340,11,3,1
Este parâmetro pode ser fornecido pelo LILO de diversas formas:
· Informando o comando toda a vez que o sistema for inicializado via
LILO. A opção menos aconselhável.
· Usando o parâmetro ``lock'' para armazenar a linha de comando como
a linha padrão de comando, fazendo com que o LILO use estas opções
toda a vez que o sistema for carregado.
· Utilizando o parâmetro append= no arquivo de configuração do LILO.
Note que o parâmetro deve estar entre aspas.
Por exemplo, uma linha de comando usando os parâmetros acima poderia
ser:
zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock
Este comando passa os parâmetros do dispositivo, configura o
dispositivo raiz em /dev/sda1 e salva todo o comando para reutilização
futura.
Um exemplo de comando append:
\{append} = "aha152x=0x340,11,3,1"
Note que o parâmetro não deve estar entre aspas na linha de comando,
mas é obrigatório que assim esteja no comando append.
Note ainda que para que o parâmetro seja ativado, o kernel deve
conter o módulo para o dispositivo assinalado. Caso contrário, o
comando não surtirá efeito algum e o kernel deverá ser reconstruído
para incluir o módulo requerido. Para maiores detalhes sobre a
reconstrução do kernel, mude o diretório para /usr/src/linux e veja o
arquivo README, e leia o FAQ e o tutorial de instalação.
Alternativamente pode-se obter um kernel genérico e instalá-lo.
É extremamente indicado a leitura da documentação LILO antes de se
tentar instalá-lo. Usos indevidos do comando BOOT podem causar danos
às partições.
QQ.. DDuurraannttee aa iinniicciiaalliizzaaççããoo ooccoorrrreeuu oo eerrrroo ""A: não pode executar B".
Por quê?
Há diversos casos em que nomes de programas encontram-se dentro do
código de vários utilitários. Este casos não ocorrem em toda parte,
mas pode ser uma explicação de porquê um executável aparentemente pode
não ser encontrado, apesar de estar presente no sistema. Pode-se
descobrir se um determinado programa tem o nome de outro dentro de seu
código usando-se o comando strings e conectando sua saída com o
comando grep.
Exemplos conhecidos de localizações pré-definidas:
· Shutdown em algumas versões tem o programa /etc/reboot
pré-definido, sendo que reboot deverá estar no diretório /etc .
· init pode causar alguns problemas, caso o kernel não consiga
encontrá-lo em init.
Para corrigir estes problemas, deve-se ou mover os programas para o
diretório correto, ou mudar os arquivos de configuração (por exemplo
inittab) para apontarem para o diretório correto. Em caso de dúvidas,
ponha os programas no mesmo diretório em que eles estavam no disco
rígido, e utilize os mesmos inittab e /etc/rc.d da forma como eles
estão presentes.
QQ.. MMeeuu kkeerrnneell tteemm ssuuppoorrttee aa ddiissccoo eemm mmeemmóórriiaa,, mmaass aappaarreeccee ccoomm 00 KKbb ddee
eessppaaççoo..
Quando isso ocorre, uma mensagem do kernel aparecerá durante a
inicialização:
Dispositivo de disco em memória inicializado:
16 discos em memória com tamanho de 0K.
Isso se deve provavelmente à definição do tamanho em zero através dos
parâmetros de kernel em tempo de inicialização. Algo como:
ramdisk=0
Isso foi incluído como exemplo de configuração do LILO em algumas
distribuições antigas, e foi colocado para sobrepor-se a parâmetros
anteriores de configuração do kernel. Caso essa linha esteja presente,
deve ser retirada.
Note que ao se tentar utilizar um disco em memória com tamanho igual a
zero, o comportamento do sistema é imprevisível, e pode resultar em
travamentos do kernel.
KK.. RReeccuurrssooss ee EEnnddeerreeççooss
Nesta seção, _v_v_v é usado no lugar de versões dos nomes dos pacotes, a
fim de evitar a referência a uma versão específica. Ao recuperar um
pacote, deve-se procurar usar sempre a versão mais recente, a menos
que haja alguma boa razão para fazer o contrário.
KK..11.. DDiissccooss ddee IInniicciiaalliizzaaççããoo PPrréé--CCoonnffiigguurraaddooss
Há diversas fontes de discos de distribuições. _P_o_r _f_a_v_o_r _u_s_e _u_m _d_o_s
_s_i_t_e_s _e_s_p_e_l_h_o_s _p_a_r_a _r_e_d_u_z_i_r _o _t_r_á_f_e_g_o _n_e_s_t_a_s _m_á_q_u_i_n_a_s_.
· Discos de inicialização Slackware
e Sites espelho Slackware
· Discos de inicialização Red Hat
e Sites espelho Red Hat
· Discos de inicialização Debian
e Sites espelho
Debian
Em adição aos discos das distribuições, as seguintes imagens de discos
de emergência estão disponíveis:
· tomsrtbt, de Tom Oehser, é um único disco de inicialização e raiz,
baseado no kernel 2.0.33, com uma grande lista de funcionalidades e
programas de suporte. Suporta IDE, SCSI, fita, placas de rede,
PCMCIA e mais. Mais de 100 utilitários e ferramentas estão inclusas
para correção e restauração de discos. O pacote ainda inclui
programas para desmontagem e reconstrução de imagens, permitindo
que novos itens possam ser incluídos.
· rescue02, de John Comyns, é um disco de emergência baseado no
kernel 1.3.84, com suporte a IDE e Adaptec 1542 e NCR53C7,8xx. Usa
binários ELF, porém contém comandos suficientes para ser utilizado
em qualquer sistema. Há módulos que podem ser carregados após a
inicialização do sistema para todas as placas SCSI. Provavelmente
não funcionará em sistemas com 4 Mb de RAM, uma vez que utiliza um
disco de 3 Mb.
· resque_disk-2.0.22, de Sergei Viznyuk, é um disco de inicialização
e raiz baseado no kernel 2.0.22 com suporte a IDE, muitas
controladoras SCSI e ELF/OUT. Inclui ainda diversos módulos e
utilitários para reparar e restaurar discos rígidos.
· Imagens cramdisk baseado no kernel 2.0.33, disponível para máquinas
com 4 e 8 Mb. Incluem emulador matemático e suporte à comunicação
(PPP e programas de discagem, NE2000, 3C509), ou suporte a
dispositivos ZIP paralelos. Estas imagens serão capazes de
inicializar um 386 com 4 Mb de RAM. Suporte a MSDOS está incluso,
podendo-se assim transmitir da Internet para uma partição DOS.
KK..22.. DDiissccooss ddee EEmmeerrggêênncciiaa
Diversos pacotes de criação de discos de emergência estão disponíveis
em sunsite.unc.edu. Com estes pacotes pode-se especificar um conjunto
de arquivos para inclusão e o software automatiza (em vários níveis) a
criação do disco de inicialização. Veja
para
maiores informações. VVeerriiffiiqquuee aass ddaattaass ddooss aarrqquuiivvooss ccuuiiddaaddoossaammeennttee
--- alguns destes pacotes podem estar desatualizados há vários anos e
podem não suportar a criação de sistemas de arquivos raiz compactados
carregados em discos em memória. Até onde conhecemos Yard é o único
pacote que poderá fazer isso.
KK..33.. PPrrooggrraammaass ddee LLoottee ddee GGrraahhaamm CChhaappmmaann
Graham Chapman escreveu um conjunto de programas que podem ser
bastante úteis como exemplos de criação de discos de inicialização. Em
versões anteriores deste tutorial os programas apareciam como um
apêndice, mas foram apagados deste documento e colocados em uma página
web:
Pode ser conveniente o uso destes programas, mas deve-se ler
cuidadosamente as instruções -- por exemplo ao especificar uma área de
troca incorreta, pode-se apagar o sistema de arquivos raiz
definitivamente. Esteja seguro de que esteja bem configurado antes de
usar os programas.
KK..44.. LLIILLOO ------ OO ccaarrrreeggaaddoorr LLiinnuuxx
Escrito por Werner Almesberger. Excelente carregador da
inicialização do sistema, e a documentação inclui informações sobre o
setor de inicialização e os estágios anteriores do processo de carga
de um sistema.
Ftp em
. Está
também disponível no Sunsite e seus diversos sites espelhos.
KK..55.. PPeerrgguunnttaass MMaaiiss FFrreeqqüüeenntteess ee CCoommoo FFaazzeerr
Estão disponíveis em diversos locais. Pode-se verificar os grupos de
notícias da Usenet em news.answers e comp.os.linux.announce.
Perguntas mais freqüentes em
e Como Fazer em
.
Mais documentação sobre o Linux pode ser encontrada em Página do
Projeto de Documentação Linux .
Caso o problema seja seríssimo pode-se enviar uma mensagem em inglês
para mail-server@rtfm.mit.edu com a palavra ``help'' na mensagem.
KK..66.. UUssoo ddoo DDiissccoo eemm MMeemmóórriiaa
Uma excelente descrição de como funciona o novo código de disco em
memória pode ser encontrada com a documentação do kernel do Linux.
Veja em /usr/src/linux/Documentation/ramdisk.txt. Foi escrito por
Paul Gortmaker e inclui uma seção sobre a criação de discos em memória
compactados.
KK..77.. OO pprroocceessssoo ddee iinniicciiaalliizzaaççããoo ddoo LLiinnuuxx
Para maiores detalhes sobre o processo de inicialização do Linux,
seguem algumas indicações:
· O Guia de Administração do Sistema Linux contém uma seção sobre o
processo. Veja em
· Visão Geral do LILO
tem uma visão tecnicamente detalhada e definitiva sobre o processo
de inicialização e como o kernel é carregado.
· O código fonte é o último guia. Abaixo seguem alguns arquivos do
kernel relacionados com o processo de inicialização. Caso se tenha
à disposição os fontes do Linux, que podem ser encontrados em
/usr/src/linux em sistemas Linux; ou alternativamente Shigio
Yamaguchi (shigio@wafu.netgate.net) tem um kernel em hipertexto em
.
aarrcchh//ii338866//bboooott//bboooottsseecctt..SS,,sseettuupp..SS
Contém o código Assembler para o setor de inicialização.
aarrcchh//ii338866//bboooott//ccoommpprreesssseedd//mmiisscc..cc
Contém o código para descompactar o kernel.
aarrcchh//ii338866//kkeerrnneell//
Diretório contendo o código de inicialização do kernel. setup.c
contém a palavra de configuração do disco em memória.
ddrriivveerrss//bblloocckk//rrdd..cc
Contém o arquivo de controle do disco em memória. Os
procedimentos rd_load e rd_load_image carregam os blocos de um
dispositivo em um disco em memória. O procedimento
identify_ramdisk_image determina o tipo do sistema de arquivos
encontrado e se ele é compactado.
LL.. CCóóddiiggooss ddee EErrrrooss ddee IInniicciiaalliizzaaççããoo ddoo LLIILLOO
Questões sobre esses códigos de erros, tem sido freqüentes na Usenet,
sendo que incluímos aqui como um serviço público. Este sumário foi
desenvolvido a partir da Documentação do Usuário LILO de Werner
Almsberger, disponível em
.
Quando o LILO carrega a si próprio, ele apresenta a palavra ``LILO''.
Cada letra é apresentada antes da execução de algum processo, assim
sendo as letras podem ser um indicador do estágio atingido e da origem
do problema.
Nenhuma parte do LILO foi carregada. LILO pode não estar
instalado ou a partição no qual o setor de inicialização está
localizado não está ativa.
LL O primeiro estágio do carregador foi iniciado e executado, mas
não foi possível carregar o segundo estágio. Os códigos de erro
com dois dígitos indicam o tipo de problema (Veja ainda "Códigos
de Erros de Discos"). Esta condição indica normalmente a falha
na mídia ou erro de geometria (por exemplo parâmetros de disco
incorretos).
LLII O primeiro estágio foi capaz de carregar o segundo, mas falhou
na sua execução. Isso pode ser causado por erro de geometria ou
pela movimentação do /boot/boot.b sem a execução do instalador.
LLIILL
O segundo estágio conseguiu ser iniciado, mas não pode carregar
a tabela de descritores do arquivo map. Isso normalmente é
causado por falha na mídia ou erro de geometria.
LLIILL??
O segundo estágio do LILO foi carregado para um endereço
incorreto. Isso é tipicamente causado por erros de geometria ou
pela movimentação do arquivo /boot/boot.b sem a execução do
instalador.
LLIILL--
A tabela de descritores está corrompida. Isso pode ser causado
por erros de geometria ou pela movimentação do arquivo
/boot/boot.b sem a execução do instalador.
LLIILLOO
Todas as partes do LILO foram carregadas.
Caso o BIOS apresente algum erro quando o LILO estiver tentando
carregar uma imagem de inicialização, o respectivo código de erro é
apresentado. Estes códigos variam de 0x00 até 0xbb. Veja o Guia do
Usuário LILO para uma maior explicação sobre este tema.
MM.. LLiissttaass ddee eexxeemmpplloo ddoo ccoonntteeúúddoo ddoo ddiissccoo ddee iinniicciiaalliizzaaççããoo
Aqui está o conteúdo dos disquetes raiz e utilitários de Graham. Estas
listas são apresentadas como um exemplo dos arquivos incluídos em um
sistema funcional. Graham adicionou algumas notas explicativas que
parecem muito úteis.
total 18
drwxr-xr-x 2 root root 1024 Jul 29 21:16 bin/
drwxr-xr-x 2 root root 9216 Jul 28 16:21 dev/
drwxr-xr-x 3 root root 1024 Jul 29 20:25 etc/
drwxr-xr-x 2 root root 1024 Jul 28 19:53 lib/
drwxr-xr-x 2 root root 1024 Jul 24 22:47 mnt/
drwxr-xr-x 2 root root 1024 Jul 24 22:47 proc/
drwxr-xr-x 2 root root 1024 Jul 28 19:07 sbin/
drwxr-xr-x 2 root root 1024 Jul 29 20:57 tmp/
drwxr-xr-x 4 root root 1024 Jul 29 21:35 usr/
drwxr-xr-x 3 root root 1024 Jul 28 19:52 var/
/bin:
total 713
-rwxr-xr-x 1 root bin 7737 Jul 24 22:16 cat*
-rwxr-xr-x 1 root bin 9232 Jul 24 22:48 chmod*
-rwxr-xr-x 1 root bin 8156 Jul 24 22:48 chown*
-rwxr-xr-x 1 root bin 19652 Jul 24 22:48 cp*
-rwxr-xr-x 1 root root 8313 Jul 29 21:16 cut*
-rwxr-xr-x 1 root bin 12136 Jul 24 22:48 dd*
-rwxr-xr-x 1 root bin 9308 Jul 24 22:48 df*
-rwxr-xr-x 1 root root 9036 Jul 29 20:24 dircolors*
-rwxr-xr-x 1 root bin 9064 Jul 24 22:48 du*
-rwxr-x--- 1 root bin 69252 Jul 24 22:51 e2fsck*
-rwxr-xr-x 1 root bin 5361 Jul 24 22:48 echo*
-rwxr-xr-x 1 root bin 5696 Jul 24 22:16 hostname*
-rwxr-xr-x 1 root bin 6596 Jul 24 22:49 kill*
-rwxr-xr-x 1 root bin 10644 Jul 24 22:17 ln*
-rwxr-xr-x 1 root bin 13508 Jul 24 22:17 login*
-rwxr-xr-x 1 root bin 26976 Jul 24 22:17 ls*
-rwxr-xr-x 1 root bin 7416 Jul 24 22:49 mkdir*
-rwxr-x--- 1 root bin 34596 Jul 24 22:51 mke2fs*
-rwxr-xr-x 1 root bin 6712 Jul 24 22:49 mknod*
-rwxr-xr-x 1 root bin 20304 Jul 24 22:17 more*
-rwxr-xr-x 1 root bin 24704 Jul 24 22:17 mount*
-rwxr-xr-x 1 root bin 12464 Jul 24 22:17 mv*
-rwxr-xr-x 1 root bin 20829 Jul 24 22:50 ps*
-rwxr-xr-x 1 root bin 9424 Jul 24 22:50 rm*
-rwxr-xr-x 1 root bin 4344 Jul 24 22:50 rmdir*
-rwxr-xr-x 1 root root 299649 Jul 27 14:12 sh*
-rwxr-xr-x 1 root bin 9853 Jul 24 22:17 su*
-rwxr-xr-x 1 root bin 380 Jul 27 14:12 sync*
-rwxr-xr-x 1 root bin 13620 Jul 24 22:17 umount*
-rwxr-xr-x 1 root root 5013 Jul 29 20:03 uname*
/dev:
total 0
lrwxrwxrwx 1 root root 10 Jul 24 22:34 cdrom -> /dev/sbpcd
crw--w--w- 1 root tty 4, 0 Jul 24 21:49 console
brw-rw---- 1 root floppy 2, 0 Apr 28 1995 fd0
lrwxrwxrwx 1 root root 4 Jul 24 22:34 ftape -> rft0
crw-rw-rw- 1 root sys 10, 2 Jul 18 1994 inportbm
crw-rw---- 1 root kmem 1, 2 Jul 28 16:21 kmem
crw-rw---- 1 root kmem 1, 1 Jul 18 1994 mem
lrwxrwxrwx 1 root root 4 Jul 24 22:34 modem -> cua0
lrwxrwxrwx 1 root root 4 Jul 24 22:34 mouse -> cua1
crw-rw-rw- 1 root sys 1, 3 Jul 18 1994 null
brw-rw---- 1 root disk 1, 1 Jul 18 1994 ram
crw-rw---- 1 root disk 27, 0 Jul 18 1994 rft0
brw-rw---- 1 root disk 25, 0 Jul 19 1994 sbpcd
*** Foram incluídos arquivos de dispositivos para as partições SCSI em uso
*** Caso sejam utilizados discos IDE, deve-se usar /dev/hdxx .
brw-rw---- 1 root disk 8, 0 Apr 29 1995 sda
brw-rw---- 1 root disk 8, 6 Apr 29 1995 sda6
brw-rw---- 1 root disk 8, 7 Apr 29 1995 sda7
brw-rw---- 1 root disk 8, 8 Apr 29 1995 sda8
lrwxrwxrwx 1 root root 7 Jul 28 12:56 systty -> console
*** esta ligação de systty para a console é obrigatória
crw-rw-rw- 1 root tty 5, 0 Jul 18 1994 tty
crw--w--w- 1 root tty 4, 0 Jul 18 1994 tty0
crw--w---- 1 root tty 4, 1 Jul 24 22:33 tty1
crw--w---- 1 root tty 4, 2 Jul 24 22:34 tty2
crw--w--w- 1 root root 4, 3 Jul 24 21:49 tty3
crw--w--w- 1 root root 4, 4 Jul 24 21:49 tty4
crw--w--w- 1 root root 4, 5 Jul 24 21:49 tty5
crw--w--w- 1 root root 4, 6 Jul 24 21:49 tty6
crw-rw-rw- 1 root tty 4, 7 Jul 18 1994 tty7
crw-rw-rw- 1 root tty 4, 8 Jul 18 1994 tty8
crw-rw-rw- 1 root tty 4, 9 Jul 19 1994 tty9
crw-rw-rw- 1 root sys 1, 5 Jul 18 1994 zero
/etc:
total 20
-rw-r--r-- 1 root root 2167 Jul 29 20:25 DIR_COLORS
-rw-r--r-- 1 root root 20 Jul 28 12:37 HOSTNAME
-rw-r--r-- 1 root root 109 Jul 24 22:57 fstab
-rw-r--r-- 1 root root 271 Jul 24 22:21 group
-rw-r--r-- 1 root root 2353 Jul 24 22:27 inittab
-rw-r--r-- 1 root root 0 Jul 29 21:02 issue
-rw-r--r-- 1 root root 2881 Jul 28 19:38 ld.so.cache
*** Diversos erros ocorrem na inicialização se ld.so.cache não está presente,mas
*** esteja seguro que ldconfig está incluído e pode ser executado em rc.x para
*** atualizá-lo.
-rw-r--r-- 1 root root 12 Jul 24 22:22 motd
-rw-r--r-- 1 root root 606 Jul 28 19:25 passwd
-rw-r--r-- 1 root root 1065 Jul 24 22:21 profile
drwxr-xr-x 2 root root 1024 Jul 29 21:01 rc.d/
-rw-r--r-- 1 root root 18 Jul 24 22:21 shells
-rw-r--r-- 1 root root 774 Jul 28 13:43 termcap
-rw-r--r-- 1 root root 126 Jul 28 13:44 ttys
-rw-r--r-- 1 root root 0 Jul 24 22:47 utmp
/etc/rc.d:
total 5
*** Não me importo muito com programas de encerramento do sistema -
*** tudo é executado em um disco em memória, não havendo muitas coisas
*** para finalizar.
-rwxr-xr-x 1 root root 1158 Jul 24 22:23 rc.K*
-rwxr-xr-x 1 root root 1151 Jul 28 19:08 rc.M*
-rwxr-xr-x 1 root root 507 Jul 29 20:25 rc.S*
/lib:
total 588
*** Tenho um sistema ELF, tendo sido incluído o carregador loader ld-linux.so.
*** Caso se esteja ainda utilizando o a.out, então deve-se incluir ld.so.
*** Deve-se usar o comando file para verificar quais bibliotecas devem ser incluídas.
lrwxrwxrwx 1 root root 17 Jul 24 23:36 ld-linux.so.1 -> ld-linux.so.1.7.3*
-rwxr-xr-x 1 root root 20722 Aug 15 1995 ld-linux.so.1.7.3*
lrwxrwxrwx 1 root root 13 Jul 24 23:36 libc.so.5 -> libc.so.5.0.9*
-rwxr-xr-x 1 root root 562683 May 19 1995 libc.so.5.0.9*
*** Deve-se incluir libtermcap
lrwxrwxrwx 1 root root 19 Jul 28 19:53 libtermcap.so.2 -> libtermcap.so.2.0.0*
-rwxr-xr-x 1 root root 11360 May 19 1995 libtermcap.so.2.0.0*
/mnt:
total 0
/proc:
total 0
/sbin:
total 191
*** Utilizo Slackware, o qual usa agetty. Muitos sistemas usam getty.
*** Verifique em /etc/inittab para ver qual o necessário. Note que (a)getty e login
*** são necessários para que se possa fazer algo no sistema.
-rwxr-xr-x 1 root bin 11309 Jul 24 22:54 agetty*
-rwxr-xr-x 1 root bin 5204 Jul 24 22:19 halt*
*** Obrigatório na inicialização do sistema
-rwxr-xr-x 1 root bin 20592 Jul 24 22:19 init*
-rwxr-xr-x 1 root root 86020 Jul 28 19:07 ldconfig*
-rwxr-xr-x 1 root bin 5329 Jul 27 14:10 mkswap*
-rwxr-xr-x 1 root root 5204 Jul 24 22:20 reboot*
-rwxr-xr-x 1 root root 6024 Jul 24 22:20 rdev*
-rwxr-xr-x 1 root bin 12340 Jul 24 22:20 shutdown*
-rwxr-xr-x 1 root root 5029 Jul 24 22:20 swapoff*
-rwxr-xr-x 1 root bin 5029 Jul 24 22:20 swapon*
-rwxr-xr-x 1 root root 20592 Jul 27 18:18 telinit*
-rwxr-xr-x 1 root root 7077 Jul 24 22:20 update*
/tmp:
total 0
/usr:
total 2
drwxr-xr-x 2 root root 1024 Jul 29 21:00 adm/
drwxr-xr-x 2 root root 1024 Jul 29 21:16 lib/
/usr/adm:
total 0
/usr/lib:
total 0
/var:
total 1
*** Muitos problemas ocorreram antes da inclusão do /etc/rc.S
*** para inicializar o /var/run/utmp, mas talvez isso não seja necessário
*** em outros sistemas
drwxr-xr-x 2 root root 1024 Jul 28 19:52 run/
/var/run:
total 0
NN.. LLiissttaass ddee eexxeemmpplloo ddoo ccoonntteeúúddoo ddoo ddiissccoo ddee uuttiilliittáárriiooss
total 579
-rwxr-xr-x 1 root root 42333 Jul 28 19:05 cpio*
-rwxr-xr-x 1 root root 103560 Jul 29 21:31 elvis*
-rwxr-xr-x 1 root root 56401 Jul 28 19:06 find*
-rwxr-xr-x 1 root root 29536 Jul 28 19:04 fdisk*
-rw-r--r-- 1 root root 128254 Jul 28 19:03 ftape.o
-rwxr-xr-x 1 root root 17564 Jul 25 03:21 ftmt*
-rwxr-xr-x 1 root root 64161 Jul 29 20:47 grep*
-rwxr-xr-x 1 root root 45309 Jul 29 20:48 gzip*
-rwxr-xr-x 1 root root 23560 Jul 28 19:04 insmod*
-rwxr-xr-x 1 root root 118 Jul 28 19:04 lsmod*
lrwxrwxrwx 1 root root 5 Jul 28 19:04 mt -> mt-st*
-rwxr-xr-x 1 root root 9573 Jul 28 19:03 mt-st*
lrwxrwxrwx 1 root root 6 Jul 28 19:05 rmmod -> insmod*
-rwxr-xr-x 1 root root 104085 Jul 28 19:05 tar*
lrwxrwxrwx 1 root root 5 Jul 29 21:35 vi -> elvis*