Eu tenho uma pequena placa embutida (Jetson TX1) que roda o Ubuntu 14.04. A placa de suporte do chip é montada para não ter provisões para uma bateria de reserva ou supercap para que o relógio perca tempo sempre que estiver desconectado (e normalmente não haverá conexão à internet para configurá-lo dessa maneira). Eu tenho um módulo de relógio I2C alimentado por bateria que eu usei antes. O relógio requer um módulo do kernel que eu compilei e instalei com sucesso (adaptei as instruções encontradas em aqui para o TX1.) Depois que o sistema é totalmente inicializado, posso definir o relógio do sistema via:
$> echo ds3231 0x68 | sudo tee /sys/class/i2c-dev/i2c-1/device/new_device
$> sudo hwclock -s -f /dev/rtc2
que funciona muito bem. Eu gostaria de ter isso feito automaticamente na inicialização e parece upstart é a ferramenta certa. Na verdade, já existe uma tarefa /etc/init/hwclock.conf para fazer isso com o RTC embutido (ou seja, aquele que perde seu tempo, porque não tem bateria), então acho que posso apenas seqüestrá-lo. Seus conteúdos são:
# hwclock - adjust system clock and timezone
#
# The hwclock task adjusts the system clock when the hardware clock is
# set to localtime (e.g. when dual-booting with Windows), and also
# ensures that the system timezone is set so that timestamps are written
# to FAT devices.
description "adjust system clock and timezone"
start on starting mountall
task
script
. /etc/default/rcS
[ "$UTC" = "yes" ] && tz="--utc" || tz="--localtime"
[ "$BADYEAR" = "yes" ] && badyear="--badyear"
exec hwclock --systz $tz --noadjfile $badyear
end script
Eu mudei para:
start on starting mountall
task
script
/bin/echo "ds3231 0x68" > /sys/class/i2c-dev/i2c-1/device/new_device
/sbin/hwclock -sf /dev/rtc2
end script
mas ao reiniciar, a hora do sistema não está definida e se eu olhar em /var/logs/upstart/hwclock.log esta mensagem é dada:
hwclock: Cannot access the Hardware Clock via any known method
hwclock: Use the --debug option tosee the details of our search for an access method.
que para mim parece que está executando a tarefa antes que o módulo do kernel seja carregado. Eu tentei outros eventos como start on filesystem
e start on runlevel [2345]
sem sucesso. no entanto, após o arranque do sistema, posso escrever apenas sudo hwclock -sf /dev/rtc2
e funciona.
ATUALIZAÇÃO: Eu apenas tentei o evento start on runlevel [23456]
e isso realmente parece funcionar. Não sei por que adicionar o 6 aos runlevels faz com que funcione, já que pensei que o nível 6 fosse para reinicializar? Este é o melhor evento ou há um melhor para garantir que o relógio seja ajustado de forma confiável?