<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jojo's blog--快樂憂傷都與你同在
    為夢想而來,為自由而生。 性情若水,風起水興,風息水止,故時而激蕩,時又清平……
    posts - 11,  comments - 30,  trackbacks - 0

    我的評論

    re: 不用密碼直接用 ssh 登入到遠端電腦 Blog of JoJo 2009-06-25 16:05  
    server$ chmod go-w ~/
    server$ chmod 700 ~/.ssh
    server$ chmod 600 ~/.ssh/authorized_keys
    NTP 時間伺服器 url -> http://linux.vbird.org/linux_server/0440ntp.php
    很多時候由於電腦硬體的問題,所以我們都會調整一下時間,好讓電腦系統的時間可以一直保持正確的狀態。 而既然要調整時間,那麼自然就會有一個讓我們可以對照著來調整時間的『準確時間』咯! 在實際生活中,我們可以透過電視臺、廣播電臺、電話等等來調整我們的手錶,那麼如果是在網路上呢? 該如何讓我們的主機隨時保持正確的時間資訊?!另外,整個地球被切分成為 24 個時區,那麼什麼是 GMT (格林威治時間),我們所在的時區又是哪一區呢?讓我們來簡單的談一談吧!

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

    大標題的圖示關於時區與網路校時的通訊協定
    時間對於現代人來說是很重要的,因為『 Time is money !』。既然時間如此重要,對於 Internet 來說應該也是很重要吧? 為什麼呢?還記得我們在基礎學習篇裡面談到的『登錄檔分析』吧? 如果你架設了一個登錄檔記錄伺服器的話,那麼總得要分析每個主機所傳來的資訊吧?如果每一部主機的時間都不相同, 那如何判斷問題發生的時間點?所以囉,『每一部主機的時間同步化』就很重要了。

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

    小標題的圖示什麼是時區?全球有多少時區?GMT 在那個時區?
    因為地球是圓的,所以同一個時刻,在地球的一邊是白天,一邊是黑夜。而因為人類使用一天 24 小時的制度,所以,在地球對角的兩邊就應該差了 12 的小時才對。由於同一個時間點上面, 整個地球的時間應該都不一樣,為了解決這個問題,所以可以想見的,地球就被分成 24 個時區了!

    那麼這 24 個時區是依據什麼來劃分的呢?由於地球被人類以『經緯度』座標來進行定位, 而經度為零的地點在英國『格林威治』這個城市所在縱剖面上, (註:所謂的縱剖面就是由南極切到北極的直線,而橫切面就是與赤道平行的切線),如下圖所示:

    地球的子午線、經緯度與時區的分隔概念
    圖一、地球的子午線、經緯度與時區的分隔概念

    因為繞地球一圈是 360 度角,這 360 度角共分為 24 個時區,當然一個時區就是 15 度角啦! 又由於是以格林威治時間為標準時間(Greenwich Mean Time, GMT 時間),加上地球自轉的關係,因此,在格林威治以東的區域時間是比較快的(+小時), 而以西的地方當然就是較慢囉!

    以臺灣為例,因為臺灣所在地約為東經 120 度北緯 25 度左右,又因為臺灣在格林威治的東方 (廢話!因為是東經嘛! ^_^),因此臺灣本地時間 (local time) 會比 GMT 時間快 8 小時 (GMT + 8)。當格林威治時間為零點,臺灣就已經是早上八點了! 底下約略列出各個時區的名稱與所在經度,以及與 GMT 時間的時差:

    標準時區

    經度

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

    所以囉,臺灣時間是 GMT + 8 就很容易推算出來了吧!要特別留意的是,很多朋友在安裝 Linux 的時候, 總是會發現目前的時間慢或者快了 8 小時,不要懷疑,絕對與時區有關! 趕緊給他查一下如何調整時區吧! ^_^。

    另外,在上表中有個比較有趣的時區,那就是在太平洋上面的國際換日線了!我們剛剛說,在格林威治的東邊時間會較快, 而在西邊時間會較慢,但是兩邊各走了 180 度之後就會碰頭啊!那不就剛好差了 24 小時嗎?沒錯啦! 所以才訂定為『國際換日線』啊!國際換日線剛好在太平洋上面,因此,如果您有坐飛機到美國的經驗應該會發現,咦! 怎麼出發的時間是星期六下午,坐了 13 個小時的飛機到了美國還是星期六!因為剛好通過了國際換日線, 日期減少了一天喔!如果反過來,由美國到臺灣,日期就會多加一天喔! ^_^

    小標題的圖示什麼是夏季節約時間 (daylight savings)?
    除了時區的概念先建立起來之後,現在再來談一談,那麼什麼是『夏季節約時間』? 既然是『夏季節約時間』當然主要是與夏天有關啦!因為地球在運行的時候是呈現一個傾斜角在繞太陽運轉的, 所以才有春夏秋冬(這個大家應該都知道啦!),在夏天的時候,白天的時間會比較長,所以為了節約用電, 因此在夏天的時候某些地區會將他們的時間定早一小時,也就是說,原本時區是 8 點好了, 但是因為夏天太陽比較早出現,因此把時間向前挪,在 8 點的時候,訂定為該天的 7 點~如此一來, 我們就可以利用陽光照明,省去了花費電力的時間,因此才會稱之為夏季節約時間!

    因為臺灣實在是太小了,並沒有橫跨兩個時區,因此,夏季節約時間對我們來說,雖然還是有幫助啦! 不過,似乎沒有特別推行的樣子說~

    小標題的圖示Coordinated Universal Time (UTC)與系統時間的誤差
    瞭解了一些時區的概念之後,這裡要談的是『什麼是正確的時間』。 在計算時間的時候,最準確的計算應該是使用『原子震盪週期』所計算的物理時鐘了 (Atomic Clock, 也被稱為原子鐘),這也被定義為標準時間 (International Atomic Time)。而我們常常看見的 UTC 也就是 Coordinated Universal Time (協和標準時間)就是利用這種 Atomic Clock 為基準所定義出來的正確時間。例如 1999 年在美國啟用的原子鐘 NIST F-1, 他所產生的時間誤差每兩千年才差一秒鐘!真的是很準吶!這個 UTC 標準時間是以 GMT 這個時區為主的喔!所以本地時間與 UTC 時間的時差就是本地時間與 GMT 時間的時差就是了!

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

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

    小標題的圖示NTP 通訊協定
    如同前面說的,電腦主機主要是以 BIOS 內部的時間為主要的時間依據,而偏偏這個時間可能因為 BIOS 內部晶片本身的問題,而導致 BIOS 時間與標準時間 (UTC) 有一點點的差異存在! 所以為了避免主機時間因為長期運作下所導致的時間偏差,進行時間同步 (synchronize) 的工作就顯的很重要了!

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

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

    1. 首先,主機當然需要啟動這個 daemon ,之後,
    2. Client 會向 NTP Server 發送出調校時間的 message ,
    3. 然後 NTP Server 會送出目前的標準時間給 Client ,
    4. Client 接收了來自 Server 的時間後,會據以調整自己的時間,就達成了網路校時咯!

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

    為了這些延遲的問題,有一些 program 已經開發了自動計算時間傳送過程的誤差,以更準確的校準自己的時間!當然啦,在 daemon 的部分,也同時以 server/client 及 master/slave 的架構來提供使用者進行網路校時的動作!所謂的 master/slave 就有點類似 DNS 的系統咯!舉例來說,臺灣的標準時間主機去國際標準時間的主機校時, 然後各大專院校再到臺灣的標準時間校時,然後我們再到各大專院校的標準時間校時!這樣一來,那幾部國際標準時間主機 (Time server) 的 loading 就不至於太大,而我們也可以很快速的達到正確的網路校時的目的呢!臺灣常見的 Time Server 有:

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

    至於 ntp 這個 daemon 是以 port 123 為連結的埠口 (使用 UDP 封包),所以我們要利用 Time server 來進行時間的同步更新時,就得要使用 NTP 套件提供的 ntpdate 來進行 port 123 的連線喔!關於網路校時更多的說明,可以到 NTP 的官方網站上察看喔!

    http://www.ntp.org

    大標題的圖示NTP 伺服器的安裝與設定
    NTP 伺服器也是一個很容易就可以架設成功的玩意兒,不過這個套件在不同的 distribution 上面可能有不一樣的名稱, 你要作的其實就是將他安裝起來之後,規定一部上層 NTP 伺服器來同步化你的時間即可啊! 如果你只是想要進行你自己單部主機的時間同步化,別架設 NTP ,直接使用 NTP 用戶端軟體即可喔!

    小標題的圖示所需套件與套件結構
    在 CentOS 上頭,你所需要的套件其實僅有 ntp 這個玩意兒而已,請自行使用 rpm 去找找看, 若沒有安裝,請拿出原版光碟來安裝,或者利用 yum install ntp 即可啊! 萬一找不到的話,那就用 Tarball 的方式來安裝吧!請自行前往 ntp 官方網站下載原始碼來安裝先。 不過,我們還需要時區相關的資料檔案,所以你需要的套件有:

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

    * tzdata
    套件名稱為『 Time Zone data 』的縮寫囉~主要提供了各個時區對應的顯示格式。

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

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

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

    * /etc/sysconfig/clock
    這個檔案其實也不包含在 NTP 的 daemon 當中,因為這個是 linux 的主要時區設定檔案啊!每次開機後 Linux 會自動的讀取這個檔案來設定自己系統所預設要顯示的時間說!舉個例子來說, 在我們臺灣地區的本地時間設定中,這個檔案內應該會出現一行『ZONE="Asia/Taipei"』的字樣, 這表示我們的時間設定檔案『要取用 /usr/share/zoneinfoe/Asia/Taipei 那個檔案』的意思!

    * /etc/localtime
    這個檔案就是『本地端的時間設定檔』啦!剛剛那個 clock 檔案裡面規定了使用的時間設定檔 (ZONE) 為 /usr/share/zoneinfo/Asia/Taipei ,所以說這就是本地端的時間了,此時 Linux 系統就會將 Taipei 那個檔案複製一份成為 /etc/localtime ,所以未來我們的時間顯示就會以 Taipei 那個時間設定檔案為準。

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

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

    * /sbin/hwclock
    這是一個 root 才能執行的指令,因為 Linux 系統上面 BIOS 時間與 Linux 系統時間是分開的,所以使用 date 這個指令調整了時間之後,還需要使用 hwclock 才能將修改過後的時間寫入 BIOS 當中!

    * /usr/sbin/ntpd
    這就是 NTP 的主要 daemon 檔案啦!得要啟動他才能提供 NTP 服務。注意,這個指令預設會參考 /etc/ntp.conf 裡面的設定喔!

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

    * /usr/sbin/ntptrace
    這個指令可以用來追蹤某部時間伺服器的時間對應關係,這也是個很有用的指令喔!底下我們會介紹如何使用這支程式!

    接下來,我們先來談一談如何設計那個 /etc/ntp.conf 吧!

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

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

    由於這些時間伺服器大多在國外,所以我們是否要使用這些伺服器來同步化自己的時間呢? 其實如果臺灣地區已經有標準時間伺服器的話,用那部即可,不需要連線到國外啦!浪費頻寬與時間啊! 而如前面提到的,臺灣地區已經有第二階的時間伺服器了,所以當然我們可以直接選擇臺灣地區的 NTP 主機即可。

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

    如果你評估一下,確定有架設 NTP 的需求時,我們可以直接選擇臺灣地區的上層 NTP 來同步化時間即可。 舉例來說 tock.stdtime.gov.tw 這個國家單位的第二層主機 (stratum-2) 應該是比較適合的。 一般來說,我們在進行 NTP 主機的設定時,都會先選擇多部上層的 Time Server 來做為我們這一部 NTP Server 的校正之用,選擇多部的原因是因為可以避免因為某部時間伺服器突然掛點時, 其他主機仍然可以提供我們的 NTP 主機來自我更新啊!然後我們的 NTP Server 才提供給自己的 Client 端更新時間。如此一來,國家單位的 tock.stdtime.gov.tw 負載才不會太大,而我們的 Client 也可以很快速的達到校時的動作!

    好了,我假設俺的 NTP 伺服器所需要設定的架構如下:

    * 我的上層 NTP 伺服器共有 tock.stdtime.gov.tw, tick.stdtime.gov.tw, time.stdtime.gov.tw 三部,其中以 tock.stdtime.gov.tw 最優先使用 (prefer);
    * 不對 Internet 提供服務,僅允許來自內部網域 192.168.1.0/24 的查詢而已;
    * 偵測一些 BIOS 時鐘與 Linux 系統時間的差異並寫入 /var/lib/ntp/drift 檔案當中。

    好了,先讓我們談一談如何在 ntp.conf 裡面設定權限控制吧!

    # 利用 restrict 來管理權限控制
    在 ntp.conf 檔案內可以利用『 restrict 』來控管權限,這個參數的設定方式為:

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

    其中 parameter 的參數主要有底下這些:

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

    * nomodiy
    用戶端不能更改 NTP 伺服器的時間參數,這即表示用戶端不能使用 ntpc 與 ntpq 這兩支程式來修改伺服器囉。 但用戶端仍可透過這部主機來進行網路校時的;

    * noquery
    用戶端不能夠使用 ntpq, ntpc 等指令來查詢時間伺服器,等於不提供 NTP 的網路校時囉;

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

    * notrust
    拒絕沒有認證的用戶端。

    那如果你沒有在 parameter 的地方加上任何參數的話,這表示『該 IP 或網段不受任何限制』的意思喔!一般來說,我們可以先關閉 NTP 的使用權限,然後在一個一個的啟用允許登入的網段。

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

    server [IP or hostname] [prefer]

    在 server 後端可以接 IP 或主機名稱,鳥哥個人比較喜歡使用主機名稱來設定說! 至於那個 perfer 表示『優先使用』的主機囉~有夠簡單吧!

    # 以 driftfile 記錄時間差異
    設定的方式如下:

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

    因為預設的 NTP Server 本身的時間計算是依據 BIOS 的晶片震盪週期頻率來計算的,但是這個數值與上層 Time Server 不見得會一致啊!所以 NTP 這個 daemon (ntpd) 會自動的去計算我們自己主機的頻率與上層 Time server 的頻率,並且將兩個頻率的誤差記錄下來,記錄下來的檔案就是在 driftfile 後面接的完整檔名當中了!關於檔名你必須要知道:

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

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

    根據上面的說明,我們最終可以取得這樣的設定檔案內容喔!

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

    # 2. 設定主機來源!
    server 220.130.158.71 prefer <==以這部主機為最優先
    server 220.130.158.51
    server 220.130.158.51

    # 3.原本內定的一個內部時間資料,不需要更動他
    server 127.127.1.0 # local clock
    fudge 127.127.1.0 stratum 10

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

    # 5.暫時不會使用的 keys 相關認證功能。
    keys /etc/ntp/keys

    然後準備一下修訂一下 /etc/sysconfig/ntpd 吧!

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

    這樣就設定妥當了,準備來啟動 NTP 服務吧!

    小標題的圖示NTP 的啟動與觀察
    設定完 ntp.conf 之後就可以啟動 ntp 伺服器了。啟動與觀察的方式如下:

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

    2. 觀察啟動的埠口看看:
    [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 這個埠口的啦!

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

    [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
    # 這個指令可以列出我們的 NTP 伺服器有跟上層連線否。由上述的輸出結果可以知道,
    # 時間有校正約 495 * 10^(-3) 秒,且每格 64 秒會主動去更新時間喔!

    [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
    # 這個指令則可以列出目前我們的 NTP 伺服器與上層 NTP 伺服器彼此之間的關係。
    # 由於我們已經和第二層連接上,但第二層與第一層就不是我們能管理的囉。
    # 所以那個 timed out 可以不理他沒關係的。

    [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

    這個 ntpq -p 可以列出目前我們的 NTP 與相關的上層 NTP 的狀態,上頭的幾個欄位的意義為:

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

    事實上這個輸出的結果告訴我們,時間真的很準了啦!因為差異都在 0.0001 秒以內, 可以符合我們的一般使用了。另外,你也可以檢查一下你的 BIOS 時間與 Linux 系統時間的差異, 就是 /var/lib/ntp/drift 這個檔案的內容,就能瞭解到咱們的 Linux 系統時間與 BIOS 硬體時鐘到底差多久?單位為 10^(-6) 秒啦!

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

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

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

    小標題的圖示Linux 系統時間與硬體時間
    在咱們的 Linux 作業系統當中其實有兩個時間喔,分別是:

    * 一個是 BIOS 記錄的實際時間,這也是硬體所記錄的;
    * 一個是 Linux 自己的系統時間,由 1970/01/01 開始記錄的時間參數。

    當 Linux 開機後,他會主動的讀出 BIOS 所記錄的時間,然後開始用自己的方式來計算時間了。 當我們使用 date 之類的指令來查詢或者是設定時間時,該時間指的僅是 Linux 的時間而已, 並沒有更動到 BIOS 內所記錄的時間吶!除非你使用 hwclock 來寫入或者是讀出 BIOS 的時間。

    而由於 BIOS 會記錄時間而且會持續計時,因此我們關機後再開機時,會發現時間其實是有順利的累積上來的。 為了要維持 BIOS 所記錄的資訊,因此主機板上面的電池就很重要了, 因為他可以讓 BIOS 在關機的時候還繼續的記錄硬體資訊以及維持時間的累計。 所以如果你發現開機後整個 BIOS 時間竟然恢復成為系統出廠值,很可能就是主機板上面的電池沒電了。 如果你將 BIOS 斷電處理時,嘿嘿!時間可能也會恢復成為系統出廠值啊。

    由於每個 BIOS 內部的時間計算器可能有點誤差,因此與我們的 Linux 時間多多少少就會產生差異, 這個差異在時間拉長之後,就會發現他的重要性了。所以才會需要進行網路校時嘛!您說是吧~

    小標題的圖示Linux 系統時區與手動校時工作: date, hwclock
    我們在前面說過, Linux 的時區檔案就是 /etc/localtime ,這是一個時間格式的檔案而不是 ASCII 類型的檔案喔! (file /etc/localtime 可以看出),至於所有的 Time Zone 則放置在 /usr/share/zoneinfo 這個目錄下。請注意:

    * 當 /etc/localtime 存在時,系統的時區以該檔案代表的時區來顯示、
    * 當 /etc/localtime 不存在時,系統的時區主要以 GMT (或 UTC) 為準;

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

    例題:
    假設你的主機本來在臺灣,後來被搬到美國的洛杉磯 (Los_Angeles) 去了。請問你如何更改主機的時區參考檔案?
    答:

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

    [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 的啦! ^_^


    好了,時區修正完畢了,那麼時間呢?如前所述,目前 Linux 系統上面有兩個時間喔,一個是 Linux 系統,另一個則是 BIOS 時間!我們可以使用 date 這個指令來手動修正目前主機的時間,不過, date 這個指令僅修正 Linux 時間而已,我們還需要以 hwclock 這個指令來將 BIOS 時間也更新才行!

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

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

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

    [root@linux ~]# hwclock [-rw]
    參數:
    -r :亦即 read ,讀出目前 BIOS 內的時間參數;
    -w :亦即 write ,將目前的 Linux 系統時間寫入 BIOS 當中啊!

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

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

    這樣可以瞭解了嗎?當我們進行完 Linux 時間的校時後,還需要以 hwclock 來更新 BIOS 的時間,因為每次開機的時候,系統會重新由 BIOS 將時間讀出來,所以, BIOS 才是重要的時間依據吶。

    小標題的圖示Linux 的網路校時
    在 Linux 的環境當中可利用 NTP 的用戶端程式,亦即是 ntpdate 這支程式就能夠進行時間的同步化。 不過你要知道的是,因為 NTP 伺服器本來就會與上層時間伺服器進行時間的同步化, 所以在預設的情況下,NTP 伺服器不可以使用 ntpdate !也就是說 ntpdate 與 ntpd 不能同時啟用的。 所以你不要在 NTP server 上頭執行這個指令呦!我們就來看看如何處理吧!

    [root@linux ~]# ntpdate [-nv] [NTP IP/hostname]
    參數:
    -d :進入除錯模式 (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
    # 最後面會顯示微調的時間有多少 (offset)

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

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

    使用 cron 之後,每天 5:10 Linux 系統就會自動的進行網路校時囉!相當的簡易吧!

    小標題的圖示Windows 的網路校時
    或許你一直都沒發現,其實 Windows 在預設的情況當中,已經幫我們處理了網路校時的工作喔! 不管你願不願意.....你可以將滑鼠的指標指在工作列右下角的時間處按兩下,就會出現如下的畫面:

    Windows XP 提供的網路校時功能
    圖二、Windows XP 提供的網路校時功能

    如上所示,你可以自行填寫臺灣的時間伺服器來對應時間,當然也可以填寫你自己的時間伺服器啊! 之後系統就會主動的上網去更新時間了。不過,這是 Windows XP 才有的功能,如果是比較早期的 Windows , 例如 Windows 95/2000 預設是沒有這個功能的。不過也沒有關係, 因為國家頻率與時間標準實驗室 (http://www.stdtime.gov.tw/) 也有提供一個用戶端軟體喔!連結資料如下:

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

    你可以下載,直接執行他就知道如何處理了,因為是全中文介面的圖形化軟體嘛!
    大標題的圖示重點回顧

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

    大標題的圖示課後練習

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

    大標題的圖示參考資料

    * NTP 的官方網站:http://www.ntp.org
    * 時間伺服器網頁:http://www.stdtime.gov.tw/Time/home.htm
    * NTP 網站: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是一個基于CentOS編寫的Nginx、MySQL、PHP、phpMyAdmin、eAcelerator一鍵安裝包。可以在VPS、獨立主機上輕松的安裝LNMP生產環境。

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

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

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

    安裝vsftp:
    下載vsftpd-for-LNMP.zip:執行 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的帳號和密碼登錄,也可以修改/etc/vsftpd.chroot限制用戶在家目錄里。默認添加了adminftp 用戶,但是沒有設置密碼,可以執行passwd adminftp 來設置密碼,或者userdel admintpd 刪除用戶。

    執行 adduser -d /web/www/user1 -s /sbin/nologin user1 來添加一個不能SSH登錄的FTP帳號,家目錄為/web/www/user1 但是沒有限制,添加限制,請修改/etc/vsftpd.chroot 添加要限制的用戶。

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

    讓Nginx開機后手動執行 /root/run.sh 后Nginx會運行 ,開機自動運行可以運行 LNMP目錄下面的 startup.sh 文件即可。

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

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

    此版本為測試版本,已經在SWVPS、thenynoc.com、VMware CentOS最小化安裝 上測試成功。
    re: 每日一學 2009/05/11 關于 nginx Blog of JoJo 2009-05-11 10:25  
    ********Nginx關閉日志*******
    用Nginx做Web服務器,如果沒有處理好日志,日志文件可能會很恐怖~10G、20G.
    可以修改nginx.conf 找到access_log:
    access_log /dev/null;
    error_log /dev/null;

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

    修改完,重啟Nginx( kill -HUP `cat logs/nginx.pid` )即可。
    re: 每日一學 2009/05/11 關于 nginx Blog of JoJo 2009-05-11 10:22  
    *********Nginx官方推出Windows版***********
    今天在看Nginx官網是看到Nginx推出了Windows版。
    最新的開發為nginx/Windows-0.7.52,下載地址為:http://sysoev.ru/nginx/nginx-0.7.52.zip
    首先下載Subversion Windows版本的服務器軟件,下載地址如下:
    http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
    文件為svn-1.2.0-setup.exe,然后執行安裝,安裝目錄如:d:\develop\subversion,然后設置一下系統的環境變量Path,將Subversion的bin路徑加入到系統的path中。

    創建Subersion庫:首先建立一個目錄存放Subversion的庫,在該庫中存放所以的Subversion項目,如D:\repository\subversion

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

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

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

    將項目導出:從Subversion項目中導出項目也很簡單,只需執行以下操作:
    svn co svn://localhost/projectname –username admin –password mypassword
    =======Window 下安裝Subversion Server============
    http://blog.roodo.com/rocksaying/archives/2385729.html

    Subversion (簡稱 SVN) 是繼 CVS 之後新興的版本控制工具 (version control system) 。對於版本控制工具的諸多概念與名詞,我並不打算說明,因為《Version Control with Subversion》已經說得很仔細。以我個人的經驗,任何接觸過版本控制工具的 programmer ,都會上癮,深陷其中、不可自拔。誇張地形容, Programmer 可以沒有 IDE 工具,但不能沒有版本控制工具。

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

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

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

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

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

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

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

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

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

    現在要建立一個名為「hello world」的專案,故在 "d:\repository" 目錄中,建立一個名為 "hello_world" 的目錄以貯藏專案內容。建立目錄後,再使用命令列工具 "svnadmin" ,配合參數 "create" 於此目錄中建立空白專案貯藏庫 (Repository),見圖「Create a repository by svnadmin」。已安裝 TortoiseSVN 的使用者,可以用圖形化介面操作,見圖「Create a repository by TortoiseSVN」。 TortoiseSVN 建立專案時,會詢問使用者要以何種方式儲存專案,建議使用預設的「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 工具會自動在 "hello_world" 目錄中產生專案所需的初始檔案。其中最重要的是專案組態檔 "conf/svnserve.conf" 以及密碼檔 "conf/passwd" 。Subversion 提供多種靈活的使用者認證方式,在此只用 Subversion 內建的認證方式。首先應指定未認證者 (annonymous) 及已認證者 (authorized) 的專案存取權限。在此例中因為是個人用途,所以應禁止未認證者存取,設定 "anon-access = none" ;允許已認證者讀取及寫入,設定 "auth-access = write" 。接著用最簡單的密碼檔方式設定認證資訊,只需將使用者識別帳號和密碼寫入密碼檔 "conf/passwd" ,設定 "password-db = passwd" 。見圖「Set configuration of repository」與「Set password of repository」。注意, Subversion server 一經啟動便成為一個網路服務,任何人都可以透過網路連線取得電腦中的專案內容,所以一定要用密碼管制。在個人用途或非公開的開發團隊中,更應為 Subversion server 設置網路防火牆,以阻絕外來使用者的存取企圖。
    Set configuration of repository
    圖5: Set configuration of repository
    Set password of repository
    圖6: Set password of repository

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

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

    * 分布式:具我目前了解,memcache作為分布式緩存系統的一種方法是首先啟動多個memcache進程,這些進程可以在不同的主機的不同端口上。memcache的分布式方法可以在N個前端主機上跑memcache進程,可以應付足夠大的緩存數據,提高了訪問獲取數據的速度。
    * 內存對象:memcache的工作機制是通過在內存里維護一個統一的巨大的hash表,用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等
    * 緩存:一個好多緩存機制,可以給一個程序帶來意想不到的性能提高,這個就不用多說了。

    memcache的優點:一般情況下,緩存系統,我們最注重的性能,不然我們用它來做啥呢?然后就是在管理維護方面,因為是要人來操作的,所以需要它能夠穩定的運行以及不能讓人發狂的配置。
    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定時器 Blog of JoJo 2008-10-26 16:18  
    ejb3 小結6
    1 ejb的依賴注入
    @Stateless
    @Remote ({Injection.class})
    public class InjectionBean implements Injection {
    @EJB (beanName="HelloWorldBean")
    HelloWorld helloworld;

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

    這里注入了另一個bean helloworldbean了,還可以用
    mappedName="HellWorldBean/remote
    來指定JNDI


    2 定時服務
    例子:


    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, "大家好,這是我的第一個定時器");
    }

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

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

    在客戶端調用時,可以這樣
    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默認為timestamp映射,有三個可以選TemporalType.DATE,TemporalType.time,TemporalType.timestamp



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



    5 命名參數查詢
    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,而是一個Object[]對象數組
    List result = query.getResultList();
    if (result!=null){
    Iterator iterator = result.iterator();
    while( iterator.hasNext() ){
    //取每一行
    Object[] row = ( Object[]) iterator.next();
    //數組中的第一個值是personid
    int personid = Integer.parseInt(row[0].toString());
    String PersonName = row[1].toString();
    out.append("personid="+ personid+ "; Person Name="+PersonName+ "<BR>");
    }
    }


    re: java日期操作 及 Timer定時器 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() {
    //初始化定時器,每分鐘響應一次
    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執行任務計劃
    do_task(); }
    return;
    }
    public void do_task() {
    System.out.println("begin ");
    //調用計劃要運行的程序v
    try{
    //Runtime.getRuntime().exec("***.exe");
    }catch(Exception e){}
    }
    public static void main(String[] args) {
    Task a = new Task();
    //死循環讓程序不斷執行
    while(true);
    }
    }
    re: java日期操作 及 Timer定時器 Blog of JoJo 2008-10-26 15:43  
    要在每天9:30和16.30兩個時間定時啟動程序,應該怎么用Timer定時器來實現?
    ===============================================
    方法是有,程序啟動的時候計算今天(當前日期)的9:30的微秒數,距離現在(當前時間)的微秒數的差,這樣就得到了馬上該運行的是那個時間,下一次運行的間隔的微秒數(一天60×60×24×1000),這樣應該是有辦法做的。

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

    settimer在user32.dll中實現.這個函數到user32.dll中注冊一個回調函數.
    user32.dll里應該有個循環,到了某個時刻就調用該回調函數.

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

    定時器也可以.

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

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





    appfuse實例

    官方網站:appfuse-tapestry=tapestry+spring+hibernate
    DEMO登陸頁面
    http://demo.appfuse.org/appfuse-tapestry/login.jsp
    登陸用戶:

    管理員賬號
    Username:mraible
    Password:tomcat
    普通用戶賬號
    Username:tomcat
    Password:tomcat


    注:管理員賬號登陸不要改密碼啊..這只是一個demo效果,請大家要自覺點,可以創建新的賬號!!謝謝合作


    說明網址:
    http://raibledesigns.com/page/rd?entry=ann_appfuse_1_9_21


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

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


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

    現在還有一個問題請教的就是:
    我在Tomcat可以添加虛擬內存,但在Eclipse啟動中還是默認的64M大少.請指教..
    re: Tapestry+Spring+Hibernate整合工作小結 Blog of JoJo 2008-10-04 23:56  
    關鍵字: Tapestry Spring Hibernate
    這是網上流傳很廣的一篇關于T+S+H整合的文章,我們在最近的項目也正好要使用到T+S+H架構,也許是對于Tapestry的學習曲線太陡峭了,目前網上的資料太少啦,也希望有經驗的兄弟多多流些資料給大家。我會陸續的把我們的資料、心得什么的發表出來,互相學習吧
    VO, PO, BO, DTO... 辨別一些名詞:
    1、VO: 實際上很模糊,通常指ValueObject和ViewObject
    2、View Object: 界面展現需要的對象,如Struts的FormBean
    3、Value Object: 早期被作為ValueObject和Transfer Object的總稱。實際上Value Object的真正意義在于它的內容,而不是身份
    4、Data Transfer Object(DTO): 數據傳輸對象,在應用程序不同層次之間傳書對象,在一個分布式應用程序中,
    Tapestry中文資料很少,T4的尤其少。國內的javaeye里面有干扁四季豆的文檔,還算原創,正規,但我看,還是失于簡略,對零起點的用戶幫助有限。

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

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章分類

    文章檔案

    新聞分類

    新聞檔案

    相冊

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一区二区视频在线免费观看| 亚洲欧美日韩中文二区| 国产精品免费一区二区三区| 国产亚洲精品精华液| 狼色精品人妻在线视频免费| 麻豆国产精品入口免费观看| 亚洲国产精华液2020| 国产成人aaa在线视频免费观看| 激情综合色五月丁香六月亚洲| 免费国产va在线观看| 亚洲精品第一国产综合精品99| 又硬又粗又长又爽免费看| 亚洲无码黄色网址| 最新亚洲成av人免费看| 久久久久久久久亚洲| 最近免费字幕中文大全视频 | 美腿丝袜亚洲综合| 午夜在线a亚洲v天堂网2019| 精品一卡2卡三卡4卡免费视频| 无码久久精品国产亚洲Av影片| 最近中文字幕无免费| 亚洲国产区男人本色在线观看| 国产真人无遮挡作爱免费视频 | 亚洲av丰满熟妇在线播放| 日韩精品内射视频免费观看 | 免费人成视频在线观看不卡| caoporm碰最新免费公开视频| 亚洲成AV人在线观看天堂无码| 国产成人免费高清激情明星| 亚洲精品乱码久久久久蜜桃| 亚洲人成人网站在线观看| 久久免费看少妇高潮V片特黄| 久久久久亚洲AV成人网| 四虎国产精品永久免费网址| 亚洲а∨天堂久久精品9966 | 无码少妇一区二区浪潮免费| 日韩毛片在线免费观看| 久久香蕉国产线看观看亚洲片| 成年男女免费视频网站| 一本到卡二卡三卡免费高 | 春暖花开亚洲性无区一区二区|