here is a proof of concept code snippet (untested yet) we could put in initramfs to work around the issue ...
#!/bin/sh
#
# use the fixrtc cmdline option in your bootloader to
# automatically set the hardware clock to the date of
# the last mount of your root filesystem to avoid fsck
# to get confused by the superblock being in the future
BROKEN_CLOCK=""
for x in $(cat /proc/cmdline); do
case ${x} in
root=*)
UUID=${x#*=}
UUID="${UUID#*=}"
;;
fixrtc)
BROKEN_CLOCK=1
;;
esac
done
if [ -n $BROKEN_CLOCK ];then
ROOTDISK=$(readlink -f /dev/disk/by-uuid/$UUID)
TIMESTR=$(dumpe2fs -h $ROOTDISK 2>/dev/null|grep "Last mount time")
TIME=${TIMESTR#*:}
here is a proof of concept code snippet (untested yet) we could put in initramfs to work around the issue ...
#!/bin/sh
#
# use the fixrtc cmdline option in your bootloader to
# automatically set the hardware clock to the date of
# the last mount of your root filesystem to avoid fsck
# to get confused by the superblock being in the future
BROKEN_CLOCK=""
for x in $(cat /proc/cmdline); do
case ${x} in
root=*)
UUID=${x#*=}
UUID="${UUID#*=}"
;;
fixrtc)
BROKEN_CLOCK=1
;;
esac
done
if [ -n $BROKEN_CLOCK ];then $(readlink -f /dev/disk/ by-uuid/ $UUID)
ROOTDISK=
TIMESTR=$(dumpe2fs -h $ROOTDISK 2>/dev/null|grep "Last mount time")
TIME=${TIMESTR#*:}
DISKYEAR=$(date -d "${TIME}" +%Y)
CLOCKYEAR=$(date +%Y)
if [ $DISKYEAR -gt $CLOCKYEAR ]; then
hwclock --set --date="${TIME}"
fi
fi