%--------------------------------------------------------------------
%%\chapter{Boots And Shutdowns}
\chapter{Iniciando e encerrando o sistema}
\label{ch:boothalt}
%--------------------------------------------------------------------

        \begin{chapterquote}
Start me up \\
Ah\dots you've got to\dots you've got to \\
Never, never never stop \\
Start it up \\
Ah\dots start it up, never, never, never \\
\ You make a grown man cry, \\
\ \ you make a grown man cry \\
(Rolling Stones) \\
% \ \\
% These boots are made for walking, \\
% and that's what they're gonna do. \\
% One of these days, these boots \\
% are gonna walk all over you. \\
        \end{chapterquote}

\index{Windows 95|see{crying}}
\index{crying}

        \noindent
	Esta seção explica o que acontece quando o  \linux\ é inicializado ou
	desligado, e como isto pode ser feito adequadamente. Caso os procedimentos
	adequados não sejam seguidos, arquivos podem se corrompidos ou
	perdidos. 
	
%%\section{An overview of boots and shutdowns}
\section{Uma visão geral da inicialização e encerramento do sistema}

%	it all by themselves.} is called \defin{booting}.  The name
%	comes from an image of the computer pulling itself up from its
%	bootstraps, but the act itself slightly more realistic.

	O ato de ligar o computador e carregar\footnote{Nos primeiros computadores,
	não bastava simplesmente ligar o computador, os operadores tinham que 
	manualmente colocar o sistema operacional na máquina. Estas novas 
	maravilhas que temos hoje fazem isso por si só.} o sistema operacional é 
	chamado \defin{booting} (inicialização). O nome vem da imagem do computador
	levantando-se, mas o ato em si mesmo é um pouco mais realista.
	%% ??? melhorar bootstraps
	                                                                     
\index{inicialização}
\index{iniciando o computador}

	Durante a inicialização, o computador carrega inicialmente uma pequena 
	porção de código chamado de \defin{bootstrap loader}
	\footnote{\defin{autocarregador}}, o qual carrega e inicia 
	o sistema operacional. O bootstrap loader é 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 de código a ser carregada deve ser muito pequena 
	(poucas centenas de bytes), evitando-se a necessidade de fabricação de 
	firmwares muito complicados.    
\index{bootstrap loader}

	Diferentes computadores implementam inicializações diferentes.
	Para PCs, o computador (a BIOS) lê o primeiro setor (chamado 
	\defin{setor de inicialização}) do disquete ou do disco rígido. 
	O bootstrap loader esté neste setor. Ele carrega o sistema operacional, 
	onde quer que ele esteja no disco (ou em qualquer outro local onde ele 
	esteja).        
\index{setor de boot}

	Após a carga do \linux, este inicializa o hardware e os controladores de
	dispositivos. É executado o processo \cmd{init}, o qual inicia os demais 
	processos que permitem o acesso aos usuários e a execução de seus programas.
	Os detalhes desta fase serão discutidas a seguir.

	No encerramento do sistema, todos os processos recebem o aviso para 
	terminarem suas atividades (isso faz com que os arquivos sejam fechados e 
	todos os procedimentos necessários sejam tomados pelos programas); os 
	sistemas de arquivos e áreas de swap são desmontados e finalmente uma 
	mensagem é 
	apresentada na console, sinalizando que o computador pode ser desligado.
	Caso o procedimento correto não seja seguido,
	coisas muito desagradáveis podem e {\em vão} ocorrer; mais importante,
	o buffer cache do sistema de arquivos pode não ter sido descarregado, o 
	que significa que todos os dados nele serão perdidos e o sistema de 
	arquivos estará inconsistente e possivelmente instável.
\index{cache do buffer}
\index{perda de dados}

%%\section{The boot process in closer look}
\section{O processo de inicialização em maiores detalhes}
\label{sec:boot-closeup}

	Pode-se inicializar o \linux\ a partir de um disquete ou do disco rígido. A
	seção de instalação do Guia de Instalação e Introdução ao Linux
	(\cite{getting-started}) 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\footnote{Isto é chamado de 
	\defin{autoteste}}, chamando então o boot. Ela escolherá um dispositivo de
	disco (tipicamente o primeiro acionador de disquetes ou o primeiro disco
	rígido, se houver um instalado; a ordem porém pode ser configurada) e lerá 
	o primeiro setor do dispositivo.
	Este é chamado de \defin{setor de inicialização}\footnote{\defin{boot 
	sector}}, e no caso de discos rígidos é também chamado de \defin{master boot
	record}, uma vez que um disco rígido pode conter diversas partições, cada 
	qual com o seus próprios setores de inicialização.           
