Não é novidade que, nos últimos anos, alguns ajustes de ambiente e sistema vem sendo aplicados com intuito de otimizar a inicialização e gerência de serviços no Linux. Acredito que, o Ubuntu, de certa forma, deu o primeiro passo com o projeto Upstart. Em paralelo, engenheiros de software da Red Hat começaram a concentrar em outro framework, conhecido como Systemd. Não sei quem começou. Mas, algumas características de software e sistema sofreram alterações que levaram a dependência do systemd. Logo, a gerência de serviços das demais distribuições está migrando para este novo padrão.
Segundo a wikipedia, a partir de 2015, a maioria das distribuições têm adotado systemd como seu sistema de inicialização padrão. Sua crescente adoção tem sido controversa, com críticos argumentando que o software tenha violado a filosofia Unix, tornando-se cada vez mais complexo, e que as distribuições foram obrigadas a adotá-lo devido à dependência de vários outros softwares, como o GNome 3 (por exemplo).
Por este motivo, a partir do Ubuntu 15, o Upstart deixou de ser padrão – ainda está disponível no repositório principal. É um excelente projeto, mas, com a dependência e avanço do systemd, sua utilização tende cair em desuso. Confesso que, as vezes, isto irrita! (risos)
Segundo a documentação do Archlinux, “Systemd é um sistema e gerenciador de serviços para Linux, compatível com os scripts de inicializações SysV e LS. Systemd fornece recursos de paralelização agressivos, usa socket e ativação D-Bus para iniciar serviços, oferece o início de daemons on-demand, mantém o registro de processos usando grupos de controle Linux, suporte snapshotting e restauração do estado do sistema, preserva pontos de montagens e automontagens e implementa uma lógica de controle elaborado transacional baseada em dependência de serviço“.
Até pouco tempo, a gerência de serviços, no padrão Debian, costumava ser feita com rcconf ou update-rc.d. Conforme exposto, a tendência é que estes ajustes passem a ser feitos via systemctl.
Em uma instalação firewall, minha primeira conduta é verificar quais serviços estão ativos e desabilitar o que não for necessário ou indispensável para o funcionamento do sistema.
root@firewall:~# netstat -ntlup Conexões Internet Ativas (somente servidores) Proto Recv-Q Send-Q Endereço Local Endereço Remoto Estado PID/Program name tcp 0 0 0.0.0.0:8443 0.0.0.0:* OUÇA 15862/webauth.mod [ tcp 0 0 0.0.0.0:3322 0.0.0.0:* OUÇA 1230/sshd tcp 0 0 0.0.0.0:8080 0.0.0.0:* OUÇA 18282/(squid-1) tcp 0 0 0.0.0.0:80 0.0.0.0:* OUÇA 10855/apache2 tcp 0 0 0.0.0.0:81 0.0.0.0:* OUÇA 15861/webauth.mod [ tcp 0 0 10.0.0.1:53 0.0.0.0:* OUÇA 1586/named tcp 0 0 127.0.0.1:53 0.0.0.0:* OUÇA 1586/named tcp 0 0 0.0.0.0:3128 0.0.0.0:* OUÇA 18282/(squid-1) tcp 0 0 127.0.0.1:953 0.0.0.0:* OUÇA 1586/named udp 0 0 10.0.0.1:53 0.0.0.0:* 1586/named udp 0 0 127.0.0.1:53 0.0.0.0:* 1586/named udp 0 0 0.0.0.0:53065 0.0.0.0:* 18282/(squid-1)
No caso da resolução de nomes, tenho feito dois ajustes: Desfaço o link simbólico do arquivo /etc/resolv.conf e desabilito o serviço resolvconf:
# 1. Desfazendo o link simbólico cp /etc/resolv.conf /tmp/ rm /etc/resolv.conf mv /tmp/resolv.conf /etc/ # 2. Desabilitando o serviço resolvconf systemctl disable resolvconf.service
Existe um mito de que o Ubuntu mudou drasticamente a resolução de nomes do sistema, impedindo o controle direto sobre o arquivo resolv.conf. Na prática, o sistema continua trabalhando sob o padrão estabelecido pela glibc. A diferença é que, no Ubuntu, o arquivo resolv.conf é um link simbólico para “../run/resolvconf/resolv.conf“, que é controlado por um framework próprio (network-manager). É uma forma de garantir que o resolv.conf seguirá as definições em /etc/network/interface. Quebrando o link simbólico, o controle sobre o arquivo volta a ser manual.
Em relação aos serviços… para saber quais serviços estão ativos:
systemctl list-unit-files | grep ".service" | more
Como adoto uma solução de firewall própria (FwGuardian), costumo remover a instalação do ufw (purge para remoção dos scripts internos). Também removo o controle de acesso mandatório AppArmor porque defino o acesso ao firewall extremamente restritivo, tanto por regras de INPUT quanto por limites de acesso PAM.
dpkg --purge ufw dpkg --purge apparmor
ou
apt-get purge ufw apt-get purge appamor
Para efeito de curiosidade, o controle de inicialização (runlevels) também é feito via systemctl.
- Como o mapeamento é feito ┌──────────┬───────────────────┐ │ Runlevel │ Target │ ├──────────┼───────────────────┤ │ 0 │ poweroff.target │ ├──────────┼───────────────────┤ │ 1 │ rescue.target │ ├──────────┼───────────────────┤ │ 2, 3, 4 │ multi-user.target │ ├──────────┼───────────────────┤ │ 5 │ graphical.target │ ├──────────┼───────────────────┤ │ 6 │ reboot.target │ └──────────┴───────────────────┘
# 1. Consultando o nível padrão systemctl get-default # 2. Definindo multi-user.target (runlevel 2,3,4) systemctl enable multi-user.target systemctl set-default multi-user.target