Você sabe a diferença entre Kernel Space e User Space em sistemas Linux? Em tempos a onde Docker, containers e aplicações servless baseadas em Linux estão em alta, é muito importante entender essa diferença.
O conteúdo desse artigo também está no formato de vídeo no nosso canal do YouTube:
Distro Linux Roda em Cima de um Kernel Linux 😱
A grosso modo uma distribuição Linux é uma coleção de programas utilitários, geralmente incluído nestes um gerenciador de pacotes, que rodam em cima de um Kernel Linux. É o Kernel Linux que é responsável pelo gerenciamento de memória, gerenciamento de processos, tempo de processador, gerenciamentos de I/O e etc. O kernel é o cara que tem acesso ao hardware.
Analisando rapidamente essa descrição já conseguimos dividir uma distribuição Linux em duas partes: os programas utilitários e o Kernel Linux. Essa divisão é definida na literatura técnica com algumas nomes, User Space, ou User Mode, para o isolamento onde rodam os programas utilitários e Kernel Space, ou Kernel Mode, para o modo de execução e isolamento privilegiado do Kernel Linux.
Kernel Space e User Space
É o Kernel, e somente o Kernel, que tem acesso e sabe conversar com o hardware por modos de execução privilegiada. Processadores modernos tem modos de execução que ajudam a isolar o Kernel Space do User Space, não vou me aprofundar nisso agora, talvez seja assunto para outro artigo.
O que precisamo saber é que as aplicações utilitárias rodam isoladas em modo não privilegiado e quando precisam de recursos de hardware, e isso geralmente fica transparente com o uso de bibliotecas, conversam com o Kernel através de syscalls para realizar suas tarefas.
Rodando Diferentes “User Spaces” com o Mesmo Kernel
Vamos agora testar essa diferença na prática com um Raspberry Pi 3B. Eu tenho um SDCard onde originalmente gravei um Raspbian :
Mas como podemos ver na tela acima criei outra partição, além das partições boot e rootfs padrão do Raspbian, onde eu adicionei o rootfs da última versão do Ubuntu 19.10.
Com esse SDCard podemos utilizar o Raspbian ou o Ubuntu. Por padrão o Raspberry Pi durante o boot espera ter a partição rootfs e vai inicializar o Raspbian normalmente, mesmo tendo uma outra partição com o Ubuntu:
Isso está definido no arquivo cmdline.txt da partição boot:
Esse cmdline.txt tem os argumentos de inicialização que o bootloader passa pro Kernel Linux. Entre esses argumentos está o partição do rootfs que o Kernel deve montar e usar para iniciar o init do User space. O argumento:
Então se modificarmos esse argumento root= dentro do cmdline.txt para a partição do Ubuntu:
e reinicializarmos a Raspberry Pi. Agora o bootloader vai passar a partição do Ubuntu para o Kernel montar e inicializar o User space, lembre-se o mesmo Kernel da imagem do Raspbian. E pronto temos o Ubuntu rodando com o mesmo Kernel do Raspbian sem problemas:
Eu não vou entrar nos detalhes do processo de boot da Raspberry Pi porque eu já expliquei bem detalhado aqui nesse vídeo:
Conclusão
Uma distro Linux é o conjunto de Kernel Space e User Space. Então quando vamos rodar um Ubuntu, Debian, Manjaro, Deepin, Red Hat ou qualquer outra distro Linux a maior diferença está em como o User space é projetado: quais serviços rodam, ambiente gráfico, versões das bibliotecas, gerenciador de pacotes e etc. O Kernel Linux geralmente é o mesmo. Ok, talvez uma ou outra distro utilize versões diferentes do Kernel. Mas geralmente o Kernel Linux mantem uma compatibilidade muito boa entre versões e você consegue rodar todas essas distros com um mesmo Kernel stable sem maiores problemas.