%% ??? verificar os index...
\index{BIOS}
\index{registro mestre de inicialização}
\index{MBR}
\index{partition boot record}
\index{boot record!mestre|see{MBR}}
\index{disco de boot!partição|see{partition boot record}}

	O setor de inicialização contém um pequeno programa, (pequeno o suficiente 
	para estar contido 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
	boot 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 inicializar o sistema a partir de um 
	disco que contenha um sistema de arquivos utilizando-se o 
	LILO\footnote{LInux LOader}.     
\index{inicializando!através de um disquete}
\index{disquete!inicializando de|see{inicializando}}

	Ao ser inicializado 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 MBR),
	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 de inicialização de um 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
	problema, mas o mais comum é utilizar o LILO (os detalhes sobre como
	fazer isso são irrelevantes neste momento, para maiores informações 
	verifique a documentação do LILO).       
\index{inicializando!através de um disco rígido}
\index{disco rígido!inicializando|see{inicializando}}
\index{tabela de partição}
\index{partição ativa}
\index{LILO}

	Quando o sistema é iniciado utilizando o LILO, ele inicializa o padrão. 
	É possível configurar o LILO para iniciar diversos kernels, ou mesmo 
	iniciar outros sistemas diferentes do \linux, sendo possível usá-lo para 
	escolher qual sistema ou kernel utilizar na hora da inicialização do 
	sistema. Para tanto basta pressionar \key{alt}, \key{shift} ou \key{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 \defin{argumentos ao kernel},
	imediatamente após o nome do sistema operacional.       

	Note 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.   


	Inicializar o sistema a partir de disquete ou um disco rígido tem suas
	vantagens e desvantagens, 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 se instalar 
	o sistema 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 inicialização 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:

    \begin{itemize}

    \item
	O kernel é 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.
\index{kernel compactado}
\index{compactação do kernel}

    \item
	Caso se esteja utilizando uma placa de vídeo Super VGA que o \linux\ 
	reconheça e que tenha modos de texto especiais (como utilizar
	100 colunas por 40 linhas), o \linux\ pode perguntar que  modo se deseja 
	utilizar.
	Durante a compilação do kernel, é possível pré-definir um modo de vídeo
	então
	essa pergunta nunca será apresentada. Isso pode ser feito também através
	do LILO ou do comando \cmd{rdev}. 
\index{placa de vídeo}
\index{configuração do kernel}
\index{modo de video}
\index{modo texto}

    \item
	Após, o kernel verifica os demais hardwares (discos rígidos, disquetes,
	placas de rede\ldots) e configura os seus controladores de dispositivos.
	Neste meio tempo, diversas mensagens são apresentadas, como por exemplo:
\index{configuração de hardware}
\index{configuração de controladores de dispositivos}
\index{mensagens de inicialização}
\index{inicializando!mensagens}
%%%%%%%%

		\begin{screen}\begin{verbatim}
LILO boot:
Loading linux....
Memory: sized by int13 088h
Console: 16 point font, 400 scans
Console: colour VGA+ 80x25, 1 virtual console (max 63)
pcibios_init : BIOS32 Service Directory structure at 0x000f8630
pcibios_init : BIOS32 Service Directory entry at 0xf8080
pcibios_init : PCI BIOS revision 2.10 entry at 0xf80b0
Probing PCI hardware.
Calibrating delay loop.. ok - 66.56 BogoMIPS
Memory: 63136k/65536k available (740k kernel code, 384k reserved, 1276k data)
Swansea University Computer Society NET3.035 for Linux 2.0
NET3: Unix domain sockets 0.13 for Linux NET3.035.
Swansea University Computer Society TCP/IP for NET3.034
IP Protocols: IGMP, ICMP, UDP, TCP
VFS: Diskquotas version dquot_5.6.0 initialized
Checking 386/387 coupling... Ok, fpu using exception 16 error reporting.
Checking 'hlt' instruction... Ok.
Intel Pentium with F0 0F bug - workaround enabled.
alias mapping IDT readonly ...  ... done
Linux version 2.0.36 (root@frajola.conectiva.com.br) (gcc version 2.7.2.3) #2 se
g set 7 11:54:18 EST 1998
		\end{verbatim}\end{screen}
%%%%%%%%
	O texto exato difere em diversos sistemas, dependendo do
	hardware disponível, assim como da versão do Linux e de como ele foi
	configurado.  

   \item
	%% ??? there isn't much it can do, anyway).

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

	O sistema de arquivos raiz é normalmente montado com permissões somente
	de leitura
	(isto pode ser configurado também com o \cmd{rdev}).  É possível, desta
	maneira, checar o sistema de arquivos enquanto ele está montado, 
	porém não é uma boa idéia tentar fazer isso em sistemas de arquivos montados
	com permissão de escrita/leitura.
\index{read-only root filesystem}
\index{sistema de arquivos raiz somente para leitura}
\index{checando um sistema de arquivos}
\index{fsck}

    \item
	Após isso, o kernel executará o programa \cmd{init} (localizado em 
	\fn{/sbin/init}) em segundo plano\footnote{background}. O \cmd{init} 
	sempre terá o número de processo igual a 1. O \cmd{init} cuida da ativação 
	de diversos serviços. O que ele fará exatamente depende
	de como está configurado; veja o capítulo~\ref{ch:init} para maiores
	informações. No mínimo ele iniciará alguns servidores essenciais.   
\index{servidores!inicializando}

    \item
	O \cmd{init} então passará o sistema para o modo multiusuário e iniciará o 
	\cmd{getty}, permitindo o uso de consoles virtuais e linhas seriais. 
	O \cmd{getty} é o programa que permite que os usuários acessem o sistema.
	O \cmd{init} pode também inicializar outros programas, dependendo de
	como esteja configurado. 
\index{console virtual}
\index{console}
\index{terminal}
\index{terminal serial}

    \item
	Após estes passos o sistema estará ativo e pronto para uso.    
    \end{itemize}

%%\section{More about shutdowns}
\section{Mais informações sobre o encerramento do sistema}

	É importante seguir corretamente os passos quando encerrar o sistema.
	Caso este procedimento não seja cumprido, seus sistemas de arquivos 
	provavelmente estarão prejudicados e os arquivos poderão ficar bagunçados.
	Isto acontece porque o \linux\ tem um cache de disco que não grava os dados 
	no disco no momento que isto é solicitado, mas somente em intervalos de 
	tempo.  A performance do sistema aumenta consideravelmente, mas isso também 
	pode causar a perda de dados caso você simplesmente desligue seu computador.
\index{encerrando o sistema}
\index{buffer cache}
\index{cache}
\index{cache de disco}

	Outra razão contra desligar simplesmente o sistema é que em um
	sistema multitarefa existem diversas coisas acontecendo em segundo
	plano, e desligar o computador neste momento pode ser desastroso.
	Usando o procedimento correto para o encerramento do sistema, você 
	garante que todos os processos em background podem salvar seus dados.
\index{processos em background!e encerramento do sistema}
\index{processos em segundo plano!e encerramento do sistema}


	Para encerrar corretamente um sistema \linux, utilize o comando
	\cmd{shutdown}. Ele é usado normalmente de duas maneiras.
\index{shutdown!usando}

	Caso esteja utilizando um sistema onde você é o único usuário,
	a maneira correta de se utilizar o \cmd{shutdown} é sair de todos os 
	programas que porventura você esteja rodando, sair de todas as consoles
	do sistema, acessar uma das consoles como \texttt{root} (ou permanecer
	no sistema como \texttt{root} mudando o diretório corrente para o diretório
	pessoal do root para não ter problemas na desmontagem de sistemas de 
	arquivos); executar o comando \texttt{shutdown~-h~now}\index{shutdown}
	(substitua o \texttt{now} por um \texttt{+} e um número em minutos caso
	você queira postergar o shutdown).


	Alternativamente, se o seu sistema tem diversos usuários, use o comando
	\texttt{shutdown~-h~\textsl{+tempo mensagem}}, onde \textsl{tempo} é
	o tempo em minutos até o sistema ser parado, e \textsl{mensagem}
	é a mensagem que será enviada aos usuários que estão conectados neste
	momento ao sistema.
		%
\begin{tscreen}
\# shutdown -h +10 'Iremos instalar um novo disco.  O sistema deverá \\
> voltar ao normal em três horas.' \\
\#
\end{tscreen}
		%
	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 
	\cmd{xterm}s:  
		%
\begin{tscreen}
Broadcast message from root (ttyp0) Wed Aug  2 01:03:25 1995... \\
\ \\
Iremos instalar um novo disco.  O sistema deverá \\
voltar ao normal em três horas. \\
The system is going DOWN for system halt in 10 minutes !!
\end{tscreen}
		%
	Este aviso é automaticamente repetido algumas vezes antes do
	encerramento, e a intervalos cada vez menores, à medida que o tempo passa.
\index{shutdown!mensagens}

	Quando o encerramento 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, servidores são encerrados, 
	e finalmente o sistemas de arquivos raiz é desmontado. Quando
	isso ocorre o processo \cmd{init} apresenta uma mensagem indicando que o 
	computador pode ser desligado. Agora, {\em e jamais antes disso}, pode-se 
	desligar o equipamento.        
\index{shutdown!ações}

	Algumas vezes, apesar de ser raro em bons sistemas, é impossível
	encerrar o sistema de forma adequada. Por exemplo, caso ocorra um erro
	fatal com o kernel, pode ser impossível executar qualquer novo comando,
	tornando o encerramento correto inviável. Tudo o que se pode fazer neste 
	caso é 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.
\index{pane}
\index{pane de sistema}
\index{shutdown!emergências}
\index{erro no shutdown|see{shutdown, emergências}}
\index{machado}
\index{buffer cache}

	Alguns usuários gostam de utilizar o comando \cmd{sync}\footnote{o
	\cmd{sync} descarrega os buffers do sistema} três vezes, aguardando
	pela gravação do buffer em disco, e desligando o equipamento em seguida. 
	Caso não haja programas sendo executados, esse procedimento equivale ao 
	\cmd{shutdown}.  Ainda assim nenhum sistema de arquivos é desmontado o que 
	pode gerar problemas com o indicador de limpeza do sistema de arquivos do 
	tipo ext2fs.  Este método não é recomendado.
\index{shutdown!sync triplo}

	(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).

%%\section{Rebooting}
\section{Reiniciando o sistema}

	Reinicializar\footnote{Também conhecido como \texttt{rebootar}} significa 
	iniciar o sistema novamente. Isto pode ser conseguido encerrando o sistema,
	desligando o computador e então ligando-o novamente. Um método mais prático
	para ter o mesmo efeito consiste em executar o \cmd{shutdown} com a opção
	de reinicialização. Isto é conseguido executando-se \texttt{shutdown -r now}, sendo
	que a opção \texttt{-r} significa `reinicialização'.
\index{reboot}
\index{reinicializando}
	
	A maioria dos sistemas \linux\ executa \texttt{shutdown -t3 -r now}
	\footnote{ou alguma variante} quando o conjunto de teclas ctrl-alt-del
	são pressionadas. Este procedimento reinicializa o sistema. A ação
	do ctrl-alt-del é configurável e poderá ser desejável aguardar alguns 
	minutos para a sua execução em uma máquina multiusuário. Sistemas que 
	são fisicamente acessíveis a qualquer pessoa, devem ser configurados 
	para não executar nada ao ser pressionadas tais teclas. Isto pode ser
	feito editando-se o arquivo \fn{/etc/inittab} e comentando-se
	\footnote{com o caracter \# no início da linha} a linha respectiva.
\index{ctrl-alt-del}
\index{init!e ctrl-alt-del}

%%\section{Single user mode}
\section{Modo monousuário}

	O comando \cmd{shutdown} também pode ser usado para colocar o sistema em 
	modo monousuário, no qual ninguém pode acessar o sistema, além do 
	superusuário \texttt{root}. Isso é muito útil para 
	tarefas de administração que não podem ser executadas caso o sistema 
	esteja sendo executado normalmente. 
%%	O modo monousuário é discutido no capítulo~\ref{chap:daemons}.
\index{modo monousuário}
\index{init!modo monousuário}

%%\section{Emergency boot floppies}
\section{Disquetes de emergência}

	Nem sempre pode ser possível inicializar o sistema a partir do disco
	rígido. Um erro 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, isso pode significar inicializar o
	sistema a partir do acionador de disquetes.
\index{inicializando!através do disquete de emergência}
\index{unidade de disquetes}

	Muitas distribuições permitem a criação de \defin{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 deseja restaurar alguns arquivos a partir de cópias de segurança feitos
	através de softwares não presentes nos discos de instalação.    
\index{backups}
\index{discos de instalação}
\index{discos de emergência!usando}

	Pode ser necessário criar um disquete de inicialização personalizado. O 
	\emph{Bootdisk HOWTO} de Graham Chapman (\cite{bootdisk-howto}) contém as
	instruções de como se fazer isso. Mas lembre-se de manter os disquetes de 
	emergência e de boot atualizados. 
\index{HOWTO!Bootdisk}
\index{discos de emergência!gerando}

	Não se pode utilizar a unidade de disquetes utilizada para montar o
	disquete de boot 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 de boot 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.
\index{ramdisk}
