Linux基礎命令---hwclock

一生有你llx發表於2018-10-22

hwclock  

hwclock 是一種訪問硬體時鐘的工具,可以顯示當前時間,將硬體時鐘設定為指定的時間,將硬體時鐘設定為系統時間,以及從硬體時鐘設定系統時間。您還可以定期執行hwlock以插入或刪除硬體時鐘中的時間,以補償系統漂移(如果繼續執行,則該時鐘始終以一定的速率獲得或丟失時間)。

該命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。  

 

1 、語法

hwclock [functions]  [options]

 

2 、選項列表

下面的選項告訴hwclock指令該執行那個函式

選項

說明

-r | --show

讀取硬體時鐘並在標準輸出上列印時間。顯示的時間總是本地時間,即使您將硬體時鐘保持在協調的世界時間。請參見-UTC選項。

--set

將硬體時鐘設定為-date選項指定的時間

-s | --hctosys

從硬體時鐘設定系統時間。

還將核心的時區值設定為由TZ環境變數和/或/usr/share/zoneinfo指示的本地時區,正如tzset(3)所解釋的那樣。核心時區值的過時的tz_dsttime欄位被設定為DST_NONE。(有關此欄位過去的含義的詳細資訊,請參閱日期的settimeofday(2)。

這是在系統啟動指令碼中使用的一個很好的選項

-w | --systohc

將硬體時鐘設定為當前的系統時間

--systz

根據當前時區設定核心的時區並重置系統時間,系統時間僅在啟動後的第一次呼叫時重置。

本地時區被認為是TZ環境變數和/或/usr/share/zoneinfo所指示的,tzset(3)將解釋它們。核心時區值的過時tz_dsttime欄位設定為DST_NONE。(有關此欄位過去的含義的詳細資訊,請參閱日期的settimeofday(2)。

這是-hctosys的另一個選項,它不讀取硬體時鐘,並且可以在最近2.6核心的系統啟動指令碼中使用,因為您知道系統時間包含硬體時鐘時間。如果硬體時鐘已經在協調時,則不會重置。

--adjust

從硬體時鐘中增加或減去時間,以說明自上次時鐘設定或調整以來的系統漂移。請參閱下面的討論

--getepoch

將核心的硬體時鐘時紀元列印到標準輸出。這是在AD中引用硬體時鐘中的零年值的年份數。正在使用的約定是,硬體時鐘中的年份計數器包含1952年以來的完整年份數,然後是核心的硬體計數器時代值必須是1952年。

每當hwlock讀取或設定硬體時鐘時,就會使用這個紀元值。 epoch只有在Alpha機器上有。

--setepoch

將核心的硬體時鐘紀元值設定為--epoch選項指定的值。

-v | --version

在標準輸出上顯示hwclock的版本

--date=date_string

如果指定-set選項,則需要此選項。否則,將忽略該選項。這將指定設定硬體時鐘的時間。選項是date指令的引數。例如:hwclock --set --date="9/22/96 16:45:05"

引數在本地時間,即使您將硬體時鐘保持在協調的世界時間。請參見-UTC選項。

--epoch=year

指定硬體時鐘時代開始的年份,即在AD中,硬體時鐘的年份計數器中的零值所指的進入AD的年份數。它與-setepoch選項一起使用,以設定核心的硬體時鐘時代概念,或者指定用於直接ISA訪問的時代。例如:

hwclock --setepoch --epoch=1952

下面的選項配合函式使用

選項

說明

-u | --utc | --localtime

指示硬體時鐘分別保持在協調的世界時間或本地時間。您可以選擇是否將時鐘保持在協調世界協調時或本地時間,但時鐘中沒有顯示任何資訊。這是你所選擇的,所以這個選項就是你如何將資訊提供給時鐘。

如果您指定了這些選項中的一個錯誤的(或者沒有指定,並且選擇了錯誤的預設值),那麼硬體時鐘的設定和查詢都將被搞砸。

如果您沒有指定-utc或-localtime,則預設值以最後一次使用hwlock設定時鐘時指定的值為準(即,hwlock成功地使用-set、-system ohc或-調整器選項執行),如adjtime檔案中所記錄的。如果adjtime檔案不存在,則預設值為本地時間。

--noadjfile

禁用/etc/adjtime.hwlock提供的工具,不使用此選項讀取或寫入該檔案。在使用此選項時,必須指定-UTC和--localtime

--adjfile=ilename

覆蓋預設的/etc/adjtime檔案

-f | --rtc=filename

重寫預設/dev檔名,在許多平臺上為/dev/rtc,但可能是/dev/rtc0、/dev/rtc1,等等。

--directisa

只有在ISA機器或Alpha上才有意義(粗略地說,它實現了足夠多的ISA機器來實現hwlock的目的)。對於其他機器,它沒有作用。這個選項告訴hwlock使用顯式I/O指令來訪問硬體時鐘。如果沒有這個選項,hwlock就會嘗試。若要使用/dev/rtc裝置(假定它由RTC裝置驅動程式驅動),如果它無法開啟裝置(用於讀取),它將使用顯式I/O指令。

--badyear

表示硬體時鐘無法儲存超出1994-1999年範圍的年份。在一些BIOSes(幾乎所有在4/26/94至5/31/95之間製造的BIOSes)中都存在一個問題,在這些BIOSes中,它們無法處理1999年之後的年份。如果試圖將世紀價值設定為小於94(或95 in)的值。在某些情況下,實際設定的值為94(或95),因此,如果您有這些機器中的一臺,則hwlock不能在1999年之後設定,也不能以正常的方式使用時鐘的值作為真正的時間。

為了彌補這一點(沒有BIOS更新,這肯定更好),請始終使用-如果您有這些機器中的一臺,就使用-壞年份。在adjtime檔案中假設日期是過去一年內的日期。要想讓它發揮作用,你最好每年至少執行一次hwclock --set或hwlock –systohc。

雖然hwlock在讀取硬體時鐘時忽略了年份值,但當它設定時鐘時,它會設定年份值,將其設定為1995、1996、1997或1998,無論哪個年份在閏年週期中所處的位置與真正的年份相同。這樣,硬體時鐘就會插入。如果你讓硬體時鐘在沒有設定的情況下執行一年以上,這個方案可能會失敗,最後你可能會損失一天。

--srm

此選項等價於--epoch=1900,用於使用srm控制檯指定alphad上最常見的歷元。

--arc

此選項等價於--epoch=1980,用於使用ARC控制檯指定ALPHS上最常見的歷次(但Ruffans有1900年)。

--jensen | --funky-toy

這兩個選項指定了您擁有的Alpha機器的型別。如果您沒有Alpha,則它們是無效的,如果有,它們通常是不必要的,因為hwlock應該能夠自行確定執行在什麼上,至少在安裝/proc時是這樣的。(如果您發現您需要這些選項之一使hwlock工作,請與維護人員聯絡,看看程式是否可以改進以自動檢測您的系統。‘hwlock --debug’和‘cat/proc/cpuinfo’的輸出可能會引起人們的興趣。)

--jensen 代表執行在Jensen模式。

--funky-toy 意味著在您的機器上,必須使用UF位而不是硬體時鐘中的UIP位來檢測時間轉換。選項名中的“toy”是指機器一年中的時間

--test

測試程式,不改變任何設定

--debug

顯示大量關於hwlock內部正在做什麼的資訊,其中一些功能是複雜的,這個輸出可以幫助您理解程式是如何工作的。

 

3 、說明

一般在作業系統中都會有兩個時鐘,硬體時鐘是主機板上的定時器時鐘,系統時鐘是系統的核心時鐘,它們相互不影響。

1 )硬體時鐘

這個時鐘,執行獨立於任何控制程式執行在CPU中,甚至當機器關閉。在ISA系統中,這個時鐘被指定為ISA標準的一部分。控制程式可以讀取或設定這個時鐘為整秒,但控制程式也可以檢測1秒時鐘的邊緣,因此該時鐘實際上具有無限的精度。

這種時鐘通常被稱為硬體時鐘、實時時鐘、RTC、BIOS時鐘和CMOS時鐘。硬體時鐘以其大寫的形式被hwlock所發明,因為其他所有的名稱都不適合誤導。例如,一些非ISA系統有幾個實時時鐘。一個非常低功耗的I2C或SPI時鐘晶片可以與備用電池一起作為硬體時鐘,以初始化一個功能更好的整合實時時鐘,用於大多數其他用途。

2 )系統時鐘

