Acelerando o boot do Slackware 12.1

Ok, eu disse que não iria mais postar tantos tutoriais, mas estava aqui testando algumas coisas para tentar fazer meu celular funcionar no Linux, então fui dar um reboot porque estava fazendos uns testes com o live-cd do Ubuntu. geralmente quando coloco meu computador para iniciar no inicio do dia, vou fazer algumas outras coisas, como abrir a janela, ligar a TV (sim, eu não consigo ficar o PC sem a TV ligada) e outras coisas. Com isso, toda vez que chego no computador, é só colocar a senha e iniciar o KDE. Eu já sabia que demorava um pouco para iniciar, mas como eu nao precisava esperar o boot, nunca me preocupei em dar uma acelerada no boot. Pois então, eu estava em um momento inspirado, e realmente estava achando que meu celular iria finalmente funcionar (só achei mesmo) no Linux. E eu naquele nervosismo tive que esperar o sistema todo iniciar após sair do Ubuntu. Aí que eu vi… Cacete que porcaria demorada! Bom, dei uma olhada lá e vi que maioria da demora eram coisas desnecessárias… HotPlug (sim, ele é desnecessário e você vai ver isso), ScanLuns e etc. Também algumas coisas bem demoradas que poderiam ser “aceleradas”, como o LDConfig. Então eu resolvi tirar essas coisas do boot, e achar algo mais rápido que as substituíssem. Realmente eu não tenho nada para fazer as 6 da manhã, mas não é que deu certo? Então, vamos lá! D

Ok, a primeira coisa a se fazer é iniciar o sistema com todos os scripts de detecção de hardware ativados, do modo mais demorado mesmo. Como você pode ver, o HotPlug é demorado pra caramba! E o que ele faz? Bom, ele simplesmente detecta o hardware do computador. Mas você não troca de hardware todo dia, então seria isso realmente necessário? Não! Simplesmente o que pode ser feito é o seguinte: carregar apenas os modulos que ele detecta na inicialização. Não entendeu? Então abra o terminal como root, e digite:

lsmod

Você vai ver uma lista de modulos, como aqui:

nvidia               3784044   6
slamrmo               127972   0 (unused)
slmdm                1075040   0 [slamrmo]
printer                 7520   0 (unused)
ipt_state                504   4
iptable_filter          1644   1
ip_conntrack_irc        2768   0 (unused)
ip_conntrack_ftp        3568   0 (unused)
ipt_REJECT              3096   1
iptable_nat            16838   0 (unused)
iptable_mangle          2072   0 (unused)
ip_conntrack           17764   2 [ipt_state ip_conntrack_irc ip_conntrack_ftp iptable_nat]
ip_tables              12096   7 [ipt_state iptable_filter ipt_REJECT iptable_nat iptable_mangle]
serport                 1256   0 (unused)
serio                    956   0 [serport]
analog                  7552   0 (unused)
pcigame                 1352   0 (unused)
joydev                  5568   0 (unused)
input                   3104   0 [analog joydev]
usb-ohci               18856   0 (unused)
usb-storage            63520   0 (unused)
usbcore                56812   0 [printer usb-ohci usb-storage]
snd-pcm-oss            28928   0 (unused)
snd-mixer-oss          11928   0 [snd-pcm-oss]
snd-seq-oss            23104   0 (unused)
snd-seq-midi-event      3208   0 [snd-seq-oss]
snd-seq                33552   2 [snd-seq-oss snd-seq-midi-event]
snd-trident            22596   1
gameport                1388   0 [analog pcigame snd-trident]
snd-util-mem            1152   0 [snd-trident]
snd-ac97-codec         68160   0 [snd-trident]
snd-pcm                52804   1 [snd-pcm-oss snd-trident snd-ac97-codec]
snd-timer              13168   0 [snd-seq snd-pcm]
snd-mpu401-uart         3120   0 [snd-trident]
snd-rawmidi            12224   0 [snd-mpu401-uart]
snd-seq-device          3716   0 [snd-seq-oss snd-seq snd-trident snd-rawmidi]
snd                    34304   0 [snd-pcm-oss snd-mixer-oss snd-seq-oss snd-seq-midi-event snd-seq snd-trident snd-util-mem snd-ac97-codec snd-pcm snd-timer snd-mpu401-uart snd-rawmidi snd-seq-device]
snd-page-alloc          4980   0 [snd-mixer-oss snd-seq-oss snd-seq snd-trident snd-pcm snd-timer snd-rawmidi snd-seq-device snd]
soundcore               3300   6 [snd]
isa-pnp                29328   0 (unused)
sis900                 12556   0 (unused)
crc32                   2880   0 [sis900]
pcmcia_core            39492   0
ide-scsi                9392   0
agpgart                45092   0

