Como remover o systemd do Ubuntu

No universo do Linux e do software livre, nada faz mais sentido do que ter liberdade de escolha.
No seu computador, só deve rodar software que você aprove.
O principal objetivo do software livre é dar ao usuário o controle sobre o que está rodando no seu hardware.
Se você, qualquer que seja o motivo, prefere o seu GNU/Linux sem o systemd, pode optar por usar uma das várias distribuições que vêm sem ele, ou removê-lo e instalar um outro init system para você.
O procedimento descrito é fácil e, de certa forma, muito simples. Por outro lado, ele pode deixar o seu sistema parcialmente inoperante — o que vai te obrigar a fazer alguns ajustes na linha de comando, depois.
Os comandos foram testados em uma instalação Ubuntu 16.04 LTS.
Siga em frente, por sua própria conta e risco.
Se tiver dúvidas, siga os links, no decorrer do texto ou na sessão de referências.

Instale o novo init system

Você não pode ficar sem um init system.
No nosso exemplo, vamos instalar o upstart — um init system mais atual do que o tradicional sysV e que concorre com o systemd.
Todos os comandos, que seguem, precisam de privilégios administrativos. É recomendado se autenticar como root.
Para instalar o upstart, rode o seguinte comando:

apt install upstart-sysv sysvinit-utils

Faça algumas configurações:

cp /usr/share/sysvinit/inittab /etc/inittab
update-initramfs -u

E reinicie o sistema:

shutdown -r now

Após iniciar o sistema, remova o systemd e seus arquivos de configuração:

apt purge systemd systemd:i386

Procedimentos complementares

O Debian e o Ubuntu estão se movendo rapidamente na direção da adoção do systemd.
Para evitar que o sistema continue tentando reinstalar pacotes relacionados ao systemd, rode a seguinte série de comandos:

echo -e 'Package: systemd\nPin: release *\nPin-Priority: -1' > /etc/apt/preferences.d/systemd
echo -e '\n\nPackage: *systemd*\nPin: release *\nPin-Priority: -1' >> /etc/apt/preferences.d/systemd
echo -e '\nPackage: systemd:amd64\nPin: release *\nPin-Priority: -1' >> /etc/apt/preferences.d/systemd
echo -e '\nPackage: systemd:i386\nPin: release *\nPin-Priority: -1' >> /etc/apt/preferences.d/systemd

Referências

http://askubuntu.com/questions/779640/how-to-remove-systemd-from-ubuntu-16-04-and-prevent-its-usage.
http://www.serverlab.ca/tutorials/linux/administration-linux/removing-systemd-from-ubuntu-15-2/.
https://www.howtoinstall.co/en/ubuntu/xenial/systemd?action=removehttps://www.howtoinstall.co/en/ubuntu/xenial/systemd?action=remove.

Alternativas ao systemd

O systemd é mais um sistema init disponível para sistemas operacionais GNU/LINUX.
Diferente de outros, este é exclusivo de sistemas operacionais Unix-like que usam o kernel Linux.
Se você clicar na tag systemd, vai encontrar vários posts, neste site, sobre o assunto — inclusive um que fala muito mal dele (que coisa feia, Elias…) 😉
ssytemd emot carrousel
Neste texto, vamos abordar o conceito do init system, quais são as opções deste tipo de software e, por fim, conhecer algumas distribuições Linux que usam alternativas ao systemd — não vai dar pra falar de todas, por que são mais de 70.

O que é um init system

Em sistemas operacionais Unix-like, o init é o primeiro processo iniciado, durante a inicialização do sistema.
Init é abreviatura da palavra initialization.
É o ancestral direto ou indireto de todos os processos rodando no seu sistema, neste momento.
Ele adota todos os processos órfãos automaticamente.
O init é iniciado pelo kernel usando nome de arquivo hard-coded.
A principal causa do kernel panic é quando o init não pode ser carregado. Ele é tipicamente identificado como o PID 1.
O systemd é mais do que apenas um sistema init. Enquanto uns avaliam este fato como uma evolução do conceito, outras apontam nele um de seus maiores defeitos.

Alternativas ao systemd

Várias alternativas ao systemd estão disponíveis para uso da comunidade.
Segue uma relação (atual e relevante) de init systems, para Linux:

  • Bootscripts — comumente usado no GoboLinux
  • Initng — é um substituto atual para o UNIX System V init e para o Sysvinit (usado no Linux), escrito em C e lançado em 2005.
    Nas implementações tradicionais do init, processos são iniciados em ordem pre-determinada. Além disto, um processo só será iniciado, depois que o anterior estiver finalizado.
    O Initng inicia processos assim que suas dependências forem satisfeitas. Foi projetado para iniciar vários processos em paralelo e melhorar a velocidade de boot dos sistemas.
  • runit — Esquema init com supervisão de serviços. Concebido como substituto do SysVinit e outros projetos.
  • minit — Um init mínimo com supervisão de processos, ordenação de dependências de serviços, ativação de serviços paralelos etc.

