Vamos agora construir a imagem do
initrd, ou seja, do disco em memória que utilizaremos para:
Carregar o suporte (módulos) necessários no kernel para suportar o pendrive e seu sistema de arquivos.
Montar a partição do pendrive como root durante o boot.
Vá para o diretório /boot (cd /boot); ele é o diretório padrão no qual o comando mkinitrd irá criar duas coisas:
- O diretório initrd-tree, contendo a árvore de diretórios, utilitários, dispositivos e scripts necessários ao processo, e que posteriormente serão comprimidos na forma da imagem do futuro disco em memória;
- O arquivo initrd.gz, que é a imagem do ramdisk propriamente dita.
ATENÇÃO: Se já houver um diretório initrd-tree, assim como um arquivo initrd.gz no /boot, renomeie-os temporariamente, pois pode ser que eles sejam necessários à inicialização de seu sistema; assim por exemplo:
# mv initrd-tree initrd-tree.bkp
# mv initrd.gz initrd.gz.bkp
Isso evitará que sejam indevidamente sobrescritos.
LEMBRE-SE: Após concluir a criação do disquete de boot (próxima seção), mova o arquivo initrd.gz (novo) e o diretório initrd-tree (novo), com o comando mv, do diretório /boot para outro diretório (como por exemplo, o diretório /opt/boot-pen criado anteriormente durante a configuração do Kernel), e renomeie novamente os arquivos acima para seus nomes originais (initrd.gz e initrd-tree), pois caso contrário sua máquina pode ficar impedida de reinicializar corretamente.
Agora entre com um dos seguintes comandos:
Máquinas com chipset VIA ou INTEL:
# mkinitrd -k X.Y.Z -m jbd:ext3:usbcore:usb-uhci:usb-storage -f ext3 -r /dev/sda1
Máquinas com chipset Compaq, OPTi, SiS, ALi:
# mkinitrd -k X.Y.Z -m jbd:ext3:usbcore:usb-ohci:usb-storage -f ext3 -r /dev/sda1
(Obs.: X.Y.Z é a versão de seu Kernel, p. ex. 2.4.31)
O que esta linha de comando faz:
- -k X.Y.Z : Irá buscar no diretório /lib/modules os módulos referentes ao kernel utilizado (p.ex. 2.4.31);
- -m jbd:ext3:usbcore:usb-uhci(ou ohci):usb-storage : especifica quais módulos serão utilizados no initrd;
- -f ext3 : especifica que o sistema de arquivos da partição root no pendrive é (no caso) ext3;
- -r /dev/sda1 : especifica que a partição a ser montada como root é (no caso) /dev/sda1
Observe que os parâmetros destas opções podem variar, uma vez que:
- -k : o kernel utilizado pode ser outro (p.ex. 2.4.22 etc.);
- -m : os módulos referentes ao sistema de arquivos (no caso jbd e ext3) poderão ser outros, conforme foi realizada a formatação do pendrive; neste caso deverá ser verificado quais os módulos necessários para suportar o sistema de arquivos utilizado; conforme especificado acima, os módulos usb-uhci ou usb-ohci também poderão variar, dependendo do chipset da placa-mãe. Se o chipset for diferente dos especificados acima, deverá ser consultada a documentação do kernel para determinar qual o módulo correto a ser utilizado. Os únicos módulos que sempre serão utilizados serão usbcore e usb-storage, pelo menos no caso do kernel série 2.4.
- -r : se o particionamento e formatação do pendrive for realizada corretamente, será sempre utilizada a partição /dev/sda1, entretanto se o pendrive não for particionado e/ou formatado, poderá ocorrer do sistema atribuir outra partição, como por exemplo /dev/sda4 etc. Neste caso, a mesma deverá ser utilizada como parâmetro para esta opção. Para evitar maiores complicações, recomendamos fortemente o particionamento e formatação do pendrive da forma descrita anteriormente.
Isso feito, deverão ser gerados no diretório /boot o diretório initrd-tree e o arquivo initrd.gz (novos).
Fazendo as modificações necessárias
Vá para o diretório initrd-tree:
# cd initrd-tree
Atenção: a partir deste momento, estando no diretório initrd-tree, os arquivos e diretórios a serem modificados deverão ser especificados, conforme abaixo, SEM a barra precedente ( / ), pois eles não se encontram imediatamente abaixo do diretório root, e sim do diretório initrd-tree.
São eles:
- load_kernel_modules : script com comandos que carregarão os módulos no Kernel;
- dev : diretório onde estarão os arquivos especiais de dispositivos para montagem no boot;
- rootdev : especifica qual será o dispositivo onde se encontra a partição root (no caso, /dev/sda1);
- rootfs : especifica qual é o sistema de arquivos da partição root (no caso, ext3);
- lib/modules/X.Y.Z : diretório onde estão os módulos a serem carregados no Kernel durante o boot.
Liste o conteúdo do initrd-tree, que deverá ser o seguinte, ou similar:
# ls
bin/ dev/ etc/ lib/ linuxrc* load_kernel_modules* mnt/ proc/ rootdev rootfs
Modifique o arquivo load_kernel_modules, da seguinte forma:
# echo "sleep 5" >> load_kernel_modules
(Atenção para usar DOIS sinais de maior ( >> ), caso contrário o arquivo será apagado e você terá que rodar novamente o comando mkinitrd, no diretório /boot, para gerar novamente o initrd-tree e o arquivo load_kernel_modules)
Este comando ("sleep 5") é necessário para dar tempo ao Kernel de carregar todos os módulos, localizar o pendrive e a partição root, sem o que não conseguirá montá-la.
Verifique o conteúdo do arquivo que deverá ser similar ao seguinte:
# cat load_kernel_modules
# This is a script used to load the kernel modules.
# To use it, chmod it 755, and then add the insmod
# lines needed to load your modules, like this:
insmod /lib/modules/$(uname -r)/jbd.o
insmod /lib/modules/$(uname -r)/ext3.o
insmod /lib/modules/$(uname -r)/usbcore.o
insmod /lib/modules/$(uname -r)/usb-uhci.o
insmod /lib/modules/$(uname -r)/usb-storage.o
sleep 5 #==============================> (você acrescentou esta linha)
Vá agora para o diretório dev/ (atenção mais uma vez: NÃO É o /dev, e sim o dev do initrd-tree), criando os arquivos especiais de dispositivo sda e sda1:
# cd dev/
# mknod -m 666 sda b 8 0
# mknod -m 666 sda1 b 8 1
Verifique agora o novo conteúdo do diretório, que deverá ser similar ao seguinte:
# ls
console hda hda1 hda2 hda3 null ram sda sda1 systty tty1 tty2 tty3 tty4
A seguir verifique os conteúdos dos seguintes arquivos, e do diretório lib/modules/X.Y.Z, que deverão ser também similares aos seguintes:
# cat rootdev
/dev/sda1
# cat rootfs
ext3
# ls lib/modules/X.Y.Z (p. ex. 2.4.31)
ext3.o jbd.o usb-storage.o usb-uhci.o usbcore.o
Agora será necessário gerar um novo arquivo initrd.gz contemplando estas modificações.
Vá para o diretório /boot e entre com o seguinte comando, sem nenhum parâmetro ou opção:
# mkinitrd
O novo arquivo initrd.gz está agora pronto para ser copiado para o disquete.