A lista no meu computador é enorme, talvez no seu não seja. Alguns modulos aí não são adicionados pelo HotPlug, eu que coloquei para serem carregados na inicialização, como os modulos relativos ao joystick. Bom, agora você já sabe tudo que o HotPlug demora um tempão detectando no boot, ou seja, agora não é mais necessário detectar nada, você ja sabe tudo que deve ser carregado, simple não? Agora vem a parte mais trabalhosa. Abra um editor de textos (como qualquer usuário, no precisa ser como root) e cole a saída do lsmod. Você também pode fazer isso com:

lsmod >> arquivo.txt

Após isso, apague todos os numeros e etc, deixe apenas uma lista com o nome dos modulos, como aqui:

nvidia
slamrmo
slmdm
printer
ipt_state
iptable_filter
ip_conntrack_irc
ip_conntrack_ftp
ipt_REJECT
iptable_nat
iptable_mangle
ip_conntrack
ip_tables
serport
serio
analog
pcigame
joydev
input
usb-ohci
usb-storage
usbcore

(...)

Eu dei uma reduzida no exemplo, mas você deve fazer isso com todas as linhas do lsmod. Após isso, cole um “modprobe” na frente do nome de cada módulo. Você simplesmente pode deixar todos os modulos na mesma linha, e usar apenas um modprobe, mas fazendo um de cada vez é mais facil de achar erros no script que será criado. Erros? Sim, Erros. Como você pode ver no lsmod, alguns módulos dependem de outros, isso significa que certos modulos devem ser carregados antes dos outros, se não você receberá uma mensagem de erro e nada será carregado. Essa ordem você pode ver no próprio lsmod, apenas veja quais os módulos que tem mais dependencia, e vá organizando-os. Separe os modulos de som, os de video e etc, e então organize quais de som devem ser carregados antes, depois os de video e assim vai indo. A maneira com que eu organizei pode ser vista a seguir:

modprobe sis900
modprobe crc32
modprobe pcmcia_core
modprobe ide-scsi
modprobe isa-pnp

modprobe soundcore
modprobe snd
modprobe snd-seq-device
modprobe snd-page-alloc
modprobe snd-trident
modprobe snd-seq
modprobe snd-pcm
modprobe snd-util-mem
modprobe snd-ac97-codec
modprobe snd-timer
modprobe snd-seq-oss
modprobe snd-pcm-oss
modprobe snd-mixer-oss

modprobe usbcore
modprobe usb-storage
modprobe usb-ohci

modprobe input
modprobe gameport
modprobe joydev
modprobe pcigame
modprobe analog
modprobe ns558

modprobe serio
modprobe serport

modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_mangle
modprobe iptable_nat
modprobe ipt_REJECT
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe iptable_filter
modprobe ipt_state

modprobe printer

modprobe slmdm country=BRAZIL
modprobe slamrmo

modprobe agpgart
modprobe nvidia

Agora que está tudo organizado, você pode colocar uma mensagem para que você saiba quando os modulos forem carregados no boot. Para isso, use o echo. Se você digitar no terminal:

echo "Away!"

Você verá que aparecerá a palavra “Away!”. O echo serve para isso, para colocar textos na saida do terminal. Então, você pode colocar alguns textos avisando o que está sendo carregado. Para isso faça como abaixo:

echo "Iniciando modulos..."
modprobe sis900
modprobe crc32
modprobe pcmcia_core
modprobe ide-scsi
modprobe isa-pnp

echo "Iniciando modulos de som..."
modprobe soundcore
modprobe snd
modprobe snd-seq-device
modprobe snd-page-alloc
modprobe snd-trident
modprobe snd-seq
modprobe snd-pcm
modprobe snd-util-mem
modprobe snd-ac97-codec
modprobe snd-timer
modprobe snd-seq-oss
modprobe snd-pcm-oss
modprobe snd-mixer-oss

echo "Iniciando modulos USB..."
modprobe usbcore
modprobe usb-storage
modprobe usb-ohci

echo "Iniciando modulos de joystick..."
modprobe input
modprobe gameport
modprobe joydev
modprobe pcigame
modprobe analog
modprobe ns558

echo "Iniciando modulos de I/O serial..."
modprobe serio
modprobe serport

echo "Iniciando modulos do IP-Tables..."
modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_mangle
modprobe iptable_nat
modprobe ipt_REJECT
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe iptable_filter
modprobe ipt_state

echo "Iniciando modulos de impressora..."
modprobe printer

echo "Iniciando modulos do modem..."
modprobe slmdm
modprobe slamrmo country=BRAZIL

echo "Iniciando modulos do video..."
modprobe agpgart
modprobe nvidia

