web-dev-qa-db-ja.com

TZ、日付、およびhwclockの正しい使用?

Buildrootで開発したカスタムボード用のARM/ulibc Linuxディストリビューションに取り組んでいます。の関係を理解し​​ようとしています

オンラインでいくつかの例を見たように、これを行うと:

# date --set "2013-04-09 15:06:30"
Tue Apr  9 15:06:30 CDT 2013
# hwclock --systohc --utc
# hwclock
Tue Apr  9 15:06:39 2013  -0.351552 seconds

そして再起動すると、私は得ます:

.... boot messages ...
... setting system clock to 2013-04-09 20:07:31 UTC (1365538051)
.... boot messages ...
#
# date; hwclock;
Tue Apr  9 15:08:24 CDT 2013
Tue Apr  9 15:08:25 2013  -0.473164 seconds
#
# date -u; hwclock -u;
Tue Apr  9 20:08:44 UTC 2013
Tue Apr  9 15:08:45 2013  -0.397120 seconds
#
# date; hwclock --localtime
Tue Apr  9 15:09:07 CDT 2013
Tue Apr  9 20:09:08 2013  -0.686601 seconds
#

それで、hwclockはlocaltime is UTCと考えているようです。そして、何らかの理由で、-u実際には適用代わりにタイムゾーン?私は少し混乱しています。誰もが私がこれについてどうすべきかを提案できますか?

編集: ARM + Busybox + uclibc、スリム化されたシステムであることに注意してください。sysconfigなどの一般的なディレクトリやファイルは多くありません。およびzoneinfo。

5
trycatch

--utcは、ハードウェアクロックがUTCを維持することをhwclockに通知し、--localtimeは、ハードウェアクロックがシステムクロックと同じタイムゾーンを維持することを示しています。 (より正確には、ハードウェアクロックは、システムクロックが現在行っているのと同じUTCへのオフセットを保持することを示しています。ハードウェアクロックは、DSTがアクティブかどうかを知らないことがよくあります。)これらのオプションは、システムクロックのタイムゾーンとは関係ありません。

理論的には、これはあなたが知る必要があるすべてのものを教えてくれます。実際には、これは混乱を招く可能性があります。

# date -u; hwclock -u;
Tue Apr  9 20:08:44 UTC 2013
Tue Apr  9 15:08:45 2013  -0.397120 seconds

「最初に、システム時刻をUTCで教えてください。次に、ハードウェアクロックがUTCを維持していると仮定すると、ローカルタイムゾーンの時刻は何ですか?」

# date; hwclock --localtime
Tue Apr  9 15:09:07 CDT 2013
Tue Apr  9 20:09:08 2013  -0.686601 seconds

「まず、ローカルタイムゾーンでのシステム時刻を教えてください。次に、ハードウェアクロックが現地時間を維持していると仮定すると、現地タイムゾーンの時間は何ですか?」

ほとんどのシステムでは、TZ環境変数を設定して、プロセスのタイムゾーンを設定できます。これはPOSIXの機能です。 BusyBoxはこれをサポートしており(コンパイル時にオフにするオプションは表示されません)、uClibcもそうです。クロック同期に取り組む場合、しばらくの間すべてをUTCで操作すると役立ちます。

export TZ=UTC0
date
hwclock

次のコマンドで時間情報を設定しました。

# setup local timezone
rm /etc/localtime
# setup for EDT and EST (+4 EDT; +5 EST)
ln -s /usr/share/zoneinfo/EST5EDT /etc/localtime
# setup for only EST (+5 EST)
#ln -s /usr/share/zoneinfo/EST /etc/localtime
# setup for only Daylight Saving Time
#ln -s /usr/share/zoneinfo/EDT /etc/localtime

rm /etc/timezone
echo "US/Eastern" > /etc/timezone
export TZ="/usr/share/zoneinfo/America/New_York"

注:このスクリプトがdate -u MMDDhhmmコマンドで実行された後、システム時計を設定します。電源を切った後、コンピューターの時刻がずれるので、アトミックウォッチを使用します。

0
Tom