alternar entre diferentes versões do kernel sem reinicializar

11

Eu quero alternar entre versões diferentes do kernel instaladas no meu sistema sem reiniciar.

Isto é, se eu tiver o ' 3.0.0-16-generickernel atualmente em execução e o kernel mais antigo 3.0.0-14-generictambém estiver lá, talvez seja possível alternar para 3.0.0-14-generic(o outro kernel) sem reiniciar.

(Preciso fazer depuração ao vivo do kernel e fazer alterações para que não seja possível reiniciar)

codificador
fonte

Respostas:

8

Não há como trocar dois Kernels completos. Tenho certeza que você pode entender o significado de um kernel monolítico como o Linux e por que isso impossibilita a substituição.

O mais próximo que você pode chegar é de um processo de patch ao vivo usando o Ksplice . Ele converte as atualizações do Kernel em calços mágicos que podem obstruir um Kernel em execução, permitindo que você mantenha o computador indefinidamente sem precisar de uma reinicialização. Para seus propósitos, ele também permite reverter as alterações.

É gratuito para as edições do Ubuntu Desktop, para que você possa brincar com ele, mas precisa pagar uma assinatura por servidores (onde esse tipo de coisa é mais necessário).


Acabei de ver sua edição. O Ksplice provavelmente não ajudará se você estiver hackeando manualmente e construindo seus próprios Kernels para depuração, pois "o serviço" é que eles fornecem atualizações especiais e não são algo que você pode gerar sozinho.

Se você está apenas construindo coisas contra um kernel oficial, ele ainda pode funcionar.


Mais uma ideia: virtualização. Você pode criar seu novo kernel e trocar as coisas na sua VM e reiniciar. Ainda vai demorar o tempo necessário para reiniciar, mas você pode tornar a VM muito mais leve que a sua máquina de desenvolvimento (baseie-a no Ubuntu Server, largue o servidor X se não precisar, etc.).

Oli
fonte
1
mas eu quero alternar entre dois kernels diferentes no meu diretório / boot
codificador
1
Sim, você não poderá alternar arbitrariamente entre dois kernels. Adicionei outra edição com outra ideia que pode funcionar para você.
Oli
2

Como Oli mencionou, sua melhor chance é provavelmente virtualização.

Dito isso, se você estiver mexendo no hardware, a virtualização pode não ser o ideal para você; nesse caso, você pode usar kexecpara trocar o kernel em execução sem uma reinicialização completa.

Retirado da página do ArchWikikexec :

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
kexec -e

Observe que o descrito acima ainda reiniciará todos os serviços , incluindo o sistema init, o servidor de exibição, a rede etc. No entanto, se você usar um sistema init rápido o suficiente systemd, poderá iniciar o novo kernel em 2 a 3 segundos, pois você está ignorando o BIOS / UEFI e o carregador de inicialização.


Uma descrição semelhante pode ser encontrada na página Wiki do RapidReboot Ubuntu .

Attila O.
fonte
0

Eu acho que essas respostas precisam ser atualizadas.

kpatch agora , o que é mais do que nativo ksplice et al.

Porém, ele não pode alterar as estruturas de dados no kernel, por razões óbvias, por isso é útil principalmente para hotpatches de segurança.

O problema geral sempre é: Os processos em execução ainda mantêm as estruturas de dados do kernel, esperando que as funções do kernel os esperem e os devolvam. E sem que esses processos sejam feitos para isso, não é realmente possível saber se é esse o caso. Portanto, você não pode alterá-los até que todos os processos que os usem sejam reiniciados. Exigiria o patch ao vivo de todos esses programas também.
E eu nem mencionei mudanças de driver, quando o hardware está em um estado especial. (O mesmo problema do kexec .)

Evi1M4chine
fonte