Caso você saiba os códigos para colorir os textos, você pode usá-los no script, para que fique mais bonitinho. Bom, como o boot do meu Slackware é todo preto e branco mesmo, eu não vou colocar corzinhas abichornadas. Agora, que o script está pronto, você já pode desativar o HotPlug. Abra um terminal como root e digite PKGTOOL, selecione setup, marque a opção hotplug. Após isso responda NO e saia do PKGTOOL. Você também pode apenas tirar a permissão de execução do /etc/rc.d/rc.hotplug:

chmod -x /etc/rc.d/rc.hotplug

Agora você pode desativar mais algumas coisas que demoram no boot. Aqui além do HotPlug, uma que coisa que me encomodava muito era o ScanLuns. Não sei pra que server aquele script, só sei que era bem lerdo e a única coisa que aparentemente fazia era detectar dispositivos USB (pelo menos ele mostrava uma mensagem que tinha detectado um dispositivo de armazenamento USB), mas eu não preciso disso, afinal meu MP3 Player tem que ser montado se qualquer jeito. Então eu desativei ele, e você também pode desativá-lo, fazendo isso:

chmod -x /etc/rc.d/rc.scanluns

Você já deve ter percebido que os scripts de inicialização ficam todos no /etc/rc.d/ certo? Então, agora nós vamos editar um arquivo por lá. Abra um editor de textos como root, e abra o arquivo /etc/rc.d/rc.M . Este é o arquivo de inicialização do sistema. QUALQUER CAGADA NELE E SEU SISTEMA PODE NÃO INICIAR MAIS, portanto, tenha cuidado. Nele que nós vamos fazer algumas coisas que farão toda a diferença. A primeira, nós vamos colar nele aquele script que criamos anteriormente. Mas não cole em qualquer lugar, ele deve ser colado antes que alguma coisa precise dos modulos, e depois da parte em que os modulos já podem ser carregados. Para isso, eu resolvi colar ele imediatamente antes da inicialização do HotPlug, na linha 83. O arquivo fica assim:

(...)

echo "Iniciando modulos variados (ok, eu nao sei pra que servem...)"
modprobe sis900
modprobe crc32
modprobe pcmcia_core
modprobe ide-scsi
modprobe isa-pnp

echo "Iniciando modulos de som..."
modprobe soundcore
modprobe snd
modprobe snd-seq-device
modprobe snd-page-alloc
modprobe snd-trident
modprobe snd-seq
modprobe snd-pcm
modprobe snd-util-mem
modprobe snd-ac97-codec
modprobe snd-timer
modprobe snd-seq-oss
modprobe snd-pcm-oss
modprobe snd-mixer-oss

echo "Iniciando modulos USB..."
modprobe usbcore
modprobe usb-storage
modprobe usb-ohci

echo "Iniciando modulos de joystick..."
modprobe input
modprobe gameport
modprobe joydev
modprobe pcigame
modprobe analog

echo "Iniciando modulos de I/O serial..."
modprobe serio
modprobe serport

echo "Iniciando modulos do IP-Tables..."
modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_mangle
modprobe iptable_nat
modprobe ipt_REJECT
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe iptable_filter
modprobe ipt_state

echo "Iniciando modulos de impressora..."
modprobe printer

echo "Iniciando modulos do modem..."
modprobe slmdm country=BRAZIL
modprobe slamrmo

echo "Iniciando modulos do video..."
modprobe agpgart
modprobe nvidia

echo "Ativando swap..."
swapon /dev/hda2

# Initialize the hotplugging subsystem for Cardbus, IEEE1394, PCI, and
# USB devices.  On a 2.4.x kernel this will run the old hotplug system
# started with /etc/rc.d/rc.hotplug.  On a newer kernel, hotplugging
# will be handled by udev.  If you run a 2.6+ kernel, don't shut off
# udev unless you also don't want hotplugging support.

(...)

Ok, estamos quase lá. D Agora, use a ferramenta de procura do seu editor de textos para procurar o bloco de código que inicia o LDConfig. O Código em questão é esse:

# Update all the shared library links:
if [ -x /sbin/ldconfig ]; then
  echo "Updating shared library links:  /sbin/ldconfig"
  /sbin/ldconfig
fi

Bom, esta parte pode ser controversa para alguns. Você tem 3 opções: Simplesmente desativar o LDConfig, não desativar o LDConfig ou então, fazer o que eu fiz. Bom, o LDConfig atrasa a inicialização porque enquanto ele está sendo executado, nada mais acontece, ele faz a parte dele e só depois que ele termina o boot continua. Então, porque ao invés disso, ele nao vai fazendo o trabalho dele enquanto o resto vai iniciando? Muito mais lógico, não? Caso ache esta a melhor opção, coloque um “&” após o “/sbin/ldconfig”, ficando o código assim:

# Update all the shared library links:
if [ -x /sbin/ldconfig ]; then
  echo "Updating shared library links:  /sbin/ldconfig"
  /sbin/ldconfig &
