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 / 468302
Accepted
AnyDev
AnyDev
Asked: 2018-09-12 07:18:41 +0800 CST2018-09-12 07:18:41 +0800 CST 2018-09-12 07:18:41 +0800 CST

Como executar o ntpd apenas como servidor, sem ajustar o horário da máquina local, no LXC

  • 772

Eu preciso apontar dispositivos para sincronizar seus relógios com meu servidor CentOS-7 rodando dentro do LXC. No servidor estou tentando usar ntpddo ntppacote, mas aberto para outros produtos. Esta pergunta é sobre a configuração do ntpdou equivalente no servidor.

Até agora eu tentei isso em/etc/ntp.conf

driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery

restrict 127.0.0.1
restrict ::1

server 127.127.1.1 iburst
fudge  127.127.1.1 stratum 8

disable monitor

Há DOIS problema aqui.

  1. ntpdtermina após o logcap_set_proc() failed to drop root privileges: Operation not permitted
  2. ntpdestá tentando ajustar a hora local. Ele falha, mas tenta. Se este fosse o único problema e eu tivesse uma mensagem de erro no log, eu poderia aceitar isso.

A saída completa /var/log/messagescausada pela tentativa de iniciar o ntpd:

systemd: Starting Network Time Service...
ntpd[20154]: ntpd [email protected] Wed Apr 12 21:24:06 UTC 2017 (1)
ntpd[20155]: proto: precision = 0.120 usec
ntpd[20155]: ntp_adjtime() failed: Operation not permitted
systemd: Started Network Time Service.
ntpd[20155]: 0.0.0.0 c01d 0d kern kernel time sync enabled
ntpd[20155]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
ntpd[20155]: Listen and drop on 1 v6wildcard :: UDP 123
ntpd[20155]: Listen normally on 2 lo 127.0.0.1 UDP 123
ntpd[20155]: Listen normally on 3 eth0 hidden:A.B.C.D UDP 123
ntpd[20155]: Listen normally on 4 tun0 hidden:E.F.G.H UDP 123
ntpd[20155]: Listening on routing socket on fd #21 for interface updates
ntpd[20155]: 0.0.0.0 c016 06 restart
ntpd[20155]: ntp_adjtime() failed: Operation not permitted
ntpd[20155]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
ntpd[20155]: 0.0.0.0 c011 01 freq_not_set
ntpd[20155]: cap_set_proc() failed to drop root privileges: Operation not permitted
systemd: ntpd.service: main process exited, code=exited, status=255/n/a
systemd: Unit ntpd.service entered failed state.
systemd: ntpd.service failed.
ntp lxc
  • 3 3 respostas
  • 3640 Views

