jojo's blog--快樂憂傷都與你同在
          為夢(mèng)想而來(lái),為自由而生。 性情若水,風(fēng)起水興,風(fēng)息水止,故時(shí)而激蕩,時(shí)又清平……
          posts - 11,  comments - 30,  trackbacks - 0

          我的評(píng)論

          server$ chmod go-w ~/
          server$ chmod 700 ~/.ssh
          server$ chmod 600 ~/.ssh/authorized_keys
          NTP 時(shí)間伺服器 url -> http://linux.vbird.org/linux_server/0440ntp.php
          很多時(shí)候由於電腦硬體的問題,所以我們都會(huì)調(diào)整一下時(shí)間,好讓電腦系統(tǒng)的時(shí)間可以一直保持正確的狀態(tài)。 而既然要調(diào)整時(shí)間,那麼自然就會(huì)有一個(gè)讓我們可以對(duì)照著來(lái)調(diào)整時(shí)間的『準(zhǔn)確時(shí)間』咯! 在實(shí)際生活中,我們可以透過電視臺(tái)、廣播電臺(tái)、電話等等來(lái)調(diào)整我們的手錶,那麼如果是在網(wǎng)路上呢? 該如何讓我們的主機(jī)隨時(shí)保持正確的時(shí)間資訊?!另外,整個(gè)地球被切分成為 24 個(gè)時(shí)區(qū),那麼什麼是 GMT (格林威治時(shí)間),我們所在的時(shí)區(qū)又是哪一區(qū)呢?讓我們來(lái)簡(jiǎn)單的談一談吧!

          1. 本章的行前準(zhǔn)備工作
          2. 關(guān)於時(shí)區(qū)與網(wǎng)路校時(shí)的通訊協(xié)定
            2.1 什麼是時(shí)區(qū)?全球有多少時(shí)區(qū)?GMT 在那個(gè)時(shí)區(qū)?
            2.2 什麼是夏季節(jié)約時(shí)間 (daylight savings)?
            2.3 Coordinated Universal Time (UTC)與系統(tǒng)時(shí)間的誤差
            2.4 NTP 通訊協(xié)定
          3. NTP 伺服器的安裝與設(shè)定
            3.1 所需套件與套件結(jié)構(gòu)
            3.2 主要設(shè)定檔 ntp.conf 的處理
            3.3 NTP 的啟動(dòng)與觀察
            3.4 安全性設(shè)定
          4. 用戶端的時(shí)間更新方式
            4.1 Linux 系統(tǒng)時(shí)間與硬體時(shí)間
            4.2 Linux 系統(tǒng)時(shí)區(qū)與手動(dòng)校時(shí)工作: date, hwclock
            4.3 Linux 的網(wǎng)路校時(shí)
            4.4 Windows 的網(wǎng)路校時(shí)
          5. 重點(diǎn)回顧
          6. 課後練習(xí)
          7. 參考資料
          8. 針對(duì)本文的建議:http://phorum.vbird.org/viewtopic.php?p=117976
          大標(biāo)題的圖示本章的行前準(zhǔn)備工作
          NTP 伺服器是個(gè)很容易設(shè)定的服務(wù),你只要熟悉網(wǎng)路基礎(chǔ)即可輕易的將他設(shè)定好。 這一章沒有什麼很重要的預(yù)習(xí)功課,您可以輕鬆的學(xué)習(xí)啊! ^_^

          大標(biāo)題的圖示關(guān)於時(shí)區(qū)與網(wǎng)路校時(shí)的通訊協(xié)定
          時(shí)間對(duì)於現(xiàn)代人來(lái)說(shuō)是很重要的,因?yàn)椤?Time is money !』。既然時(shí)間如此重要,對(duì)於 Internet 來(lái)說(shuō)應(yīng)該也是很重要吧? 為什麼呢?還記得我們?cè)诨A(chǔ)學(xué)習(xí)篇裡面談到的『登錄檔分析』吧? 如果你架設(shè)了一個(gè)登錄檔記錄伺服器的話,那麼總得要分析每個(gè)主機(jī)所傳來(lái)的資訊吧?如果每一部主機(jī)的時(shí)間都不相同, 那如何判斷問題發(fā)生的時(shí)間點(diǎn)?所以囉,『每一部主機(jī)的時(shí)間同步化』就很重要了。

          每一部主機(jī)時(shí)間的同步化重要性當(dāng)然不只如此,包括之前談到的 DHCP 用戶端/伺服器端所需要的租約時(shí)間限制、 網(wǎng)路偵測(cè)時(shí)所需要注意的時(shí)間點(diǎn)、剛剛談到的登錄檔分析功能、具有相關(guān)性的主機(jī)彼此之間的錯(cuò)誤偵測(cè)等等, 都需要具有相同的時(shí)間才能夠捉出問題呢。好了,底下咱們就來(lái)聊一聊,如何利用網(wǎng)路來(lái)進(jìn)行主機(jī)的時(shí)間同步化吧!

          小標(biāo)題的圖示什麼是時(shí)區(qū)?全球有多少時(shí)區(qū)?GMT 在那個(gè)時(shí)區(qū)?
          因?yàn)榈厍蚴菆A的,所以同一個(gè)時(shí)刻,在地球的一邊是白天,一邊是黑夜。而因?yàn)槿祟愂褂靡惶?24 小時(shí)的制度,所以,在地球?qū)堑膬蛇吘蛻?yīng)該差了 12 的小時(shí)才對(duì)。由於同一個(gè)時(shí)間點(diǎn)上面, 整個(gè)地球的時(shí)間應(yīng)該都不一樣,為了解決這個(gè)問題,所以可以想見的,地球就被分成 24 個(gè)時(shí)區(qū)了!

          那麼這 24 個(gè)時(shí)區(qū)是依據(jù)什麼來(lái)劃分的呢?由於地球被人類以『經(jīng)緯度』座標(biāo)來(lái)進(jìn)行定位, 而經(jīng)度為零的地點(diǎn)在英國(guó)『格林威治』這個(gè)城市所在縱剖面上, (註:所謂的縱剖面就是由南極切到北極的直線,而橫切面就是與赤道平行的切線),如下圖所示:

          地球的子午線、經(jīng)緯度與時(shí)區(qū)的分隔概念
          圖一、地球的子午線、經(jīng)緯度與時(shí)區(qū)的分隔概念

          因?yàn)槔@地球一圈是 360 度角,這 360 度角共分為 24 個(gè)時(shí)區(qū),當(dāng)然一個(gè)時(shí)區(qū)就是 15 度角啦! 又由於是以格林威治時(shí)間為標(biāo)準(zhǔn)時(shí)間(Greenwich Mean Time, GMT 時(shí)間),加上地球自轉(zhuǎn)的關(guān)係,因此,在格林威治以東的區(qū)域時(shí)間是比較快的(+小時(shí)), 而以西的地方當(dāng)然就是較慢囉!

          以臺(tái)灣為例,因?yàn)榕_(tái)灣所在地約為東經(jīng) 120 度北緯 25 度左右,又因?yàn)榕_(tái)灣在格林威治的東方 (廢話!因?yàn)槭菛|經(jīng)嘛! ^_^),因此臺(tái)灣本地時(shí)間 (local time) 會(huì)比 GMT 時(shí)間快 8 小時(shí) (GMT + 8)。當(dāng)格林威治時(shí)間為零點(diǎn),臺(tái)灣就已經(jīng)是早上八點(diǎn)了! 底下約略列出各個(gè)時(shí)區(qū)的名稱與所在經(jīng)度,以及與 GMT 時(shí)間的時(shí)差:

          標(biāo)準(zhǔn)時(shí)區(qū)

          經(jīng)度

          時(shí)差
          GMT , Greenwich Mean Time 0 W/E 標(biāo)準(zhǔn)時(shí)間
          CET , Central European 15 E +1 東一區(qū)
          EET , Eastern European 30 E +2 東二區(qū)
          BT , Baghdad 45 E +3 東三區(qū)
          USSR, Zone 3 60 E +4 東四區(qū)
          USSR, Zone 4 75 E +5 東五區(qū)
          Indian, First 82.3E +5.5東五半?yún)^(qū)
          USSR, Zone 5 90 E +6 東六區(qū)
          SST , South Sumatra 105 E +7 東七區(qū)
          JT , Java 112 E +7.5東七半?yún)^(qū)
          CCT , China Coast (臺(tái)灣所在地) 120 E +8 東八區(qū)
          JST , Japan 135 E +9 東九區(qū)
          SAST, South Australia 142 E +9.5東九半?yún)^(qū)
          GST , Guam 150 E +10 東十區(qū)
          NZT , New Zealand 180 E +12 東十二區(qū)
          Int'l Date Line 180 E/W 國(guó)際換日線
          BST , Bering 165 W -11 西十一區(qū)
          SHST, Alaska/Hawaiian 150 W -10 西十區(qū)
          YST , Yukon 135 W -9 西九區(qū)
          PST , Pacific 120 W -8 西八區(qū)
          MST , Mountain 105 W -7 西七區(qū)
          CST , Central 90 W -6 西六區(qū)
          EST , Eastern 75 W -5 西五區(qū)
          AST , Atlantic 60 W -4 西四區(qū)
          Brazil, Zone 2 45 W -3 西三區(qū)
          AT , Azores 30 W -2 西二區(qū)
          WAT , West Africa 15 W -1 西一區(qū)

          所以囉,臺(tái)灣時(shí)間是 GMT + 8 就很容易推算出來(lái)了吧!要特別留意的是,很多朋友在安裝 Linux 的時(shí)候, 總是會(huì)發(fā)現(xiàn)目前的時(shí)間慢或者快了 8 小時(shí),不要懷疑,絕對(duì)與時(shí)區(qū)有關(guān)! 趕緊給他查一下如何調(diào)整時(shí)區(qū)吧! ^_^。

          另外,在上表中有個(gè)比較有趣的時(shí)區(qū),那就是在太平洋上面的國(guó)際換日線了!我們剛剛說(shuō),在格林威治的東邊時(shí)間會(huì)較快, 而在西邊時(shí)間會(huì)較慢,但是兩邊各走了 180 度之後就會(huì)碰頭啊!那不就剛好差了 24 小時(shí)嗎?沒錯(cuò)啦! 所以才訂定為『國(guó)際換日線』啊!國(guó)際換日線剛好在太平洋上面,因此,如果您有坐飛機(jī)到美國(guó)的經(jīng)驗(yàn)應(yīng)該會(huì)發(fā)現(xiàn),咦! 怎麼出發(fā)的時(shí)間是星期六下午,坐了 13 個(gè)小時(shí)的飛機(jī)到了美國(guó)還是星期六!因?yàn)閯偤猛ㄟ^了國(guó)際換日線, 日期減少了一天喔!如果反過來(lái),由美國(guó)到臺(tái)灣,日期就會(huì)多加一天喔! ^_^

          小標(biāo)題的圖示什麼是夏季節(jié)約時(shí)間 (daylight savings)?
          除了時(shí)區(qū)的概念先建立起來(lái)之後,現(xiàn)在再來(lái)談一談,那麼什麼是『夏季節(jié)約時(shí)間』? 既然是『夏季節(jié)約時(shí)間』當(dāng)然主要是與夏天有關(guān)啦!因?yàn)榈厍蛟谶\(yùn)行的時(shí)候是呈現(xiàn)一個(gè)傾斜角在繞太陽(yáng)運(yùn)轉(zhuǎn)的, 所以才有春夏秋冬(這個(gè)大家應(yīng)該都知道啦!),在夏天的時(shí)候,白天的時(shí)間會(huì)比較長(zhǎng),所以為了節(jié)約用電, 因此在夏天的時(shí)候某些地區(qū)會(huì)將他們的時(shí)間定早一小時(shí),也就是說(shuō),原本時(shí)區(qū)是 8 點(diǎn)好了, 但是因?yàn)橄奶焯?yáng)比較早出現(xiàn),因此把時(shí)間向前挪,在 8 點(diǎn)的時(shí)候,訂定為該天的 7 點(diǎn)~如此一來(lái), 我們就可以利用陽(yáng)光照明,省去了花費(fèi)電力的時(shí)間,因此才會(huì)稱之為夏季節(jié)約時(shí)間!

          因?yàn)榕_(tái)灣實(shí)在是太小了,並沒有橫跨兩個(gè)時(shí)區(qū),因此,夏季節(jié)約時(shí)間對(duì)我們來(lái)說(shuō),雖然還是有幫助啦! 不過,似乎沒有特別推行的樣子說(shuō)~

          小標(biāo)題的圖示Coordinated Universal Time (UTC)與系統(tǒng)時(shí)間的誤差
          瞭解了一些時(shí)區(qū)的概念之後,這裡要談的是『什麼是正確的時(shí)間』。 在計(jì)算時(shí)間的時(shí)候,最準(zhǔn)確的計(jì)算應(yīng)該是使用『原子震盪週期』所計(jì)算的物理時(shí)鐘了 (Atomic Clock, 也被稱為原子鐘),這也被定義為標(biāo)準(zhǔn)時(shí)間 (International Atomic Time)。而我們常常看見的 UTC 也就是 Coordinated Universal Time (協(xié)和標(biāo)準(zhǔn)時(shí)間)就是利用這種 Atomic Clock 為基準(zhǔn)所定義出來(lái)的正確時(shí)間。例如 1999 年在美國(guó)啟用的原子鐘 NIST F-1, 他所產(chǎn)生的時(shí)間誤差每?jī)汕瓴挪钜幻腌姡≌娴氖呛軠?zhǔn)吶!這個(gè) UTC 標(biāo)準(zhǔn)時(shí)間是以 GMT 這個(gè)時(shí)區(qū)為主的喔!所以本地時(shí)間與 UTC 時(shí)間的時(shí)差就是本地時(shí)間與 GMT 時(shí)間的時(shí)差就是了!

          事實(shí)上,在我們的身邊就有很多的原子鐘,例如石英表,還有電腦主機(jī)上面的 BIOS 內(nèi)部就含有一個(gè)原子鐘在紀(jì)錄與計(jì)算時(shí)間的進(jìn)行吶!不過由於原子鐘主要是利用計(jì)算晶片 (crystal) 的原子震盪週期去計(jì)時(shí)的,這是因?yàn)槊糠N晶片都有自己的獨(dú)特的震盪週期之故。 然而因?yàn)檫@種晶片的震盪週期在不同的晶片之間多多少少都會(huì)有點(diǎn)差異性, 甚至同一批晶片也可能會(huì)或多或少有些許的差異(就連溫度也可能造成這樣的誤差呢!),因此也就造成了 BIOS 的時(shí)間會(huì)三不五時(shí)的給他快了幾秒或者慢了幾秒。

          或許您會(huì)認(rèn)為,BIOS 計(jì)時(shí)器每天快個(gè)五秒也沒有什麼了不起的,不過如果您再仔細(xì)的算一算,會(huì)發(fā)現(xiàn),一天快五秒, 那麼一個(gè)月快2.5分鐘,一年就快了 75 分鐘了!所以說(shuō),呵呵!時(shí)間差是真的會(huì)存在的! 那麼如果您的電腦真的有這樣的情況,那要怎麼來(lái)重新校正時(shí)間呢?那就需要『網(wǎng)路校時(shí)』 (Network Time Protocol, NTP) 的功能了!底下我們就談一談那個(gè) NTP 的 daemon 吧!

          小標(biāo)題的圖示NTP 通訊協(xié)定
          如同前面說(shuō)的,電腦主機(jī)主要是以 BIOS 內(nèi)部的時(shí)間為主要的時(shí)間依據(jù),而偏偏這個(gè)時(shí)間可能因?yàn)?BIOS 內(nèi)部晶片本身的問題,而導(dǎo)致 BIOS 時(shí)間與標(biāo)準(zhǔn)時(shí)間 (UTC) 有一點(diǎn)點(diǎn)的差異存在! 所以為了避免主機(jī)時(shí)間因?yàn)殚L(zhǎng)期運(yùn)作下所導(dǎo)致的時(shí)間偏差,進(jìn)行時(shí)間同步 (synchronize) 的工作就顯的很重要了!

          那麼怎麼讓時(shí)間同步化呢?想一想,如果我們選擇幾部主要主機(jī) (Primary server) 調(diào)校時(shí)間,讓這些 Primary Servers 的時(shí)間同步之後,再開放網(wǎng)路服務(wù)來(lái)讓 Client 端連線,並且提供 Client 端調(diào)整自己的時(shí)間,不就可以達(dá)到全部的電腦時(shí)間同步化的運(yùn)作了嗎!那麼什麼協(xié)定可以達(dá)到這樣的功能呢?那就是 Network Time Protocol ,另外還有 Digital Time Synchronization Protocol (DTSS) 也可以達(dá)到相同的功能!

          不過,到底 NTP 這個(gè) daemon 是如何讓 Server 與 Client 同步他們的時(shí)間呢?

          1. 首先,主機(jī)當(dāng)然需要啟動(dòng)這個(gè) daemon ,之後,
          2. Client 會(huì)向 NTP Server 發(fā)送出調(diào)校時(shí)間的 message ,
          3. 然後 NTP Server 會(huì)送出目前的標(biāo)準(zhǔn)時(shí)間給 Client ,
          4. Client 接收了來(lái)自 Server 的時(shí)間後,會(huì)據(jù)以調(diào)整自己的時(shí)間,就達(dá)成了網(wǎng)路校時(shí)咯!

          不過,在上面的步驟中您有沒有想到一件事啊,那就是如果 Client 到 Server 的訊息傳送時(shí)間過長(zhǎng)怎麼辦?舉例來(lái)說(shuō),我在臺(tái)灣以 ADSL 的 PC 主機(jī),連線到美國(guó)的 NTP Server 主機(jī)進(jìn)行時(shí)間同步化要求,而美國(guó) NTP Server 收到我的要求之後,就發(fā)送當(dāng)時(shí)的正確時(shí)間給我,不過, 由美國(guó)將資料傳送回我的 PC 時(shí),時(shí)間可能已經(jīng)延遲了 10 秒鐘去了!這樣一來(lái),我的 PC 校正的時(shí)間是 10 秒鐘前的標(biāo)準(zhǔn)時(shí)間喔!此外,如果美國(guó)那麼 NTP 主機(jī)有太多的人喜歡上去進(jìn)行網(wǎng)路校時(shí)了,所以 loading (負(fù)荷) 太重啦!導(dǎo)致訊息的回傳又延遲的更為嚴(yán)重!那怎麼辦?

          為了這些延遲的問題,有一些 program 已經(jīng)開發(fā)了自動(dòng)計(jì)算時(shí)間傳送過程的誤差,以更準(zhǔn)確的校準(zhǔn)自己的時(shí)間!當(dāng)然啦,在 daemon 的部分,也同時(shí)以 server/client 及 master/slave 的架構(gòu)來(lái)提供使用者進(jìn)行網(wǎng)路校時(shí)的動(dòng)作!所謂的 master/slave 就有點(diǎn)類似 DNS 的系統(tǒng)咯!舉例來(lái)說(shuō),臺(tái)灣的標(biāo)準(zhǔn)時(shí)間主機(jī)去國(guó)際標(biāo)準(zhǔn)時(shí)間的主機(jī)校時(shí), 然後各大專院校再到臺(tái)灣的標(biāo)準(zhǔn)時(shí)間校時(shí),然後我們?cè)俚礁鞔髮T盒5臉?biāo)準(zhǔn)時(shí)間校時(shí)!這樣一來(lái),那幾部國(guó)際標(biāo)準(zhǔn)時(shí)間主機(jī) (Time server) 的 loading 就不至於太大,而我們也可以很快速的達(dá)到正確的網(wǎng)路校時(shí)的目的呢!臺(tái)灣常見的 Time Server 有:

          * tock.stdtime.gov.tw
          * time.stdtime.gov.tw
          * clock.stdtime.gov.tw
          * freq_f.stdtime.gov.tw
          * tick.stdtime.gov.tw

          至於 ntp 這個(gè) daemon 是以 port 123 為連結(jié)的埠口 (使用 UDP 封包),所以我們要利用 Time server 來(lái)進(jìn)行時(shí)間的同步更新時(shí),就得要使用 NTP 套件提供的 ntpdate 來(lái)進(jìn)行 port 123 的連線喔!關(guān)於網(wǎng)路校時(shí)更多的說(shuō)明,可以到 NTP 的官方網(wǎng)站上察看喔!

          http://www.ntp.org

          大標(biāo)題的圖示NTP 伺服器的安裝與設(shè)定
          NTP 伺服器也是一個(gè)很容易就可以架設(shè)成功的玩意兒,不過這個(gè)套件在不同的 distribution 上面可能有不一樣的名稱, 你要作的其實(shí)就是將他安裝起來(lái)之後,規(guī)定一部上層 NTP 伺服器來(lái)同步化你的時(shí)間即可啊! 如果你只是想要進(jìn)行你自己?jiǎn)尾恐鳈C(jī)的時(shí)間同步化,別架設(shè) NTP ,直接使用 NTP 用戶端軟體即可喔!

          小標(biāo)題的圖示所需套件與套件結(jié)構(gòu)
          在 CentOS 上頭,你所需要的套件其實(shí)僅有 ntp 這個(gè)玩意兒而已,請(qǐng)自行使用 rpm 去找找看, 若沒有安裝,請(qǐng)拿出原版光碟來(lái)安裝,或者利用 yum install ntp 即可啊! 萬(wàn)一找不到的話,那就用 Tarball 的方式來(lái)安裝吧!請(qǐng)自行前往 ntp 官方網(wǎng)站下載原始碼來(lái)安裝先。 不過,我們還需要時(shí)區(qū)相關(guān)的資料檔案,所以你需要的套件有:

          * ntp
          就是 NTP 伺服器的主要套件啦,包括設(shè)定檔以及執(zhí)行檔等等,都是這個(gè)套件提供的;

          * tzdata
          套件名稱為『 Time Zone data 』的縮寫囉~主要提供了各個(gè)時(shí)區(qū)對(duì)應(yīng)的顯示格式。

          至於你需要的檔案方面,主要有這幾個(gè)玩意兒啦:

          * /etc/ntp.conf
          這個(gè)是 NTP daemon 的主要設(shè)定檔,依據(jù)不同的版本放置的目錄可能會(huì)不同,不過檔名都是一樣的!使用 locate ntp.conf 搜尋一下您的系統(tǒng)有沒有這個(gè)檔案吧!這也是 NTP 唯一的一個(gè)設(shè)定檔案!

          * /usr/share/zoneinfo/
          這是個(gè)目錄,這個(gè)目錄是 Linux 本身提供的,而不是 NTP 所提供的。 在這個(gè)目錄下的檔案其實(shí)是規(guī)定了各主要時(shí)區(qū)的時(shí)間設(shè)定檔案,例如臺(tái)灣地區(qū)的時(shí)區(qū)設(shè)定檔案在 /usr/share/zoneinfo/Asia/Taipei 就是了!這個(gè)目錄裡面的檔案與底下要談的兩個(gè)檔案 (clock 與 localtime) 是有關(guān)係的喔!

          * /etc/sysconfig/clock
          這個(gè)檔案其實(shí)也不包含在 NTP 的 daemon 當(dāng)中,因?yàn)檫@個(gè)是 linux 的主要時(shí)區(qū)設(shè)定檔案啊!每次開機(jī)後 Linux 會(huì)自動(dòng)的讀取這個(gè)檔案來(lái)設(shè)定自己系統(tǒng)所預(yù)設(shè)要顯示的時(shí)間說(shuō)!舉個(gè)例子來(lái)說(shuō), 在我們臺(tái)灣地區(qū)的本地時(shí)間設(shè)定中,這個(gè)檔案內(nèi)應(yīng)該會(huì)出現(xiàn)一行『ZONE="Asia/Taipei"』的字樣, 這表示我們的時(shí)間設(shè)定檔案『要取用 /usr/share/zoneinfoe/Asia/Taipei 那個(gè)檔案』的意思!

          * /etc/localtime
          這個(gè)檔案就是『本地端的時(shí)間設(shè)定檔』啦!剛剛那個(gè) clock 檔案裡面規(guī)定了使用的時(shí)間設(shè)定檔 (ZONE) 為 /usr/share/zoneinfo/Asia/Taipei ,所以說(shuō)這就是本地端的時(shí)間了,此時(shí) Linux 系統(tǒng)就會(huì)將 Taipei 那個(gè)檔案複製一份成為 /etc/localtime ,所以未來(lái)我們的時(shí)間顯示就會(huì)以 Taipei 那個(gè)時(shí)間設(shè)定檔案為準(zhǔn)。

          好了,如果現(xiàn)在我這部主機(jī)搬到日本東京去了,那麼我應(yīng)該如何調(diào)整時(shí)間呢?其實(shí)什麼調(diào)整都不需要,因?yàn)槲覀兊?localtime 主要是分析與 UTC 時(shí)間的時(shí)差來(lái)顯示的格式,所以,您只要將 /etc/sysconfig/clock 裡面的 ZONE 設(shè)定成為 Asia/Tokyo 並且將 /usr/share/zoneinfo/Asia/Tokyo 複製成為 /etc/localtime ,呵呵!就能顯示時(shí)間為日本東京的時(shí)間了!這樣是否能夠瞭解?

          * /bin/date
          這個(gè)是 Linux 系統(tǒng)上面常見的日期與時(shí)間輸出指令,用途很廣喔!除了輸出時(shí)間外,也可以修改時(shí)間。

          * /sbin/hwclock
          這是一個(gè) root 才能執(zhí)行的指令,因?yàn)?Linux 系統(tǒng)上面 BIOS 時(shí)間與 Linux 系統(tǒng)時(shí)間是分開的,所以使用 date 這個(gè)指令調(diào)整了時(shí)間之後,還需要使用 hwclock 才能將修改過後的時(shí)間寫入 BIOS 當(dāng)中!

          * /usr/sbin/ntpd
          這就是 NTP 的主要 daemon 檔案啦!得要啟動(dòng)他才能提供 NTP 服務(wù)。注意,這個(gè)指令預(yù)設(shè)會(huì)參考 /etc/ntp.conf 裡面的設(shè)定喔!

          * /usr/sbin/ntpdate
          這個(gè)就是 Client 端用來(lái)連接 NTP Server 的主要執(zhí)行檔囉!如果您沒有要啟用 NTP 而僅想要使用 NTP Client 功能的話,那麼只會(huì)用到這個(gè)指令而已啦!

          * /usr/sbin/ntptrace
          這個(gè)指令可以用來(lái)追蹤某部時(shí)間伺服器的時(shí)間對(duì)應(yīng)關(guān)係,這也是個(gè)很有用的指令喔!底下我們會(huì)介紹如何使用這支程式!

          接下來(lái),我們先來(lái)談一談如何設(shè)計(jì)那個(gè) /etc/ntp.conf 吧!

          小標(biāo)題的圖示主要設(shè)定檔 ntp.conf 的處理
          如前所述,由於 NTP 時(shí)間伺服器採(cǎi)用類似階層架構(gòu) (stratum) 來(lái)處理時(shí)間的同步化, 所以他使用的是類似一般 server/client 的主從架構(gòu)。網(wǎng)路社會(huì)上面有提供一些主要與次要的時(shí)間伺服器, 這些均屬於第一階及第二階的時(shí)間伺服器 (stratum-1, stratum-2) ,如下所示:

          * 主要時(shí)間伺服器:http://www.eecis.udel.edu/~mills/ntp/clock1a.html
          * 次要時(shí)間伺服器:http://www.eecis.udel.edu/~mills/ntp/clock2a.html

          由於這些時(shí)間伺服器大多在國(guó)外,所以我們是否要使用這些伺服器來(lái)同步化自己的時(shí)間呢? 其實(shí)如果臺(tái)灣地區(qū)已經(jīng)有標(biāo)準(zhǔn)時(shí)間伺服器的話,用那部即可,不需要連線到國(guó)外啦!浪費(fèi)頻寬與時(shí)間啊! 而如前面提到的,臺(tái)灣地區(qū)已經(jīng)有第二階的時(shí)間伺服器了,所以當(dāng)然我們可以直接選擇臺(tái)灣地區(qū)的 NTP 主機(jī)即可。

          # 時(shí)間伺服器的階層概念
          其實(shí) NTP 的階層概念與 DNS 很類似啦,當(dāng)你架設(shè)一部 NTP 主機(jī),這部 NTP 所向上要求同步化的那部主要主機(jī)為 stratum-1 時(shí),那麼你的 NTP 就是 stratum-2 囉!舉例來(lái)說(shuō),如果我們的 NTP 是向臺(tái)灣的 tock.stdtime.gov.tw 這部 stratum-2 的主機(jī)要求時(shí)間同步化,那我們的主機(jī)即為 stratum-3 ,如果還有其他的 NTP 主機(jī)向我們要求時(shí)間同步, 那麼該部主機(jī)則會(huì)是 stratum-4 啦!就這樣啊~ 那最多可以有幾個(gè)階層?最多可達(dá) 15 個(gè)階層喔!

          如果你評(píng)估一下,確定有架設(shè) NTP 的需求時(shí),我們可以直接選擇臺(tái)灣地區(qū)的上層 NTP 來(lái)同步化時(shí)間即可。 舉例來(lái)說(shuō) tock.stdtime.gov.tw 這個(gè)國(guó)家單位的第二層主機(jī) (stratum-2) 應(yīng)該是比較適合的。 一般來(lái)說(shuō),我們?cè)谶M(jìn)行 NTP 主機(jī)的設(shè)定時(shí),都會(huì)先選擇多部上層的 Time Server 來(lái)做為我們這一部 NTP Server 的校正之用,選擇多部的原因是因?yàn)榭梢员苊庖驗(yàn)槟巢繒r(shí)間伺服器突然掛點(diǎn)時(shí), 其他主機(jī)仍然可以提供我們的 NTP 主機(jī)來(lái)自我更新啊!然後我們的 NTP Server 才提供給自己的 Client 端更新時(shí)間。如此一來(lái),國(guó)家單位的 tock.stdtime.gov.tw 負(fù)載才不會(huì)太大,而我們的 Client 也可以很快速的達(dá)到校時(shí)的動(dòng)作!

          好了,我假設(shè)俺的 NTP 伺服器所需要設(shè)定的架構(gòu)如下:

          * 我的上層 NTP 伺服器共有 tock.stdtime.gov.tw, tick.stdtime.gov.tw, time.stdtime.gov.tw 三部,其中以 tock.stdtime.gov.tw 最優(yōu)先使用 (prefer);
          * 不對(duì) Internet 提供服務(wù),僅允許來(lái)自內(nèi)部網(wǎng)域 192.168.1.0/24 的查詢而已;
          * 偵測(cè)一些 BIOS 時(shí)鐘與 Linux 系統(tǒng)時(shí)間的差異並寫入 /var/lib/ntp/drift 檔案當(dāng)中。

          好了,先讓我們談一談如何在 ntp.conf 裡面設(shè)定權(quán)限控制吧!

          # 利用 restrict 來(lái)管理權(quán)限控制
          在 ntp.conf 檔案內(nèi)可以利用『 restrict 』來(lái)控管權(quán)限,這個(gè)參數(shù)的設(shè)定方式為:

          restrict [你的IP] mask [netmask_IP] [parameter]

          其中 parameter 的參數(shù)主要有底下這些:

          * ignore
          拒絕所有類型的 NTP 連線;

          * nomodiy
          用戶端不能更改 NTP 伺服器的時(shí)間參數(shù),這即表示用戶端不能使用 ntpc 與 ntpq 這兩支程式來(lái)修改伺服器囉。 但用戶端仍可透過這部主機(jī)來(lái)進(jìn)行網(wǎng)路校時(shí)的;

          * noquery
          用戶端不能夠使用 ntpq, ntpc 等指令來(lái)查詢時(shí)間伺服器,等於不提供 NTP 的網(wǎng)路校時(shí)囉;

          * notrap
          不提供 trap 這個(gè)遠(yuǎn)端事件登錄 (remote event logging) 的功能。

          * notrust
          拒絕沒有認(rèn)證的用戶端。

          那如果你沒有在 parameter 的地方加上任何參數(shù)的話,這表示『該 IP 或網(wǎng)段不受任何限制』的意思喔!一般來(lái)說(shuō),我們可以先關(guān)閉 NTP 的使用權(quán)限,然後在一個(gè)一個(gè)的啟用允許登入的網(wǎng)段。

          # 利用 server 設(shè)定上層 NTP 伺服器
          上層 NTP 伺服器的設(shè)定方式為:

          server [IP or hostname] [prefer]

          在 server 後端可以接 IP 或主機(jī)名稱,鳥哥個(gè)人比較喜歡使用主機(jī)名稱來(lái)設(shè)定說(shuō)! 至於那個(gè) perfer 表示『優(yōu)先使用』的主機(jī)囉~有夠簡(jiǎn)單吧!

          # 以 driftfile 記錄時(shí)間差異
          設(shè)定的方式如下:

          driftfile [可以被 ntpd 寫入的目錄與檔案]

          因?yàn)轭A(yù)設(shè)的 NTP Server 本身的時(shí)間計(jì)算是依據(jù) BIOS 的晶片震盪週期頻率來(lái)計(jì)算的,但是這個(gè)數(shù)值與上層 Time Server 不見得會(huì)一致啊!所以 NTP 這個(gè) daemon (ntpd) 會(huì)自動(dòng)的去計(jì)算我們自己主機(jī)的頻率與上層 Time server 的頻率,並且將兩個(gè)頻率的誤差記錄下來(lái),記錄下來(lái)的檔案就是在 driftfile 後面接的完整檔名當(dāng)中了!關(guān)於檔名你必須要知道:

          * driftfile 後面接的檔案需要使用完整路徑檔名;
          * 該檔案不能是連結(jié)檔;
          * 該檔案需要設(shè)定成 ntpd 這個(gè) daemon 可以寫入的權(quán)限。
          * 該檔案所記錄的數(shù)值單位為:百萬(wàn)分之一秒 (ppm)。

          driftfile 後面接的檔案會(huì)被 ntpd 自動(dòng)更新,所以他的權(quán)限一定要能夠讓 ntpd 寫入才行。在 CentOS 4.x 預(yù)設(shè)的 NTP 伺服器中,使用的 ntpd 的 owner 是 ntp ,這部份可以查閱 /etc/sysconfig/ntpd 就可以知道啦!
          # keys [key_file]
          除了以 restrict 來(lái)限制用戶端的連線之外,我們也可以透過金鑰系統(tǒng)來(lái)給用戶端認(rèn)證, 如此一來(lái)可以讓主機(jī)端更放心了。不過在這個(gè)章節(jié)裡面我們暫不討論這個(gè)部分, 有興趣的朋友可以參考 ntp-keygen 這個(gè)指令的相關(guān)說(shuō)明喔!

          根據(jù)上面的說(shuō)明,我們最終可以取得這樣的設(shè)定檔案內(nèi)容喔!

          [root@linux ~]# vi /etc/ntp.conf
          # 在保留大部分的預(yù)設(shè)值的情況下,我們作了幾個(gè)小部分的修改喔:
          # 1. 先處理權(quán)限方面的問題:
          restrict default nomodify notrap noquery
          restrict 220.130.158.71 <==底下這三行在開放主機(jī)進(jìn)入的權(quán)限
          restrict 220.130.158.51
          restrict 220.130.158.52
          restrict 127.0.0.1 mask 255.0.0.0 <==內(nèi)部與 LAN 的使用權(quán)限
          restrict 192.168.1.0 mask 255.255.255.0 nomodify

          # 2. 設(shè)定主機(jī)來(lái)源!
          server 220.130.158.71 prefer <==以這部主機(jī)為最優(yōu)先
          server 220.130.158.51
          server 220.130.158.51

          # 3.原本內(nèi)定的一個(gè)內(nèi)部時(shí)間資料,不需要更動(dòng)他
          server 127.127.1.0 # local clock
          fudge 127.127.1.0 stratum 10

          # 4. 就是那個(gè)時(shí)間差異分析的咚咚,保留預(yù)設(shè)值即可。
          driftfile /var/lib/ntp/drift
          broadcastdelay 0.008

          # 5.暫時(shí)不會(huì)使用的 keys 相關(guān)認(rèn)證功能。
          keys /etc/ntp/keys

          然後準(zhǔn)備一下修訂一下 /etc/sysconfig/ntpd 吧!

          [root@linux ~]# vi /etc/sysconfig/ntpd
          OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
          SYNC_HWCLOCK=yes
          # 將他改成 yes 吧!這樣 BIOS 的時(shí)間也會(huì)跟著改變的!

          這樣就設(shè)定妥當(dāng)了,準(zhǔn)備來(lái)啟動(dòng) NTP 服務(wù)吧!

          小標(biāo)題的圖示NTP 的啟動(dòng)與觀察
          設(shè)定完 ntp.conf 之後就可以啟動(dòng) ntp 伺服器了。啟動(dòng)與觀察的方式如下:

          1. 啟動(dòng) NTP
          [root@linux ~]# /etc/init.d/ntpd start

          2. 觀察啟動(dòng)的埠口看看:
          [root@linux ~]# netstat -tlunp
          Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
          udp 0 0 192.168.1.254:123 0.0.0.0:* 15118/ntpd
          udp 0 0 127.0.0.1:123 0.0.0.0:* 15118/ntpd
          udp 0 0 0.0.0.0:123 0.0.0.0:* 15118/ntpd
          udp 0 0 :::123 :::* 15118/ntpd
          # 主要是 UDP 封包,且在 port 123 這個(gè)埠口的啦!

          這樣就表示我們的 NTP 伺服器已經(jīng)啟動(dòng)了,不過要與上層 NTP 伺服器連線則還需要一些時(shí)間, 通常啟動(dòng) NTP 後約在 15 分鐘內(nèi)才會(huì)和上層 NTP 伺服器順利連接上。 那要如何確認(rèn)我們的 NTP 伺服器有順利的更新自己的時(shí)間呢?你可以使用底下幾個(gè)指令來(lái)查閱喔:

          [root@linux ~]# ntpstat
          synchronised to NTP server (220.130.158.71) at stratum 3
          time correct to within 495 ms
          polling server every 64 s
          # 這個(gè)指令可以列出我們的 NTP 伺服器有跟上層連線否。由上述的輸出結(jié)果可以知道,
          # 時(shí)間有校正約 495 * 10^(-3) 秒,且每格 64 秒會(huì)主動(dòng)去更新時(shí)間喔!

          [root@linux ~]# ntptrace -n 127.0.0.1
          127.0.0.1: stratum 3, offset -0.034965, synch distance 0.109233
          220.130.158.71: stratum 2, offset -0.000873, synch distance 0.031625
          220.130.158.50: timed out, nothing received
          ***Request timed out
          # 這個(gè)指令則可以列出目前我們的 NTP 伺服器與上層 NTP 伺服器彼此之間的關(guān)係。
          # 由於我們已經(jīng)和第二層連接上,但第二層與第一層就不是我們能管理的囉。
          # 所以那個(gè) timed out 可以不理他沒關(guān)係的。

          [root@linux ~]# ntpq -p
          remote refid st t when poll reach delay offset jitter
          ==============================================================================
          *220-130-158-71. 220.130.158.50 2 u 53 64 77 36.800 -10.496 1.890
          220-130-158-51. .INIT. 16 u - 64 0 0.000 0.000 4000.00
          +220-130-158-51. 220.130.158.50 2 u 49 64 77 33.448 -10.431 2.581
          LOCAL(0) LOCAL(0) 10 l 51 64 77 0.000 0.000 0.004

          這個(gè) ntpq -p 可以列出目前我們的 NTP 與相關(guān)的上層 NTP 的狀態(tài),上頭的幾個(gè)欄位的意義為:

          * remote:亦即是 NTP 主機(jī)的 IP 或主機(jī)名稱囉~注意最左邊的符號(hào), 如果有『+』代表目前正在作用當(dāng)中的上層 NTP ,如果是『*』代表也有連上線,不過是作為次要連線的 NTP 主機(jī)。
          * refid:參考的上一層 NTP 主機(jī)的位址
          * st:就是 stratum 階層囉!
          * when:幾秒鐘前曾經(jīng)做過時(shí)間同步化更新的動(dòng)作;
          * poll:下一次更新在幾秒鐘之後;
          * reach:已經(jīng)向上層 NTP 伺服器要求更新的次數(shù)
          * delay:網(wǎng)路傳輸過程當(dāng)中延遲的時(shí)間,單位為 10^(-6) 秒
          * offset:時(shí)間補(bǔ)償?shù)慕Y(jié)果,單位與 10^(-3) 秒
          * jitter:Linux 系統(tǒng)時(shí)間與 BIOS 硬體時(shí)間的差異時(shí)間, 單位為 10^(-6) 秒。

          事實(shí)上這個(gè)輸出的結(jié)果告訴我們,時(shí)間真的很準(zhǔn)了啦!因?yàn)椴町惗荚?0.0001 秒以內(nèi), 可以符合我們的一般使用了。另外,你也可以檢查一下你的 BIOS 時(shí)間與 Linux 系統(tǒng)時(shí)間的差異, 就是 /var/lib/ntp/drift 這個(gè)檔案的內(nèi)容,就能瞭解到咱們的 Linux 系統(tǒng)時(shí)間與 BIOS 硬體時(shí)鐘到底差多久?單位為 10^(-6) 秒啦!

          小標(biāo)題的圖示安全性設(shè)定
          NTP 伺服器在安全的相關(guān)性方面,其實(shí)剛剛我們?cè)?/etc/ntp.conf 裡面的 restrict 參數(shù)中就已經(jīng)設(shè)定了 NTP 這個(gè) daemon 的服務(wù)限制範(fàn)圍了!不過,在防火牆 iptables 的部分,還是需要開啟連線監(jiān)聽的啦!所以,在您的 iptables 規(guī)則的 scripts 當(dāng)中,需要加入這一段 (我是以開放 192.168.1.0/24 這個(gè)網(wǎng)域作為範(fàn)例的!)

          iptables -A INPUT -p UDP -i $EXTIF -s 192.168.1.0/24 --dport 123 -j ACCEPT

          若還要開放其他的網(wǎng)段或者主機(jī),請(qǐng)自行修改您的防火牆?rùn)C(jī)制咯!
          大標(biāo)題的圖示用戶端的時(shí)間更新方式
          上頭介紹了 NTP 伺服器的安裝與設(shè)定,如果我們僅有十部不到的主機(jī)時(shí),老實(shí)說(shuō),實(shí)在沒有架設(shè) NTP 伺服器的需求。 只要能夠在你的主機(jī)上頭以 NTP 用戶端軟體來(lái)進(jìn)行網(wǎng)路校時(shí)就能夠同步化時(shí)間了,沒必要時(shí)時(shí)刻刻進(jìn)行時(shí)間的校正吧!^_^! 底下我們會(huì)介紹幾個(gè)重要的概念,瞭解一下為何電腦關(guān)機(jī)了時(shí)間還能夠繼續(xù)記憶呢?

          小標(biāo)題的圖示Linux 系統(tǒng)時(shí)間與硬體時(shí)間
          在咱們的 Linux 作業(yè)系統(tǒng)當(dāng)中其實(shí)有兩個(gè)時(shí)間喔,分別是:

          * 一個(gè)是 BIOS 記錄的實(shí)際時(shí)間,這也是硬體所記錄的;
          * 一個(gè)是 Linux 自己的系統(tǒng)時(shí)間,由 1970/01/01 開始記錄的時(shí)間參數(shù)。

          當(dāng) Linux 開機(jī)後,他會(huì)主動(dòng)的讀出 BIOS 所記錄的時(shí)間,然後開始用自己的方式來(lái)計(jì)算時(shí)間了。 當(dāng)我們使用 date 之類的指令來(lái)查詢或者是設(shè)定時(shí)間時(shí),該時(shí)間指的僅是 Linux 的時(shí)間而已, 並沒有更動(dòng)到 BIOS 內(nèi)所記錄的時(shí)間吶!除非你使用 hwclock 來(lái)寫入或者是讀出 BIOS 的時(shí)間。

          而由於 BIOS 會(huì)記錄時(shí)間而且會(huì)持續(xù)計(jì)時(shí),因此我們關(guān)機(jī)後再開機(jī)時(shí),會(huì)發(fā)現(xiàn)時(shí)間其實(shí)是有順利的累積上來(lái)的。 為了要維持 BIOS 所記錄的資訊,因此主機(jī)板上面的電池就很重要了, 因?yàn)樗梢宰?BIOS 在關(guān)機(jī)的時(shí)候還繼續(xù)的記錄硬體資訊以及維持時(shí)間的累計(jì)。 所以如果你發(fā)現(xiàn)開機(jī)後整個(gè) BIOS 時(shí)間竟然恢復(fù)成為系統(tǒng)出廠值,很可能就是主機(jī)板上面的電池沒電了。 如果你將 BIOS 斷電處理時(shí),嘿嘿!時(shí)間可能也會(huì)恢復(fù)成為系統(tǒng)出廠值啊。

          由於每個(gè) BIOS 內(nèi)部的時(shí)間計(jì)算器可能有點(diǎn)誤差,因此與我們的 Linux 時(shí)間多多少少就會(huì)產(chǎn)生差異, 這個(gè)差異在時(shí)間拉長(zhǎng)之後,就會(huì)發(fā)現(xiàn)他的重要性了。所以才會(huì)需要進(jìn)行網(wǎng)路校時(shí)嘛!您說(shuō)是吧~

          小標(biāo)題的圖示Linux 系統(tǒng)時(shí)區(qū)與手動(dòng)校時(shí)工作: date, hwclock
          我們?cè)谇懊嬲f(shuō)過, Linux 的時(shí)區(qū)檔案就是 /etc/localtime ,這是一個(gè)時(shí)間格式的檔案而不是 ASCII 類型的檔案喔! (file /etc/localtime 可以看出),至於所有的 Time Zone 則放置在 /usr/share/zoneinfo 這個(gè)目錄下。請(qǐng)注意:

          * 當(dāng) /etc/localtime 存在時(shí),系統(tǒng)的時(shí)區(qū)以該檔案代表的時(shí)區(qū)來(lái)顯示、
          * 當(dāng) /etc/localtime 不存在時(shí),系統(tǒng)的時(shí)區(qū)主要以 GMT (或 UTC) 為準(zhǔn);

          所以,如果您想要變更您 Linux 系統(tǒng)的時(shí)區(qū),那麼只要在 /usr/share/zoneinfo 裡面找到您需要的時(shí)區(qū)檔案, 然後將他複製一份成為 /etc/localtime 就可以順利的更新時(shí)區(qū)設(shè)定了!另外,同時(shí)建議修正一下 /etc/sysconfig/clock 這個(gè)檔案裡面的 ZONE 設(shè)定值!以我們臺(tái)灣的 Time zone 為例,在 /etc/sysconfig/clock 這個(gè)檔案當(dāng)中應(yīng)該是『ZONE="Asia/Taipei"』這就表示我們的時(shí)區(qū)檔案為 /usr/share/zoneinfo/Asia/Taipei 這個(gè)檔案囉!請(qǐng)對(duì)應(yīng)著修改成您所想要的時(shí)區(qū)吧!

          例題:
          假設(shè)你的主機(jī)本來(lái)在臺(tái)灣,後來(lái)被搬到美國(guó)的洛杉磯 (Los_Angeles) 去了。請(qǐng)問你如何更改主機(jī)的時(shí)區(qū)參考檔案?
          答:

          時(shí)區(qū)參考檔在是 /etc/localtime ,不過這個(gè)檔案在不同的 Linux distribution 的處理方式不一樣。 以 Red Hat 系統(tǒng)為例,他是以複製的方式來(lái)處理這個(gè)檔案。而 SuSE 則是以 hard link 來(lái)處理的。 所以,請(qǐng)記得不要隨意的單純用『複製』的方式來(lái)處理,最好先移除後複製。 所以你可以這樣做:

          [root@linux ~]# rm /etc/localtime
          [root@linux ~]# cp -a /usr/share/zoneinfo/America/Los_Angeles \
          > /etc/localtime
          [root@linux ~]# vi /etc/sysconfig/clock
          ZONE="America/Los_Angeles"
          UTC=false
          ARC=false

          這樣就 OK 的啦! ^_^


          好了,時(shí)區(qū)修正完畢了,那麼時(shí)間呢?如前所述,目前 Linux 系統(tǒng)上面有兩個(gè)時(shí)間喔,一個(gè)是 Linux 系統(tǒng),另一個(gè)則是 BIOS 時(shí)間!我們可以使用 date 這個(gè)指令來(lái)手動(dòng)修正目前主機(jī)的時(shí)間,不過, date 這個(gè)指令僅修正 Linux 時(shí)間而已,我們還需要以 hwclock 這個(gè)指令來(lái)將 BIOS 時(shí)間也更新才行!

          [root@linux ~]# date MMDDhhmmYYYY
          參數(shù):
          MM:月份
          DD:日期
          hh:小時(shí)
          mm:分鐘
          YYYY:西元年

          1. 修改時(shí)間成為 1 小時(shí)後的時(shí)間該如何是好?
          [root@linux ~]# date
          Thu Dec 7 15:36:45 CST 2006

          [root@linux ~]# date 120716362006
          Thu Dec 7 16:36:00 CST 2006
          # 瞧!時(shí)間立刻就修改過來(lái)了!

          [root@linux ~]# hwclock [-rw]
          參數(shù):
          -r :亦即 read ,讀出目前 BIOS 內(nèi)的時(shí)間參數(shù);
          -w :亦即 write ,將目前的 Linux 系統(tǒng)時(shí)間寫入 BIOS 當(dāng)中啊!

          2. 查閱 BIOS 時(shí)間,並且寫入更改過的時(shí)間囉!
          [root@linux ~]# hwclock -r
          Thu Dec 7 15:37:44 2006 -0.627128 seconds
          # 看一看,是否剛好差異約一個(gè)小時(shí)啊!這就是 BIOS 時(shí)間!

          [root@linux ~]# hwclock -w
          # 這樣就寫入囉~很簡(jiǎn)單吧!

          這樣可以瞭解了嗎?當(dāng)我們進(jìn)行完 Linux 時(shí)間的校時(shí)後,還需要以 hwclock 來(lái)更新 BIOS 的時(shí)間,因?yàn)槊看伍_機(jī)的時(shí)候,系統(tǒng)會(huì)重新由 BIOS 將時(shí)間讀出來(lái),所以, BIOS 才是重要的時(shí)間依據(jù)吶。

          小標(biāo)題的圖示Linux 的網(wǎng)路校時(shí)
          在 Linux 的環(huán)境當(dāng)中可利用 NTP 的用戶端程式,亦即是 ntpdate 這支程式就能夠進(jìn)行時(shí)間的同步化。 不過你要知道的是,因?yàn)?NTP 伺服器本來(lái)就會(huì)與上層時(shí)間伺服器進(jìn)行時(shí)間的同步化, 所以在預(yù)設(shè)的情況下,NTP 伺服器不可以使用 ntpdate !也就是說(shuō) ntpdate 與 ntpd 不能同時(shí)啟用的。 所以你不要在 NTP server 上頭執(zhí)行這個(gè)指令呦!我們就來(lái)看看如何處理吧!

          [root@linux ~]# ntpdate [-nv] [NTP IP/hostname]
          參數(shù):
          -d :進(jìn)入除錯(cuò)模式 (debug) ,可以顯示出更多的有效資訊。

          [root@linux ~]# ntpdate 192.168.1.254
          7 Dec 17:21:46 ntpdate[1427]: adjust time server 192.168.1.254 offset -0.0147 sec
          # 最後面會(huì)顯示微調(diào)的時(shí)間有多少 (offset)

          [root@linux ~]# hwclock -w
          # 還得寫入 BIOS 時(shí)間才行啊!

          [root@linux ~]# vi /etc/crontab
          # 加入這一行去!
          10 5 * * * root /usr/sbin/ntpdate tock.stdtime.gov.tw && /sbin/hwclock -w

          使用 cron 之後,每天 5:10 Linux 系統(tǒng)就會(huì)自動(dòng)的進(jìn)行網(wǎng)路校時(shí)囉!相當(dāng)?shù)暮?jiǎn)易吧!

          小標(biāo)題的圖示W(wǎng)indows 的網(wǎng)路校時(shí)
          或許你一直都沒發(fā)現(xiàn),其實(shí) Windows 在預(yù)設(shè)的情況當(dāng)中,已經(jīng)幫我們處理了網(wǎng)路校時(shí)的工作喔! 不管你願(yuàn)不願(yuàn)意.....你可以將滑鼠的指標(biāo)指在工作列右下角的時(shí)間處按兩下,就會(huì)出現(xiàn)如下的畫面:

          Windows XP 提供的網(wǎng)路校時(shí)功能
          圖二、Windows XP 提供的網(wǎng)路校時(shí)功能

          如上所示,你可以自行填寫臺(tái)灣的時(shí)間伺服器來(lái)對(duì)應(yīng)時(shí)間,當(dāng)然也可以填寫你自己的時(shí)間伺服器啊! 之後系統(tǒng)就會(huì)主動(dòng)的上網(wǎng)去更新時(shí)間了。不過,這是 Windows XP 才有的功能,如果是比較早期的 Windows , 例如 Windows 95/2000 預(yù)設(shè)是沒有這個(gè)功能的。不過也沒有關(guān)係, 因?yàn)閲?guó)家頻率與時(shí)間標(biāo)準(zhǔn)實(shí)驗(yàn)室 (http://www.stdtime.gov.tw/) 也有提供一個(gè)用戶端軟體喔!連結(jié)資料如下:

          http://www.stdtime.gov.tw/chinese/EXE/NTPClock.exe

          你可以下載,直接執(zhí)行他就知道如何處理了,因?yàn)槭侨形慕槊娴膱D形化軟體嘛!
          大標(biāo)題的圖示重點(diǎn)回顧

          * 地球共有 24 個(gè)時(shí)區(qū),而以格林威治時(shí)間 (GMT) 為標(biāo)準(zhǔn)時(shí)間;
          * 臺(tái)灣本地時(shí)間為 GMT + 8 小時(shí);
          * 最準(zhǔn)確的時(shí)間為使用原子鐘 (Atomic clock) 所計(jì)算的,例如 UTC (Coordinated Universal Time) 就是一例;
          * Linux 系統(tǒng)本來(lái)就有兩種時(shí)間,一種是 Linux 以 1970/01/01 開始計(jì)數(shù)的系統(tǒng)時(shí)間,一種則是 BIOS 記載的硬體時(shí)間;
          * Linux 可以透過網(wǎng)路校時(shí),最常見的網(wǎng)路校時(shí)為使用 NTP 伺服器,這個(gè)服務(wù)啟動(dòng)在 udp port 123;
          * 時(shí)區(qū)檔案主要放置於 /usr/share/zoneinfo/ 目錄下,而本地時(shí)區(qū)則參考 /etc/localtime;
          * NTP 伺服器為一種階層式的服務(wù),所以 NTP 伺服器本來(lái)就會(huì)與上層時(shí)間伺服器作時(shí)間的同步化, 因此 nptd 與 ntpdate 兩個(gè)指令不可同時(shí)使用;
          * NTP 伺服器的連線狀態(tài)可以使用 ntptrace 及 ntpq -p 來(lái)查詢;
          * NTP 提供的用戶端軟體為 ntpdate 這個(gè)指令;
          * 在 Linux 下想要手動(dòng)處理時(shí)間時(shí),需以 date 設(shè)定時(shí)間後,以 hwclock -w 來(lái)寫入 BIOS 所記錄的時(shí)間。
          * 在 LPI 網(wǎng)站 http://www.lpi.org 裡面提到的,在 LPI 102 裡面 NTP 其實(shí)考的還不少!Topic 1.111.6 Maintain system time 裡面說(shuō)到,應(yīng)試者應(yīng)該要瞭解 BIOS 時(shí)間與 UTC 時(shí)間的意義,同時(shí)需要知道怎麼設(shè)定 timezone ,而時(shí)間差所使用的檔案 driftfile 也需要瞭解吶!可能會(huì)考的內(nèi)容含有:
          o date
          o hwclock
          o ntpd
          o ntpdate
          o /usr/share/zoneinfo
          o /etc/localtime
          o /etc/ntp.conf
          o /etc/ntp.drift (新版已經(jīng)改至 /var/lib/ntp/drift)

          大標(biāo)題的圖示課後練習(xí)

          * 什麼是 GMT (格林威治) 時(shí)間與 UTC 時(shí)間?
          由於地球是圓的,所以同一時(shí)間點(diǎn)上,在地球共可分為 24 個(gè)時(shí)區(qū),其中,我們以歐洲的格林威治時(shí)間為一個(gè)對(duì)照的依據(jù),這個(gè)即是 GMT 時(shí)間。臺(tái)灣時(shí)間比 GMT 時(shí)間快了 8 小時(shí)。至於 UTC 時(shí)間則是由原子鐘所計(jì)算的時(shí)間,這個(gè)時(shí)間是相當(dāng)?shù)臏?zhǔn)確的, 主要仍以格林威治時(shí)間為時(shí)區(qū)!
          * Linux 系統(tǒng)的所有時(shí)區(qū)檔案放置哪一個(gè)目錄底下?
          所有的時(shí)區(qū)檔案放置於:/usr/share/zoneinfo 底下!至於系統(tǒng)時(shí)區(qū)的設(shè)定檔則在 /etc/sysconfig/clock 與 /etc/localtime 喔!
          * 我的 Linux 主機(jī)本來(lái)放置在日本東京,現(xiàn)在想將他拿到臺(tái)灣來(lái)運(yùn)作,不過因?yàn)槿毡九c臺(tái)灣有一個(gè)小時(shí)的時(shí)差, 所以我的時(shí)間應(yīng)該需要經(jīng)過調(diào)整才行。不過,因?yàn)槲业?BIOS Time 主要是依據(jù) UTC 時(shí)間來(lái)設(shè)定的,所以似乎只要更動(dòng)時(shí)區(qū)參數(shù)即可。請(qǐng)問我該如何設(shè)定時(shí)區(qū),好讓我的 Linux 主機(jī)能夠顯示正確的時(shí)間?
          先將 /etc/localtime 刪除,然後將 /usr/share/zoneinfo/Asia/Taipei 這個(gè)檔案複製成為 /etc/localtime 即可!
          * 目前 Linux 系統(tǒng)上面的時(shí)間伺服器主要是以 NTP 為主,請(qǐng)問這個(gè) daemon 的主要設(shè)定檔放在哪裡,而該設(shè)定檔中,針對(duì)上層 time server 的設(shè)定參數(shù)為何?而那個(gè) driftfile 參數(shù)是幹嘛用的?
          在 /etc/ntp.conf 這個(gè)檔案當(dāng)中,至於上層 time server 的設(shè)定參數(shù)為 server 啊!那個(gè) driftfile 則是用來(lái)做為『時(shí)間差額』的計(jì)算的!該參數(shù)後面接的是一個(gè)完整路徑的檔名,該檔案裡面的數(shù)值單位為百萬(wàn)分之一(ppm)。
          * 請(qǐng)問 ntptrace 的功能為何?
          可以用來(lái)追蹤上層 time server 的連線時(shí)間與目前時(shí)間!
          * 我以 date 更新了我 Linux 上面的時(shí)間後,該如何將時(shí)間數(shù)據(jù)寫入 BIOS 內(nèi)?
          必須利用 hwclock 這個(gè)程式來(lái)寫入,利用 hwclock -w 寫入 BIOS
          * 在 Linux 上面如何進(jìn)行網(wǎng)路校時(shí)?
          最簡(jiǎn)單的方法即是使用『 ntpdate time.servers.ip && hwclock -w 』即可!

          大標(biāo)題的圖示參考資料

          * NTP 的官方網(wǎng)站:http://www.ntp.org
          * 時(shí)間伺服器網(wǎng)頁(yè):http://www.stdtime.gov.tw/Time/home.htm
          * NTP 網(wǎng)站:http://www.eecis.udel.edu/~mills/ntp/html/ntpd.html

          By the way, if still can not work, pls note to stop iptable
          /etc/init.d/iptables stop

          vi /etc/selinux/config

          #SELINUX=enforcing
          SELINUX=disabled
          LNMP是一個(gè)基于CentOS編寫的Nginx、MySQL、PHP、phpMyAdmin、eAcelerator一鍵安裝包。可以在VPS、獨(dú)立主機(jī)上輕松的安裝LNMP生產(chǎn)環(huán)境。

          2009年3月27日發(fā)布vsftpd已經(jīng)安裝配置包,下載。地址:
          http://blog.licess.cn/uploads/200903/vsftpd-for-LNMP.zip

          2009年3月2日修復(fù)執(zhí)行startup.sh時(shí)提示: /bin/bash^M: bad interpreter: No such file or directory 的錯(cuò)誤。

          使用說(shuō)明(2009年3月2日修改):
          登陸Linux,下載LNMP壓縮包,并解壓. (一些朋友可能不知道怎么弄,登陸VPS或者主機(jī),執(zhí)行命令 wget http://blog.licess.cn/uploads/200901/LNMP.zip ,將LNMP.zip下載到VPS中,執(zhí)行 unzip LNMP.zip 解壓LNMP一鍵安裝包)。
          執(zhí)行./down.sh下載LNMP所要的安裝包 ,如果執(zhí)行后提示:-bash: ./down.sh: Permission denied ,這個(gè)是因?yàn)闄?quán)限不夠引起的,可以執(zhí)行命令:chmod +x run.sh 來(lái)加上執(zhí)行權(quán)限。
          然后再執(zhí)行./install.sh ,輸入要綁定的域名,回車后。程序會(huì)自動(dòng)安裝編譯Nginx、PHP、MySQL、phpMyAdmin、eAcelerator這幾個(gè)軟件。

          安裝vsftp:
          下載vsftpd-for-LNMP.zip:執(zhí)行 wget http://blog.licess.cn/uploads/200903/vsftpd-for-LNMP.zip

          unzip vsftpd-for-LNMP.zip

          cd vsftpd-for-LNMP

          chmod +x installvsftpd.sh

          ./installvsftpd.sh

          安裝完畢后即可使用你的SSH的帳號(hào)和密碼登錄,也可以修改/etc/vsftpd.chroot限制用戶在家目錄里。默認(rèn)添加了adminftp 用戶,但是沒有設(shè)置密碼,可以執(zhí)行passwd adminftp 來(lái)設(shè)置密碼,或者userdel admintpd 刪除用戶。

          執(zhí)行 adduser -d /web/www/user1 -s /sbin/nologin user1 來(lái)添加一個(gè)不能SSH登錄的FTP帳號(hào),家目錄為/web/www/user1 但是沒有限制,添加限制,請(qǐng)修改/etc/vsftpd.chroot 添加要限制的用戶。

          程序安裝路徑:
          MySQL : /usr/local/mysql
          PHP : /usr/local/php
          Nginx : /usr/local/nginx
          PHPMyAdmin /web/www/phpmyadmin
          Web目錄 /web/www

          讓Nginx開機(jī)后手動(dòng)執(zhí)行 /root/run.sh 后Nginx會(huì)運(yùn)行 ,開機(jī)自動(dòng)運(yùn)行可以運(yùn)行 LNMP目錄下面的 startup.sh 文件即可。

          opt.sh 為優(yōu)化文件,如果內(nèi)存小于128MB可以通過執(zhí)行 ./opt.sh 添加swap分區(qū),并修改時(shí)區(qū)為東8區(qū)。注:并不一定在所有的VPS上都可以添加swap分區(qū),swvps不可以,其他沒有測(cè)試。

          通過下面這幾個(gè)鏈接查看phpinfo和管理MySQL
          phpinfo http://ip/phpinfo.php
          phpMyAdmin http://ip/phpmyadmin

          此版本為測(cè)試版本,已經(jīng)在SWVPS、thenynoc.com、VMware CentOS最小化安裝 上測(cè)試成功。
          ********Nginx關(guān)閉日志*******
          用Nginx做Web服務(wù)器,如果沒有處理好日志,日志文件可能會(huì)很恐怖~10G、20G.
          可以修改nginx.conf 找到access_log:
          access_log /dev/null;
          error_log /dev/null;

          這樣全部把他們丟到系統(tǒng)的黑洞里了
          不用每時(shí)每刻都往系統(tǒng)磁盤瘋狂的讀寫日志了 還延長(zhǎng)硬盤的壽命

          修改完,重啟Nginx( kill -HUP `cat logs/nginx.pid` )即可。
          *********Nginx官方推出Windows版***********
          今天在看Nginx官網(wǎng)是看到Nginx推出了Windows版。
          最新的開發(fā)為nginx/Windows-0.7.52,下載地址為:http://sysoev.ru/nginx/nginx-0.7.52.zip
          首先下載Subversion Windows版本的服務(wù)器軟件,下載地址如下:
          http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
          文件為svn-1.2.0-setup.exe,然后執(zhí)行安裝,安裝目錄如:d:\develop\subversion,然后設(shè)置一下系統(tǒng)的環(huán)境變量Path,將Subversion的bin路徑加入到系統(tǒng)的path中。

          創(chuàng)建Subersion庫(kù):首先建立一個(gè)目錄存放Subversion的庫(kù),在該庫(kù)中存放所以的Subversion項(xiàng)目,如D:\repository\subversion

          創(chuàng)建一個(gè)新的Subversion項(xiàng)目。
          只需執(zhí)行: svnadmin create D:\repository\subversion\projectnamePHPChina
          下面需要設(shè)置項(xiàng)目的用戶信息,只需打開Subversion項(xiàng)目conf目錄下passwd文件添加新的用戶即可,
          [users]
          admin = mypassword
          接下來(lái)是設(shè)置項(xiàng)目的一些其他信息,打開conf目錄下的svnserve.conf文件,然后進(jìn)行如下設(shè)置即可:
          [general]
          anon-access = read
          auth-access = write
          password-db = passwd
          realm = projectname

          啟動(dòng)Subversion,這里可以通過命令行啟動(dòng),最好使用SVN Service Wrapper,你可以通過以下地址下載:http://dark.clansoft.dk/~mbn/svnservice,將SVNService.exe拷貝到Subversion安裝主目錄的bin目錄下即可,然后執(zhí)行以下命令,就可以將Subversion以windows服務(wù)方式啟動(dòng)啦。
          SVNService -install -d -r D:\repository\subversion

          向Subversion中導(dǎo)入項(xiàng)目:現(xiàn)在我們需要將項(xiàng)目導(dǎo)入到Subversion的庫(kù)中,只需執(zhí)行一下命令: svn import d:\projectname svn://localhost/projectname -m “initial import” –username admin –password mypassword
          這樣項(xiàng)目就導(dǎo)入到subversion庫(kù)中啦。

          將項(xiàng)目導(dǎo)出:從Subversion項(xiàng)目中導(dǎo)出項(xiàng)目也很簡(jiǎn)單,只需執(zhí)行以下操作:
          svn co svn://localhost/projectname –username admin –password mypassword
          =======Window 下安裝Subversion Server============
          http://blog.roodo.com/rocksaying/archives/2385729.html

          Subversion (簡(jiǎn)稱 SVN) 是繼 CVS 之後新興的版本控制工具 (version control system) 。對(duì)於版本控制工具的諸多概念與名詞,我並不打算說(shuō)明,因?yàn)椤禫ersion Control with Subversion》已經(jīng)說(shuō)得很仔細(xì)。以我個(gè)人的經(jīng)驗(yàn),任何接觸過版本控制工具的 programmer ,都會(huì)上癮,深陷其中、不可自拔。誇張地形容, Programmer 可以沒有 IDE 工具,但不能沒有版本控制工具。

          如我這類常常接觸 open source software 的 Programmer ,多數(shù)皆熟悉 CVS/SVN 這類版本控制工具。我原本預(yù)期國(guó)內(nèi)資訊軟體公司會(huì)更普遍地使用版本控制工具,但匪夷所思的是國(guó)內(nèi)資訊軟體公司中的資訊工程師似乎對(duì)其非常陌生。例如在我過去任職的一間通過 CMMI level-2 認(rèn)證的資訊軟體公司之中,工程師竟然沒有使用版本控制工具的習(xí)慣。我這自學(xué)起家的人,完全無(wú)法理解國(guó)內(nèi)的程設(shè)人才正規(guī)養(yǎng)成教育出了什麼問題?為什麼他們不用呢?所以本文預(yù)期作為 Subversion 的快速入手指南,使 programmer 可以在自己的桌面環(huán)境中安裝 Subversion ,並用它來(lái)維護(hù)為自己寫的小工具程式。透過這一過程,養(yǎng)成 programmer 使用版本控制工具的習(xí)慣。沒錯(cuò), Subversion 不是只用在專案軟體開發(fā)的大傢伙,就算是為了個(gè)人用途撰寫的小工具程式,它都能幫上不少忙。

          多年前,我在 GNU/Linux 和 FreeBSD 環(huán)境下把玩 BBS 程式碼時(shí) (Firebird BBS, TIP) ,我就開始接觸 CVS 這個(gè)版本控制工具。當(dāng)我面對(duì)組成 BBS 的上百份 C 語(yǔ)言原始檔、上萬(wàn)行程式碼時(shí), CVS 是不可或缺的工具。沒有 CVS/SVN 這類版本控制工具,任何修改程式碼的動(dòng)作都會(huì)增加 programmer 大腦記憶體的負(fù)擔(dān), programmer 將會(huì)浪費(fèi)許多時(shí)間在搜尋與比對(duì)程式碼的工作之上。就算是撰寫個(gè)人使用的小程式,版本控制工具仍然帶給 programmer 許多便利之處。我為自己寫過的小工具不知凡幾,有些程式寫完後又過了好幾個(gè)月才會(huì)想到再修改。此時(shí)版本控制工具的提交 (commit) 記錄功能就能幫我喚起以往撰寫過程中的記憶。分支功能可以讓我無(wú)後顧之憂地為我的小工具添加新功能,確認(rèn)無(wú)誤後再合併回主幹。
          取得安裝套件

          安裝 Subversion server 其實(shí)是件很簡(jiǎn)單的事,許多 GNU/Linux distribution 都已經(jīng)提供 Subversion package ,只要一個(gè)安裝指令就能完成安裝動(dòng)作。雖然大多數(shù)使用者並不使用 GNU/Linux 作為桌面環(huán)境,而是使用 Microsoft Windows 2k/xp 作為家中的桌面環(huán)境。但在這桌面環(huán)境下安裝 Subversion 服務(wù)仍然是件非常簡(jiǎn)單的事。例如本文內(nèi)容就是在 Microsoft Windows XP 平臺(tái)上進(jìn)行 Subversion server 的實(shí)際安裝工作。

          首先,請(qǐng)先到「Subversion」網(wǎng)站中取得 Subversion server 的安裝套件。在「下載頁(yè)面」中列出了多種平臺(tái)的可執(zhí)行安裝套件。 Windows 平臺(tái)使用者,請(qǐng)開啟 Subversion Win32 binaries 之頁(yè)面下載。撰寫本文時(shí),下載的是 svn-win32-1.4.0.zip 。這個(gè)安裝套件就只是一個(gè) Zip 壓縮包,裡面是一組包含 Subversion server 以及 client 的命令列工具,所以以下的操作過程, GNU/Linux 和 MS Windows 平臺(tái)皆適用。
          安裝與啟動(dòng) Subversion server

          取得 Subversion 安裝套件的壓縮包後,解開其中的檔案放置到你想放的目錄中。此例中放在 "C:\Program Files\svn-win32" 。工具皆在其 bin 目錄中,主要使用到三個(gè)工具。

          * svnserve
          Subversion Server 主程式。本文提到「啟動(dòng) Subversion server」,意思就是執(zhí)行 svnserve 此一程式。
          * svnadmin
          Subversion 專案管理工具。負(fù)責(zé)新增空白專案、刪除專案等動(dòng)作。
          * svn
          Subversion 專案內(nèi)容存取工具。舉凡 checkout (提出專案內(nèi)容), commit (提交修改內(nèi)容), update, revert 等存取動(dòng)作,皆使用此工具。

          設(shè)置 Subversion server 的方法很多,本文只說(shuō)明最簡(jiǎn)單的一種方式,就是單獨(dú)運(yùn)行 svnserve ,只要執(zhí)行 svnserve 時(shí)加上 "--daemon" 參數(shù)即可,這種方式適合做為個(gè)人用途。若要進(jìn)行 team work ,請(qǐng)參閱《Version Control with Subversion - Chapter 6. Server Configuration》進(jìn)行配置。另有一個(gè)常用的選擇性參數(shù) "--root" 可以指示 Subversion server 搜尋專案貯藏庫(kù) (Repository) 的起點(diǎn)。 MS Windows 平臺(tái)使用者,可以建立 svnserve.exe 的捷徑,將 "--daemon" 和 "--root" 附加在「目標(biāo)欄位」,如圖「svnserve 捷徑設(shè)定」所示。日後需要使用 Subversion 時(shí),便可直接點(diǎn)擊捷徑啟動(dòng) Subversion server 。作為個(gè)人用途,這種需要時(shí)再啟動(dòng)的方式也就足夠了。如果你想在不登入桌面的情況下使用 Subversion 服務(wù),請(qǐng)參閱《Version Control with Subversion - Chapter 6. Server Configuration》,將 Subversion server 設(shè)定為系統(tǒng)服務(wù)。 GNU/Linux 可以選擇 inet daemon 和 apache server 兩種設(shè)置方式。而 Windows 平臺(tái)使用者,在 svn-win32 1.40 版之後,可以將 svnserve 設(shè)定為 Windows Service (系統(tǒng)服務(wù)) ,請(qǐng)參閱《TortoiseSVN Manual - Svnserve Based Server》。
          svnserve 捷徑設(shè)定
          圖1: svnserve 捷徑設(shè)定
          Subversion server 如何尋找專案貯藏庫(kù) (Repository)

          Subversion 預(yù)設(shè)使用專屬的 URL 格式存取專案,其格式為 "svn://主機(jī)名稱/專案貯藏庫(kù)路徑/" 。本文只在個(gè)人桌面環(huán)境下使用,所以主機(jī)名稱為 localhost 。基本上,你可以將專案貯藏庫(kù) (Repository) 放在任何目錄中。若啟動(dòng) Subversion server 時(shí)未指定 root 路徑 (未加 "--root") ,則 Subversion server 會(huì)將 URL 所指示的專案貯藏庫(kù)路徑視為完整的本地檔案路徑。例如 URL 若為 "svn://localhost/repository/project1/" ,則 Subversion server 會(huì)認(rèn)為專案貯藏庫(kù)放置在 "/repository/project1" (Windows 則為 "c:\repository\project1") 。 Windows 平臺(tái)的使用者在此需要注意一點(diǎn),你只能選擇其中一個(gè)磁碟放置 Repository ,預(yù)設(shè)是 "C:" 。這是因?yàn)?Subversion 存取專案內(nèi)容的 URL 不能包括磁碟代號(hào),因此若你將專案貯藏庫(kù)放在其他磁碟中,就必須在啟動(dòng) Subversion server 時(shí)加上 "--root" 參數(shù)指示磁碟代號(hào),例如 "svnserve --daemon --root d:"。將各個(gè)專案的貯藏庫(kù)集中放置在一個(gè)目錄下,其實(shí)是個(gè)好主意,配合 "--root" 參數(shù)指定 root 路徑,可以少記很多字。例如將專案的貯藏庫(kù)都放置在 "d:\repository" 的目錄中,那麼啟動(dòng) Subversion server 的參數(shù)應(yīng)為 "--daemon --root d:\repository" ,專案貯藏庫(kù)的 URL 則簡(jiǎn)化為 "svn://localhost/專案貯藏庫(kù)目錄/" 。
          實(shí)例測(cè)試

          所有專案的貯藏庫(kù)都存放在 "d:\repository" 目錄之中,故啟動(dòng) Subversion server 的命令列內(nèi)容為 "svnserve --daemon --root d:\repository" 。見圖「svnserve 捷徑設(shè)定」。

          現(xiàn)在要建立一個(gè)名為「hello world」的專案,故在 "d:\repository" 目錄中,建立一個(gè)名為 "hello_world" 的目錄以貯藏專案內(nèi)容。建立目錄後,再使用命令列工具 "svnadmin" ,配合參數(shù) "create" 於此目錄中建立空白專案貯藏庫(kù) (Repository),見圖「Create a repository by svnadmin」。已安裝 TortoiseSVN 的使用者,可以用圖形化介面操作,見圖「Create a repository by TortoiseSVN」。 TortoiseSVN 建立專案時(shí),會(huì)詢問使用者要以何種方式儲(chǔ)存專案,建議使用預(yù)設(shè)的「Berkeley database (BDB)」方式。
          Create a repository by svnadmin
          圖2: Create a repository by svnadmin
          Create a repository by TortoiseSVN - 1
          圖3: Create a repository by TortoiseSVN - 1
          Create a repository by TortoiseSVN - 2
          圖4: Create a repository by TortoiseSVN - 2

          Subversion 工具會(huì)自動(dòng)在 "hello_world" 目錄中產(chǎn)生專案所需的初始檔案。其中最重要的是專案組態(tài)檔 "conf/svnserve.conf" 以及密碼檔 "conf/passwd" 。Subversion 提供多種靈活的使用者認(rèn)證方式,在此只用 Subversion 內(nèi)建的認(rèn)證方式。首先應(yīng)指定未認(rèn)證者 (annonymous) 及已認(rèn)證者 (authorized) 的專案存取權(quán)限。在此例中因?yàn)槭莻€(gè)人用途,所以應(yīng)禁止未認(rèn)證者存取,設(shè)定 "anon-access = none" ;允許已認(rèn)證者讀取及寫入,設(shè)定 "auth-access = write" 。接著用最簡(jiǎn)單的密碼檔方式設(shè)定認(rèn)證資訊,只需將使用者識(shí)別帳號(hào)和密碼寫入密碼檔 "conf/passwd" ,設(shè)定 "password-db = passwd" 。見圖「Set configuration of repository」與「Set password of repository」。注意, Subversion server 一經(jīng)啟動(dòng)便成為一個(gè)網(wǎng)路服務(wù),任何人都可以透過網(wǎng)路連線取得電腦中的專案內(nèi)容,所以一定要用密碼管制。在個(gè)人用途或非公開的開發(fā)團(tuán)隊(duì)中,更應(yīng)為 Subversion server 設(shè)置網(wǎng)路防火牆,以阻絕外來(lái)使用者的存取企圖。
          Set configuration of repository
          圖5: Set configuration of repository
          Set password of repository
          圖6: Set password of repository

          設(shè)定組態(tài)及密碼後,專案貯藏庫(kù)的建立工作便算完成。接下來(lái)測(cè)試是否可以存取專案貯藏庫(kù)。請(qǐng)先啟動(dòng) Subversion server 。接下來(lái),此例中將專案貯藏庫(kù)放置在 "d:\repository\hello_world" ,且啟動(dòng) Subversion server 時(shí)已經(jīng)指定 "d:\repository" 為 root 目錄,所以專案的 URL 應(yīng)該是 "svn://localhost/hello_world/" ,就以此 URL 向 Subversion server 提出 (checkout) hello_world 專案,提出的內(nèi)容,稱之為工作複本 (working copy) 。此例將工作複本放在 "d:\src\hello" 。見圖「Checkout a repository」。如果一切無(wú)誤,那麼 Subversion 就會(huì)在 "d:\src\hello" 之中產(chǎn)生工作複本了。
          Checkout a repository by svn
          圖7: Checkout a repository by svn
          Checkout a repository by TortoiseSVN
          圖8: Checkout a repository by TortoiseSVN
          軟體專案管理的起點(diǎn)

          軟體專案管理之中,充斥了太多理論,有心提高軟體生產(chǎn)品質(zhì)的使用者,不論是軟體開發(fā)團(tuán)隊(duì)的 PM ,亦或是習(xí)慣為自己使用而動(dòng)手寫程式的 programmer ,也許都被那些軟體專案管理的理論弄得昏頭轉(zhuǎn)向。然而它們的起點(diǎn),都是從版本控制著手的。透過這篇快速入門,從無(wú)到有的設(shè)置服務(wù)並建立空白專案,只要三個(gè)步驟就完成了,相信可以讓各位了解建立一個(gè)版本控制服務(wù)其實(shí)並不難。接下來(lái),我預(yù)計(jì)還會(huì)再完成一篇使用文章,以編寫程式碼的過程為實(shí)例,說(shuō)明 svn 和 TortoiseSVN 的實(shí)用功能。
          [+]Roodo Cliip
          re: Memcache工作原理 Blog of JoJo 2009-05-07 13:54  
          memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),可以用來(lái)構(gòu)建大負(fù)載的網(wǎng)站,來(lái)分擔(dān)數(shù)據(jù)庫(kù)的壓力。在這里我們要非常注意三點(diǎn):

          * 分布式:具我目前了解,memcache作為分布式緩存系統(tǒng)的一種方法是首先啟動(dòng)多個(gè)memcache進(jìn)程,這些進(jìn)程可以在不同的主機(jī)的不同端口上。memcache的分布式方法可以在N個(gè)前端主機(jī)上跑memcache進(jìn)程,可以應(yīng)付足夠大的緩存數(shù)據(jù),提高了訪問獲取數(shù)據(jù)的速度。
          * 內(nèi)存對(duì)象:memcache的工作機(jī)制是通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash表,用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫(kù)檢索的結(jié)果等
          * 緩存:一個(gè)好多緩存機(jī)制,可以給一個(gè)程序帶來(lái)意想不到的性能提高,這個(gè)就不用多說(shuō)了。

          memcache的優(yōu)點(diǎn):一般情況下,緩存系統(tǒng),我們最注重的性能,不然我們用它來(lái)做啥呢?然后就是在管理維護(hù)方面,因?yàn)槭且藖?lái)操作的,所以需要它能夠穩(wěn)定的運(yùn)行以及不能讓人發(fā)狂的配置。
          There are other places your application might be opening files than
          just URLConnection... for example every Runtime.exec() costs 3 open
          files.

          To check the limit, use "ulimit -a" or "ulimit -n" in the shell.

          This isn't a solution, but you can increase the limit by running
          "ulimit -n someNumber" in the shell before running the application, or
          put the command in your .bash_profile or similar place so it runs
          every time you login.

          The solution is to find out what files your application isn't closing,
          and make sure you close them. You can do that by doing "ls -l" in
          /proc/NN/fd, or running lsof on the process.
          Re: Could not initialize master info structure, more error messages can be found in the MySQL error log

          Login to mysql, then perform these steps:
          1.)mysql> reset slave;
          2.)mysql> start slave;

          Done.

          http://forums.mysql.com/read.php?26,163227,220616#msg-220616
          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 16:18  
          ejb3 小結(jié)6
          1 ejb的依賴注入
          @Stateless
          @Remote ({Injection.class})
          public class InjectionBean implements Injection {
          @EJB (beanName="HelloWorldBean")
          HelloWorld helloworld;

          public String SayHello() {
          return helloworld.SayHello("注入者");
          }

          這里注入了另一個(gè)bean helloworldbean了,還可以用
          mappedName="HellWorldBean/remote
          來(lái)指定JNDI


          2 定時(shí)服務(wù)
          例子:


          import javax.annotation.Resource;
          import javax.ejb.Remote;
          import javax.ejb.SessionContext;
          import javax.ejb.Stateless;
          import javax.ejb.Timeout;
          import javax.ejb.Timer;

          @Stateless
          @Remote ({TimerService.class})
          public class TimerServiceBean implements TimerService {

          private int count = 1;
          private @Resource SessionContext ctx;

          public void scheduleTimer(long milliseconds){
          count = 1;
          ctx.getTimerService().createTimer(new Date(new Date().getTime() + milliseconds),milliseconds, "大家好,這是我的第一個(gè)定時(shí)器");
          }

          @Timeout
          public void timeoutHandler(Timer timer)
          {
          System.out.println("---------------------");
          System.out.println("定時(shí)器事件發(fā)生,傳進(jìn)的參數(shù)為: " + timer.getInfo());
          System.out.println("---------------------");

          if (count>=5){
          timer.cancel();//如果定時(shí)器觸發(fā)5次,便終止定時(shí)器
          }
          count++;
          }
          }
          通過依賴注入@Resource SessionContext ctx,我們獲得SessionContext對(duì)象,調(diào)用ctx.getTimerService().createTimer
          (Date arg0, long arg1, Serializable arg2)方法創(chuàng)建定時(shí)器,三個(gè)參數(shù)的含義如下:
          Date arg0 定時(shí)器啟動(dòng)時(shí)間,如果傳入時(shí)間小于現(xiàn)在時(shí)間,定時(shí)器會(huì)立刻啟動(dòng)。
          long arg1 間隔多長(zhǎng)時(shí)間后再次觸發(fā)定時(shí)事件。單位:毫秒
          Serializable arg2 你需要傳給定時(shí)器的參數(shù),該參數(shù)必須實(shí)現(xiàn)Serializable接口。
          當(dāng)定時(shí)器創(chuàng)建完成后,我們還需聲明定時(shí)器方法。定時(shí)器方法的聲明很簡(jiǎn)單,只需在方法上面加入@Timeout 注
          釋,另外定時(shí)器方法必須遵守如下格式:
          void XXX(Timer timer)
          在定時(shí)事件發(fā)生時(shí),此方法將被執(zhí)行。

          在客戶端調(diào)用時(shí),可以這樣
          try {
          InitialContext ctx = new InitialContext(props);
          TimerService timer = (TimerService) ctx.lookup("TimerServiceBean/remote");
          timer.scheduleTimer((long)3000);

          }



          3 日期型的注釋

          @Temporal(value=TemporalType.DATE)
          public Date getBirthday() {
          return birthday;
          }

          @Temporal默認(rèn)為timestamp映射,有三個(gè)可以選TemporalType.DATE,TemporalType.time,TemporalType.timestamp



          4 @lob
          如果是大的LOB,最好用延遲加載了
          @Lob
          @Basic(fetch=FetchType.Lazy)
          ......



          5 命名參數(shù)查詢
          Query query=em.createQuery("select p from Person P where p.personid=:Id");

          query.setParameter("Id",new Integer(1));



          6 查詢部分屬性
          Query query = em.createQuery("select p.personid, p.name from Person p order by p.personid desc ");
          //集合中的元素不再是Person,而是一個(gè)Object[]對(duì)象數(shù)組
          List result = query.getResultList();
          if (result!=null){
          Iterator iterator = result.iterator();
          while( iterator.hasNext() ){
          //取每一行
          Object[] row = ( Object[]) iterator.next();
          //數(shù)組中的第一個(gè)值是personid
          int personid = Integer.parseInt(row[0].toString());
          String PersonName = row[1].toString();
          out.append("personid="+ personid+ "; Person Name="+PersonName+ "<BR>");
          }
          }


          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 15:54  
          import java.awt.event.*;
          import java.util.*;

          public class Task implements ActionListener {
          javax.swing.Timer time;
          public Task() {
          //初始化定時(shí)器,每分鐘響應(yīng)一次
          time = new javax.swing.Timer(1000*6, this);
          time.start();
          }

          public void actionPerformed(ActionEvent arg0) {
          Calendar rightNow = Calendar.getInstance();
          if(rightNow.get(Calendar.HOUR_OF_DAY) == 9 ||
          rightNow.get(Calendar.HOUR_OF_DAY) == 16)
          {
          if(Calendar.getInstance().get(Calendar.MINUTE) == 30)
          //9:30或16:30執(zhí)行任務(wù)計(jì)劃
          do_task(); }
          return;
          }
          public void do_task() {
          System.out.println("begin ");
          //調(diào)用計(jì)劃要運(yùn)行的程序v
          try{
          //Runtime.getRuntime().exec("***.exe");
          }catch(Exception e){}
          }
          public static void main(String[] args) {
          Task a = new Task();
          //死循環(huán)讓程序不斷執(zhí)行
          while(true);
          }
          }
          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 15:43  
          要在每天9:30和16.30兩個(gè)時(shí)間定時(shí)啟動(dòng)程序,應(yīng)該怎么用Timer定時(shí)器來(lái)實(shí)現(xiàn)?
          ===============================================
          方法是有,程序啟動(dòng)的時(shí)候計(jì)算今天(當(dāng)前日期)的9:30的微秒數(shù),距離現(xiàn)在(當(dāng)前時(shí)間)的微秒數(shù)的差,這樣就得到了馬上該運(yùn)行的是那個(gè)時(shí)間,下一次運(yùn)行的間隔的微秒數(shù)(一天60×60×24×1000),這樣應(yīng)該是有辦法做的。

          這種情況一般用1個(gè)TimerTask控制loading當(dāng)天的任務(wù).這個(gè)TimerTask基本上每天24小時(shí)運(yùn)行一次.只要保證在9點(diǎn)之前運(yùn)行就可以了
          final Timer timer=new Timer(false);
          timer.schedual(new TimerTask()
          {
          public void run()
          {
          Calendar now=Calendar.getInstance(); //獲得當(dāng)前時(shí)間
          Calendar next1=Calendar.getInstance();
          Calendar next2=Calendar.getInstance();
          next1.set(Calendar.HOUR_OF_DAY,9);//設(shè)置鐘頭9點(diǎn)
          next1.set(Calendar.MINUTE,30);//設(shè)置分鐘為30
          next2.set(Calendar.HOUR_OF_DAY,16);
          next2.set(Calendar.MINUTE,30);
          timer.schedual(new TimerTask()
          {
          public void run()
          {
          //你9點(diǎn)半要作的事情
          }
          },(next1.getTimeInMillis()-now.getTimeInMillis()));
          //計(jì)算現(xiàn)在距離9點(diǎn)半還有多少時(shí)間.
          timer.schedual(new TimerTask()
          {
          public void run()
          {//你16點(diǎn)半要作的事情}
          },(next2.getTimeInMillis()-now.getTimeInMillis()));
          }
          },0,24*60*60*1000);24小時(shí)運(yùn)行一次
          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 15:37  
          方法是有,程序啟動(dòng)的時(shí)候計(jì)算今天(當(dāng)前日期)的9:30的微秒數(shù),距離現(xiàn)在(當(dāng)前時(shí)間)的微秒數(shù)的差,這樣就得到了馬上該運(yùn)行的是那個(gè)時(shí)間,下一次運(yùn)行的間隔的微秒數(shù)(一天60×60×24×1000),這樣應(yīng)該是有辦法做的。
          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 15:26  
          我既然提了這個(gè)思路,就說(shuō)明其可行性。就算你不用ontime,只要主板在加電。時(shí)鐘依然跳動(dòng),對(duì)系統(tǒng)是的負(fù)擔(dān),不可說(shuō)沒有。但是不會(huì)影響到正常運(yùn)行的。就算是計(jì)劃任務(wù),原理依然相似。
          ---------------------------------------------------------------------------------
          可行是肯定的,但是否最優(yōu)就必須討論了.
          我的意思是能否直接調(diào)用內(nèi)核的服務(wù),不要繞彎,這樣能減少消耗.
          當(dāng)然,最快的方法是硬件中斷,但是這需要做的額外工作很多,不于考慮.

          settimer在user32.dll中實(shí)現(xiàn).這個(gè)函數(shù)到user32.dll中注冊(cè)一個(gè)回調(diào)函數(shù).
          user32.dll里應(yīng)該有個(gè)循環(huán),到了某個(gè)時(shí)刻就調(diào)用該回調(diào)函數(shù).

          madhappy(545454) 的方法基本可行.
          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 15:25  
          計(jì)劃任務(wù)可以編程實(shí)現(xiàn),比如程序運(yùn)行一個(gè)shell命令 at..../interactive %%%.exe Time....之類的,具體看文檔.但是萬(wàn)一機(jī)器把task服務(wù)關(guān)閉,就比較麻煩了.

          定時(shí)器也可以.

          或者啟動(dòng)程序的時(shí)候記錄一個(gè)時(shí)間,寫到硬盤上某文件之類的,每隔24小時(shí)再執(zhí)行一下你的那個(gè)文件夾操作,還可以當(dāng)日志用.
          re: java日期操作 及 Timer定時(shí)器 Blog of JoJo 2008-10-26 15:25  
          1.開一個(gè)定時(shí)器1,長(zhǎng)度任意。
          2.在定時(shí)器1里面判定當(dāng)前時(shí)間。比如距離0:00還有8小時(shí)23分12秒,那么關(guān)閉定時(shí)器1,開定時(shí)器2,8小時(shí)
          3.在定時(shí)器2里判定當(dāng)前時(shí)間。比如距離0:00還有23分12秒,那么關(guān)閉定時(shí)器2開定時(shí)器3,長(zhǎng)度23分鐘
          4.在定時(shí)器3中開定時(shí)器4,時(shí)長(zhǎng)1秒。當(dāng)距離0:00為0時(shí),執(zhí)行操作。然后關(guān)閉定時(shí)器3開定時(shí)器1。
          5.如此往復(fù)...

          這樣的話。一天所經(jīng)歷的判斷的代碼平均也就是100來(lái)行。方法簡(jiǎn)單,就是定時(shí)器,且不會(huì)耗什么資源的。
          --------------------------------------------------------------
          思路很好,不過針對(duì)系統(tǒng)來(lái)說(shuō),是否負(fù)擔(dān)還是一樣.
          系統(tǒng)的ONTIMER,具體怎么實(shí)現(xiàn),我們大家討論一下.-----------------------------------------------------------------------------------------
          re: tsh Tapestry Spring Hibernate 集成筆記 Blog of JoJo 2008-10-05 23:13  
          一本很好的是Enjoying Web Development with Tapestry,非常的棒,由淺入深,可惜目前無(wú)法找全這本書,http://www.itpub.net/390564.html有前4章
          昨天,看電視,聽到網(wǎng)上最近流傳這樣一篇好文章,對(duì)同學(xué)聚會(huì)的真實(shí)情感和內(nèi)幕,刻畫得入木三分,個(gè)別地方雖有些偏激,但仍不失為一篇很有看法的好文. 也聽了兩個(gè)特別有代表性的跟貼,心里對(duì)作者有些景仰,燧上網(wǎng)查找原創(chuàng)文章想要收藏,可惜找了半天,卻一無(wú)所獲,心里失望致極.
          re: Tapestry學(xué)習(xí)經(jīng)驗(yàn) Blog of JoJo 2008-10-05 09:23  
          --------------------------------------------------------------------------------





          appfuse實(shí)例

          官方網(wǎng)站:appfuse-tapestry=tapestry+spring+hibernate
          DEMO登陸頁(yè)面
          http://demo.appfuse.org/appfuse-tapestry/login.jsp
          登陸用戶:

          管理員賬號(hào)
          Username:mraible
          Password:tomcat
          普通用戶賬號(hào)
          Username:tomcat
          Password:tomcat


          注:管理員賬號(hào)登陸不要改密碼啊..這只是一個(gè)demo效果,請(qǐng)大家要自覺點(diǎn),可以創(chuàng)建新的賬號(hào)!!謝謝合作


          說(shuō)明網(wǎng)址:
          http://raibledesigns.com/page/rd?entry=ann_appfuse_1_9_21


          我已將它改為Eclipse做開發(fā)的了.有須要的到群里

          注:以appfuse4.0版為主
          Tapestry的討論QQ群:8502111


          re: Tapestry學(xué)習(xí)經(jīng)驗(yàn) Blog of JoJo 2008-10-05 09:23  
          貼題提到的幾個(gè)問題:
          1.在Eclipse更改后要在tomcat的servlet管理里重啟一下appfuse,不知有沒有更好的方法可以不用重啟的.
          2.應(yīng)用Velocity作servlet模板時(shí)不能顯示中文.我加入的servlet實(shí)例.
          3.在accessDecisionManager里能不能實(shí)例對(duì)目錄的權(quán)限管理.

          現(xiàn)在還有一個(gè)問題請(qǐng)教的就是:
          我在Tomcat可以添加虛擬內(nèi)存,但在Eclipse啟動(dòng)中還是默認(rèn)的64M大少.請(qǐng)指教..
          關(guān)鍵字: Tapestry Spring Hibernate
          這是網(wǎng)上流傳很廣的一篇關(guān)于T+S+H整合的文章,我們?cè)谧罱捻?xiàng)目也正好要使用到T+S+H架構(gòu),也許是對(duì)于Tapestry的學(xué)習(xí)曲線太陡峭了,目前網(wǎng)上的資料太少啦,也希望有經(jīng)驗(yàn)的兄弟多多流些資料給大家。我會(huì)陸續(xù)的把我們的資料、心得什么的發(fā)表出來(lái),互相學(xué)習(xí)吧
          VO, PO, BO, DTO... 辨別一些名詞:
          1、VO: 實(shí)際上很模糊,通常指ValueObject和ViewObject
          2、View Object: 界面展現(xiàn)需要的對(duì)象,如Struts的FormBean
          3、Value Object: 早期被作為ValueObject和Transfer Object的總稱。實(shí)際上Value Object的真正意義在于它的內(nèi)容,而不是身份
          4、Data Transfer Object(DTO): 數(shù)據(jù)傳輸對(duì)象,在應(yīng)用程序不同層次之間傳書對(duì)象,在一個(gè)分布式應(yīng)用程序中,
          Tapestry中文資料很少,T4的尤其少。國(guó)內(nèi)的javaeye里面有干扁四季豆的文檔,還算原創(chuàng),正規(guī),但我看,還是失于簡(jiǎn)略,對(duì)零起點(diǎn)的用戶幫助有限。

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          相冊(cè)

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 江山市| 稷山县| 沂南县| 新干县| 泉州市| 山西省| 博爱县| 木兰县| 都安| 方正县| 滨海县| 老河口市| 襄垣县| 鹤岗市| 宁津县| 建始县| 秦安县| 乌拉特后旗| 昌江| 焉耆| 盱眙县| 深泽县| 女性| 聂拉木县| 泸水县| 江门市| 陈巴尔虎旗| 六安市| 汽车| 灵寿县| 通海县| 黄浦区| 姚安县| 临安市| 荔波县| 花莲市| 桃源县| 叙永县| 喀喇| 通化县| 诏安县|