108.1 Lição 1
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
108 Serviços essenciais do sistema |
Objetivo: |
108.1 Controlar a hora do sistema |
Lição: |
1 de 2 |
Introdução
Na computação moderna, é essencial manter um controle preciso do tempo. A implementação desse controle, no entanto, é surpreendentemente complexa. A prática de controlar a hora parece trivial para o usuário final, mas o sistema precisa ser capaz de lidar com muitas idiossincrasias e casos extremos de forma inteligente. É preciso levar em conta o fato de que os fusos horários não são estáticos, mas podem ser alterados por uma decisão administrativa ou política. Um país pode optar por acabar com o horário de verão. Qualquer programa deve ser capaz de lidar com essas mudanças de uma maneira lógica. Felizmente para os administradores de sistema, as soluções para o controle de data e hora no sistema operacional Linux são maduras, robustas e geralmente funcionam sem muita interferência.
Quando um computador Linux é inicializado, ele começa a marcar o tempo. Nós nos referimos a isso como o relógio do sistema, uma vez que é atualizado pelo sistema operacional. Além disso, os computadores modernos também têm um relógio de hardware ou de tempo real. Esse relógio de hardware é um recurso da placa-mãe que marca o tempo, esteja o computador funcionando ou não. Durante a inicialização, a hora do sistema é definida a partir do relógio de hardware, mas na maioria das vezes esses dois relógios funcionam independentemente um do outro. Nesta lição, discutiremos os métodos de interação com o relógio do sistema e o do hardware.
Na maioria dos sistemas Linux modernos, a hora do sistema e a hora do hardware são sincronizadas com a hora da rede, implementada pelo Network Time Protocol (NTP). Na grande maioria dos casos, a única configuração que um usuário normal precisa fazer é definir seu fuso horário; o NTP cuida do resto. No entanto, falaremos de algumas maneiras de ajustar a hora manualmente. Pontos específicos da configuração da hora da rede serão abordados na próxima lição.
Hora local e hora universal
O relógio do sistema está configurado para o Tempo Universal Coordenado (UTC), que é a hora local de Greenwich, Reino Unido. Normalmente, um usuário deseja saber sua hora local. A hora local é calculada tomando-se a hora UTC e aplicando um deslocamento com base no fuso horário e no horário de verão. Desta forma, evitam-se muitos cálculos complexos.
O relógio do sistema pode ser definido para a hora UTC ou local, mas é recomendável que também seja definido para a hora UTC.
Date
date
é um utilitário nativo que simplesmente imprime a hora local:
$ date Sun Nov 17 12:55:06 EST 2019
Se modificarmos as opções do comando date
, mudamos o formato da saída.
Por exemplo, date -u
serve para exibir o horário UTC atual.
$ date -u Sun Nov 17 18:02:51 UTC 2019
Outras opções comumente usadas retornam a hora local em um formato RFC aceito:
-I
-
Data/hora no formato ISO 8601. Anexar
date
(-Idate
) limita a saída apenas à data. Outros formatos sãohours
,minutes
,seconds
ens
(para nanossegundos). -R
-
Retorna data e hora no formato RFC 5322.
--rfc-3339
-
Retorna data e hora no formato RFC 3339.
O formato de date
pode ser personalizado pelo usuário com as sequências especificadas na página de manual. Por exemplo, a hora atual pode ser formatada como tempo do Unix da seguinte maneira:
$ date +%s 1574014515
Na página de manual de date
, podemos ver que %s
se refere ao tempo do Unix.
O tempo do Unix é usado internamente na maioria dos sistemas baseados em Unix. Ele armazena a hora UTC como o número de segundos desde a Época, que foi definida como 1º de janeiro de 1970.
Note
|
O número de bits necessários para armazenar a hora Unix no momento atual é de 32 bits. No futuro, 32 bits se tornarão insuficientes para conter a hora atual no formato Unix. Isso causará problemas sérios para qualquer sistema Linux de 32 bits. Felizmente, isso não ocorrerá até 19 de janeiro de 2038. |
Usando essas sequências, podemos formatar a data e a hora em quase todos os formatos exigidos por qualquer aplicativo. Claro, na maioria dos casos é preferível seguir um padrão aceito.
Além disso, date --date
pode ser usado para formatar um horário que não seja a hora atual. Neste caso, um usuário pode especificar a data a ser aplicada ao sistema usando o tempo do Unix, por exemplo:
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
A opção --debug
é muito útil para garantir que uma data possa ser analisada com sucesso. Observe o que acontece ao passarmos uma data válida para o comando:
$ date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500" date: parsed day part: Fri (day ordinal=0 number=5) date: parsed date part: (Y-M-D) 2020-01-03 date: parsed time part: 14:00:17 UTC-05 date: input timezone: parsed date/time string (-05) date: using specified time as starting value: '14:00:17' date: warning: day (Fri) ignored when explicit dates are given date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds date: timezone: system default date: final: 1578078017.000000000 (epoch-seconds) date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC) date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)
Essa é uma ferramenta útil para a resolução de problemas em um aplicativo que gera uma data.
Relógio do hardware
O comando hwclock
exibe a hora mantida no relógio de tempo real. Este comando exige privilégios elevados; portanto, usamos sudo
para chamar o comando neste caso:
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
A opção --verbose
retorna mais resultados, que podem ser úteis para solucionar problemas:
$ sudo hwclock --verbose hwclock from util-linux 2.34 System Time: 1578079387.976029 Trying to open: /dev/rtc0 Using the rtc interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2020/01/03 19:23:08 Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969 Time since last adjustment is 1578079388 seconds Calculated Hardware Clock drift is 0.000000 seconds 2020-01-03 14:23:07.948436-05:00
Observe o Calculated Hardware Clock drift
. Esta saída informa se a hora do sistema e a hora do hardware estão divergindo uma da outra.
timedatectl
timedatectl
é um comando que pode ser usado para verificar o status geral de hora e data, incluindo se a hora da rede foi ou não sincronizada (na próxima lição, trataremos do Network Time Protocol).
Por padrão, timedatectl
retorna informações semelhantes a date
, mas com a adição da hora RTC (hardware), bem como o status do serviço NTP:
$ timedatectl Local time: Thu 2019-12-05 11:08:05 EST Universal time: Thu 2019-12-05 16:08:05 UTC RTC time: Thu 2019-12-05 16:08:05 Time zone: America/Toronto (EST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Configurando a hora com timedatectl
Se o NTP não estiver disponível, recomenda-se usar timedatectl
em vez de date
ou hwclock
para definir a hora:
# timedatectl set-time '2011-11-25 14:00:00'
O processo é semelhante ao de date
. O usuário também pode definir a hora independentemente da data com o formato HH:MM:SS.
Definindo o fuso horário com timedatectl
timedatectl
é a melhor maneira de configurar o fuso horário local nos sistemas Linux baseados em systemd
quando não existe GUI. timedatectl
lista os fusos horários possíveis e, a partir daí, o fuso horário pode ser definido usando um deles como argumento.
Primeiro, listamos os fusos horários possíveis:
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
A lista de fusos horários possíveis é longa, por isso o uso do comando grep
é recomendado neste caso.
Em seguida, podemos definir o fuso horário usando um dos elementos da lista retornada:
$ timedatectl set-timezone Africa/Cairo $ timedatectl Local time: Thu 2019-12-05 18:18:10 EET Universal time: Thu 2019-12-05 16:18:10 UTC RTC time: Thu 2019-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
Lembre-se de que o nome do fuso horário deve ser exato. Africa/Cairo
, por exemplo, muda o fuso horário, mas cairo
ou africa/cairo
não.
Desativando o NTP com timedatectl
Em alguns casos, pode ser necessário desativar o NTP. Podemos fazer isso com systemctl
, mas vamos demonstrar o procedimento com timedatectl
:
# timedatectl set-ntp no $ timedatectl Local time: Thu 2019-12-05 18:19:04 EET Universal time: Thu 2019-12-05 16:19:04 UTC RTC time: Thu 2019-12-05 16:19:04 Time zone: Africa/Cairo (EET, +0200) NTP enabled: no NTP synchronized: no RTC in local TZ: no DST active: n/a
Definindo o fuso horário sem timedatectl
A definição do fuso horário é uma etapa padrão ao se instalar o Linux em uma nova máquina. Se houver um processo de instalação gráfico, isso provavelmente será feito sem nenhuma ação adicional do usuário.
O diretório /usr/share/zoneinfo
contém informações sobre os diferentes fusos horários possíveis. No diretório zoneinfo
, há subdiretórios com o nome dos continentes, bem como outros links simbólicos. Recomenda-se encontrar o zoneinfo
da sua região começando por seu continente.
Os arquivos zoneinfo
contêm as regras necessárias para calcular a diferença de horário local em relação a UTC e também são importantes se a sua região segue o horário de verão. O conteúdo de /etc/localtime
será lido quando o Linux precisar determinar o fuso horário local. Para definir o fuso horário sem o uso de uma GUI, o usuário deve criar um link simbólico de /usr/share/zoneinfo
para /etc/localtime
informando sua localização. Por exemplo:
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
Depois de definir o fuso horário correto, recomenda-se executar:
# hwclock --systohc
Isso configurará o relógio do hardware a partir do relógio do sistema (ou seja, o relógio em tempo real será configurado para a mesma hora que date
). Note que este comando é executado com privilégios de root; neste caso, você está logado como root.
/etc/timezone
é semelhante a /etc/localtime
. É uma representação de dados do fuso horário local e, como tal, pode ser lido usando cat
:
$ cat /etc/timezone America/Toronto
Observe que este arquivo não é usado por todas as distribuições Linux.
Configurando data e hora sem timedatectl
Note
|
A maioria dos sistemas Linux modernos usa o |
Usando date
date
tem uma opção para definir a hora do sistema. Use --set
ou -s
para definir a data e hora. Também há a opção --debug
para verificar a análise correta do comando:
# date --set="11 Nov 2011 11:11:11"
Neste caso, é necessário ter privilégios de root para definir a data. Também podemos optar por alterar a hora ou data independentemente:
# date +%Y%m%d -s "20111125"
Aqui, devemos especificar as sequências para que nossa string seja analisada corretamente. Por exemplo, %Y
refere-se ao ano e, portanto, os primeiros quatro dígitos 2011
serão interpretados como o ano de 2011. Da mesma forma, %T
é a sequência de hora, como demonstrado aqui ao definirmos a hora:
# date +%T -s "13:11:00"
Depois de alterar a hora do sistema, é recomendável também definir o relógio do hardware para que os relógios do sistema e do hardware estejam sincronizados:
# hwclock --systohc
systohc
significa “relógio do sistema para relógio do hardware”.
Usando hwclock
Em vez de definir o relógio do sistema e atualizar o relógio do hardware, podemos optar por reverter o processo. Começaremos ajustando o relógio do hardware:
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Note que, por padrão, hwclock
espera a hora UTC, mas retorna a hora local.
Depois de configurar o relógio do hardware, precisamos atualizar o relógio do sistema a partir dele. hctosys
pode ser interpretado como “relógio do hardware para relógio do sistema”.
# hwclock --hctosys
Exercícios Guiados
-
Indique se os comandos a seguir estão exibindo ou modificando a hora do sistema ou a hora do hardware:
Comando(s) Sistema Hardware Ambos date -u
hwclock --set --date "12:00:00"
timedatectl
timedatectl | grep RTC
hwclock --hctosys
date +%T -s "08:00:00"
timedatectl set-time 1980-01-10
-
Observe a seguinte saída e, em seguida, corrija o formato do argumento para que o comando seja bem-sucedido:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
-
Use o comando
date
e as sequências para que o mês do sistema seja definido como fevereiro. Deixe o resto da data e hora inalterados. -
Pressupondo que o comando acima foi bem-sucedido, use
hwclock
para ajustar o relógio do hardware a partir do relógio do sistema. -
Existe um local chamado
eucla
. De que continente ele faz parte? Use o comandogrep
para descobrir. -
Defina seu fuso horário atual para
eucla
.
Exercícios Exploratórios
-
Qual método de configuração de hora é o ideal? Em que caso o método preferido seria impraticável?
-
Por que você acha que existem tantos métodos para realizar a mesma coisa, ou seja, definir a hora do sistema?
-
Após 19 de janeiro de 2038, o Tempo do Linux exigirá um número de 64 bits para ser armazenado. No entanto, poderíamos simplesmente ter optado por definir uma “Nova Época”. Por exemplo, 1º de janeiro de 2038 à meia-noite pode ser definido como a Hora
0
de uma Nova Época. Por que você acha que esta solução não foi adotada?
Resumo
Nesta lição, você aprendeu:
-
Como exibir a hora em diferentes formatos a partir da linha de comando.
-
A diferença entre o relógio do sistema e o relógio do hardware no Linux.
-
Como ajustar manualmente o relógio do sistema.
-
Como ajustar manualmente o relógio do hardware.
-
Como alterar o fuso horário do sistema.
Comandos usados nesta lição:
date
-
Exibe ou altera o relógio do sistema. Outras opções:
-u
-
Exibe a hora UTC.
+%s
-
Usa uma sequência para exibir a hora da Época.
--date=
-
Determina uma hora específica a exibir, sem ser a hora atual.
--debug
-
Exibe mensagens de depuração ao analisar uma data inserida pelo usuário.
-s
-
Ajusta o relógio do sistema manualmente.
hwclock
-
Exibe ou altera o relógio do hardware.
--systohc
-
Usa o relógio do sistema para definir o relógio do hardware.
--hctosys
-
Usa o relógio do hardware para definir o relógio do sistema.
--set --date
-
Ajusta o relógio do hardware manualmente.
timedatectl
-
Exibe os relógios do sistema e do hardware, bem como a configuração NTP em sistemas Linux baseados em systemd.
set-time
-
Define a hora manualmente.
list-timezones
-
Lista os fusos horários possíveis.
set-timezone
-
Define o fuso horário manualmente.
set-ntp
-
Ativa/desativa o NTP.
Respostas aos Exercícios Guiados
-
Indique se os comandos a seguir estão exibindo ou modificando a hora do sistema ou a hora do hardware:
Comando(s) Sistema Hardware Ambos date -u
X
hwclock --set --date "12:00:00"
X
timedatectl
X
timedatectl | grep RTC
X
hwclock --hctosys
X
date +%T -s "08:00:00"
X
timedatectl set-time 1980-01-10
X
-
Observe a seguinte saída e, em seguida, corrija o formato do argumento para que o comando seja bem-sucedido:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
date --debug --set "12/20/20 0:10 -3"
-
Use o comando
date
e as sequências para que o mês do sistema seja definido como fevereiro. Deixe o resto da data e hora inalterados.date +%m -s "2"
-
Pressupondo que o comando acima foi bem-sucedido, use
hwclock
para ajustar o relógio do hardware a partir do relógio do sistema.hwclock -systohc
-
Existe um local chamado
eucla
. De que continente ele faz parte? Use o comandogrep
para descobrir.timedatectl list-timezones \| grep -i eucla
OU
grep -ri eucla /usr/share/zoneinfo
-
Defina seu fuso horário atual para
eucla
.timedatectl set-timezone 'Australia/Eucla'
ou
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Respostas aos Exercícios Exploratórios
-
Qual método de configuração de hora é o ideal? Em que caso o método preferido seria impraticável?
Na maioria das distribuições Linux, o NTP vem habilitado por padrão e define a hora do sistema sem interferência do usuário. No entanto, se um sistema Linux não estiver conectado à internet, o NTP ficará inacessível. Por exemplo, um sistema Linux embarcado rodando em um equipamento industrial pode não ter conectividade de rede.
-
Por que você acha que existem tantos métodos para realizar a mesma coisa, ou seja, definir a hora do sistema?
Como a configuração da hora tem sido um requisito de todos os sistemas *nix por décadas, existem muitos métodos legados para fazer essa configuração e que ainda são mantidos.
-
Após 19 de janeiro de 2038, o Tempo do Linux exigirá um número de 64 bits para ser armazenado. No entanto, poderíamos simplesmente ter optado por definir uma “Nova Época”. Por exemplo, 1º de janeiro de 2038 à meia-noite pode ser definido como a Hora
0
de uma Nova Época. Por que você acha que esta solução não foi adotada?Até 2038, a grande maioria dos computadores já estará equipado de CPUs de 64 bits, e usar um número de 64 bits não degradará o desempenho de forma significativa. No entanto, seria impossível estimar os riscos de “reiniciar” o tempo da Época dessa maneira. Muitos softwares legados poderiam ser afetados. Os bancos e grandes empresas, por exemplo, costumam ter uma grande quantidade de programas antigos dos quais dependem para uso interno. Portanto, esse cenário, como tantos outros, exigia que se encontrasse um meio-termo. Qualquer sistema de 32 bits ainda em execução em 2038 sofreria com o estouro do Tempo da Época, mas o software legado seria impactado pela alteração do valor da Época.