Tutorial: Como instalar pacotes conflitantes no Debian

Tutorial: Como instalar pacotes conflitantes no Debian


 

Essa dificuldade geralmente acontece ao tentar instalar pacotes de versões antigas (ou experimentais/instáveis/em teste) e usualmente com as dependências que são necessárias para o pacote antigo desejado. Essas dependências acabam conflitando com alguma outra mais nova necessária para outro serviço ou pacote na máquina.

Ao constatar que precisa de ambos programas, você tenta diversos métodos, envolvendo apt pinning , misturando repositórios, ou até backport feito em casa e descobre ficar num pesadelo de dependências.

Uma saída mais organizada e de melhor manutenção, envolvendo apenas pacotes oficiais do Debian sem modificações de código ou empacotamento a manter, é criar um container "híbrido" na máquina, para instalar esse pacote antigo num ambiente "quase" separado, "quase" uma máquina virtual, "quase" um container.

A manutenção pelo sysadmin será apenas de configurações e atualizando pacotes oficiais Debian.

Abordagem

Vamos criar um container "híbrido", com namespace e filesystem razoavelmente isolados mas com acesso a processos e à rede no host. Por isso não há runlevels nem systemd próprios nesse tipo de container e teremos de gerenciar isso pelo host.

Esse modelo tem vantagens e desvantagens e você deve analisar para seu cenário.

No exemplo desse tutorial, vamos instalar dentro do container "híbrido" uma versão Stretch antiga de zabbix-agent, tudo num servidor Debian Buster Estável com Apache, se comunicando com um proxy zabbix e seu servidor de versão antiga. As configurações mantidas em puppet não são objeto desse tutorial.


Para monitorar apache no host

Habilitar módulo status

a2enmod status
nano /etc/apache2/mods-enabled/status.conf
service apache2 restart
service apache2 status

Acessar a página de status do servidor

Podes também usar lynx, links2, w3m ou outro browser texto.

curl http://localhost/server-status

Incluir no /etc/apt/sources.list

Você pode escolher NÃO usar a opção "trusted". Aliás, é recomendável. Foi comodidade para facilitar a gestão de chaves expiradas.

###########
# stretch
deb [trusted=yes] http://archive.debian.org/debian/ stretch main contrib non-free
# stretch-backports
deb [trusted=yes] http://archive.debian.org/debian/ stretch-backports main contrib non-free
# stretch-backports-sloppy
deb [trusted=yes] http://archive.debian.org/debian/ stretch-backports-sloppy main contrib non-free
# stretch-updates
deb [trusted=yes] http://archive.debian.org/debian/ stretch-updates main contrib non-free
# stretch-security
deb [trusted=yes] http://security.debian.org/debian-security stretch/updates main contrib non-free
###########

Debootstrap e chroot

O debootstrap cria containers chroot com versões e até arquiteturas diferentes de Debian. O chroot puro não altera prompt nem tem pontos de montagem como /proc . Seja cuidadoso e sempre verifique se está no container ou no host antes de executar comandos. O gerenciador schroot altera o prompt.

Com o chroot, você executa o comando e encerra sessão do container ao terminar o comando. É do tipo one-shot. Após entrar numa sessão bash, você encerra a sessão do container ao sair da sessão bash.

apt-get install debootstrap
mkdir /opt/chrootstretch


#debootstrap --variant=minbase stretch /opt/chrootstretch
debootstrap stretch /opt/chrootstretch

chroot /opt/chrootstretch

cat /etc/debian_version

apt-get install locales/stretch

dpkg-reconfigure locales

apt-get install  libreadline7/stretch procps/stretch curl/stretch net-tools/stretch less/stretch nano/stretch debconf/stretch sudo/stretch

apt-get install  zabbix-agent/stretch


less /etc/zabbix/zabbix_agentd.conf
ls -lah /etc/zabbix/zabbix_agentd.conf.d/

service zabbix-agent restart
service zabbix-agent status


#https://manpages.debian.org/testing/zabbix-agent/zabbix_agentd.8.en.html


zabbix_agentd -V

exit

#voltou ao host

Schroot para gerenciar chroot

Schroot é uma maneira bem mais fácil de configurar, gerenciar e utilizar containers chroot.

apt-get install schroot aufs-tools

#aufs-tools | unionfs-fuse qemu-user-static
ls /opt/chrootstretch/

Examinar os diretórios que zabbix deveria ter acesso no host para personalizar depois

cat /etc/schroot/default/fstab 

Configurar o container gerenciado

nano /etc/schroot/chroot.d/chrootstretch
#####################
# schroot chroot definitions.
# See schroot.conf(5) for complete documentation of the file format.
#
# Please take note that you should not add untrusted users to
# root-groups, because they will essentially have full root access
# to your system.  They will only have root access inside the chroot,
# but that's enough to cause malicious damage.
#
# The following lines are examples only.  Uncomment and alter them to
# customise schroot for your needs, or create a new entry from scratch.
#
#AFM 20210407

[chrootstretch]
description=Contains the zabbix stretch version
aliases=zabbixstretch
type=directory
directory=/opt/chrootstretch
users=root
root-groups=root
profile=desktop
personality=linux
preserve-environment=true
message-verbosity=normal
setup.fstab=chrootstretch/fstab
#######################

Editar fstab personalizado conforme exame anterior e deixar o resto default

mkdir /etc/schroot/chrootstretch
cp /etc/schroot/default/fstab /etc/schroot/chrootstretch/

nano /etc/schroot/chrootstretch/fstab
#incluir no fstab
#######################
#AFM 20210408
/var/log/apache2        /var/log/apache2        none    rw,bind         0       0
#######################

Entrar no chroot, verificar montagens e suas permissões, reiniciar serviço e verificar

schroot -c chrootstretch

cat /proc/mounts

chown -R zabbix.zabbix /var/log/zabbix-agent
ls -lah /var/log/zabbix-agent

service zabbix-agent restart
service zabbix-agent status
zabbix_agentd -V
curl http://localhost/server-status

exit

Testar container gerenciado por schroot

A partir daqui começaremos a executar comandos "remotamente" a partir do host para o container executando em background, que formou uma sessão que ficou aguardando comandos e persiste até que seja explicitamente encerrada. Nem o reboot a aborta efetivamente. Por isso em nosso cenário é importante limpar todas sessões no shutdown e garantir isso também no boot. Não vamos tentar recuperar sessões abortadas.

##############
#criar uma sessão chroot no background e obter sessionid

SESSION=$(schroot --begin-session --chroot=chrootstretch)
echo $SESSION

schroot --info --all-sessions

schroot --run-session --chroot=$SESSION -- /bin/ls -lah
schroot --run-session --chroot=$SESSION -- adduser --quiet --system --group --disabled-login --no-create-home --home /nonexistent zabbix
schroot --run-session --chroot=$SESSION -- service zabbix-agent restart
schroot --run-session --chroot=$SESSION -- service zabbix-agent status
schroot --run-session --chroot=$SESSION -- zabbix_agentd -V
schroot --run-session --chroot=$SESSION -- curl http://localhost/server-status

ps -aux |grep zabbix

#no shutdown e no reboot, para garantir limpeza de sessões abandonadas
schroot --end-session --all-sessions
schroot --info --all-sessions
schroot --info --all

#########

Scripts para automatizar no systemd

mkdir /opt/scripts

Script para iniciar container

nano /opt/scripts/iniciar_zabbix_container.sh
############
#!/bin/sh
#AFM 20210412 para iniciar zabbix no container durante boot

#limpar eventuais sessões abortadas
/usr/bin/schroott --end-session --all-sessions


/usr/bin/schroot --begin-session --chroot=chrootstretch --session-name=meucontainerzabbix
/usr/bin/schroot --run-session --chroot=meucontainerzabbix -- adduser --quiet --system --group --disabled-login --no-create-home --home /nonexistent zabbix
/usr/bin/schroot --run-session --chroot=meucontainerzabbix -- service zabbix-agent restart

#########
chmod +x  /opt/scripts/iniciar_zabbix_container.sh

/opt/scripts/iniciar_zabbix_container.sh

Script para parar container

nano /opt/scripts/parar_zabbix_container.sh
###############
#!/bin/sh
#AFM 20210412 para iniciar zabbix no container durante boot


#limpar eventuais sessões
/usr/bin/schroot --end-session --all-sessions
###############
chmod +x /opt/scripts/parar_zabbix_container.sh

/opt/scripts/parar_zabbix_container.sh

Configurar ambos os serviços one-shot no systemd

nano /etc/systemd/system/iniciar_zabbix_container.service
###############
[Unit]
Description=Iniciar zabbix container
After=schroot.service
#Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target


[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/opt/scripts/iniciar_zabbix_container.sh  #your paths and filenames
#ExecStop=/opt/scripts/parar_zabbix_container.sh
ExecStop=/usr/bin/true #para nao dar warning

[Install]
WantedBy=default.target
###############
nano /etc/systemd/system/parar_zabbix_container.service
###############
[Unit]
Description=Parar zabbix container
After=schroot.service
Before=shutdown.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target


[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/usr/bin/true  #para nao dar warning
ExecStop=/opt/scripts/parar_zabbix_container.sh

[Install]
WantedBy=halt.target shutdown.target
###############
systemctl enable iniciar_zabbix_container
systemctl is-enabled iniciar_zabbix_container
systemctl is-active iniciar_zabbix_container

systemctl enable parar_zabbix_container
systemctl is-enabled parar_zabbix_container

Reboot e testar se parou e reiniciou corretamente

reboot
schroot --info --all-sessions
schroot --run-session --chroot=meucontainerzabbix  -- service zabbix-agent status
schroot --run-session --chroot=meucontainerzabbix  -- curl http://localhost/server-statu

Agora precisa configurar o zabbix DENTRO do container


cp  /opt/chrootstretch/etc/zabbix/zabbix_agentd.conf /opt/chrootstretch/etc/zabbix/zabbix_agentd.conf.20210413
nano /opt/chrootstretch/etc/zabbix/zabbix_agentd.conf
########
#Server                  = 0.0.0.0/0
Server			= 192.168.0.103,192.168.0.100
ServerActive            = 192.168.0.103,192.168.0.100
########
ls /opt/chrootstretch/etc/zabbix/zabbix_agentd.conf.d
ls /opt/chrootstretch/etc/zabbix/
less /opt/chrootstretch/etc/zabbix/zabbix_agent.conf

scp root@192.168.0.101:/etc/zabbix/zabbix_agentd.conf.d/* /opt/chrootstretch/etc/zabbix/zabbix_agentd.conf.d/

less  /opt/chrootstretch/etc/zabbix/zabbix_agentd.conf.d/apache.conf

schroot --run-session --chroot=meucontainerzabbix -- mkdir /var/log/zabbix
schroot --run-session --chroot=meucontainerzabbix -- chown -R zabbix.zabbix /var/log/zabbix
schroot --run-session --chroot=meucontainerzabbix -- ls -lah /var/log/zabbix
schroot --run-session --chroot=meucontainerzabbix -- service zabbix-agent restart
schroot --run-session --chroot=meucontainerzabbix -- service zabbix-agent status
schroot --run-session --chroot=meucontainerzabbix -- zabbix_agentd -p

mkdir -p /opt/chrootstretch/etc/apache2/sites-enabled
mkdir /etc/bash_completion.d
mkdir /var/log/rotinas
nano /etc/schroot/chrootstretch/fstab
#incluir no fstab
#######################
#AFM 20210408
/var/log/apache2        /var/log/apache2        none    rw,bind         0       0
/etc/zabbix/scripts	/etc/zabbix/scripts	none    rw,bind         0       0
/var/log/rotinas	/var/log/rotinas	none    rw,bind         0       0
/etc/bash_completion.d	/etc/bash_completion.d	none    rw,bind         0       0
/etc/apache2/sites-enabled /etc/apache2/sites-enabled	none    rw,bind         0       0
#######################

Para aumentar o nível de log durante execução, válido até o próximo restart do serviço

schroot --run-session --chroot=meucontainerzabbix -- zabbix_agentd --runtime-control log_level_increase

No puppet server

nano /etc/puppetlabs/code/environments/production/modules/base/files/etc/hosts 
#############
#AFM 20210414 incluir no hosts
192.168.0.105  proxy01
#############

Verificar que rodou puppet nos servidores DNS.

De volta ao servidor monitorado

/opt/scripts/parar_zabbix_container.sh
/opt/scripts/iniciar_zabbix_container.sh
schroot --run-session --chroot=meucontainerzabbix -- tail -f /var/log/zabbix/zabbix_agentd.log

Examine com atenção a saída do comando e verifique se coleta os dados desejados

schroot --run-session --chroot=meucontainerzabbix -- zabbix_agentd -p

Nos proxies zabbix

root@zabbix-proxy:~# zabbix_get -s 192.168.0.105 -k "system.swap.size[,pfree]"
100.000000
root@zabbix5-server:~# zabbix_get -s 192.168.0.105 -k "system.swap.size[,pfree]"
100.000000

Se o zabbix_agentd.conf do servidor monitorado estiver com diretiva Server e/ou ServerActive mal configurada vai retornar:

#zabbix_get [2076]: Check access restrictions in Zabbix agent configuration

Bibliografia

Misturar pacotes

https://snapshot.debian.org/binary/zabbix-agent/

https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html

https://serverfault.com/questions/279329/can-i-have-two-versions-of-the-same-package-in-an-apt-repository

https://www.debian.org/doc/manuals/debian-reference/ch02.en.html

https://cloudwafer.com/blog/installing-multiple-versions-of-php-on-debian/

Monitorar Apache

https://techexpert.tips/pt-br/zabbix-pt-br/zabbix-monitorando-apache/

https://www.zabbix.com/br/integrations/apache

Proxy válido para chroot também, que não herda variáveis de ambiente

https://serverfault.com/questions/36832/debian-route-all-http-traffic-through-squid

Debootstrap

https://unix.stackexchange.com/questions/458332/how-can-i-install-and-run-conflicting-packages-on-debian-ubuntu

https://wiki.debian.org/Debootstrap

https://unix.stackexchange.com/questions/219253/the-most-minimal-debian-sid-installed-with-debootstrap

https://linux.die.net/man/8/debootstrap

https://www.debian.org/doc/manuals/securing-debian-manual/chroot-ssh-env.pt-br.html

https://wiki.debian.org/chroot

https://askubuntu.com/questions/958795/how-to-use-the-mirror-option-of-apt-cacher-ng-for-debootstrap

Schroot

https://linux.die.net/man/5/schroot.conf

https://linux.die.net/man/1/schroot

https://linux.die.net/man/5/schroot-setup

https://manpages.debian.org/testing/schroot/schroot-faq.7.en.html

https://packages.debian.org/buster/schroot

https://wiki.debian.org/Schroot

http://logan.tw/posts/2018/02/24/manage-chroot-environments-with-schroot/

https://josiahulfers.com/2018/03/31/schroot-cheatsheet/

https://wiki.debian.org/RichardDarst/Schroot

https://serverfault.com/questions/613179/how-do-i-do-mount-bind-in-etc-fstab

https://unix.stackexchange.com/questions/55710/how-can-i-access-a-directory-outside-a-chroot-from-within-it

https://unix.stackexchange.com/questions/24182/how-to-get-the-complete-and-exact-list-of-mounted-filesystems-in-linux

https://www.debian.org/doc/manuals/securing-debian-manual/ch03s05.pt-br.html

https://askubuntu.com/questions/835285/why-does-update-rc-d-not-accept-my-init-script

https://gitlab.com/codelibre/schroot

Systemd

https://www.freedesktop.org/software/systemd/man/systemd.target.html

https://unix.stackexchange.com/questions/555638/booting-a-systemd-container-how-to-bypass-console-login

https://qastack.com.br/superuser/688733/start-a-systemd-service-inside-chroot

https://unix.stackexchange.com/questions/48973/execute-a-command-before-shutdown

http://userscripts4systemd.blogspot.com/

https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux

https://www.cyberciti.biz/faq/linux-execute-cron-job-after-system-reboot/

https://opensource.com/life/16/11/running-commands-shutdown-linux

https://askubuntu.com/questions/51145/how-to-run-a-command-before-the-machine-automatically-shuts-down

https://unix.stackexchange.com/questions/347275/how-to-run-a-script-at-shutdown-on-debian-9-or-raspbian-8-jessie

 

Comentários

Postagens mais visitadas deste blog

Tutorial Cyrus IMAP aggregator (murder) 2.3.16 sobre Debian GNU Linux 5.x Lenny

Instalar Squid forward proxy com SSL cache (SSL bump) em Rocky Linux 8.9 para cache de pacotes na infrestrutura

How to configure multipath for high availability and performance on Debian and CentOS for storage at IBM DS8300 SAN