Mini-COMO FAZER Relógio Ron Bean, rbean@execpc.com v, Dezembro de 1996 Como configurar e manter o relógio do seu computador com a hora certa. ______________________________________________________________________ Índice geral 1. Introdução 2. Usando o programa `` 2.1 Verificando a sua instalação 2.2 Medindo a taxa de alteração do seu relógio 2.3 Exemplo 2.3.1 Para configurar a hora 2.3.2 Iniciar a hora e verificar a taxa de alteração 2.3.3 Calculando o fator de correção 3. Um breve comentário sobre o xntpd ______________________________________________________________________ 11.. IInnttrroodduuççããoo Os circuitos responsáveis pelo relógio nas placas mães dos PCs ( e igualmente em estações de trabalho ) são notoriamente inexatos. O Linux provê uma maneira simples para corrigir isto em um programa, fazendo com que o relógio seja *_m_u_i_t_o* preciso mesmo sem uma fonte de tempo externa. Porém, a maioria das pessoas parece não saber a respeito disso, por razões deste tipo: 1. Não é mencionado na maioria das documentações de ``como configurar o Linux'', e seria difícil configurar automaticamente durante a instalação ( embora teoricamente não seja impossível se você tem um modem ). 2. Se você der uma olhada no ``man clock'', irá obter o clock(3), mas não é isto que se quer ( tente ``man 8 clock'' ). 3. Parece que a maioria das pessoas não se importa com a hora. 4. Os poucos que se importam, frequentemente usam o pacote xntpd da louie.udel.edu para fazer a sincronia com uma fonte externa ( como um servidor de hora ou um rádio relógio ). Este mini-COMO FAZER descreve uma abordagem de baixo nível técnico. Se não estiver interessado neste tipo de informação, recomendo que se perda algum tempo em que inclui todos os tipos de coisas interessantes, incluindo informações completas sobre xntpd e links para NIST e USNO ( tenho mais alguns comentários sobre o xntpd no fim deste documento ). NNoottaa Se você usa mais de um SO na sua máquina, deve-se deixar apenas um deles reiniciar o relógio da CMOS, a fim de evitar confusões. Se você usa freqüentemente tanto Linux como Windows na mesma máquina, pode-se usar alguns programas gratuitos de relógio ( siga os links da URL acima ). 22.. UUssaannddoo oo pprrooggrraammaa ```` cclloocckk '''' Tudo o que você precisa saber está na página de manual do clock(8), porém, este mini-COMO FAZER irá guiá-lo. NNoottaa É necessário ser o ssuuppeerruussuuáárriioo para executar o ``clock'', ou qualquer outro programa que afete a hora do sistema ou o relógio da CMOS. 22..11.. VVeerriiffiiccaannddoo aa ssuuaa iinnssttaallaaççããoo Verifique nos seus arquivos de inicialização do sistema se há um comando parecido com ``clock -a'' ou ``clock -ua''. Dependendo da distribuição com que se está trabalhando, pode estar no arquivo /etc/rc.local, ou /etc/rc.d/rc.sysinit, ou em algum lugar similar. Se estiver dizendo ``clock -s'' ou ``clock -us'', mude o ``s'' para um ``a'', e então, verifique se há um arquivo /etc/adjtime, que contém uma única linha parecida com isso: 0.000000 842214901 0.000000 Estes números são o fator de correção ( em segundo por dia ), a hora que o relógio foi corrigido ( em segundos desde do dia 1 de Janeiro de 1970 ), e a fração de segundos que foi arredondada da última vez. Se este arquivo não existir, entre no sistema como ssuuppeerruussuuáárriioo e crie-o, com uma única linha como essa ( com todos os zeros ): 0.0 0 0.0 Depois execute ``clock -a'' ou ``clock -ua'' manualmente do interpretador de comandos ( shell ) para atualizar o segundo número ( use o parâmetro ``u'' se o seu relógio estiver configurado para hora Universal ao invés de local ). 22..22.. MMeeddiinnddoo aa ttaaxxaa ddee aalltteerraaççããoo ddoo sseeuu rreellóóggiioo Primeiramente é necessário saber que horas são :-). A sua hora local pode estar precisa ou não. Meu método favorito é chamar o serviço de hora certa pelo telefone 130. Se tiver acesso a um servidor de hora na rede, pode-se usar o programa ntpdate do pacote xntpd ( use o parâmetro -b para proteger o kernel da confusão com o relógio da CMOS ). De outra maneira, use ``date -s hh:mm:ss'' para configurar manualmente a hora do kernel, e depois execute ``clock -w'' para configurar o relógio da CMOS a partir do relógio do kernel. É necessário relembrar quando foi a última vez que o relógio foi configurado, então, escreva a data em algum lugar onde você não irá perder. Se foi usado o ntpdate, faça ``date +%s'' e escreva o número de segundos desde o dia 1 de Janeiro de 1970. Depois de alguns dias ou semanas, volte e veja o quanto o relógio foi alterado. Se estiver configurando o relógio manualmente, recomendo esperar pelo menos duas semanas, e somente calcular a taxa de alteração para o mais próximo de .1 seg/dia. Depois de alguns meses, o mais próximo de .01 seg/dia ( algumas pessoas exigem mais precisão do que isso, porém eu prefiro ser conservador ). Se você está usando o ntpdate, não espere todo esse tempo. Pode-se ter um cron executando um ``clock -a'' em intervalos regulares, para manter a hora do sistema alinhada com a hora ( corrigida ) da CMOS. Este comando também irá ser executado no seu arquivo de inicialização toda vez que você inicializar a máquina. Então, se você faz isso freqüentemente ( como alguns de nós ), isto será o suficiente para os seus propósitos. Observe que certos programas podem reclamar se a hora do sistema pula ou retrocede alguns segundos. Se houver este problema, pode-se usar o xntpd ou o ntpdate para corrigir a hora de forma mais gradual. 22..33.. EExxeemmpplloo 22..33..11.. PPaarraa ccoonnffiigguurraarr aa hhoorraa Entre no sistema como ssuuppeerruussuuáárriioo. Ligue para o 130 e escute atentamente. Digite: date -s hh:mm:ss mas não pressione enter até ouvir o bip ( após os segundos ). ( Pode- se usar o ``ntpdate'' ao invés do ``date'', e pular a parte da ligação para o 130 ). Isto configura a ``hora do kernel''. Digite então: clock -w Isto configura a hora da CMOS para se ajustar com a hora do kernel. Digite: date +%j ( ou ``date +%s'' se você usou o ``ntpdate'' ao invés do ``date'' acima ) e anote o número que ele fornece, para a próxima vez. 22..33..22.. IInniicciiaarr aa hhoorraa ee vveerriiffiiccaarr aa ttaaxxaa ddee aalltteerraaççããoo Ache a data que foi escrita pela última vez. Entre no sistema como ssuuppeerruussuuáárriioo Digite: clock -a Isto configura a hora do kernel para se ajustar com a hora atual da CMOS. Disque 130 e ouça a hora. Digite: date e pressione enter quando ouvir o bip ( do 130 ). Enquanto espera, anote a hora que foi dita, e não desligue o telefone. Isto diz a você qual era a hora que estava na sua máquina, quando deveria estar exatamente no minuto. Agora, digite date hh:mm:00 usando o minuto *sseegguuiinnttee* ao aquele que foi dito ( no 130 ), e pressione enter quando ouvir o bip de novo ( agora você pode desligar ). Para hh use a hora local. Isto configura a ``hora do kernel''. Digite: clock -w o qual escreve a nova hora (correta) para o relógio da CMOS. Digite: date +%j ( ou ``date +%s'' se foi este o comando utilizado anteriormente ) Agora você tem três números ( duas datas e uma hora ) que irão permitir o cálculo da taxa de alteração. 22..33..33.. CCaallccuullaannddoo oo ffaattoorr ddee ccoorrrreeççããoo No momento em que foi executado ``date'', sua máquina estava rápida ou lenta? Se estava rápida, será necessário subtrair alguns segundos, então, escreva isso como um número negativo. Se estava lenta, deve-se adicionar alguns segundos, então, escreva como um número positivo. Agora, subtraia as duas datas. Se foi usado ``date +%j'', os números representam o dia do ano ( 1- 365, ou 1-366 em alguns anos ). Se o dia 1 de Janeiro foi passado desde que a última mudança do relógio foi feita, então, será necessário adicionar 365 ( ou 366 ) ao segundo número. Se foi usado ``date +%s'', então, o numero é em segundos, e será necessário dividí-lo por 86400 para obter-se os dias. Se você já tem um fator de correção no arquivo /etc/adjtime, será necessário calcular o número de segundos que você já corrigiu. Se o fator de correção aumentou, este número terá o sinal oposto do medido; se diminuiu, ele terá o mesmo sinal do medido. Multiplique o antigo fator de correção pelo número de dias e, adicione o novo número de segundos ( adição com sinais -- se os dois número têm o mesmo sinal, será obtido um número maior, se os sinais forem opostos, o número será menor ). Divida então o número total de segundos pelo número de dias para obter o novo fator de correção, e coloque-o no arquivo /etc/adjtime substituindo o antigo valor. Anote a nova data ( em segundos ou dias ) para a próxima vez. Eis aqui como o meu arquivo /etc/adjtime se encontra: -9.600000 845082716 -0.250655 ( Observe que 9.6 segundos por dia é bem próximo de cinco minutos por mês! ) 33.. UUmm bbrreevvee ccoommeennttáárriioo ssoobbrree oo xxnnttppdd O seu sistema tem atualmente dois relógios -- o ``relógio de tempo real'' alimentado pela bateria, que mantém a hora mesmo quando o sistema é desligado ( também conhecido como o ``relógio da CMOS'', ``relógio do equipamento'' ou ``RTC'' ) e a ``hora do kernel'' ( algumas vezes chamada de ``relógio do programa'' ou ``relógio do sistema'' ), a qual é baseada na interrupção do marcador de tempo e é inicializada a partir do relógio da CMOS durante a inicialização. Os dois irão andar com diferentes taxas, então, eles irão gradualmente trabalharem separados um do outro, Todas as referências ao ``relógio'' na documentação do xntpd, se referem ao ``relógio do kernel''. Quando você executa o xntpd ou timed ( ou qualquer outro programa que usa a chamada de sistema do adjtimex ), o kernel do Linux assume que o relógio do kernel é mais preciso do que o da CMOS, e reinicializa a hora da CMOS a cada 11 minutos ( até que a máquina seja reiniciada ). Isto significa que o ``relógio'' não sabe mais quando é que o relógio da CMOS foi mudado pela última vez, de modo que você não pode usar o fator de correção no arquivo /etc/adjtime. Pode-se usar o ntpdate no arquivo de inicialização para ( inicialmente ) configurar o relógio a partir de um servidor de tempo antes de iniciar o xntpd. Se não é sempre que se tem acesso a uma fonte de tempo durante a inicialização da sua máquina, isto pode ser um pouco inadequado -- o xntpd realmente não foi feito para ser usado em situações como essa. Teoricamente, alguém poderia escrever um programa para usar um serviço de tempo e calcular automaticamente a taxa de alteração do relógios da CMOS e do kernel. Não conheço nenhum programa que faça isso, mas provavelmente a maioria do código será copiado do xntpd.