這是由Linux核心內的時鐘保持的時間,由計時器中斷驅動。(在ISA機器上,計時器中斷是ISA標準的一部分)。它只有在linux在機器上執行時才有意義。系統時間是從1970年世界協調時(UTC)1月1日00:00開始的秒數(或者更簡潔地說,是1969年以來的秒數)。不過,系統時間不是整數,它實際上是無限的。系統時間是重要的時間。Linux系統中硬體時鐘的基本目的是在Linux不執行時保持時間。在Linux啟動時,將系統時間從硬體時鐘初始化,然後不再使用硬體時鐘。請注意,在設計ISA的DOS中,硬體時鐘是唯一的實時時鐘。

重要的是,當系統執行時,系統時間不存在任何不連續性,比如使用date命令來設定它。但是,在系統執行時,您可以對硬體時鐘做任何您想做的事情,而下一次Linux啟動時,它將使用硬體時鐘的調整時間進行設定。

Linux 核心維護系統的本地時區的概念。但是不要被誤導-幾乎沒有人關心核心認為它在哪個時區。相反,關心時區的程式(可能因為他們想為您顯示本地時間)幾乎總是使用更傳統的方法。確定時區:它們使用“tz”環境變數或“/usr/share/zoneinfo”目錄,如tzset(3)的手冊頁所解釋的那樣。時區值是錯誤的,vFAT檔案系統會在檔案上報告並設定錯誤的時間戳。

