Quando você atualiza o kernel, na verdade você atualiza o pacote do kernel . Na maioria das distribuições Linux, o que isso realmente faz é apenas registrar o pacote em seu gerenciador de pacotes, adicionar os novos módulos em /lib/modules, adicionar o initramfs e o kernel em /boot, e talvez atualizar as entradas do carregador de inicialização e outras atividades diversas. Ele geralmente não substitui o kernel carregado na memória.
Na inicialização, o próprio kernel é carregado na memória. Ou seja, mesmo que o arquivo do qual foi carregado (ex. /boot/vmlinuz) desapareça, ele não é necessário após o carregamento inicial do kernel.
Mesmo que fosse necessário para algo (digamos, informações de depuração) e tenha sido substituído, qualquer pessoa que já tenha um identificador de arquivo aberto ainda poderá usar o arquivo, pois os dados de apoio não serão excluídos até que o inode em questão tem uma contagem de referência de 0 (o kernel em si não precisa dessa referência, pois já está carregado na memória, ao contrário da execução de processos de executáveis do espaço do usuário). Esses blocos normalmente podem ser totalmente liberados do disco, a menos que você esteja executando algum programa de espaço do usuário nesse arquivo. O kernel do Linux não pagina sua própria memória e até se descompacta na inicialização. Não há /proc/.../exeou/proc/.../fdmaneira de acessar o /boot/vmlinuz inicializado — o kernel pode nem mesmo montar o dispositivo do qual foi inicializado em uma situação de inicialização por rede ou USB.
Então, geralmente, o kernel não se atualiza. Isso normalmente é feito na reinicialização ou no kexecmomento. O tipo de coisa que você está descrevendo existe para casos de uso limitados como kpatch , kgraft e ksplice , mas geralmente eles só podem ser usados para patches pequenos e direcionados, não para novos lançamentos de kernel upstream.
Quando você atualiza o kernel, na verdade você atualiza o pacote do kernel . Na maioria das distribuições Linux, o que isso realmente faz é apenas registrar o pacote em seu gerenciador de pacotes, adicionar os novos módulos em
/lib/modules
, adicionar o initramfs e o kernel em/boot
, e talvez atualizar as entradas do carregador de inicialização e outras atividades diversas. Ele geralmente não substitui o kernel carregado na memória.Na inicialização, o próprio kernel é carregado na memória. Ou seja, mesmo que o arquivo do qual foi carregado (ex.
/boot/vmlinuz
) desapareça, ele não é necessário após o carregamento inicial do kernel.Mesmo que fosse necessário para algo (digamos, informações de depuração) e tenha sido substituído, qualquer pessoa que já tenha um identificador de arquivo aberto ainda poderá usar o arquivo, pois os dados de apoio não serão excluídos até que o inode em questão tem uma contagem de referência de 0 (o kernel em si não precisa dessa referência, pois já está carregado na memória, ao contrário da execução de processos de executáveis do espaço do usuário). Esses blocos normalmente podem ser totalmente liberados do disco, a menos que você esteja executando algum programa de espaço do usuário nesse arquivo. O kernel do Linux não pagina sua própria memória e até se descompacta na inicialização. Não há
/proc/.../exe
ou/proc/.../fd
maneira de acessar o /boot/vmlinuz inicializado — o kernel pode nem mesmo montar o dispositivo do qual foi inicializado em uma situação de inicialização por rede ou USB.Então, geralmente, o kernel não se atualiza. Isso normalmente é feito na reinicialização ou no
kexec
momento. O tipo de coisa que você está descrevendo existe para casos de uso limitados como kpatch , kgraft e ksplice , mas geralmente eles só podem ser usados para patches pequenos e direcionados, não para novos lançamentos de kernel upstream.