HARDWARECLOCK="localtime" does not work when TIMEZONE is unset
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 67/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- linux, shell
- Bereich
- operating-systems
Rechercherichtung
Beginne mit /etc/runit/core-services/03-console-setup.sh und untersuche, wie das Skript TIMEZONE an hwclock übergibt, wenn die Variable nicht gesetzt ist. Vergleiche das Verhalten mit den gemeldeten Reproduktionen mit leerem TZ und gültigem TZ und überprüfe anschließend die RTC- und Systemzeitbehandlung mit HARDWARECLOCK="localtime" und ohne konfiguriertes TIMEZONE.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
TZ=$TIMEZONE prevents HARDWARECLOCK="localtime" from working correctly
Environment
I am using a dual-boot system with Windows and Void Linux.
Windows treats the hardware RTC as local time, while Void Linux defaults to treating the RTC as UTC. Since I am using the Asia/Shanghai timezone (UTC+8), this causes an 8-hour time difference when switching between the two operating systems.
This is a common issue with Windows/Linux dual-boot systems. The Void Linux documentation documents the HARDWARECLOCK option and states that it can be set to localtime when the RTC stores local time.
Following the documentation, I configured /etc/rc.conf as follows:
...
# Set RTC to UTC or localtime.
HARDWARECLOCK="localtime"
# Set timezone, availables timezones can be found at /usr/share/zoneinfo.
#
# NOTE: it's preferred to set the timezone in /etc/localtime instead:
# - ln -sf /usr/share/zoneinfo/<timezone> /etc/localtime
# Setting the timezone here requires a reboot to apply any changes/fixes
# and read-write access to the filesystem.
#
#TIMEZONE="Europe/Madrid"
...
However, the system does not behave as expected.
Expected behavior
With:
HARDWARECLOCK="localtime"
the RTC should be interpreted as local time without applying an additional timezone offset.
Therefore, hwclock --localtime and date should report approximately the same time:
$ sudo hwclock --localtime
2026-10-06 14:07:27.608389+08:00
$ date
Tue Oct 6 14:07:32 CST 2026
Actual behavior
Instead, the system applies an additional timezone offset to the RTC:
$ sudo hwclock --localtime
2026-10-06 14:14:30.649538+08:00
$ date
Tue Oct 6 22:14:35 CST 2026
The result is an 8-hour difference.
Investigation
I traced the boot process and found the following code in /etc/runit/core-services/03-console-setup.sh:
if [ -n "$HARDWARECLOCK" ]; then
msg "Setting up RTC to '${HARDWARECLOCK}'..."
TZ=$TIMEZONE hwclock --systz \
${HARDWARECLOCK:+--$(echo $HARDWARECLOCK |tr A-Z a-z) --noadjfile} || emergency_shell
fi
When I set:
HARDWARECLOCK="localtime"
the command effectively becomes:
TZ=$TIMEZONE hwclock --systz --localtime --noadjfile
The problem appears to be that TIMEZONE is normally not set in /etc/rc.conf. In that case, the command is executed with an empty TZ environment variable:
TZ= hwclock --systz --localtime --noadjfile
With an empty or invalid TZ, hwclock --systz appears to behave differently and applies a timezone offset even though --localtime was explicitly specified.
As a workaround, I have to manually set TIMEZONE in /etc/rc.conf:
...
# Set RTC to UTC or localtime.
HARDWARECLOCK="localtime"
# Set timezone, availables timezones can be found at /usr/share/zoneinfo.
#
# NOTE: it's preferred to set the timezone in /etc/localtime instead:
# - ln -sf /usr/share/zoneinfo/<timezone> /etc/localtime
# Setting the timezone here requires a reboot to apply any changes/fixes
# and read-write access to the filesystem.
TIMEZONE="Asia/Shanghai"
...
After setting TIMEZONE, the command becomes:
TZ=Asia/Shanghai hwclock --systz --localtime --noadjfile
and the RTC is handled as expected.
Minimal reproduction
1. System-level reproduction
-
Edit
/etc/rc.conf. -
Set:
HARDWARECLOCK="localtime" -
Do not set
TIMEZONE. -
Reboot.
-
Compare:
hwclock --localtime date
On a system using a non-UTC timezone, the two commands show a timezone offset.
If TIMEZONE is explicitly set to a valid timezone, for example:
TIMEZONE="Asia/Shanghai"
the problem does not occur.
2. hwclock reproduction
First, check the RTC time:
hwclock --localtime
Then run:
TZ=Asia/Shanghai hwclock --hctosys --localtime
With a valid TZ, hwclock --hctosys --localtime sets the system time directly from the RTC without applying an additional offset.
However, when TZ is empty:
TZ= hwclock --hctosys --localtime
hwclock still applies a timezone offset despite --localtime being explicitly specified.
This behavior can be reproduced with an empty or otherwise invalid TZ value.
Question
I am not sure whether this is a bug in the Void Linux startup script or expected behavior of hwclock from util-linux.
A possible workaround in the Void Linux startup script might be to only set TZ when $TIMEZONE is non-empty, rather than unconditionally using:
TZ=$TIMEZONE hwclock ...
Additional information
$ hwclock -v
hwclock from util-linux 2.41.4
System Time: 1791268704.280299
- Vorherrschende Sprache
- C
- Sterne
- 247
- Forks
- 67
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus void-linux/void-runit
-
udev device permission race conditionEvtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
void-linux/void-runit#135 · 10 Kommentare ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 25/100
void-linux/void-runit#127 ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 25/100
void-linux/void-runit#125 · 4 Kommentare ·
-
key file and source not passed to keyscriptEvtl. vergeben @shaohme hat das vor 850 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 35/100
void-linux/void-runit#120 ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 20/100
void-linux/void-runit#119 · 7 Kommentare ·
Alle Issues in void-linux/void-runit
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 68/100
JustAResearcher/gpu-unlock-ada#110 ·
Maintainer antworten meist innerhalb von 1 Tag
-
documentation hygiene
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 1 Tag
-
documentation
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 75/100
Maintainer antworten meist innerhalb von 1 Tag