A
initramfs é um ramfs no qual um arquivo initramfs é desempacotado antes que o kernel efetue tarefas tais como montar a partição root. Este arquivo pode ser inserido junto com a imagem do kernel, no momento da confecção do mesmo ou como um arquivo separado.
Para nossa initramfs precisamos do busybox. Busybox é um conjunto de utilitários comuns em sistemas UNIX em um único e minúsculo executável. Para usuários de Gentoo:
# mkdir /usr/local/src/build_initramfs
# ROOT="/usr/local/src/build_initramfs/" USE="-pam make-symlinks static" emerge -av busybox
Edite /etc/portage/savedconfig/sys-apps/busybox-<version> e tenha certeza de que a linha CONFIG_BUSYBOX_EXEC_PATH está como abaixo:
CONFIG_BUSYBOX_EXEC_PATH="/bin/busybox"
Senão altere e construa o busybox novamente com a USE savedconfig.
# ROOT="/usr/local/src/build_initramfs/" USE="-pam savedconfig make-symlinks static" emerge -av busybox
# cd /usr/local/src/build_initramfs
# rm -r {etc,usr,lib,lib64,var}
Usuários Debian ou outra distribuição devem baixar as fontes diretamente de
http://www.busybox.net/.
# tar -xjvf busybox-<versão>
# cd busybox-<versão>
# make menuconfig
E selecione as opções conforme:
Vamos gerar um kmap (mapa do teclado):
# dumpkeys > default_keymap
# loadkeys br-abnt2
# /usr/local/src/build_initramfs/bin/busybox dumpkmap > br-abnt2-<ARCH>.bin
Ou, se você compilou as fontes do pacote oficial do busybox:
<caminho para as fontes do busybox>/busybox dumpkmap > br-abnt2-<ARCH>.bin
Como eu uso amd64 no lugar de ARCH inseri amd64 ficando br-abnt2-amd64.bin Se for i386, idem.
# loadkeys default_keymap
O arquivo init do initramfs
Quando você boota seu sistema, o kernel irá extrair o initramfs para o rootfs e verificará se um arquivo chamado "init" existe, e se encontrado o executará. O arquivo init no nosso caso será responsável por decriptar e montar a partição root quando então o resto do processo de boot será assumido pelo init da partição root.
O init constante em
http://gentoo-wiki.com/...Initramfs.27s_init não funciona em versões recentes do busybox. Assim você deve usar meu arquivo atualizado e disponibilizado em:
Preparando a initramfs
Baixe também o arquivo applets:
Se você compilou o busybox com o pacote do site oficial faça o seguinte:
Crie o diretório temporário para a initramfs:
# mkdir /usr/local/src/build_initramfs
E crie os links para o busybox:
# cd /path/to/busybox-<version>
# ./applets/install.sh /usr/local/src/build_initramfs --symlinks
Agora, independente de qual busybox esteja usando faça o seguinte:
Crie os diretórios necessários:
# cd /usr/local/src/build_initramfs
# mkdir {proc,sys,new-root,etc,dev}
Copie o script init:
# cp /path/to/init .
# chmod 755 init
Crie os dispositivos necessários:
# mknod --mode=0660 /usr/local/src/build_initramfs/dev/null c 1 3
# mknod --mode=0600 /usr/local/src/build_initramfs/dev/console c 5 1
Você precisa de um executável estático executável cryptsetup. Pode baixá-lo de:
# cp cryptsetup-<versão>-<arch>-pc-linux-gnu-static /usr/local/src/build_initramfs/sbin/cryptsetup
# chmod u+x /usr/local/src/build_initramfs/sbin/cryptsetup
Você pode incluir um arquivo com uma art ascii para ser apresentado no momento do login, para um visual mais bonito. Salve em /usr/local/src/build_initramfs/etc copie também o kmap que você criou anteriormente e o applets em /usr/local/src/build_initramfs/etc.
Recompilando o kernel
Agora finalmente vamos criar a imagem initramfs diretamente nas fontes do kernel. Tenha certeza de que a fonte do seu kernel esteja em /usr/src/linux.
# rm -iv /usr/src/linux/usr/initramfs_data.cpio.gz
# cd /usr/local/src/build_initramfs
# find . | cpio --quiet -o -H newc | gzip -9 >/usr/src/linux/usr/initramfs_data.cpio.gz
# touch /usr/src/linux/usr/initramfs_data.cpio.gz
Tenha certeza que seu kernel está configurado conforme as opções apresentadas no início. Agora compile mais uma vez:
# mount /boot
# make && make modules modules_install install
Ou para Debian:
# make-kpkg --revision=crypt.1.0 kernel-image
# dpkg -i <novo-pacote-do-kernel>