Não é o kernel que está gerando o initramfs , é cpio . Então, o que você está realmente procurando é uma maneira de construir um arquivo cpio que contenha dispositivos, links simbólicos, etc.
Seu método 2 usa usr/gen_init_cpio
na árvore de código-fonte do kernel para construir o arquivo cpio durante a construção do kernel. Essa é realmente uma boa maneira de construir um arquivo cpio sem ter que preencher o sistema de arquivos local primeiro (o que exigiria que o root criasse todos os dispositivos ou usasse o fakeroot ou um sistema de arquivos FUSE que não tenho certeza se já foi escrito). / p>
Tudo o que você está perdendo é gerar o arquivo de entrada para gen_init_cpio
como uma etapa de compilação. Por exemplo. no shell:
INITRAMFS_SOURCE_DIR=/home/brandon/rascal-initramfs
exec >initramfs_source.txt
echo "dir /bin 755 0 0"
echo "file /bin/busybox $INITRAMFS_SOURCE_DIR/bin/busybox 755 0 0"
for x in sh ls cp …; do echo "slink /bin/$x busybox 777 0 0" done
# etc …
Se você quiser refletir os links simbólicos para o busybox que estão presentes na sua árvore de construção, aqui está uma maneira (suponho que você esteja construindo no Linux):
( cd "$INITRAMFS_SOURCE_DIR/bin" &&
for x in *; do
if [ "$(readlink "$x")" = busybox ]; then
echo "slink /bin/$x busybox 777 0 0"
fi
done )
Aqui está uma maneira de copiar todos os seus links simbólicos:
find "$INITRAMFS_SOURCE_DIR" -type l -printf 'slink %p %l 777 0 0\n'
Para o busybox, talvez sua árvore de construção não tenha os links simbólicos e, em vez disso, você deseja criar um para cada utilitário compilado. A maneira mais simples de pensar é procurar em sua árvore de construção do busybox .*.o.cmd
files: há um por comando gerado.
find /path/to/busybox/build/tree -name '.*.cmd' -exec sh -c '
for x; do
x=${x##*/.}
echo "slink /bin/${x%%.*} busybox 777 0 0"
done
' _ {} +