fi

Agora, que vem a parte controversa. Alguns podem achar inútil isso, pois mesmo que o boot continue, ele vai continuar bem mais lento até que o LDConfig termine. Já que o LDConfig exige um uso intenso do processador, tudo que for acontecer enquanto ele está sendo executado obviamente ficará mais lento. E em sistemas que ele demora mais para terminar, o X irá iniciar, e o LDConfig poderá continar executando, deixando as vezes com que o carregamento do gerenciador de janelas fique mais lento. No meu caso quando eu digito a senha e aperto enter ele acaba, e o carregamento do KDE continua normalmente. Se você usa um WM mais leve, isto também não irá encomodar. A pricipal vantagem é de quem tem um processador com SMP (Symmetric Multi-Processing), ou seja, com mais de um núcleo (como um Intel Core Duo) ou com HT (Hyper Threading). Caso o módulo para o SMP esteja carregado ou então seja built-in no kernel, esta parte do LDConfig irá representar uma economia de tempo substancial. Caso queira simplesmente desativar o LDConfig (que irá acelerar mais ainda o boot), simplesmente comente todas as linhas da inicialização do LDConfig, ficando assim o código:

# Update all the shared library links:
#if [ -x /sbin/ldconfig ]; then
#  echo "Updating shared library links:  /sbin/ldconfig"
#  /sbin/ldconfig
#fi

Assim ele não inicia mais, e não deixa mais seu boot lerdo. Mas também não irá mais atualizar o cache fazer os links necessários para as bibliotecas do sistema. Então toda vez que você instalar uma biblioteca que não tem o LDConfig por padrão no instalador, você terá que fazer isso na mão mesmo, porque no boot isso não irá mais acontecer. Para evitar maiores problemas eu deixo isso tudo ativado mesmo.
É isso, com essas modificações, meu boot que demorava em média vergonhosos 2 minutos passou a demorar apenas 36 segundos, legal não? Isso é super útil para quem precisa ficar reiniciado o pc muitas vezes para mudar de sistema operacional por exemplo. Caso tenha um computador rápido que faz o boot em poucos segundos, faça isso e deixe o boot mais rápido ainda. Não esqueça, este tutorial é focado para Slackware e distribuições baseadas nele, pois no Slackware a estrutura dos diretórios de inicialização é diferente das outras distribuições.

Complemento adicional: D

Após postar o artigo no fórum Slacklife, recebi algumas dicas interessantes do user teo e resolvi editar o post para complementar o texto.
Primeiramente, há uma maneira mais rápida de se acrescentar os módulos à inicialização do sistema. Para isso, basta adicionar o nome dos módulos ao arquivo /etc/rc.modules (o qual me esqueci completamente enquanto escrevia o artigo), e eles serão automaticamente carregados. Além disso, tem uma maneira de se evitar toda a mão de obra na hora de adicionar os nomes ao arquivo. Para isso, basta usar o seguinte script no bash:

for i in `lsmod | grep -v Module | cut -d' ' -f1`; do echo /sbin/modprobe $i >> /etc/rc.d/rc.modules; done

Ainda assim é necessária a verificação da ordem do carregamento dos módulos, mas já corta a parte mais chata do tutorial. Caso você adicione o carregamento dos módulos no /etc/rc.d/rc.modules, não é necessário criar o código para carregar os módulos no /etc/rc.d/rc.M, se não ele irá carregar cada modulo duas vezes (não que esteja errado, mas aí o objetivo do tutorial acaba sendo desvirtuado).
Também pode-se acelerar ainda mais o boot, desativando o fc-cache na inicialização. O fc-cache simplesmente atualiza o cache das fontes do sistema, coisa que só é necessária quando você instala novas fontes no seu servidor gráfico. Para desativá-lo faça o seguinte: abra o arquivo /etc/rc.d/rc.M (o mesmo que foi editado anteriormente), e localize o seguinte bloco de código:

# Update the X font indexes:
if [ -x /usr/X11R6/bin/fc-cache ]; then
  echo "Updating X font indexes:  /usr/X11R6/bin/fc-cache"
  /usr/X11R6/bin/fc-cache
fi

Para desativá-lo, comente-o colocando um “#” na frente de cada linha:

# Update the X font indexes:
#if [ -x /usr/X11R6/bin/fc-cache ]; then
#  echo "Updating X font indexes:  /usr/X11R6/bin/fc-cache"
#  /usr/X11R6/bin/fc-cache
#fi

Quanto aos módulos do kernel estarem built-in, tem uma explicação mais clara aqui, então deletei a parte do texto que falava sobre os módulos built-in, pois a informação não estava 100% correta (o boot acelerava, mas o sistema poderia perder desempenho).

Agora sim está tudo esclarecido, falowz!

FONTE:

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s