Estou executando o Debian Stretch e o kernel Linux versão 4.9.110-3+deb9u4, com uma configuração modificada. Estou observando o seguinte comportamento estranho
- Defina o relógio do hardware para
2016-01-01 00:00:00 UTC
- Reinício
dmesg
relata a leitura do relógio do hardware semelhante ao que foi definido anteriormentedate
relatórios2016-11-03 17:16:42 UTC
O comportamento acima é observado com qualquer data anterior 2016-11-03 17:00:00 UTC
. Não reduzi mais do que isso.
O código-fonte do kernel não foi alterado, nem estou executando nenhum módulo de kernel personalizado. Eu também observei isso usando o kernel 4.9.168 dos repositórios Debian, bem como o kernel 4.19.37 de stretch-backports. Também consegui reproduzir isso em um droplet da DigitalOcean executando Stretch e 4.9.168.
Não vi esse problema ocorrer quando defino uma data após 2016-11-03. Não parece provável, mas parece que o kernel está forçando alguma data mínima.
Alguém tem uma pista sobre isso?
Logs da minha VM:
root@debian-vm:~# timedatectl
Local time: Thu 2016-11-03 17:17:02 UTC
Universal time: Thu 2016-11-03 17:17:02 UTC
RTC time: Fri 2016-01-01 00:29:00
Time zone: Etc/UTC (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no
root@debian-vm:~# dmesg | grep rtc
[ 0.985653] rtc_cmos 00:01: registered as rtc0
[ 0.985670] rtc_cmos 00:01: alarms up to one month, y3k, 114 bytes nvram, hpet irqs
[ 1.032409] rtc_cmos 00:01: setting system clock to 2016-01-01 00:28:37 UTC (1451608117)
Logs de um droplet da DigitalOcean:
root@debian-s-1vcpu-1gb-sfo2-01:~# timedatectl
Local time: Thu 2016-11-03 17:17:05 UTC
Universal time: Thu 2016-11-03 17:17:05 UTC
RTC time: Fri 2016-01-01 00:00:46
Time zone: Etc/UTC (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no
Acontece que isso não está no kernel do Linux, mas no systemd. O utilitário systemd clock tem um valor mínimo de clock definido no tempo de compilação e, se a hora lida no RTC for anterior a esse horário, ele forçará o relógio do sistema a esse horário mínimo. Esse "tempo mínimo" pode ser especificado pelo sistema de compilação do Meson ou é lido a partir do momento de criação do arquivo NEWS no ambiente de compilação.
Os logs a seguir mostram que o relógio está sendo avançado pelo systemd, além de exibir o valor mínimo do relógio.
Você pode ver o código-fonte do systemd que verifica o clock mínimo aqui