本章說明 Linux系統 如何keeps time,及需要做什麼來避免發生問題。通常,你無須對時間做什麼,但理解它會更好。 時區 時間測量基於最規則的自然現象,如地球轉動導致的晝夜更替。晝夜總時間是恆定的,但晝夜分別的長度是變化的。一個簡單的常數是正午。 正
本章說明
Linux系統如何keeps time,及需要做什麼來避免發生問題。通常,你無須對時間做什麼,但理解它會更好。
時區
時間測量基於最規則的自然現象,如地球轉動導致的晝夜更替。晝夜總時間是恆定的,但晝夜分別的長度是變化的。一個簡單的常數是正午。
正午是白天太陽在最高點的時間。由於地球是圓的, 不同地方正午發生在不同的時間。這引出了本地時local time的概念。
硬件時鐘和軟件時鐘
個人計算機有一個電池驅動的硬件時鐘。電池保證始終在計算機沒電的時候依然能工作。硬件始終能從BIOS設置屏或操作系 統的別的地方進行設置。
Linux核心獨立於硬件始終跟蹤時間。啟動時,Linux根據硬件時鐘設置自己的時鐘。此後,2個始終相互獨立運行。因為查看硬件始終慢而復雜,因此Linux管理自己的時鐘。
核心始終一直顯示通用時間。這樣,核心無須知道時區,高可靠的簡單結果使更新時區信息更簡單。每個進程自己處理時區轉換(使用時區包部分裡的標准工具)。
硬件始終可以是本地時間或通用時間。通常用通用時間更好,因為這樣你無須在夏時制開始或結束時改變硬件時鐘 (UTC does not have DST)。不幸的是,有些PC操作系統,包括MSDOS、Windows、OS/2都假設硬件時鐘是本地時間。 Linux可處理2種方式,但如果硬件時鐘顯示本地時間,那麼必須在夏時制開始或結束時(否則就不能顯示本地時間)。
顯示和設置時鐘
在Debian系統中,系統時區由符號連接/etc/localtime 決定。連接指向描述本地時區的時區數據文件。時區數據文件存在/usr/lib/zoneinfo 中。其他Linux distributions可能不同。
用戶可以用設置TZ環境變量來改變他的私人時區。如果不設置,就假定是系統時區。 TZ變量的語法在tzset (3)man頁中說明。
date 命令顯示當前日期和時間。 例如:
$ date
Sun Jul 14 21:53:41 EET DST 1996
$
That time is Sunday, 14th of July, 1996, at about ten before ten at the evening, in the time zone called ``EET DST' (which might be East European Daylight Savings Time). date 也可用於顯示通用時間:
$ date -u
Sun Jul 14 18:53:42 UTC 1996
$
date 也可用於設置核心的軟件始終:
# date 07142157
Sun Jul 14 21:57:00 EET DST 1996
# date
Sun Jul 14 21:57:02 EET DST 1996
#
更詳細的見date man頁--syntax is a bit arcane. 只有root能設置時間。雖然每個用戶可以有自己的時區,但時鐘對每個人都是一樣的。
date 只顯示或設置軟件時鐘。 clock 命令同步硬件和軟件時鐘。用於系統啟動時讀取硬件時鐘和設置軟件時鐘。如果兩個時鐘都需要設置,則先用date 設置軟件時鐘,然後用clock -w 設置硬件時鐘。
clock 的-u告訴它硬件時鐘是通用時間。 必須正確使用-u選項。否則計算機將困惑到底是什麼時間。
時鐘必須小心改變。
Unix系統的許多部分要求時鐘工作正常。例如, cron 守侯程序周期地運行命令。如果改變時鐘,它可能迷惑它是否該運行命令。 On one early Unix system, someone set the clock twenty years into the future, and cron w
anted to run all the periodic commands for twenty years all at once. 現在版本的cron 可以正確處理,但仍然要小心。大的前後跳躍比小的更危險。
當時鐘錯誤時
Linux軟件時鐘不會始終精確。 PC硬件產生的時間中斷周期地運行軟件時鐘。如果系統運行了太多進程,服務於時間中斷需要花費太多的時間,軟件時鐘啟動靠後。硬件時鐘獨立運行並通常更精確。如果你的系統經常啟動(比如不是
服務器的多數系統),那麼通常時間很精確。
如果需要調整硬件時鐘,通常最簡單的是重啟動,進入BIOS設定屏幕,並在那裡完成。這避免了改變系統時間可能導致的所有問題。如果不能通過BIOS,用date 和clock 設定新時間(以此順序),但如果系統有部分工作不正常,必須准備重啟動。
連網的計算機(即使是通過modem)能通過與其他計算機時間比較來自動檢查自己的時鐘。如果知道保持很精確時間的其他計算機,那麼2台計算機都將保持精確的時間。這可以使用rdate
.netdate 命令來完成。 2個命令都檢查遠程的計算機(ne
tdate 可處理多台遠程計算機),來同步本地計算機的時間。有規律地運行這樣一個程序,你的計算機就可以保持與遠程計算機一樣精確的時間。
測量孔(Measuring Holes)
本附錄包括用於測量文件系統中潛在的孔的程序的有趣的部分。 The source distribution of the book contains the full source code(sag/measure-holes/measure-holes.c).
int process(FILE *f, char *filename) {
static char *buf = NULL;
static long prev_block_size = -1;
long zeroes;
char *p;
if (buf == NULL || prev_block_size != block_size) {
free(buf);
buf = xmalloc(block_size + 1);
buf[block_size] = 1;
prev_block_size = block_size;
}
zeroes = 0;
while (fread(buf, block_size, 1, f) == 1) {
for (p = buf; *p == '\0'; )
++p;
if (p == buf+block_size)
zeroes += block_size;
}
if (zeroes > 0)
printf("%ld %s\n", zeroes, filename);
if (ferror(f)) {
errormsg(0, -1, "read failed for `%s'", filename);
return -1;
}
return 0;
}