Você vai encontrar mais itens na página do Wikipedia — fique atento para o fato de que alguns projetos estão mortos.

Distribuições Linux que usam outros init systems

Como disse, no começo, são muitas dezenas de opções. E ter opções, no mundo do software livre é importante.
Não vai dar para citar todas, contudo sugiro visitar o site without-systemd para ver uma relação mais completa.
O Distrowatch também tem uma relação de distribuições Linux que não usam o systemd.
Na lista, abaixo, separei uma relação de distribuições livres do systemd, que se destacam por diversos motivos:

  1. FreeBSD, OpenBSD etc — Os BSD não são Linux e não existe compatibilidade entre o systemd e estas distros — embora seja possível usá-los com o kernel Linux.
    O site tem vários posts sobre BSD, caso você se interesse.
  2. Slackware — no momento, a distro não aderiu ao systemd, mas não existe nenhum comprometimento do Patrick Volkerding no sentido de se manter distante deste sistema. Para quem gosta do Slackware, vale experimentar o Porteus — http://www.porteus.org/.
    Este projeto tem o comprometimento de seguir sem o systemd.
  3. Devuan — este é o projeto Debian, tocado por ex-integrantes que não concordaram com a mudança para o systemd. Veja mais no site http://devuan.org. Experimente também o Finnix, o Overclockix, o Trios, o Debian GNU/Hurd e o Debian KFreeBSD. Estes 2 últimos são opções para puristas e vale a pena conhecer.
  4. Tails — este é um projeto derivado do Debian e voltado para oferecer mais criptografia e segurança, com mais conforto para o usuário.
    Temos alguns textos, no site, mencionando este projeto.
  5. UbuntuBSD — como o nome indica, é baseado no Ubuntu e usa o núcleo do FreeBSD. Em vez do Unity, usa o ambiente gráfico XFCE. Também é uma opção interessante. Dá uma olhada no site oficial da distro: https://www.ubuntubsd.org/.
  6. Alpine Linux — Distro independente, de propósito genérico e projetada para power users.
    usea OpenRC como init systemhttp://www.alpinelinux.org/.
  7. Gentoo — Uma das distribuições mais conhecidas, que não se rendeu ao systemd — https://www.gentoo.org/.
  8. ReactOS — Tal como o Gentoo, trata-se de uma distro Linux, já estabelecida e com uma comunidade formada ao seu redor — https://www.reactos.org/.

Conhece alguma outra distro livre do systemd, que você gostaria de recomendar? Escreva nos comentários!

Referências

https://en.wikipedia.org/wiki/Init.
https://distrowatch.com/search.php?pkg=systemd&distrorange=NotInLatest#pkgsearch.
http://without-systemd.org/wiki/index.php/Main_Page#GNU.2FLinux_distributions.

Como verificar o init system instalado no meu sistema

Esta é uma pergunta que pode ser um pouco difícil de responder — dada a característica difusa deste tipo de software.
No sistema operacional Debian, que vem fazendo a transição desde a versão 7.0 Wheezy – e a deve concluir no 9.0 Stretch – a resposta pode não ser fácil.
Mesmo em outros sistemas operacionais, pode ser difícil obter respostas definitivas a este questionamento.
screenshot google search

Este post pode não trazer respostas prontas para a pergunta, mas pode ajudar a investigar e, caso não resolva muita coisa para você, pelo menos espero ter sido útil sob de vista de aumentar o seu conhecimento sobre o sistema.

Como a maioria dos softwares, no Linux, é possível saber seu nome e versão, executando o binário acompanhado da opção ‘–version’.
No Debian 9, existe o init e o systemd. Mas só o último vai retornar algum valor interessante:

/sbin/init --version
/sbin/init: unrecognized option '--version'

Isto acontece por que este init é um link (atalho) para o systemd. Veja a prova:

ls -lah /sbin/init 
lrwxrwxrwx 1 root root 20 Jul  8 08:04 /sbin/init -> /lib/systemd/systemd

Já que ficou claro, que temos o systemd instalado, veja como obter sua versão:

systemd --version
systemd 230
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

Como é possível observar, no meu sistema, o systemd instalado é a versão 230.
Parte da confusão, pode ser causada por este processo de transição atual. Muitos programas ainda dependem de chamar o “init” — e, por isso, pelo menos o nome tem que estar presente.
Use o comando ps, para determinar o aplicativo com o PID 1:

