Como faço para inicializar o Linux com rootfs na RAM?

16

O rootfs é uma imagem squashfs e meu carregador de inicialização está carregando em algum endereço no SDRAM. Quais parâmetros eu preciso passar para o kernel para que ele possa montar os rootfs a partir daí? O suporte ao Squashfs é incorporado e já funciona com

root=/dev/mtdblock2 rootfstype=squashfs  

para inicializar a partir do flash.

EDIT: Este é um dispositivo incorporado baseado em MIPS, usando um gerenciador de inicialização personalizado. Normalmente, o carregador de inicialização extrai o kernel compactado do flash para a SDRAM e, em seguida, monta / dev / mtdblock2 como rootfs. Estou tentando melhorar o gerenciador de inicialização para que ele possa baixar uma imagem em sua RAM e inicializar sem gravar no flash.

Não consigo descobrir como fazer o Linux montar uma imagem do sistema de arquivos na RAM como rootfs.

Atilla Filiz
fonte
Descreva melhor o que você está tentando alcançar, se você já conhece o squashfs funciona. Como você sabe que isso funciona? O que acontece? E o mais importante, o que não funciona da maneira que você deseja?
rozcietrzewiacz
11
Além disso, qual carregador de inicialização o dispositivo usa?
rozcietrzewiacz
Acho que se você usar memdisk (de SYSLINUX) como kernel, ele carrega a imagem inteira na memória e, em seguida, botas dele
Golimar

Respostas:

10

Eu usaria um initramfs. ( http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt )

Muitas distribuições Linux usam um initramfs (para não serem confundidas com um initrd, elas são diferentes) durante o processo de inicialização, principalmente para poder iniciar programas no espaço do usuário muito cedo no processo de inicialização. No entanto, você pode usá-lo para o que quiser.

O benefício de um initramfs sobre um initrd é que um initramfs usa um sistema de arquivos tmpfs enquanto um initrd usa um dispositivo de bloco ram. A principal diferença aqui é que, para um initrd, você deve pré-alocar todo o espaço do sistema de arquivos, mesmo que não utilize todo esse espaço. Portanto, se você não usar o espaço do sistema de arquivos, desperdiçar memória RAM, que em um dispositivo incorporado, geralmente é um recurso escasso. O Tmpfs é um sistema de arquivos que fica sem RAM, mas usa apenas o máximo de RAM atualmente em uso no sistema de arquivos. Portanto, se você excluir um arquivo de um tmpfs, essa ram será liberada imediatamente.

Agora, normalmente, o initramfs é temporário, usado apenas para executar alguns programas extremamente precocemente no processo de inicialização. Após a execução desses programas, o controle é transferido para o sistema de arquivos real em execução em um disco físico. No entanto, você não precisa fazer isso. Não há nada que o impeça de executar o initramfs indefinidamente.

Patrick
fonte
Então, eu realmente tenho tentado configurar um sistema que roda "fora do initramfs indefinidamente". O sistema está instalado na maior parte do tempo, mas tive alguns problemas - estou me perguntando se você pode lançar alguma luz. Pergunta postada aqui
dtmland
0

Eu uso o phramdriver para esse fim: ele emula um dispositivo MTD usando memória física, o que significa que você pode usar exatamente a mesma imagem rootfs para teste / desenvolvimento que posteriormente será gravada no flash real. A mágica necessária na linha de comando do kernel seria algo como

phram.phram=rootfs,0x100000,9Mi root=/dev/mtdblock0 memmap=9M\$100000

Observe que você também precisa do memmapargumento para garantir que o kernel não tente usar essa memória por si só. 9MB é o tamanho dos meus rootfs (ou era). O \ before $ é necessário no meu carregador de inicialização, pode não estar no seu. O endereço que eu escolhi lá é arbitrário, porque não sei como a memória física é distribuída no seu dispositivo, então escolha um que faça sentido para você. Eu suponho que você já usou tftp ou algo para carregar seus rootfs nesse endereço

telent
fonte