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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.