Written by: Helio Loureiro
Category: Linux
Hits: 4336

Esses dias precisei fazer uma migração de uma mediawiki que usamos na empresa de uma máquina que rodava CentOS 6.8 pra um Ubuntu 18.04.

Para garantir seu funcionamento, primeiro eu queria testar os upgrades necessários em minha máquina.  Nada melhor que copiar os arquivos e rodar a versão exata do site remoto com containers em docker.

Mas ao rodar o container... ele simplesmente saia com código de erro 139.  Mais nada.  Sem logs, sem describe, sem nada que pudesse ajudar.

~ > docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS                  NAMES
8ffcdf12d761        centos:6.8          "bash"              52 minutes ago      Up 52 minutes                 0.0.0.0:8080->80/tcp   elated_ganguly
7bd9374248fd        centos:6.8          "bash"              56 minutes ago      Exited (139) 56 minutes ago                          dreamy_fermat
80ff07e9b84e        centos:6.8          "bash"              10 hours ago        Exited (139) 10 hours ago                            romantic_hertz
3db1d6c1f68b        centos:6            "bash"              10 hours ago        Exited (139) 10 hours ago                            bold_kilby

Olhando pela Internet, descobri em alguns sites pessoas relatando o mesmo problema.  É algo relacionado com a versão da glibc do container com a versão do kernel que estou rodando, que é muito mais novo:

 ~ > uname -a
Linux elxa7r5lmh2 5.9.0-rc5-helio #10 SMP Sat Sep 19 12:04:57 CEST 2020 x86_64 x86_64 x86_64 OSI/Linux

A solução é adicionar um parâmetro a mais no grub a opção "vsyscall=emulate":

~ > grep GRUB_CMDLINE_LINUX /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 pcie_aspm=off pci=nomsi vsyscall=emulate" 

e fazer um update no próprio grub.

~ > sudo update-grub2 && sudo reboot -f

Após um reboot os containers funcionaram sem problemas.

~ > docker run -it --rm=true centos:6.8 bash
[root@224aecaba978 /]# hostname
224aecaba978
[root@224aecaba978 /]# exit
exit
 ~ > docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
ca68add255bd        ubuntu:18.04        "bash"              2 hours ago         Exited (1) 2 hours ago                       festive_galois
 ~ > 

Eu tentei configurar diretamente no kernel através da interface em /sys, mas eu só consegui com isso gerar um kernel panic.  O jeito mais fácil e seguro foi mesmo rebootando meu laptop.