Alguns tópicos úteis sobre como reduzir o tempo de boot

Normal 0 21 false false false PT X-NONE X-NONE
Numa época em que usamos computadores que compõem milhões de flops ao segundo, é um pouco paradoxal dever esperar um vida por o boot da própria máquina: esta problemática é irrelevante se se utiliza o computador como servidor que não somos constrangidos a reiniciar o computador continuamente, mas é sentida pelos utentes de desktops e sobretudo por pessoas que utilizam portáteis (laptops). Neste apontamento procurarei, sem garantias e sem pretensões, fornecer alguns tópicos úteis sobre como reduzir o tempo de boot.

Antes de iniciar gostaria de referir dois pontos: antes de tudo gostaria de dizer que os conselhos seguintes não são exclusivamente farinha do meu saco, foram obtidos em consulta e pesquisa na Internet; gostaria muito de colocar os endereços onde recolhi toda a informação da qual me documentei, mas infelizmente com a pressa do momento não os registei.
Em segundo lugar queria acrescentar que existem outros métodos para aceder num modo mais rápido ao “mesmo” ambiente de trabalho (vejam a suspensão em disco) mas estes apontamentos têm como objectivo a redução de tempo de um boot normal de um computador “normal”.
 
Qualquer comentário, nota, ou correcção é bem aceite.
 
Prosseguimos fornecendo uma panorâmica sobre a modalidade de boot do computador e em particular dos sistemas GNU/Linux.
O primeiro elemento o que entra em acção é a BIOS (Basic Input/Output System), ou seja um programa que reside num chip na placa principal (motherboard), que se ocupa de reconhecer uma parte do hardware (geralmente o processador, os leitores ópticos e discos rígidos).
 
Uma vez terminado o reconhecimento do hardware a BIOS lê a MBR (Master Boot Record) do disco de arranque permitindo assim o carregamento do boot loader, isto é aquele software que permite escolher o sistema operativo para arrancar.
A maior parte das distros Linux permite escolher entre LILO (LInux LOader) e GRUB (GRand Unified Bootloader), a Debian utiliza GRUB por predefinição. O boot loader ocupa-se de carregar o kernel escolhido, na memória RAM. Neste ponto o kernel Linux adquire o controlo e, em Debian inicia init (pacote sysvinit). Init é simplesmente um software que seguindo um elenco mais ou menos ordenado inicia um conjunto de “daemons” entre os quais GDM, KDM ou outros.
Para tal propósito acho que é útil dividir estes apontamentos em 4 partes, cada uma das partes é dedicada a uma fase específica do procedimento do boot.
 
Ponto 1 – Os parâmetros correctos da BIOS
 
Se bem que a maior parte das placas principias (motherboard) estão equipadas com BIOS que permitem personalização mínima, é aconselhável efectuar tudo o que é possível para fazer, de modo que o tempo que vai desde quando ligamos o pc até ao carregamento do boot loader seja reduzido ao máximo.
Se bem que seja aconselhável utilizar a versão mais recente da BIOS, esta é uma operação de alto risco, que pode comprometer o bom funcionamento da motherboard, acho que devo dizer que os HP e TOSHIBA fornecem no próprio site utilitários para “flashare” a BIOS com a última versão disponível. Devo dizer que tais utilitários são desenvolvidos para serem executados sobre o Windows, portanto é uma operação que aconselho a fazer antes de instalar Linux...

Ponto 2 – Configuração do Boot Loader
 
O objectivo deste ponto é reduzir o tempo necessário do GRUB para iniciar o carregamento do kernel. Infelizmente também aqui não temos a possibilidade de fazer a não ser tentar diminuir ao mínimo a interacção do GRUB com o utilizador.
Se de facto iniciamos a nossa máquina sempre com o mesmo kernel e se não temos outros sistemas operativos (dualboot), podemos dizer ao GRUB para não mostrar o ecrã com as listas dos sistemas operativos disponíveis e diminuir a zero a espera que de costume (geralmente são 10”), é dada ao utilizador para escolher o que deve arrancar.
Para tal é preciso proceder à modificação do ficheiro /boot/grub/menu.list definindo para 0 (zero) o item timeout e alterar a linha ##hiddenmenu
 
Ponto 3- Instalar o Kernel certo
 
É inútil dizer que o ideal seria compilar o kernel à mão e, eliminar tudo aquilo che não
necessitamos (Initial RamDisk Image incluído), mas sou da opinião que é uma coisa um bocado “fastidiosa” de fazer.
Para ter uma lista dos kernel disponíveis (naturalmente espero que os repositórios estejam configurados) necessitamos de digitar no terminal:
 