當您使用”--hctosys”選項設定系統時間時,hwlock將核心時區設定為“tz”或“/usr/share/zoneinfo”所指示的值。

時區值實際上由兩部分組成:1)欄位“tz_minutesWest”表示本地時間(未根據DST進行調整)滯後於UTC;2)欄位“tz_dsttime”,指示當前在本地有效的夏令時(DST)約定的型別。第二個欄位不在Linux下使用,始終為零。

3 )hwclock如何訪問硬體時鐘

hwlock 使用多種不同的方法來獲取和設定硬體時鐘值,最常見的方法是對裝置特殊檔案“/dev/rtc”執行I/O操作,假定該檔案是由rtc裝置驅動程式驅動的。然而,這種方法並不總是可用的。首先,rtc驅動程式是linux中比較新的一種。此外,雖然有一些版本的rtc驅動程式可以在decalpha上工作,但似乎有大量的alpha無法工作(常見的症狀是時鐘掛起)。此外,最近的linux系統對rtc有更多的通用支援,甚至支援不止一個的系統,所以您可能需要通過指定/dev/rtc 0或/dev/rtc 1來覆蓋預設值。

在舊系統中,訪問硬體時鐘的方法取決於系統硬體。

在ISA系統中,hwlock通過對埠0x70和0x71進行I/O操作,可以直接訪問構成時鐘的“CMOS儲存器”暫存器。它使用實際的I/O指令,因此只有在超級使用者有效使用者ID的情況下才能這樣做。(對於jensen Alpha,hwlock無法執行這些I/O指令,因此它使用裝置檔案“/dev/port”,它提供了與I/O子系統幾乎一樣低的介面)。這是一種非常糟糕的訪問時鐘的方法,因為使用者空間程式通常不應該進行直接I/O和禁用中斷。但是在ISA和Alpha系統中,這是唯一的方式。

在m68k系統上,hwlock可以通過控制檯驅動程式訪問時鐘,通過裝置檔案“/dev/tty1”訪問時鐘。

hwlock 嘗試使用檔案“/dev/rtc”。如果核心沒有編譯“/dev/rtc”,或者它無法開啟“/dev/rtc”,那麼hwlock將返回到另一種方法(如果可用的話)。在ISA或Alpha計算機上,您可以強制hwclock使用CMOS暫存器的直接操作,而無需通過指定“--directisa”選項。

4 )校準功能adjust

硬體時鐘通常不是很精確,但是它的許多不準確是完全可以預測的,它每天得到或失去相同的時間。這被稱為系統漂移。hwlock的“調整”功能允許您進行系統校正以糾正系統漂移。它的工作方式如下:hwlock儲存了一個檔案“/etc/adjtime”,它儲存了一些歷史資訊。