ps aux | head -n 5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 203156  7716 ?        Ss   07:10   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    07:10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    07:10   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   07:10   0:00 [kworker/0:0H]

Você pode obter o mesmo resultado no FreeBSD — e ambos os sistemas, tradicionalmente, usam inits bem diferentes:

ps -p 1
PID TT  STAT    TIME COMMAND
  1  -  ILs  0:00.48 /sbin/init --

A maior dificuldade é que você já precisa saber de antemão qual o sistema init usado, para saber onde encontrar o seu binário e, só então, inquirir sobre sua versão.
Mas é possível investigar o seu sistema para conseguir determinar uma quantidade maior de informações a este respeito.

Verifique no /proc

O sistema de arquivos /proc pode ter esta resposta.
Já escrevemos sobre como obter informações do sistema através do /proc, caso você queira se aprofundar mais no assunto.
A maneira de inquirir sobre o init, por este método, funciona assim:

sudo stat /proc/1/exe 
[sudo] senha para justincase: 

E olhe o resultado, na primeira linha:

  File: '/proc/1/exe' -> '/lib/systemd/systemd'
  Size: 0         	Blocks: 0          IO Block: 1024   ligação simbólica
Device: 4h/4d	Inode: 137028      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-08-12 10:44:18.292096235 -0300
Modify: 2016-08-12 10:44:18.256095478 -0300
Change: 2016-08-12 10:44:18.256095478 -0300
 Birth: -

Como vimos, até agora, a presença do /sbin/init ou do /etc/init.d, não é indicativo suficiente para determinar qual o sistema usado — uma vez que sempre estará presente para manter compatibilidades, mesmo que seja apenas como um link.
Vamos abordar a questão de forma diferente. Nos tópicos, que seguem, vamos procurar especificamente pelos (mais usados) systemd, upstart, System 5 e o OpenRC.

Como detectar o System 5 init

No Debian, uma das formas de detectar (ironicamente) a ausência do System 5 init é estabelecer a ausência do /etc/inittab.
Observe, contudo que este é um efeito colateral da metodologia Debian de empacotar coisas como o /etc/inittab.
Mesmo que você desinstale o System 5 init, o /etc/inittab vai continuar aí, no seu sistema.
Ou seja, se o arquivo de configuração estiver aí, significa que o System 5 init está ou já esteve presente.

Como detectar o systemd

Além do método descrito, lá em cima, é possível detectar se ele está ativo no sistema através da existência do /run/systemd/system. Trata-se de um diretório, dentro do /run, usado pelo próprio systemd e criado na inicialização.

ls /run/systemd/
ask-password   generator.late  initctl   netif    seats     system
cgroups-agent  inaccessible    journal   notify   sessions  transient
generator      inhibit         machines  private  shutdown  users

screenshot ls systemd run
Esta checagem pode ser falha, caso você tenha o uselessd instalado — uma vez que ele cria os mesmos arquivos.

Como detectar o nosh

O system-manager ou gestor de sistemas do nosh, cria um diretório /run/system-manager, o que pode ser insuficiente para determinar que é ele mesmo quem está instalado no seu sistema.
Adicione a isto características que dificultam sua detecção:

  • o projeto do gestor de sistemas do nosh não prevê a criação de pipes ou soquetes no sistema de arquivos. Além disto, não tem uma API RPC.
  • Seu gestor de serviços, convencionalmente, tem uma soquete de API em /run/service-manager/control. Mas o que pode confundir você é que ele pode ser executado sob outro gestor de sistemas. Nesta situação, as informações podem levar conclusões equivocadas.

Como detectar o upstart

O initctl do upstart faz sua própria chamada de API sobre o D-Bus e a verificação oficial consiste em determinar se é possível rodar o initctl e se sua saída contém a string “upstart” em algum ponto (use o comando grep para encontrá-la).
Mas tal como no systemd:

  • Não há garantia de que a API irá permanecer a mesma amanhã.
  • Não há garantia de que algumas questões de compatibilidades irão permanecer ou não, no futuro.

Conclusão

O “jogo” ainda não está definido. Softwares desta categoria, mais do que nunca, estão em constante mudança e o que é verdadeiro hoje (veja a data deste post), pode ter significado nulo amanhã.
Se você tiver alguma dica, contudo, sobre o assunto, compartilhe com os leitores deste site, nos comentários.

Referências

http://unix.stackexchange.com/questions/196166/how-to-find-out-if-a-system-uses-sysv-upstart-or-systemd-initsystem.