3 respostas

  • Voted
  1. Best Answer
    A.B
    2019-03-25T02:34:23+08:002019-03-25T02:34:23+08:00

    Conforme discutido nos comentários, o chrony recebeu recentemente uma nova opção -xpara não tentar alterar o relógio do sistema, tornando-o especialmente adequado para operações de contêiner. Infelizmente, a primeira versão (3.2) a receber esta opção não era completa e ainda solicita a capacidade do Linux, então ainda falha.

    Traçando chronyd do pacote chrony versão 3.2-2.el7 em um contêiner CentOS7 LXC (com host não CentOS) com opção -x, na verdade, a correção do bug não está aqui:

    # strace /usr/sbin/chronyd -x -d
    

    [...]

    [pid   571] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
    [pid   571] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {1<<CAP_NET_BIND_SERVICE|1<<CAP_SYS_TIME, 1<<CAP_NET_BIND_SERVICE|1<<CAP_SYS_TIME, 0}) = -1 EPERM (Operation not permitted)
    

    Portanto, se você pudesse impedir que o binário não modificável chronyd solicitasse um recurso proibido, ele seria executado (é sobre isso que trata a correção de bug 3.3). Boas notícias, é possível com um LD_PRELOAD/ dlsym()wrapper.

    Compile em outro sistema Linux em outro lugar (a compilação foi realmente feita no host Debian 9 e não deu nenhum problema para executar no contêiner CentOS7 como está) este código chamado capsetwrapper.c, com definições de estruturas encontradas lá, por exemplo (isso não t mudar do kernel 3.10 também).

    #define _GNU_SOURCE 1
    #include <dlfcn.h>
    
    #include <sys/capability.h>
    
    int capset(cap_user_header_t hdrp, const cap_user_data_t datap) {
        int (*orig_capset)(cap_user_header_t,const cap_user_data_t)=dlsym(RTLD_NEXT,"capset");
        datap->effective &= ~ (1<<CAP_SYS_TIME);
        datap->permitted &= ~ (1<<CAP_SYS_TIME);
        return orig_capset(hdrp, datap);
    }
    

    usando esta maneira específica (para tornar uma biblioteca adequada para LD_PRELOADuso):

    gcc -shared -fPIC -o libcapsetwrapper.so capsetwrapper.c -ldl
    

    E está funcionando como visto aqui:

    [root@centos7-amd64bis ~]# LD_PRELOAD=/root/libcapsetwrapper.so /usr/sbin/chronyd -x -d
    2019-03-24T10:09:58Z chronyd version 3.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SECHASH +SIGND +ASYNCDNS +IPV6 +DEBUG)
    2019-03-24T10:09:58Z Disabled control of system clock
    2019-03-24T10:09:58Z Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift
    

    verificando seus recursos durante a execução:

    # egrep '^Cap(Prm|Eff)' /proc/$(pidof chronyd)/status
    CapPrm: 0000000000000400
    CapEff: 0000000000000400
    

    mostra 0x400 que é o restante 1<<CAP_NET_BIND_SERVICEcomo visto acima.

    Para integrar isso no sistema:

    • coloque a libcapsetwrapper.soembalagem como/usr/local/lib/libcapsetwrapper.so

    • com systemctl edit chronyd, substitua a CAP_SYS_TIMEverificação e o executável começa com isso:

      [Unit]
      ConditionCapability=
      
      [Service]
      ExecStart=
      ExecStart=/bin/sh -c 'export LD_PRELOAD=/usr/local/lib/libcapsetwrapper.so; exec /usr/sbin/chronyd -x'
      

      Desculpe, não consegui reutilizar o $OPTIONSparâmetro (que está vazio e deve estar recebendo a -xopção, carregada de /etc/sysconfig/chronyd), mas com mais conhecimento do systemd deve ser possível.

    Resultado de trabalho:

    # systemctl status chronyd
    ● chronyd.service - NTP client/server
       Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
      Drop-In: /etc/systemd/system/chronyd.service.d
               `-override.conf
       Active: active (running) since Sun 2019-03-24 10:24:26 UTC; 13min ago
         Docs: man:chronyd(8)
               man:chrony.conf(5)
      Process: 843 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
      Process: 839 ExecStart=/bin/sh -c export LD_PRELOAD=/usr/local/lib/libcapsetwrapper.so; exec /usr/sbin/chronyd -x (code=exited, status=0/SUCCESS)
     Main PID: 841 (chronyd)
       CGroup: /system.slice/chronyd.service
               `-841 /usr/sbin/chronyd -x
    

    O que não foi testado é se o ambiente SELinux padrão (não disponível aqui) permite a operação de pré-carregamento ou se algo mais deve ser feito /usr/local/lib/libcapsetwrapper.so(certifique-se de usar restoreconnele).

    • 2
  2. AnyDev
    2020-07-16T06:33:17+08:002020-07-16T06:33:17+08:00

    Desde a versão 7.7.1908 , o CentOS tem a chronyversão 3.4 que suporta o -xsinalizador corretamente e pode ser executado em LXC, com pequenos ajustes de configuração.

    • O padrão /usr/lib/systemd/system/chronyd.servicetem o ConditionCapability=CAP_SYS_TIMEque não deveria estar lá quando executado com o -xLXC, então remova-o adicionando este drop in file/etc/systemd/system/chronyd.service.d/lxc.conf
        [Unit]
        # Default service has:
        # ConditionCapability=CAP_SYS_TIME
        # which does not work under LXC and causes service to refuse to start
        # Clear it.
        ConditionCapability=
    
    • Edite /etc/sysconfig/chronyde adicione -xpara OPTIONSterminar comOPTIONS="-x"

    • Altere /etc/chrony.confpara NÃO sincronizar com nenhum servidor NTP, mas para servir a hora do relógio local. Remova/desative todas as outras serverentradas e adicione:

        # Comment out default/other server entries
        #server 0.centos.pool.ntp.org iburst
        #server 1.centos.pool.ntp.org iburst
        #server 2.centos.pool.ntp.org iburst
        #server 3.centos.pool.ntp.org iburst
        #
        # Add these as per https://www.thegeekdiary.com/centos-rhel-7-chrony-how-to-sync-to-local-clock/
        server 127.127.1.0
        local stratum 10
        allow all
    

    Revise a allowdiretiva para atender às suas necessidades, pois allow all, como no exemplo, pode não ser adequado para você.

    • Recarregue e reinicie o serviço
        systemctl daemon-reload
        systemctl restart chronyd
    

    Deve ser isso.

    • 2
  3. AnyDev
    2018-09-12T07:18:41+08:002018-09-12T07:18:41+08:00

    Eu encontrei uma maneira de fazê-lo funcionar, mas não estou feliz com minha solução, então ainda estou procurando uma resposta melhor.

    Parte 1. Eu impedi ntpdde tentar remover privilégios de root.

    Nele /usr/lib/systemd/system/ntpd.servicetem por padrão:

    [Service]
    EnvironmentFile=-/etc/sysconfig/ntpd
    ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
    

    então eu ''removo'' -u ntp:ntpcolocando/etc/systemd/system/ntpd.service.d/local.conf

    [Service]
    ExecStart=
    ExecStart=/usr/sbin/ntpd $OPTIONS
    

    O que permite ntpdcontinuar rodando como root. Funciona, mas não estou feliz com essa abordagem.

    Parte 2. A parte da hora local não atualizada

    A adição de causas em /etc/ntp.conflinha no serviço começa a registrar o erro apenas uma vez, em vez de 3 vezes sem a configuração. Uma vez que não pode alterar o relógio, isso é aceitável. Idealmente, nem tentaria mudar o relógio.disable kernelntpdntp_adjtime() failed: Operation not permitted

    • 0

relate perguntas

  • Como posso usar minha hora local como única referência de `ntpd`?

  • A hora do sistema é alterada automaticamente por algum motivo desconhecido na máquina Linux

  • Monte a pasta do host para o convidado com o LXC 2.x, mas faça somente leitura?

  • Não é possível iniciar o servidor NFS no Alpine Linux LXC

  • Linux do zero dentro de um contêiner LXC

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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