假設您從沒有adjtime檔案開始,發出hwlock-set命令將硬體時鐘設定為真實的當前時間。hwlock建立adjtime檔案,並在其中記錄當前時間,作為最後一次校準時鐘。5天后,時鐘增加了10秒,因此您可以發出另一個“hwlock --set”命令來設定它。返回10秒。hwlock更新adjtime檔案,顯示當前時間作為最後一次校準時鐘,並以系統漂移速率記錄每天2秒。24小時過去,然後發出“hwlock --adjust”命令。hwlock查閱adjtime檔案,看到時鐘離開時每天增加2秒。一個人呆了整整一天。所以它從硬體時鐘中減去2秒。然後,它記錄當前時間作為最後一次調整時鐘的時間。又過了24小時,你又發出了另一個“hwclock --adjust”指令。hwclock做了同樣的事情:減去2秒,用當前時間更新adjtime檔案,這是最後一次調整時鐘。

每次您校準時鐘(使用--set或—systohc)時,hwlock根據上次校準的時間、上次調整後的時間、在任何中間的調整中假定的漂移率以及時鐘當前的關閉量,重新計算系統漂移率。在hwclock使用的任何時候,都會出現少量的誤差,因此它不會進行小於1秒的調整。稍後,當您再次請求調整時,累積漂移將超過1秒鐘,而hwlock則會進行調整。

在系統啟動時,在“hwlock --hctosys”之前進行hwlock的調整是很好的,並且在系統通過cron執行時也可以定期進行調整。

雖然adjtime檔案的命名僅僅是為了控制時間調整的歷史記錄,但它實際上包含了hwlock在從一個呼叫到下一個呼叫時記憶資訊時使用的其他資訊。adjtime檔案的格式是ASCII:

第1行的3個數字數字,用空格隔開,分別代表:a)系統漂移率,每天以秒為單位,浮點小數點;b)自1969年世界協調時以來最近調整或校準的秒數,小數整數;c)零(與時鐘(8)相容)為十進位制整數。

第2行一個數字,代表自1969年世界協調時以來最近一次校準產生的秒數。如果還沒有校準,或者已知任何先前的校準都是沒有意義的,那麼值就是0(例如,因為在校準之後,硬體時鐘已經被找到,不包含有效時間)。這是一個十進位制整數。

第3行是“utc”或“local”。指示硬體時鐘是設定為協調世界時間還是設定為本地時間。

5 )核心如何自動同步硬體時鐘

在某些系統中,您應該注意到硬體時鐘保持同步的另一種方式。Linux核心有一種模式,它每11分鐘將系統時間複製一次到硬體時鐘。這是一個很好的模式,當您使用一些複雜的東西,比如NTP來保持系統時間同步時。(NTP是一種保持系統時間同步的方法,它可以與網路上的某個時間伺服器或連線到您的系統的無線電時鐘保持同步。參見RFC 1305)。

這個模式(我們稱之為“11分鐘模式”)是關閉的,直到有東西開啟它。ntp守護程式xntpd就可以開啟它。您可以通過執行任何東西來關閉它,包括“hwlock --hctosys”,它以老式的方式設定系統時間。

如果你的系統以11分鐘的模式執行,不要使用“hwlock --adjust”或“hwlock-hctosys”。在啟動時使用“hwlock --hctosys”來獲得一個合理的系統時間是可以接受的,直到您的系統能夠執行為止。從外部源設定系統時間並啟動11分鐘模式

 

4 、例項

1 )不適用任何引數,直接檢視硬體時鐘

[root@localhost ntop-4.0.1]#  hwclock

2018 08 23 星期四  15 01 28   -0.577410 seconds

2 )設定硬體時鐘

[root@localhost ntop-4.0.1]#  hwclock --set --date="0904"    // 設定硬體時鐘,需要 date 引數來配合使用

[root@localhost ntop-4.0.1]#  hwclock

2018 09 04 星期二  09 04 09   -0.479386 seconds

3 )將硬體時鐘設定成本地時間格式

[root@localhost ntop-4.0.1]#  hwclock --localtime

2018 09 04 星期二  01 05 46   -0.462990 seconds

4 )將硬體時鐘設定成系統時間

[root@localhost ntop-4.0.1]#  date      // 檢視當前系統時間

2018  09  04 星期二  12:25:15 CST

[root@localhost ntop-4.0.1]#  hwclock –w  // 將硬體時鐘設定為系統時間

[root@localhost ntop-4.0.1]# hwclock     // 檢視硬體時鐘

2018 09 04 星期二  12 25 48   -0.263687 seconds

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29270124/viewspace-2216980/,如需轉載,請註明出處,否則將追究法律責任。

相關文章