AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 534843
Accepted
mbigras
mbigras
Asked: 2019-08-10 22:23:21 +0800 CST2019-08-10 22:23:21 +0800 CST 2019-08-10 22:23:21 +0800 CST

Por que o comum está em um cgroup diferente quando o podman é iniciado com o systemd?

  • 772

Dado que o podman está instalado em um sistema linux e uma unidade systemd chamada baz.service:

# /etc/systemd/system/baz.service
[Service]
ExecStart=/usr/bin/podman run --rm --tty --name baz alpine sh -c 'while true; do date; sleep 1; done'
ExecStop=/usr/bin/podman stop baz

E o baz.service começou:

# systemctl daemon-reload
# systemctl start baz.service

Então, quando eu verifico o status da unidade, não vejo o shou sleepprocesso no cgroup /system.slice/baz.service

# systemctl status baz
● baz.service
   Loaded: loaded (/etc/systemd/system/baz.service; static; vendor preset: enabl
   Active: active (running) since Sat 2019-08-10 05:50:18 UTC; 14s ago
 Main PID: 16910 (podman)
    Tasks: 9
   Memory: 7.3M
      CPU: 68ms
   CGroup: /system.slice/baz.service
           └─16910 /usr/bin/podman run --rm --tty --name baz alpine sh -c while
# ...

Eu esperava ver o shand sleepchildren no meu status baz.service porque ouvi pessoas da redhat dizerem que o podman usa um modelo tradicional de fork-exec.

Se podman fizesse fork e exec, então my she sleepprocess não seriam filhos de podman e estariam no mesmo cgroup que o processo podman original?

Eu esperava poder usar o systemd e o podman para poder gerenciar meus contêineres sem que os filhos fossem para um pai diferente e escapassem da minha unidade ssystemd baz.service.

Olhando para a saída de pseu posso ver isso she sleepna verdade são filhos de um processo diferente chamado conmon. Não tenho certeza de onde veio o conmon ou como foi iniciado, mas o systemd não o capturou.

# ps -Heo user,pid,ppid,comm
# ...
root     17254     1   podman
root     17331     1   conmon
root     17345 17331     sh
root     17380 17345       sleep

A partir da saída, fica claro que minha unidade baz.service não está gerenciando a cadeia conmon -> sh -> sleep.

  • Como o podman é diferente do modelo de servidor cliente do docker?
  • Como o conmon do podman é diferente do containerd do docker?

Talvez ambos sejam tempos de execução de contêiner e o dockerddaemon seja o que as pessoas querem se livrar.

Então, talvez o docker seja como:

  • daemon dockerd
  • docker cli
  • tempo de execução do contêiner containerd

E o podman é como:

  • podman cli
  • tempo de execução do contêiner comum

Então, talvez o podman use um modelo tradicional de fork exec, mas não é o podman cli que é bifurcação e exec, é o processo comum.

Eu me sinto confuso.

systemd docker
  • 2 2 respostas
  • 1485 Views

2 respostas

  • Voted
  1. Best Answer
    Danila Kiver
    2019-08-11T13:46:28+08:002019-08-11T13:46:28+08:00

    A ideia por trás disso podmané sair da arquitetura centralizada com o superpoderoso supervisor (por exemplo dockerd, ), onde o daemon centralizado é um ponto único de falha. Existe até uma hashtag sobre isso - " #nobigfatdaemons ".

    Como evitar o gerenciamento centralizado de contêineres? Você remove o daemon principal único (novamente, dockerd) e inicia os contêineres de forma independente (no final do dia, os contêineres são apenas processos, então você não precisa do daemon para gerá-los).

    No entanto, você ainda precisa do caminho para

    • recolher os logs do container - alguém tem que segurar stdoute stderrdo container;
    • coletar o código de saída do container - alguém precisa wait(2)no PID 1 do container;

    Para isso, cada contêiner podman ainda é supervisionado por um pequeno daemon, chamado conmon(de "monitor de contêiner"). A diferença com o daemon do Docker é que esse daemon é o menor possível (verifique o tamanho do código-fonte ) e é gerado por contêiner. Se conmonum contêiner travar, o restante do sistema não será afetado.

    Em seguida, como o contêiner é gerado?

    Considerando que o usuário pode querer executar o container em background, como no Docker, o podman runprocesso bifurca duas vezes e só então executa conmon:

    $ strace -fe trace=fork,vfork,clone,execve -qq podman run alpine
    execve("/usr/bin/podman", ["podman", "run", "alpine"], 0x7ffeceb01518 /* 30 vars */) = 0
    ...
    [pid  8480] clone(child_stack=0x7fac6bffeef0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tid=[8484], tls=0x7fac6bfff700, child_tidptr=0x7fac6bfff9d0) = 8484
    ...
    [pid  8484] clone(child_stack=NULL, flags=CLONE_VM|CLONE_VFORK|SIGCHLD <unfinished ...>
    [pid  8491] execve("/usr/bin/conmon", ... <unfinished ...>
    [pid  8484] <... clone resumed>)        = 8491
    
    

    O processo intermediário entre podman rune conmon(ou seja, o pai direto de conmon- no exemplo acima é o PID 8484) sairá e conmonserá reparentado por init, tornando-se assim um daemon autogerenciado. Depois disso, conmontambém bifurca o runtime (eg runc) e, finalmente, o runtime executa o entrypoint do container (eg /bin/sh).

    Quando o container está rodando, podman runnão é mais necessário e pode sair, mas no seu caso ele fica online, pois você não pediu para desanexar do container.

    Em seguida, podmanfaz uso de cgroups para limitar os contêineres. Isso significa que ele cria novos cgroups para novos contêineres e move os processos para lá . Pelas regras do cgroups, o processo pode ser membro de apenas um cgroup por vez, e adicionar o processo a algum cgroup o remove de outro cgroup (onde estava anteriormente) dentro da mesma hierarquia. Assim, quando o container é iniciado, o layout final dos cgroups se parece com o seguinte: podman runpermanece em cgroups do baz.service, criado por systemd, o conmonprocesso é colocado em seus próprios cgroups, e os processos em container são colocados em seus próprios cgroups:

    $ ps axf
    <...>
     1660 ?        Ssl    0:01 /usr/bin/podman run --rm --tty --name baz alpine sh -c while true; do date; sleep 1; done
     1741 ?        Ssl    0:00 /usr/bin/conmon -s -c 2f56e37a0c5ca6f4282cc4c0f4c8e5c899e697303f15c5dc38b2f31d56967ed6 <...>
     1753 pts/0    Ss+    0:02  \_ sh -c while true; do date; sleep 1; done
    13043 pts/0    S+     0:00      \_ sleep 1
    <...>
    
    $ cd /sys/fs/cgroup/memory/machine.slice
    $ ls -d1 libpod*
    libpod-2f56e37a0c5ca6f4282cc4c0f4c8e5c899e697303f15c5dc38b2f31d56967ed6.scope
    libpod-conmon-2f56e37a0c5ca6f4282cc4c0f4c8e5c899e697303f15c5dc38b2f31d56967ed6.scope
    
    $ cat libpod-2f56e37a0c5ca6f4282cc4c0f4c8e5c899e697303f15c5dc38b2f31d56967ed6.scope/cgroup.procs 
    1753
    13075
    
    $ cat libpod-conmon-2f56e37a0c5ca6f4282cc4c0f4c8e5c899e697303f15c5dc38b2f31d56967ed6.scope/cgroup.procs 
    1741
    

    Nota: O PID 13075 acima é na verdade um sleep 1processo, gerado após a morte do PID 13043.

    Espero que isto ajude.

    • 12
  2. user3238133
    2021-05-07T06:45:10+08:002021-05-07T06:45:10+08:00

    podman com --cgroups splitcriará os cgroups de uma maneira mais amigável ao sistema. (Semelhante a como o systemd-nspawn faria isso, com um cgroup de "serviço" e sub-cgroups para processos de supervisor e contêiner)

    Exemplo - meu contêiner rwhod:

     CGroup: /machine.slice/rwhod.service
             ├─container
             │ ├─ 998 /dev/init -- /container/tool/run
             │ ├─1040 /usr/bin/python3 -u /container/tool/run
             │ └─1706 /usr/sbin/rwhod -i mgmt0 -S -D
             └─supervisor
               └─995 /opt/podman/libexec/podman/conmon --api-version 1 -c ddf3e27960378fd57b2ebd15d7beb7474506f612e7329acb014c5f89cd652562 >
    

    Eu fiz parte da adição desse método ao podman especificamente para esse propósito, como parte desta discussão de log. https://github.com/containers/podman/issues/6400

    • 0

relate perguntas

  • systemd: como posso executar um script no início de um serviço, sem editar a definição do serviço

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Como instalo o docker no RHEL 7 offline?

  • Preciso executar este arquivo de script apenas uma vez?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve