DNS Query Performance Testing Tool -- "queryperf"

這兩天為了測試 DNS server 的 System capacity, 才發現原來還有 "queryperf" 這個小工具,這是 Bind9 內帶的工具,不過我找了一下,雖然我在一開始裝機時就將 Bind9 的相關 package 都安裝了,不過似乎還是沒找到 "queryperf" 的 command...不過沒關係,找不到就直接裝吧...

首先看一下今天的測試環境,這裡有兩台 DNS server,中間都是 2G channel bonding 的網路:
Master DNS server : RHEL 5.2 (bind-9.3.4-6.P1)
Slave DNS server : RHEL 5.1 (bind-9.3.3-7)

首先我們先到 ISC -- Internet Systems Consortium 的 ftp 站 http://ftp.isc.org/isc/bind9/ 去抓 Bind9 Tarbal file : (找自己需要的版本就好)
[root@ns1 opt]# wget http://ftp.isc.org/isc/bind9/9.3.4-P1/bind-9.3.4-P1.tar.gz
--16:58:53-- http://ftp.isc.org/isc/bind9/9.3.4-P1/bind-9.3.4-P1.tar.gz
Resolving ftp.isc.org... 204.152.184.110, 2001:4f8:0:2::18
Connecting to ftp.isc.org|204.152.184.110|:80...

[root@ns2 opt]# wget http://ftp.isc.org/isc/bind9/9.3.3/bind-9.3.3.tar.gz
--16:56:54-- http://ftp.isc.org/isc/bind9/9.3.3/bind-9.3.3.tar.gz
Resolving ftp.isc.org... 204.152.184.110, 2001:4f8:0:2::18
Connecting to ftp.isc.org|204.152.184.110|:80...
抓回來之後,這裡我們擺在 /opt 底下,然後解壓縮 :
[root@ns1 opt]# tar -zxvf bind-9.3.4-P1.tar.gz
[root@ns2 opt]# tar -zxvf bind-9.3.3.tar.gz
接著我們到 /opt/bind-9.3.4-P1/contrib/queryperf/ 目錄下,這裡就是放 queryperf 的位置。
[root@ns1 opt]# cd bind-9.3.4-P1/contrib/queryperf/
再來是 "sh configure" 以及 "make" 來編譯我們要的 queryperf 指令:
[root@ns1 queryperf]# sh configure
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for library containing res_mkquery... -lresolv
checking for socket in -lsocket... no
checking for inet_ntoa in -lnsl... yes
checking for gethostbyname2... yes
checking for getaddrinfo... yes
checking for getnameinfo... yes
checking for socklen_t... yes
checking for sa_len... no
configure: creating ./config.status
config.status: creating Makefile
[root@ns1 queryperf]# make
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DHAVE_LIBNSL=1 -DHAVE_GETHOSTBYNAME2=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -c queryperf.c
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DHAVE_LIBNSL=1 -DHAVE_GETHOSTBYNAME2=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 queryperf.o -lnsl -lresolv -lm -o queryperf
[root@ns1 queryperf]#
接著就可以看到產生了一個新的檔案 "queryperf",這就是我們等一下要用到的指令了。
[root@ns1 queryperf]# ls -alrt
total 292
-rw-rw-r-- 1 10132 wheel 2981 Jul 12 2001 README
-rw-rw-r-- 1 10132 wheel 1831 May 13 2004 configure.in
-rwxrwxr-x 1 10132 wheel 97865 May 13 2004 configure
-rw-rw-r-- 1 10132 wheel 603 Jul 20 2004 Makefile.in
-rw-rw-r-- 1 10132 wheel 50279 Jan 5 2006 queryperf.c
drwxrwxr-x 2 10132 wheel 4096 Jun 28 2007 utils
drwxrwxr-x 2 10132 wheel 4096 Mar 30 17:29 missing
drwxrwxr-x 2 10132 wheel 4096 Mar 30 17:29 input
drwxrwxr-x 11 10132 wheel 4096 Mar 30 17:29 ..
-rw-r--r-- 1 root root 791 Mar 30 17:30 Makefile
-rwxr-xr-x 1 root root 19302 Mar 30 17:30 config.status
-rw-r--r-- 1 root root 8188 Mar 30 17:30 config.log
-rw-r--r-- 1 root root 34692 Mar 30 17:30 queryperf.o
-rwxr-xr-x 1 root root 34059 Mar 30 17:30 queryperf
drwxrwxr-x 5 10132 wheel 4096 Mar 30 17:30 .
README 檔案裡面有簡介如何使用,當然也可以用 -h 來秀一下 useage:
[root@ns1 queryperf]# /opt/bind-9.3.4-P1/contrib/queryperf/queryperf -h

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.1.1.2.2.5.4.4 2006/01/05 02:06:09 marka Exp $


Usage: queryperf [-d datafile] [-s server_addr] [-p port] [-q num_queries]
[-b bufsize] [-t timeout] [-n] [-l limit] [-f family] [-1]
[-i interval] [-r arraysize] [-u unit] [-H histfile]
[-T qps] [-e] [-D] [-c] [-v] [-h]
-d specifies the input data file (default: stdin)
-s sets the server to query (default: 127.0.0.1)
-p sets the port on which to query the server (default: 53)
-q specifies the maximum number of queries outstanding (default: 20)
-t specifies the timeout for query completion in seconds (default: 5)
-n causes configuration changes to be ignored
-l specifies how a limit for how long to run tests in seconds (no default)
-1 run through input only once (default: multiple iff limit given)
-b set input/output buffer size in kilobytes (default: 32 k)
-i specifies interval of intermediate outputs in seconds (default: 0=none)
-f specify address family of DNS transport, inet or inet6 (default: any)
-r set RTT statistics array size (default: 50000)
-u set RTT statistics time unit in usec (default: 100)
-H specifies RTT histogram data file (default: none)
-T specify the target qps (default: 0=unspecified)
-e enable EDNS 0
-D set the DNSSEC OK bit (implies EDNS)
-c print the number of packets with each rcode
-v verbose: report the RCODE of each response on stdout
-h print this usage
使用上主要有兩個步驟,第一就是先建立一個 RR 測試檔案,裡面的格式也很簡單,就是:
aaa.com NS
bbb.com MX
ccc.com A
這裡我先建兩個含我內部所有 RR record 的測試檔案:
/opt/querytest_list.txt >> 裡面有 1032 筆 record
/opt/querytest_list2.txt >> 裡面有 519120 筆 record

至於指令的用法也很簡單,就是 "./queryperf -s hostname -d test_file",其中 hostname 是被測試的 DNS server IP address 或 hostname,至於 test_file 就是剛剛編輯的 RR file 囉。

建議是直接裝在 Slave 的機器上,去測試 Master 的機器比較不影響效能,雖然我試完發現差異不太大。這裡我直接示範在 Master server 上跑 queryperf 的結果:

先測試 query 1000 筆 record 的結果:
[root@ns1 named]# /opt/bind-9.3.4-P1/contrib/queryperf/queryperf -s localhost -d /opt/querytest_list.txt

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.1.1.2.2.5.4.4 2006/01/05 02:06:09 marka Exp $

[Status] Processing input data
[Status] Sending queries (beginning with 127.0.0.1)
[Status] Testing complete

Statistics:

Parse input file: once
Ended due to: reaching end of file

Queries sent: 1030 queries
Queries completed: 1030 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries

RTT max: 0.001296 sec
RTT min: 0.000073 sec
RTT average: 0.000344 sec
RTT std deviation: 0.000116 sec
RTT out of range: 0 queries

Percentage completed: 100.00%
Percentage lost: 0.00%

Started at: Wed Mar 30 20:35:04 2010
Finished at: Wed Mar 30 20:35:04 2010
Ran for: 0.020277 seconds

Queries per second: 50796.468906 qps

[root@ns1 named]#
再先測試 query 519120 筆 record 的結果:
[root@ns1 named]# /opt/bind-9.3.4-P1/contrib/queryperf/queryperf -s localhost -d /opt/querytest_list2.txt

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.1.1.2.2.5.4.4 2006/01/05 02:06:09 marka Exp $

[Status] Processing input data
[Status] Sending queries (beginning with 127.0.0.1)
[Status] Testing complete

Statistics:

Parse input file: once
Ended due to: reaching end of file

Queries sent: 519120 queries
Queries completed: 519120 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries

RTT max: 0.002820 sec
RTT min: 0.000042 sec
RTT average: 0.000382 sec
RTT std deviation: 0.000085 sec
RTT out of range: 0 queries

Percentage completed: 100.00%
Percentage lost: 0.00%

Started at: Wed Mar 30 20:36:31 2010
Finished at: Wed Mar 30 20:36:41 2010
Ran for: 10.158483 seconds

Queries per second: 51102.118299 qps

[root@ns1 named]#
最後是在 Slave server 上跑 queryperf 去測試 Master server,先測試 query 1000 筆 record 的結果:
[root@ns2 slaves]# /opt/bind-9.3.3/contrib/queryperf/queryperf -s ns1 -d /opt/querytest_list.txt

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.1.1.2.2.5.4.4 2006/01/05 02:06:09 marka Exp $

[Status] Processing input data
[Status] Sending queries (beginning with xx.xx.xx.1)
[Status] Testing complete

Statistics:

Parse input file: once
Ended due to: reaching end of file

Queries sent: 1030 queries
Queries completed: 1030 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries

RTT max: 0.000572 sec
RTT min: 0.000128 sec
RTT average: 0.000339 sec
RTT std deviation: 0.000049 sec
RTT out of range: 0 queries

Percentage completed: 100.00%
Percentage lost: 0.00%

Started at: Wed Mar 30 20:42:17 2010
Finished at: Wed Mar 3 20:42:17 2010
Ran for: 0.018820 seconds

Queries per second: 54729.011690 qps

[root@ns2 slaves]#
再先測試 query 519120 筆 record 的結果:
[root@ns2 slaves]# /opt/bind-9.3.3/contrib/queryperf/queryperf -s ns1 -d /opt/querytest_list2.txt

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.1.1.2.2.5.4.4 2006/01/05 02:06:09 marka Exp $

[Status] Processing input data
[Status] Sending queries (beginning with xx.xx.xx.1)
[Status] Testing complete

Statistics:

Parse input file: once
Ended due to: reaching end of file

Queries sent: 519120 queries
Queries completed: 519120 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries

RTT max: 0.000818 sec
RTT min: 0.000059 sec
RTT average: 0.000330 sec
RTT std deviation: 0.000044 sec
RTT out of range: 0 queries

Percentage completed: 100.00%
Percentage lost: 0.00%

Started at: Wed Mar 30 20:42:51 2010
Finished at: Wed Mar 30 20:43:00 2010
Ran for: 9.113103 seconds

Queries per second: 56964.131756 qps

[root@ns2 slaves]#
這裡我將 Master DNS server 的 IP 馬賽克起來了...由上面的結果可以看的出來,在這一台機器上的每秒最大查詢數量大約在 5萬6千筆左右,以上,報告完畢。

------------------------------------------------------------------------------------
2010/03/31 補充資料:

再查了一下資料發現其實 Bind9 內建的小工具應該是 dnsperf/resperf 才對,用法跟 queryperf 幾乎一樣,有興趣可以參考一下下面的網頁:

Linux Certif - Man dnsperf(1)
Linux Certif - Man resperf(1)

這裡附上一個測試結果以供比較:
[root@ns2 slaves]# /usr/local/nom/bin/dnsperf -s ns1 -d /opt/querytest_list2.txt

DNS Performance Testing Tool

Nominum Version 1.0.1.0

[Status] Processing input data
[Status] Sending queries (to 113.21.80.1)
[Status] Testing complete

Statistics:

Parse input file: once
Ended due to: reaching end of file

Queries sent: 519120 queries
Queries completed: 519120 queries
Queries lost: 0 queries

Avg request size: 52 bytes
Avg response size: 136 bytes

Percentage completed: 100.00%
Percentage lost: 0.00%

Started at: Wed Mar 31 14:59:03 2010
Finished at: Wed Mar 31 14:59:13 2010
Ran for: 9.362073 seconds

Queries per second: 55449.257873 qps

[root@ns2 slaves]#
補充完畢~
(詳全文...)

首次在 Solaris 10 上 Mount RHEL5 NFS mount point fail

之前有在 LINUX AutoFS 實作 中提到關於在 RHEL 上以 AutoFS 的方式來 Mount NFS partitions from RHEL5 NFS server,今天要試一下在另一台 Solaris 10 的機器上,一樣用 AutoMount 的方式來從 RHEL5 NFS server 上 Mount NFS partitions,不過似乎遇到怪怪的問題了,在改完 /etc/auto_master 與 /etc/auto_nfs ,(這裡要特別注意一下喔,在 RHEL 上這兩個檔案為 /etc/auto.master and /etc/auto.nfs 而在 Solaris 上則改成底線符號喔),並將 svc:/system/filesystem/autofs:default 給重啟後,發現仍無法將遠端 RHEL5 share 的目錄給 mount 上來啊,出現了如下的錯誤訊息:
root@KHCFEMS01 # ls -al /NFSBKP/configuration
/NFSBKP/configuration: Permission denied
total 1
一開始還以為真的是沒在 RHEL5 NFS server 上的 /etc/exports 裡加上這部 Solaris 的權限,再次檢查之後才發現不對啊,權限都有,查看一下 Solaris 機器上的 Log 檔發現如下的錯誤:
root@KHCFEMS01 # tail -3 /var/adm/messages
Oct 8 18:18:44 KHCFEMS01 automountd[26815]: [ID 834250 daemon.error] Mount of KHCBKPS01:/NBU/KHCFEMS01 on /NFSBKP/configuration: Not owner
Oct 8 18:23:39 KHCFEMS01 nfs: [ID 435675 kern.warning] WARNING: NFS server initial call to KHCBKPS01 failed: Not owner
Oct 8 18:23:39 KHCFEMS01 automountd[26851]: [ID 834250 daemon.error] Mount of KHCBKPS01:/NBU/KHCFEMS-ALL on /NFSBKP/configuration: Not owner
原來問題是出在 Solaris 機器上 mount client 的設定檔裡關於版本的問題,在這裡,我們直接編輯 Solaris 上的 /etc/default/nfs 檔,搜尋一下
#NFS_CLIENT_VERSMAX=4
將之改為:
NFS_CLIENT_VERSMAX=3
然後將 svc:/network/nfs/client:default 給 refresh 一下:
svcadm refresh svc:/network/nfs/client:default
這時我們再看一次,果然已經可以使用 AutoMount 來看到遠端的 Mount point 囉,報告完畢~
root@KHCFEMS01 # ls -al /NFSBKP/configuration
total 33
drwxr-xr-x 5 root root 4096 Oct 8 17:21 .
dr-xr-xr-x 2 root root 2 Oct 8 18:22 ..
drwxr-xr-x 2 root root 4096 Oct 8 16:34 KHCFEMS01
drwxr-xr-x 2 root root 4096 Oct 8 16:34 KHCFEMS02
drwxr-xr-x 2 root root 4096 Oct 8 16:36 common_log
(詳全文...)

用 X-manager 連進 Linux server 時出現 GConf Error 怎麼辦?

最近用 X-manager 連進 Linux server 的 X-Window 時,卻一直出現如下圖所示的幾個錯誤訊息,這讓我在登入時很困擾:
其中有四個錯誤訊息分別是:
1. GConf error: Adding client to server's list failed, CORBA error: IDL:omg.org/CORBA/COMM_FAILURE:1.0
All further errors shown only on terminal.
2. An error occurred while loading or saving configuration information for gnome-session. Some of your configuration settings may not work properly.
Detail : Adding client to server's list failed, CORBA error: IDL:omg.org/CORBA/COMM_FAILURE:1.0
3. An error occurred while loading or saving configuration information for Nautilus. Some of your configuration settings may not work properly.
Detail : Adding client to server's list failed, CORBA error: IDL:omg.org/CORBA/COMM_FAILURE:1.0
4. An error occurred while loading or saving configuration information for Print Notifier. Some of your configuration settings may not work properly.
Detail : Adding client to server's list failed, CORBA error: IDL:omg.org/CORBA/COMM_FAILURE:1.0
遇到這種情形,一則是乾脆重新開機,如果是像我這邊的機器屬於重要服務不能中斷的話,那麼還有一個方法,照著下面的步驟吧:
首先:假設是用 root 登入的話,那麼先把 /tmp/ 底下跟 root 相關的檔案都砍掉:
接著,到 root 的目錄下,找到 .gnome 開頭的 3 個目錄 (.gnome, .gnome2, .gnome2_private),一樣,全砍了:
# rm -rf .gnome*
最後,再把 X 重啟一次吧,啥?不知道步驟喔,參考一下上一篇文章"如何在不重開機的情況下 Restart RHEL 的 X window?"吧,簡單的用下面的指令也可以:
# kill -HUP `cat /var/run/gdm.pid`
,重啟完後再用 X-manager 測試一下,果然登入時就不會再有那些亂七八糟的錯誤訊息蹦出來囉,報告完畢~
(詳全文...)

如何在不重開機的情況下 Restart RHEL 的 X window?

最近有一部 RedHat 4 的機器在使用 X manager 登入時一直出現多個 GNOME 的錯誤視窗,雖然不影響登入,但還是覺得很不舒服,想要重啟機器,但因有重要的服務在 in service,只能想辦法直接在不 reboot 機器的情況下重啟 X11了,找了一下,原來在 /usr/sbin 底下就有相關的 script 可用啊:

首先一樣我們列一下這一次的測試環境:RHEL4.5 + X11:
接著我們來秀一下這個實用 script 的內容 (/usr/sbin/gdm-restart):
看到最後那一行了沒?其實我們只要拿那一行來用就夠了,不過這裡我們在重啟服務之前先看一下 X11 的 status 吧:
注意到了嗎?目前的主要 GDM 的 PID 是 4427,接著我們直接用下面的指令來重啟 X11 吧:
# kill -HUP `cat /var/run/gdm.pid`
下面就是重啟後的結果:其中第二部分多了一筆 process:
root 16547 0.0 0.0 12548 2480 ? S 14:39 0:00 \_ /usr/bin/gdm-binary -nodaemon
這是因為我用 X-manager 連進去 server 測試的結果。
重啟完只有最初的 X11 process 的 PID 不變,其餘的 process 都已經重啟了,報告完畢~

2009/08/19 補充:在 RHEL5 上面也是一樣的作法喔~
(詳全文...)

如何在 Linux server 上 turn on DNS (BIND) 的 Query logging?

在 Linux server 上開 BIND DNS service 後,發現似乎在系統的 LOG 檔案 /var/log/messages 裡面只看的到 named service 的啟動/停止訊息,卻看不到一些 Client 端 Query 的 Log,這對初期的 named 設定上來說實在是有些困擾,幸好 BIND 的 utility 中包含一個好用的工具,那就是 rndc,他有很多好用的功能可以用來細部控制 BIND,不過這裡我們只測試一下它 Turn on query logging 的功能:

首先,這裡我們的環境是 RHEL5.2 + BIND 9.3.4:
接著,我們看一下 rndc 有哪些 option 可用:
接下來就簡單了,想要 Turn on query logging 的功能,就使用下面的指令吧:
[root@ns1 named]# rndc querylog
我們來看一下系統的紀錄檔吧:
現在已經開始產生 Client query 的紀錄了。

接下來,再下一次剛剛的指令就可以 Turn off query logging 的功能了:
[root@ns1 named]# rndc querylog
我們再看一次系統的紀錄檔吧:
果然已經停止記錄了~
(詳全文...)

在 Solaris 10 以 IPMP 簡易配置網卡的 Virtual IP

這次的實作要把本來只有一個實體 IP 的 Solaris 10 的機器改成兩個實體 IP 加上共用一個對外的虛擬 IP,實際的配置將如下:在這個實作中,我們大致上要改動到以下幾個檔案:/etc/hosts, /etc/hostname.bge0, /etc/hostname.bge1, /etc/defaultrouter,其中 bge0 與 bge1 是因為本次的實作機器為 Netra 210,所以網卡的部分請自行依據機型而變。
原配置:
bge0: 10.15.25.43

新配置:
bge0:10.15.25.31
bge1:10.15.25.32
Virtual IP: 10.15.25.43
root@KHCFEMS01 # uname -a
SunOS KHCFEMS01 5.10 Generic_137137-09 sun4u sparc SUNW,Netra-210
root@KHCFEMS01 # cat /etc/release
Solaris 10 10/08 s10s_u6wos_07b SPARC
Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 27 October 2008
當然這裡的設定也有幾個限制,首先是兩塊網卡要能提供同樣的工作模式,再來是所有設定的 IP 要在同一個網段之內,而且在這網段內要有其他的機器或設備存在,通常是 GW 啦,可以設置在 defaultrouter 內;當設定完之後,系統會不斷發出 ICMP 的 echo request 封包給同網路的 GW,應該會得到 ICMP Echo reply,另外還會同時監控網卡上有沒有 RUNNING 的存在 (就是用 ifconfig -a 時會在 <> 看到的),這兩項測試都 OK 的話,就判定網卡是 OK 的;任一項失敗,就判定網卡是 nOK 的。(這個最後我們再用snoop來測試一下就知道)

接下來就是開始設定了,首先編輯一下 /etc/hosts:
root@KHCFEMS01 # vi /etc/hosts
#
# Internet host table
#
127.0.0.1 localhost
10.15.25.43 KHCFEMS01 khcfems01 loghost
10.15.25.44 KHCFEMS02 khcfems02
10.15.25.31 KHCFEMS01_bge0 khcfems01_bge0
10.15.25.32 KHCFEMS01_bge1 khcfems01_bge1
10.15.25.33 KHCFEMS02_bge0 khcfems02_bge0
10.15.25.34 KHCFEMS02_bge1 khcfems02_bge1
接著我們啟動 bge1 的網卡:
1. 未啟動之前的現狀:
2. 啟動後的狀態:接著我們要編輯 /etc/hostname.bge0 與 /etc/hostname.bge1:
再來是編輯一下 /etc/defaultrouter 和 /etc/netmasks 囉:最後,用 init 6 重新開機一下吧~

重開完之後用 ifconfig -a 看一下網卡的狀態:接著我們用 snoop 來看一下封包吧:
P.S.1. 注意到網卡中被 <> 括起來的部分了嗎:
UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
有 RUNNING 而且 ping 的到 GW 才有機會帶起 Virtual 的 Interface 喔!另外,NOFAILOVER 就是現在 IPMP group 的狀態啦。

P.S.2. 可以看到已經有一個新的 bge0:1 被帶起來了,而其對外的 Virtual IP 也是我們設定的 10.15.25.43 囉~

以上,報告完畢!
(詳全文...)

就是這道光...我也看到日偏蝕了


昨晚聽廣播說今天早上會有日全蝕的天文景象,而且還是本世紀觀看日偏食的最佳時刻,當然在台灣並沒辦法看到完整的日全蝕,而是只能看到日偏蝕,聽新聞說有百分之87左右;今天一到了機房,大家已經圍在門口的警衛室觀看大陸的杭州與武漢日全蝕的 Live 轉播了,警衛還特別借給大家一副濾光鏡,果然到外面戴上一看,已經開始有"初虧"現象出現了,是從左上方開始缺角的...

等到接近9點半,拿出相機來拍,卻是相當失敗,幸好還有其他人有成功拍下來的,就借他一張來貼囉,這一張是在 9:36 分左右在高雄岡山的機房前拍攝的,已經很接近"食甚"了過了幾分鐘,被遮住的太陽開始恢復...只是讓我不解的是,為什麼不是往右下角方向恢復,卻是往左下角方向恢復呢? (詳全文...)

Linux 機器上 SFTP 時出現 "Received message too long xxxxxxxx" 的錯誤訊息

以往每次登入機器時都會用 SecureCRT 去連接機器,順便在 SecureCRT 上設定登入時執行的指令去附帶檢查把機器當下服務執行的狀況給秀出來,但因為登入的機器太多台,不希望每次有變動時就要去每一台有跑 SecureCRT 的電腦上把登入指令更改,因此想偷懶透過修改 /root/.bashrc 內容來讓這些檢查的過程自動化,也就是說讓 client 透過 SSH client 去連接機器時,只要用 root 登入,或切換使用者到 root 就會自動執行 /root/.bashrc 裡面所定義的 script 把機器狀態給秀出來~

當時的 /root/.bashrc 內容如下面範例所示:
[root@KHCFTPS01 ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim'
alias ls='ls --color'

TERM=xterm-color; export TERM;
alias grep='grep --color'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# Pre-health checking #
/etc/init.d/sys_chk.sh;
[root@KHCFTPS01 ~]#
其中的 /etc/init.d/sys_chk.sh; 那一段就是用來登入後檢查系統的那個小 shell script,測試從其他機器登入或本機變更使用者為 root 後都可正常秀出機器狀態檢查的結果。本來事情到這邊就結束了,但前幾天寫好這一部份後,也用的好好的,而昨天突然發現,要 SFTP 進這些機器都沒回應了,初步以為是防火牆的問題,但查了之後,繞開防火牆直接用兩台機器對測 SFTP 看到出現下面的錯誤訊息:
[root@ns1 ~]# sftp KHCFTPS01
Connecting to KHCFTPS01...
root@KHCFTPS01's password:
Received message too long 1044266528
[root@ns1 ~]#
可是用 SSH 測試卻又能正常登入,這時才想起來前幾天曾在這幾台機器上加上自動狀態檢查的 script,會不會是那個咚咚在搞鬼ㄌㄟ??於是回到機器上去修改 /root/.bashrc 把自動檢查的那一段先 mark 起來,再到 ns1 測試一次 SFTP 到我們的 FTP 機器,這次就可以成功登入了。所以果然是 /etc/init.d/sys_chk.sh 執行的東西太多,吐出太多東西到螢幕上...呵呵,既然知道問題出在哪兒了,山不轉路轉,路不轉嘛那我只好自己轉囉...回到剛才的 /root/.bashrc 中,還記得之前我們曾在 如何讓你的 Linux 色彩更豐富 中提到利用 alias 的作法來節省平常的時間,可以把一些很長的執行字串,改成好敲的短字串,這裡我們就用這種方式把 /etc/init.d/sys_chk.sh 指定給 sck 這個短字串 (sck 只是我覺得順眼的縮寫,請依個人喜好更改),改完的 /root/.bashrc 內容如下面範例所示:
[root@KHCFTPS01 ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim'
alias ls='ls --color'
alias sck='/etc/init.d/sys_chk.sh'

TERM=xterm-color; export TERM;
alias grep='grep --color'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# Pre-health checking #
sck;
[root@KHCFTPS01 ~]#
這時候再試一次 SFTP 果然就不再出現 "Received message too long 1044266528" 的問題囉~而且平時沒事也可以隨時直接敲入 sck (前面提到過,sck 只是我覺得順眼的縮寫,請依個人喜好更改)這個指令來做個機器狀態檢查,人生又擱係彩色ㄟ囉~
(詳全文...)

用 Tftpd32 接收 LINUX 送來的 SYSLOG

為了驗證機器可以送 System log 訊息到指定的 EMS server,只好先在自己的電腦上跑個 Syslog server 來收,這裡稟持本人愛用綠色軟體的習慣,推薦大家可以使用上一篇所介紹的 Tftpd32 來作為 Syslog server,有興趣可以去參觀一下(首頁在此)。而今天要驗證的 Agent 機器 OS 是 RHEL ES5.2,裡面就有 syslog Daemon 的 (service 的名稱就是 syslog 不是 syslogd 喔,待會兒要重啟服務時會用到) 所以不用另外安裝 Agent 程式。

待會兒要編輯 /etc/syslog.conf 這個主要的檔案,所以我們先列一下裡面的主要格式:
在 /etc/syslog.conf 裡的每一行都有兩個部分組成,一個是 "SELECTOR",另一個是 "ACTION"。整行組合起來就是指:當符合 "SELECTOR" 事件發生時,就採取 "ACTION" 所指定的方式來記錄這個事件。

而 "SELECTOR" 是由 facility.priority 組合而成的,其中 priority 是指事件的優先等級,分成八個不同的等級,依優先順序由低至高分別為:
debug --> info --> notice --> warn (=warning) --> err (=error) --> crit --> alert --> emerg --> panic (=emerg)。
至於 Facility 則是 syslog.conf 中用來描素事件產生子系統的關鍵字。這些在 syslog.conf 的 說明中都有提到,可以用 "man syslog.conf" 去看看詳細的說明。UNIX 系統中內定的 facility 基本上包括 auth、authpriv、cron、daemon、kern、lpr、mail、mark、news、 security(same as auth)、syslog、user、uucp、local0 ~ local7 等。這些 facility 所代表的程式,隨著 UNIX 系統種類的不同,會有些差異,但大同小異啦。下面是 facility 的意義:
* auth, authpriv:與認證有關的系統,例如 login, su 等需驗證的服務
* uucp: UUCP系統
* daemon:與各個 daemon 有關的系統
* kern :核心(kernel)系統
* lpr:列印相關的系統
* mail:與郵件有關的系統
* news:與新聞群組有關的系統
* syslog:與 syslogd本身相關的系統
* user:一般使用者的系統
* local0 ~ local7:保留, 做為特別設定使用的
所以我們接著編輯 /etc/syslog.conf 檔案,在這裡我們只新增一行新的如下來做個測試:
[root@KHCDNSS01 named]# vi /etc/syslog.conf
kern.*;daemon.warn;auth,authpriv.notice;cron.err @10.19.0.194
這裡我準備將系統 kernel 的所有訊息以及各個 Daemon 在 Warning 等級以上,認證部分的訊息在 Notice 以上還有 Cron job 在 Error 等級以上的訊息都送出來,其中 @10.19.0.194 代表將前面所定義的訊息傳送到遠端的 syslog server (IP address: 10.19.0.194),也就是跑著 Tftpd32 的電腦囉~

P.S. 另外的應用啦:如果選端收 syslog 的機器安裝的 OS 也是 LINUX server 的話,那遠端機器上要多加一個動作:
編輯 vi /etc/sysconfig/syslog 檔案,將 SYSLOGD_OPTIONS="-m 0" 變更為 SYSLOGD_OPTIONS="-m 0 -r" (增加 -r remote) 參數 ,存檔,重啟 syslog service.
[root@KHCDNSS01 named]# vi /etc/syslog.conf
kern.*;daemon.warn;auth,authpriv.notice;cron.err @10.19.0.194
[root@KHCDNSS01 named]# service syslog restart
Shutting down kernel logger: [ OK ]
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
Starting kernel logger: [ OK ]
[root@KHCDNSS01 named]# service syslog status
syslogd (pid 15144) is running...
klogd (pid 15147) is running...
所以我們可以在 Syslog server (跑 Tftpd32 的那台機器啦) 上收到來自剛剛測試機器上 restart syslog daemon 的 kernel syslog 送過來如下圖所示:

讓我們再試一次關於 kernel 的 syslog,這次我們拿兩張網卡中的其中一張,將它重起看看會發生什麼事?(P.S. 這裡兩張網卡有做 channel bonding 所以我可以隨便把其中一張網卡 down 下來,如果你的環境不是這樣,就不要隨便拿網卡來玩喔,免得連不進去囉)
[root@KHCDNSS01 named]# ifconfig eth1 down; ifconfig eth1 up;
一樣到 Syslog server 上收到來自剛剛測試機器上 eth1 down 以及 up 後 kernel infomation 的 syslog 送過來如下圖所示:

接著,我們再做個小測試,在測試機器上面搞個 daemon 的 warning syslog 來玩玩,這裡我們拿 snmpd 來做範例:
[root@KHCDNSS01 named]# service dhcpd restart
Stopping dhcpd: [ OK ]
Starting dhcpd: [ OK ]
再回到 Syslog server 上收到來自剛剛測試機器上 restart dhcpd daemon 後在帶起 dhcpd daemon warning 的 syslog 送過來如下圖所示:

接著我們測試一下關於系統登入認證的 syslog,首先我們先測試 auth,authpriv.notice; 的這種設定方式,接著我們到另一台嘗試登入測試機器,並故意第一次敲錯密碼然後第二次敲正確的密碼登入再以 exit 登出測試機器,接著我們可以在 Syslog server 上發現只收到來自剛剛測試機器上 auth,authpri notice 關於有某個 user 從某一台機器嘗試登入失敗的 syslog 送過來,至於正確敲入密碼登入及登出的部分就沒有 syslog 送出了,如下圖所示:

[root@KHCBKPS01 ~]# ssh 10.15.25.13
root@10.15.25.13's password:
Permission denied, please try again.
root@10.15.25.13's password:
Last login: Thu Jun 4 18:54:37 2009 from 10.15.25.51
[root@KHCDNSS01 named]# exit
logout

Connection to 10.15.25.13 closed.
[root@KHCBKPS01 ~]#
再來我們再測試一下 auth,authpriv.info; 的這種設定方式,接著我們到另一台嘗試登入測試機器,重複剛才的測試步驟,接著我們就可以在 Syslog server 上收到來自剛剛測試機器上 auth,authpri information 關於有某個 user 從某一台機器嘗試登入失敗,然後正確登入以及登出的 syslog 送過來如下圖所示:

[root@KHCBKPS01 ~]# ssh 10.15.25.13
root@10.15.25.13's password:
Permission denied, please try again.
root@10.15.25.13's password:
Last login: Thu Jun 4 18:56:44 2009 from 10.15.25.51
[root@KHCDNSS01 named]# exit
logout

Connection to 10.15.25.13 closed.
[root@KHCBKPS01 ~]#
以上只是一些簡單的使用範例,至於實際組合,就看個人的需求自行變更囉~
(詳全文...)

用 Tftpd32 更新 D-Link DES-3828 的 Firmware

為了幫手邊的 D-Link DES-3828DC switch 加上跨 VLAN 的 DHCP relay 功能,所以得將機器上的 Firmware 從 4.50.B12 更新到 4.50.B16,至於更新的方式就是將新的 firmware image 檔放在 tftp server 上,然後更新到 D-Link 上~這裡稟持本人愛用綠色軟體的習慣,推薦大家可以使用 Tftpd32 來作為 tftp server,有興趣可以去參觀一下(首頁在此),或者直接下載 Tftpd32 v3.3 英文綠色版

首先要將電腦接上網路線連到要更新 Firmware 的 D-Link 上然後直接執行 Tftpd32 讓他跑起來就好,然後把新的 Firmware Image 檔放到 Tftp server,也就是剛剛的電腦上的任意一個目錄下(這裡就先用 C:\ 當範本囉),然後把 tftp 欄位上的 Current Directory 點 Browse 去選取剛剛的目錄,也就是 C:\ 就好了,接著 telnet 或者要直接連 console 進去 D-Link 都可以,登入之後 (D-Link DES-3828DC 初始是沒有帳號密碼的,直接 enter 就可登入了,記得設個新帳號和密碼喔) 可以看到目前的 Firmware 版本為 Build 4.50.B12。

接著敲入下面的指令:
download firmware_fromTFTP 10.255.251.252 des3828r4_4.50.b16.had
其中 10.255.251.252 是我電腦也就是跑 Tftpd server 的 IP address,然後 des3828r4_4.50.b16.had 便是新的 Firmware 檔囉~

這時應該可以看到電腦上的 Tftpd32 有進度出現:

等到跑完時,D-Link 上的結果如下:(做完之後,就下指令 reboot 一下 D-Link switch 吧~)
DES-3800:admin# download firmware_fromTFTP 10.255.251.252 des3828r4_4.50.b16.had
Command: download firmware_fromTFTP 10.255.251.252 des3828r4_4.50.b16.had

Connecting to server................... Done.
Download firmware...................... Done. Do not power off!
Please wait, programming flash......... Done.

DES-3800:admin#reboot
Command: reboot

Are you sure to proceed with the system reboot?(y/n)
Please wait, the switch is rebooting...
等到重新開機完畢應該就可以看到如下面的結果:(已經成功更新為 Build 4.50.B16 囉)
DES-3828DC Fast Ethernet Switch Command Line Interface

Firmware: Build 4.50.B16
Copyright(c) 2008 D-Link Corporation. All rights reserved.
UserName:Admin
PassWord:********

DES-3800:admin#show switch
Command: show switch

Device Type : DES-3828DC Fast-Ethernet Switch
Combo Port Type : 1000Base-T + 1000Base-T
MAC Address : 00-22-B0-3A-3F-00
IP Address : 10.255.251.253 (Manual)
VLAN Name : default
Subnet Mask : 255.255.255.248
Default Gateway : 10.255.251.254
Boot PROM Version : Build 0.00.010
Firmware Version : Build 4.50.B16
Hardware Version : A2
Serial Number : P19B18B000076
System Name :
System Location :
System Contact :
Spanning Tree : Disabled
GVRP : Disabled
IGMP Snooping : Disabled
MLD Snooping : Disabled
TELNET : Enabled (TCP 23)
SSH : Disabled
WEB : Enabled (TCP 80)
RMON : Disabled
RIP : Disabled
DVMRP : Disabled
PIM : Disabled
OSPF : Disabled
SNMP : Disabled

DES-3800:admin#
(詳全文...)