Você não precisa fazer nada muito complicado. Apenas chame kexec
para inicializar no novo kernel. Não ficou mais simples. ..a menos que seu kernel antigo fosse de alguma forma compilado sem suporte a kexec.
Eu tenho um dispositivo incorporado com um flash conectado à SPI. Basicamente, isso significa que o dispositivo inicializa seu gerenciador de inicialização e o kernel do Linux a partir de uma pequena parte do flash.
À medida que o dispositivo é inicializado, mas antes que o sistema de arquivos raiz seja montado e o switch_root seja chamado - eu gostaria de inicializar opcionalmente um segundo kernel diferente
Isso é possível? Meu objetivo neste caso é ter um gerenciador de inicialização e kernel de ações muito pequenos em flash - mas então colocar um kernel novo / maior em um disco rígido.
Meu gerenciador de inicialização é muito limitado, onde não consigo ler o kernel mais novo do disco rígido.
em suma
a) CPU comes out of reset, reads its bootloader from flash
b) bootloader boots, inits basic hardware, loads Linux kernel from flash
c) kernel boots, inits more hardware, and reads a second kernel from a hard disk
d) I'd like to switch to the second kernel at this point
meu objetivo neste processo é fornecer um mecanismo onde o kernel em flash possa envelhecer com o tempo, mas os kernels atualizados podem ser fornecidos através do disco rígido. Se meu bootloader fosse mais avançado, eu seguiria esse caminho - no entanto, ele não é capaz de inicializar o hardware necessário (o controlador de disco), nem tem suporte moderno ao sistema de arquivos
... uma opção que eu ponderei é se seria possível colocar o segundo kernel na memória física, marcar um endereço conhecido como tendo este segundo kernel, então resetar. O gerenciador de partida poderia então detectar o endereço conhecido e verificar a integridade do segundo kernel, escolhendo-o ao invés de um vindo do Flash
alguma dica seria apreciada!
Você não precisa fazer nada muito complicado. Apenas chame kexec
para inicializar no novo kernel. Não ficou mais simples. ..a menos que seu kernel antigo fosse de alguma forma compilado sem suporte a kexec.
Dê uma olhada no UBOOT, isso funcionou para mim no passado.
Você pode usar isso mesmo para ler sistemas de arquivos, mas deve permitir que você alterne entre várias imagens. Desta forma, você sempre sobrescreve a imagem que não está usando no momento e reconfigura o uboot para iniciar a atualização na reinicialização.