$ apt-cache search –names-only linux-image
 
Para verificar o kernel utilizado:
 
$ uname -r
 
A escolha do kernel dedicado à nossa arquitectura é uma operação que nos consentirá
durante o nosso trabalho de obter melhores prestações, porque o kernel deverá utilizar as instruções máquina especificas para o nosso processador.
No tempo que vai entre o carregamento da parte do GRUB e o inicio do init, o kernel compila as acções predefinidas como o reconhecimento de hardware e outras.
Configurando propriamente o boot loader de modo em que este último passe estes parâmetros de inicio ao kernel, podemos procurar contornar as acções inúteis de utilização que fazemos no nosso pc.
A lista dos parâmetros que é possível passar ao kernel Linux é grande e a tal propósito limito-me a enumerar e explicar aqueles que acho que são úteis. Voltamos a editar o ficheiro /boot/grub/menu.list e modificamos as seguintes linhas:
 
# kopt= root=/dev/hdc1 rootfstype=ext3 mem=1024m ro

# defoptions= quiet noresume

...onde,

root=/dev/hdc1: Indica qual é o disco que contém a partição de root (“/”), este parâmetro não comporta melhoramentos na fase de boot, mas é indispensável ao kernel para iniciar o sistema.

rootfstype=ext3: indica com qual filesystem foi formatada a partição de root, julgo que especificando abertamente o kernel não terá de compreende-lo sozinho.

 mem=1024m: especifica a quantidade de memória disponível; julgo (como disse em cima) que especificando abertamente o kernel não terá de calcular a memória RAM disponível.
 ro: especifica em montar inicialmente a partição de root só em leitura, inútil para as prestações na fase de boot, mas útil para executar o controlo do disco.

quiet: especifica ao kernel de não voltar a trazer a saída de vídeo de todas as suas operações na fase e boot, mas visualizar simplesmente a mensagem “Loading Kernel”, julgo que, talvez em mínima parte, pudesse ser útil diminuir as operações para as impressões sobre o output standard.

noresume: se não se utiliza a suspensão sobre o disco, com “noresume” evitamos que o kernel analise a partição de swap para procurar eventuais sessões hibernadas.

…e depois,

$ update-grub

Ponto 4 – Redução do procedimento de iniciação dos “daemons”.
 
Antes de aprofundar este ponto, aconselho a ler o funcionamento de sysv-init a fim de compreeender as acções que serão efectuadas e o prodecimento do boot em geral.
Aconselho também a instalar bootchart, uma ferramenta que nos permitirá obter informação mais detalhada e sobretudo fazer uma monitorização dos melhoramentos nesta última fase do procedimento do boot.
 
$ apt-get install bootchart bootchart-view
 
Depois editar o ficheiro /boot/gerub/menu.lst e acrescentar o seguinte comando init=/sbin/bootchartd aos parâmetros de boot do nosso kernel.
O bootchart será executado como primeiro processo do kernel e se ocupará pois de iniciar o init e de monitorizar o seu comportamento. Neste momento fazer um reboot do sistema e depois digitar:
 
$ bootchart -f png
 
Este comando permite-nos obter uma imagem em png que conterá o gráfico representante do nosso procedimento de boot.
 
Para desabilitar “daemons” inúteis instalamos o pacote sysv-rc-conf e executamo-lo como root, este utilitário permite-nos gerir os “daemons” iniciados de init durante a fase de boot do sistema. Cada “daemon” representa um serviço que o nosso computador nos forcenerá. Podemos desativar estes (entre outros):
 
- avahi: http://avahi.org/
- exim4: é um MTA, utilizado também in “locale” para enviar ao utilizador root eventos administrativos;
- lpd: deverá ser um “daemon” para a gestão da impressora mas penso que utilizando cups possa fazer o mesmo;
- nfs-common: não utilizando nenhum net-filesystem pode ser desativado;
- policycoreutils: deverá fazer a gestão de políticas de segurança selinux, mas penso para uso doméstico não deveremos ter problemas;
- ssh: no caso cujo esteja activo o “daemon” ssh e não ocorre colocar o pc como remoto podemos desativá-lo;

 
Para outros “daemons” podem dar uma olhada no Google… :-P
 
Desabilitar terminais inutilizados:

Frequentemente num sistema Gnu/Linux é possível usufruir a mais do que um terminal através da combinação das teclas ctrl + alt + f1.
De base Debian tem 6 terminais de texto e um (tty7) onde executará uma janela X, mas dificilmente um utente de um desktop necessitará de 6 terminais. A tal propósito pode ser útil deixar habilitada exclusivamente a consola gráfica e uma de texto, útil para um eventual comando de assistência .
Editamos o ficheiro /etc/inittab e comentamos as seguintes linhas:
 
1:2345:respawn:/sbin/getty 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
 
Paralizar a execusão dos serviços:

Sysvinit inicia um serviço (daemon) só quando o precedente assinala que o seu startup foi obtido com sucesso. Modificando oportunamente o ficheiro de configuração podemos instruir init a fim de que execute os serviços (daemons) directamente sem esperar resposta do daemon precedente.
 
$ echo “CONCURRENCY=shell” >> /etc/default/rcS
 
Substituir Bash por Dash:
Alguns serviços durante a fase de execusão necessitam de ser executados de uma shell; por predifinição a shell utilizada seja para a execusão, como para outros utilizadores é BASH (Bourne Again Shell), é a mais difusa e completa do mundo Linux. Utilizar uma ferramenta tão potente só para fornecer um ambiente de execusão aos serviços é pois contraproducente, pode ser portanto mais indicado instalar e predifinir DASH como shell, uma ferramenta mais modesta e que faz o seu serviço.
 
$ apt-get install dash
$ dpkg-reconfigure dash
 
Neste momento o /bin/sh apontará a /bin/dash com a consequência que esta última será usada em fase de execusão. Esta operação não deverá, de qualquer maneira, reduzir as potencialidades da shell usada pelo utilizador, que verá todos os seus atributos em /etc/passwd.
Definir de modo optimizado os “daemons” de rede:
No arranque o sistema controla o ficheiro /ect/network/interfaces para saber como fazer a gestão do interface de rede, se este não está definido correctamente o sistema no arranque poderá procurar “pedir” os parâmetros de rede para uma hipotética interface de Ethernet desconectada. Como tal poderá ser melhor instruir o sistema a fim de que no arraque configure só a interface de loopback.
Editar o ficheiro /etc/network/interfaces do seguinte modo:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces (5).
# The loopback network interface
auto lo
iface lo inet loopback
#Wired Interface
#
#DHCP(default)
iface eth0 inet dhcp
 
Ordenar a execusão dos serviços (daemons):
Analizando os scripts dos daemons presentes em /etc/init.d temos a noção que sobre o cabeçalho de cada um são especificados, altravés de alguns comentários, as dependências de cada daemon com respeito aos outros. Tais comentários não são interpretados com o init que executa os daemons baseando-se sobre os números inteiros especificados no número do script (ver /etc/rc2.d/ que actua conforme o /etc/inittab).
Acontece portanto que init executa um daemon que faz perder ciclos ao processador, atendendo a execusão do daemon do qual depende.
Existem sistemas alternativos a sysv-init que se baseam sobre dependências dos daemons (initNG) ou sobre eventos por esses gerados (Upstart de Ubuntu) mas a nossa intenção é configurar de modo optimizado sysv-init que é o padrão de facto.
Seria portanto útil analizar as dependências dos daemons e mudar os números inteiros de modo a ordenar a fase de boot, felizmente o utilitário InsServ (http://packages.debian.org/en/lenny/insserv) faz tudo isto no nosso lugar :-).
 
$ apt-get install insserv
$ dpkg-reconfigure insserv

 
Reinicializamos o pc e reanalizamos a saída do bootchar-f png…

 
 

Comentários

Opções de visualização dos comentários

Seleccione a sua forma preferida de visualização de comentários e clique "Gravar configuração" para activar as suas alterações.

Resultados

E que resultados obtiveste com isto?
Podias apresentar uma comparação entre os tempos que tinhas antes e depois de utilizares estas melhorias para sabermos se vale mesmo a pena o esforço.
De qualquer das formas, obrigado pela contribuição! :)

Resultados

Tenho um dualboot.
Para optimizar o boot o ideal será ter só um SO, como digo na introdução, mas digo-te que se obtêm bons resultados comparativos...
 
Cumps,
 

______________________________________
Linux User: #473675 - Ubuntu 8.04 LTS
GPG Key : BFE2CAD9
FingerPrint Key:4590126F186B20D3D35
E2FEF92684829BFE2CAD9