輕鬆進行自主的、安全的、分布式網路備份
層級: 中級
Carlos Justiniano (Carlos.Justiniano@ecuityinc.com)
軟體設計師, Ecuity Inc.
重要資料的丟失可能意味著致命的破壞。儘管如此,還是有無數專業人員忽視了對他們的資料的備份。雖然原因 可能各不相同,但是,最常見的一個解釋是,執行例行備份確實煩瑣。由於機器擅長於完成普通而重複 的任務,因此,自動化備份的過程是降低工作內在的枯燥性和人們與生俱來的拖延傾向的關鍵所在。
如果您使用 Linux,那麼您就已經可以使用那些建立定製備份解決方案的極其強大的工具。本文中的方案, 可以讓您使用幾乎每個 Linux 發行版本都附帶的開放原始碼工具來執行從簡單的到更進階而且安全的網路備份。
簡單備份
本文按照一步一步的方法來進行講述,只要您遵循那些基本的步驟,此方法會是非常直觀的。
在研究更進階的分布式備份解決方案之前,讓我們首先來看一個簡單而強大的存檔機制。讓我們 來分析一個名為 arc 的方便的指令碼,它可以讓我們在 Linux shell 提示符中建立備份快照。
清單 1. arc shell 指令碼
#!/bin/sh tar czvf $1.$(date +%Y%m%d%-H%M%S).tgz $1 exit $?
|
arc 指令碼接收一個單獨的檔案或目錄名作為參數,建立一個壓縮的封存檔案,同時將當前日期 嵌入到產生的封存檔案的名字之中。例如,如果您有一個名為 beoserver 的目錄,您可以調用 arc 指令碼,將 beoserver 目錄名傳遞給它以建立一個壓縮的封存檔案,如: beoserver.20040321-014844.tgz
使用 date 命令是為了嵌入一個日期和時間戳記以協助您組織封存檔案。 日期的格式是年、月、日、小時、分、秒 —— 雖然秒域的使用有一些多餘。查看 data 命令的手冊( man date)來瞭解其他選項。另外,在清單 1 中,我們向 tar 傳遞了 -v(verbose)選項。這就使得 tar 顯示出它正在存檔 的檔案。如果您喜歡靜默地進行備份,那麼刪除這個 -v 選項。
清單 2. 存檔 beoserver 目錄
$ ls arc beoserver $ ./arc beoserver beoserver/ beoserver/bookl.dat beoserver/beoserver_ab_off beoserver/beoserver_ab_on $ ls arc beoserver beoserver.20040321-014844.tgz
|
進階備份
這個簡單備份是實用的;不過,它仍然包含一個人工備份的過程。行業最佳經驗通常建議將資料備份到多個媒體上, 並備份到分開的不同地理位置。中心思想是避免依賴於任何一個單獨的儲存媒體或單獨的位置。
在下一個例子中我們將應對這一挑戰,我們將分析一個 1 所示的假想的分布式網路,它展示了對兩台 遠程伺服器和一台離線儲存伺服器的系統管理。
圖 1. 分布式網路
伺服器 #1 和 #2 上的備份檔案將安全地傳輸到離線儲存伺服器上,而且整個分布式備份過程將在沒有人工 幹涉的情況下定期進行。我們將使用一組標準的工具(開放安全 shell 工具套件(OpenSSH)的一部分), 以及磁帶存檔器(tar)和 cron 任務調度服務。我們的全部計劃是,使用 cron 進行調度,使用 shell 程式 和 tar 應用程式完成備份過程,使用 OpenSSH 安全 shell(ssh)加密進行遠端存取、認證、安全 shell 拷貝(scp)以自動完成檔案傳輸。要獲得另外的資料請務必查看每個工具的手冊。
使用公開金鑰/私密金鑰進行安全的遠端存取
在數字安全的上下文中,密鑰(key)指的是用來加密或解密其他資料片斷的一個資料片斷。公開金鑰私密金鑰 模式的有趣之處在於,使用公開金鑰加密的資料,只有用相應的私密金鑰才可以解密。您可以自由地發布一個 公開金鑰,這樣別人就可以對發送給您的訊息進行加密。公開金鑰/私密金鑰模式徹底改變了數字安全的原因之一是, 寄件者和接收者不必再共用一個通用的密碼。除了其他方面的貢獻,公開金鑰/私密金鑰加密使用電子商務和其他 安全傳輸成為可能。在本文中,我們將建立並使用公開金鑰和私密金鑰來建立一個非常安全的分布式備份解決方案。
要進行備份過程的每台機器都必須運行 OpenSSH 安全 shell 服務(sshd),同時讓 22 連接埠可以通過 任何內部防火牆被訪問。如果您訪問遠端伺服器,那麼很有可能您正在使用安全 shell。
我們的目標將是,不需要人工提供密碼就可以安全地訪問機器。一些人認為最簡單的辦法是設定無密碼的訪問: 不要這樣做。這樣做不安全。不用那樣,本文中我們將使用的方法可能會佔用您大約一個小時的時間,建立起一個 與使用“無密碼”帳號同樣方便的系統 —— 不過它是公認非常安全的。
讓我們首先確保 OpenSSH 已經安裝,接下來查看它的版本號碼。完成本文時,最新的發行的 OpenSSH 是 2004 年 2 月 24 日發布的版本 3.8。您應該考慮使用一個較新的而且穩定的發布版本,至少所用的版本應該要比版本 2.x 新。 訪問 OpenSSH Security 網頁以獲得關於特定舊版本的缺陷的細節(請參閱本文後面的 參考資料 中 的連結)。到目前為止,OpenSSH 是非常穩定的,而且已經證明不存在其他 SSH 工具所報告的很多缺陷。
在 shell 提示符中,輸入 ssh 並給出重要的 V 選項來檢查版本號碼:
$ ssh -V
OpenSSH_3.5p1, SSH protocols 1.5/2.0, OpenSSL 0x0090701f
如果 ssh 返回的版本號碼大於 2.x,則機器處於相對良好的狀態。無論如何,建議您所有的 軟體都使用最新的穩定版本,這對於安全相關的軟體來說尤其重要。
我們的第一個步驟是,使用將會有特權訪問伺服器 1 和 2 的帳號登入到離線儲存伺服器機器(見圖 1)。
$ ssh accountname@somedomain.com
登入到離線儲存伺服器以後,使用 ssh-keygen 程式並給出 -t dsa 選項來建立一個公開金鑰/金鑰組。 -t 選項是必須的,用來指定我們要產生的密鑰類型。我們將使用數位簽章演算法(Digital Signature Algorithm,DSA), 它讓我們可以使用更新的 SSH2 協議。參閱 ssh-keygen 手冊以獲得更多細節。
在 ssh-keygen 執行的過程中,在詢問您口令(passphrase)之前,將提示您輸入 ssh 金鑰儲存區的位置。當詢問在何處 儲存體金鑰時只需要按下斷行符號鍵,然後 ssh-keygen 程式將建立一個名為 .ssh 的隱藏目錄(如果原來不存在), 以及兩個檔案,一個公開金鑰檔案和一個私密金鑰檔案。
ssh-keygen 的一個有趣特性是,當提示輸入一個口令時,它讓您可以只是簡單地按下斷行符號鍵。如果您沒有 給出口令,那麼 ssh-keygen 將產生沒有加密的密鑰!如您所想,這不是個好主意。當要求輸入口令時,確保輸入 一個足夠長的字元訊息,最好包含混合字元而不僅僅是一個簡單的密碼字串。
清單 3. 永遠選擇好的口令
[offsite]:$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/accountname/.ssh/id_dsa): Enter passphrase (empty for no passphrase): (enter passphrase) Enter same passphrase again: (enter passphrase) Your identification has been saved in /home/accountname/.ssh/id_dsa. Your public key has been saved in /home/accountname/.ssh/id_dsa.pub. The key fingerprint is: 7e:5e:b2:f2:d4:54:58:6a:fa:6b:52:9c:da:a8:53:1b accountname@offsite
|
由於 ssh-keygen 產生的 .ssh 目錄是一個隱藏的“dot”目錄,所以要給 ls 命令傳入一個 -a 選項 來查看新建立的目錄:
[offsite]$ ls -a
. .. .bash_logout .bash_profile .bashrc .emacs .gtkrc .ssh
進入隱藏的 .ssh 目錄並列出其內容:
[offsite]$ cd .ssh
[offsite]$ ls -lrt
id_dsa id_dsa.pub
現在,在隱藏的 .ssh 目錄中,我們已經擁有了一個私密金鑰(id_dsa)和一個公開金鑰(id_dsa.pub)。 您可以使用 vi 或 emacs 等文本編輯工具或者簡單地使用 less 或 cat 命令來分析每個密鑰檔案的內容。 您將看到由混合字元構成的內容已經經過了 base64 編碼。
然後,我們需要將公開金鑰拷貝並安裝到伺服器 1 和 2 上。不要使用 ftp。更合理的是,使用安全拷貝程式來將公開金鑰 傳送到每一台遠程機器上。
清單 4. 將公開金鑰安裝到遠程伺服器上
[offsite]$ scp .ssh/id_dsa.pub accountname@server1.com:offsite.pub accountname@server1.com's password: (enter password, not new passphrase!) id_dsa.pub 100% |*****************************| 614 00:00
[offsite]$ scp .ssh/id_dsa.pub accountname@server2.com:offsite.pub accountname@server2.com's password: (enter password, not new passphrase!) id_dsa.pub 100% |*****************************| 614 00:00
|
在安裝完新的公開金鑰後,我們就可以使用建立私密金鑰和公開金鑰時指定的口令來登入到每一台機器。 現在,登入到每台機器,並將 offsite.pub 檔案的內容附加到一個名為 authorized_keys 的 檔案中,這個檔案儲存體在每台遠程機器的 .ssh 目錄下。我們可以使用一個文字編輯器或者 簡單地使用 cat 命令來將 offsite.pub 檔案的內容附加到 authorized_keys 檔案:
清單 5. 將 offsite.pub 添加到已授權識別碼列表
[offsite]$ ssh accountname@server1.com accountname@server1.com's password: (enter password, not new passphrase!) [server1]$ cat offsite.pub >> ./ssh/authorized_keys
|
接下來的步驟是考慮一些額外的安全性。首先,我們修改 .ssh 的存取權限,以使得 只有所有者有讀、寫和執行的許可權。然後,我們確保 authorized_keys 檔案只能由所有者 來訪問。最後,將先前上傳的 offsite.pub 密鑰檔案刪除,因為再也不需要它了。確保 設定適當的存取權限很重要,因為 OpenSSH 伺服器可能會拒絕使用具有不安全存取權限的 密鑰。
清單 6. 使用 chmod 修改許可權
[server1]$ chmod 700 .ssh [server1]$ chmod 600 ./ssh/authorized_keys [server1]$ rm offsite.pub [server1]$ exit
|
在伺服器 2 上完成同樣的步驟後,我們就可以返回到離線儲存機器上來測試新的口令類型的訪問。 在離線伺服器上您可以輸入下面的內容:
[offsite]$ ssh -v accountname@server1.com
在檢驗您的帳號現在可以使用新的口令而不是原來的密碼來訪問遠端伺服器時, 使用 -v 或 verbose 標記選項來顯示調試資訊。調試輸出 除了能讓您在一個高的層面上觀察到認證過程是如何工作的之外,還可以顯示出您可以以其他 方式無法得到的重要訊息。在以後的串連中您可能並不需要指定 -v 標記;但是在測試連接時它相當有用。
使用 ssh-agent 自動化機器訪問
ssh-agent 程式如同一個看門人,它根據需要安全地提供對安全密鑰的訪問。ssh-agent 啟動後, 它就會在後台運行,並且可以由 ssh 和 scp 程式等其他 OpenSSH 應用程式所使用。這就使得 ssh 程式 可以請求一個已經解密了的密鑰,而不是在每次需要時向您詢問私密金鑰的安全口令。
讓我們來仔細研究一下 ssh -agent。ssh-agent 運行時它會輸出 shell 命令:
清單 7. ssh-agent 應用
[offsite]$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XX1O24LS/agent.14179; export SSH_AUTH_SOCK; SSH_AGENT_PID=14180; export SSH_AGENT_PID; echo Agent pid 14180;
|
我們可以使用 shell 的 eval 命令來讓 shell 執行 ssh-agent 顯示的輸出命令:
[offsite]$ eval `ssh-agent`
Agent pid 14198
eval 命令告訴 shell 去評價(執行)ssh-agent 程式產生 的命令。確保您指定的是反引號(`)而不是單引號!執行後,eval `ssh-agent` 語句將返回代理的進程標識符。在幕後,SSH_AUTH_SOCK 和 SSH_AGENT_PID shell 變數已經被匯出而可以使用。您可以將它們顯示在 shell 控制台中來查看它們的值:
[offsite]$ echo $SSH_AUTH_SOCK
/tmp/ssh-XX7bhIwq/agent.14197
$SSH_AUTH_SOCK (SSH Authentication Socket 的縮寫) 是一個本地通訊端的位置,應用程式可以通過它來與 ssh-agent 通訊。 將 eval `ssh-agent` 語句加入到您的 ~/.bash_profile 檔案以 確保 SSH_AUTH_SOCK 和 SSH_AGENT_PID 始終 被註冊。
ssh-agent 現在就已經成為一個後台進程,可以用 top 和 ps 命令查看得到。
現在我們就已經可以使用 ssh-agent 共用我們的口令。為此,我們必須使用一個名為 ssh-add 的程式, 這個程式將我們的口令添加(發送)到運行著的 ssh-agent 程式。
清單 8. 用於免口令登入的 ssh-add
[offsite]$ ssh-add Enter passphrase for /home/accountname/.ssh/id_dsa: (enter passphrase) Identity added: /home/accountname/.ssh/id_dsa (/home/accountname/.ssh/id_dsa)
|
現在,當我們訪問 server1 時,不會再被提示輸入口令:
[offsite]$ ssh accountname@server1.com
[server1]$ exit
如果您還不相信,那麼嘗試去掉(kill -9)ssh-agent 進程,然後 重新串連 server1。這一次,您將注意到,server1 將會詢問儲存在 .ssh 目錄下 id_dsa 中的私密金鑰的口令:
[offsite]$ kill -9 $SSH_AGENT_PID
[offsite]$ ssh accountname@server1.com
Enter passphrase for key '/home/accountname/.ssh/id_dsa':
使用 keychain 簡化密鑰訪問
到現在為止,我們已經瞭解了幾個 OpenSSH 程式(ssh、scp、ssh-agent 和 ssh-add),而且 我們已經建立並安裝了私密金鑰和公開金鑰來啟用一個安全而且自動的登入過程。您可能已經意識到, 大部分設定工作只需要進行一次。例如,建立密鑰、安裝密鑰、通過 .bash_profile 執行 ssh-agent 的 過程在每台機器只需要進行一次。那真是好訊息。
不太理想的訊息是,我們每次登入到離線的機器上時,都必須調用 ssh-add,而且,ssh-agent 與我們將要用來自動化備份工作的 cron 調度進程並不直接相容。cron 進程不能與 ssh-agent 通訊的原因是,cron 作業是作為 cron 的子進程來執行,這樣它們就不會繼承 $SSH_AUTH_SOCK shell 變數。
幸運的是,有一個解決方案不但可以消除 ssh-agent 和 ssh-add 的局限,而且可以讓 我們使用 cron 來自動進行各種需要對其他機器進行安全地無密碼訪問的過程。在他 2001 年 發表的三篇 developerWorks 系列文章中,即 OpenSSH key management(參閱 參考資料 以獲得連結),Daniel Robbins 介紹了一個名為 keychain 的 shell 指令碼,它是 ssh-add 和 ssh-agent 的一個前端,簡化了整個無密碼的過程。隨著時間的 過去,keychain 指令碼已經經曆了很多改進,現在由 Aron Griffis 維護,其最新的 2.3.2-1 發布版本 公佈於 2004 年 6 月 17 日。
keychain shell 指令碼太長以致於無法在本文中列出,因為精心編寫的指令碼中包括了很多錯誤 檢測、豐富的文檔以及非常多的跨平台代碼。不過,keychain 可以自項目的 Web 網站上方便地 下載得到(參閱 參考資料 以獲得連結)。
下載並安裝了 keychain 後,使用它就很簡單了。只需要登入到每台機器並將下面兩行添加到 每個 .bash_profile 檔案:
keychain id_dsa
. ~/.keychain/$HOSTNAME-sh
在您第一次重新登入到每台機器時,keychain 將向您詢問口令。不過,除非機器被重新啟動,否則, 以後再登入時,keychain 將不會再要求您重新輸入口令。最好的是,cron 任務現在可以使用 OpenSSH 命令來安全地訪問遠端機器,而不需要互動地使用口令。更好的安全和更容易的使用, 現在我們已經兼得。
清單 9. 在每台機器上初始化
KeyChain 2.3.2; http://www.gentoo.org/projects/keychain Copyright 2002-2004 Gentoo Technologies, Inc.; Distributed under the GPL
* Initializing /home/accountname/.keychain/localhost.localdomain-sh file... * Initializing /home/accountname/.keychain/localhost.localdomain-csh file... * Starting ssh-agent * Adding 1 key(s)... Enter passphrase for /home/accountname/.ssh/id_dsa: (enter passphrase)
|
指令碼化備份過程
我們的下一個任務是建立執行必要的備份過程的 shell 指令碼。目標是執行伺服器 1 和 2 的完全資料 庫備份。在我們的例子中,每個伺服器都運行著 MySQL 資料庫伺服器,我們使用 mysqldump 命令列工具 來將一些資料庫表匯出到一個 SQL 輸入檔案中。
清單 10. 伺服器 1 的 dbbackup.sh shell 指令碼
#!/bin/sh
# change into the backup_agent directory where data files are stored. cd /home/backup_agent
# use mysqldump utility to export the sites database tables mysqldump -u sitedb -pG0oDP@sswrd --add-drop-table sitedb --tables tbl_ccode tbl_machine tbl_session tbl_stats > userdb.sql
# compress and archive tar czf userdb.tgz userdb.sql
|
在伺服器 2 上,我們將設定一個類似的指令碼來備份網站資料庫中給出的專屬表單。 每個指令碼都通過下面的步驟標記為可執行檔:
[server1]:$ chmod +x dbbackup.sh
在伺服器 1 和 2 上設定了 dbbackup.sh 後,我們返回到離線的資料服務器,在那裡我們將建立一個 shell 指令碼 來調用各個遠程 dbbackup.sh 指令碼並隨後傳輸壓縮的(.tgz)資料檔案。
清單 11. 用在離線的資料服務器上的 backup_remote_servers.sh shell 指令碼
#!/bin/sh
# use ssh to remotely execute the dbbackup.sh script on server 1 /usr/bin/ssh backup_agent@server1.com "/home/backup_agent/dbbackup.sh"
# use scp to securely copy the newly archived userdb.tgz file # from server 1. Note the use of the date command to timestamp # the file on the offsite data server. /usr/bin/scp backup_agent@server1.com:/home/backup_agent/userdb.tgz /home/backups/userdb-$(date +%Y%m%d-%H%M%S).tgz
# execute dbbackup.sh on server 2 /usr/bin/ssh backup_agent@server2.com "/home/backup_agent/dbbackup.sh"
# use scp to transfer transdb.tgz to offsite server. /usr/bin/scp backup_agent@server2.com:/home/backup_agent/transdb.tgz /home/backups/transdb-$(date +%Y%m%d-%H%M%S).tgz
|
backup_remote_servers.sh shell 指令碼使用 ssh 命令來執行遠程伺服器上的指令碼。由於我們 已經設定的無密碼的訪問,ssh 命令可以通過離線的伺服器在伺服器 1 和 2 上遠程地執行命令。 感謝 keychain,整個認證過程現在可以自動完成。
調度
我們的下一個步驟,也是最後一個步驟,是調度 backup_remote_servers.sh shell 指令碼在 離線的資料存放區伺服器上的執行。我們將向 cron 調度伺服器中添加兩個條目,以要求每天執行 備份指令碼兩次,3:34 執行一次,8:34 再執行一次。在離線的伺服器上使用 edit(-e)選項調用 crontab 程式。
[offsite]:$ crontab -e
crontab 調用 VISUAL 或 EDITOR shell 環境變數所指定的預設的編輯器。然後,輸入兩個條目並儲存和關閉檔案。
清單 12. 離線的伺服器上的 Crontab 條目
34 3 * * * /home/backups/remote_db_backup.sh 34 20 * * * /home/backups/remote_db_backup.sh
|
一個 crontab 行包括兩個主要部分,時間表部分和後面的命令部分。時間表分為多個域,用來指定 一個命令應該何時執行:
清單 13. Crontab 格式
+---- minute | +----- hour | | +------ day of the month | | | +------ month | | | | +---- day of the week | | | | | +-- command to execute | | | | | | 34 3 * * * /home/backups/remote_db_backup.sh
|
檢驗您的備份
您應該對備份進行例行地檢查,以確保程式正確進行。Bot可以使煩瑣的工作得到避免,但是 永遠不能因此而懶惰。如果您的資料值得備份,那麼它也值得您時常進行抽樣檢查。
考慮添加一個 cron 作業來提醒您自己至少每個月對備份進行一次檢查。另外,經常修改安全密鑰也是一 個好主意,同樣您也可以調度一個 cron 作業來提醒您做這件事。
另外的安全防範
要獲得更高的安全性,可以考慮在每台機器上安裝並配置一個入侵偵測系統(ntrusion Detection System,IDS),比如 Snort。可以預見,當入侵正在發生或者近期發生過時,IDS 將會 通知您。IDS 到位後,您將可以添加其他層次上的安全,比如對您的備份進行數位簽章和加密。
GNU Privacy Guard(GnuPG)、OpenSSL 和 ncrypt 等流行的開放原始碼工具可以支援通過 shell 指令碼 對封存檔案進行加密,不過不建議在沒有 IDS 提供的額外層次保護的情況下這樣做(參閱 參考資料 以獲得關於 Snort 的更多資訊)。
結束語
本文向您展示了如何讓您的指令碼在遠程伺服器執行以及如何執行安全自動的檔案傳輸。 我希望您能由此得到靈感而開始考慮保護您自己的重要資料,並使用 OpenSSH 和 Snort 等 開放原始碼工具來構建新的解決方案。
參考資料
- 在官方的 OpenSSH 首頁和 OpenSSH Security page 您將找到下載、文檔以及更多內容。
- 閱讀 Daniel Robbins 的由三部分構成的極好的 IBM developerWorks 文章“OpenSSH 金鑰管理”(developerWorks,2001 年)並下載他的 keychain 應用程式。
- 要深入學習 SSH,Carlos 向您推薦 O'Reilly 的 SSH, The Secure Shell: The Definitive Guide(O'Reilly & Associates,2001 年)。
- Snort 入侵偵測系統(IDS)是一個開放原始碼的最佳產品,設計 用來檢測並報告未授權的訪問或可疑的行為。如果您正在計劃自動化對封存檔案的簽名和加密,那麼一定 要使用一個 IDS。
- 您可以使用 GNU Privacy Guard(GnuPG)、OpenSSL 和 ncrypt 在 shell 指令碼中對存檔備份檔案進行 簽名和加密。
- 如果您沒有使用過它們,那麼請參考 TCP wrappers 和 xinetd 中的提示。
- Perl 愛好者還會有興趣閱讀“使用 Perl 自動化 UNIX 系統管理”(developerWorks,2001 年)、 “介紹用於系統管理的 cfengine ”(developerWorks,2002 年)和 “用 Perl 進行應用程式配置”(developerWorks,2000 年),它們都是 Ted Zlatanov 的作品。
- developerWorks 文章“Windows 到 Linux 之旅:第 8 部分. 備份與恢複”(developerWorks,2003 年)給出了關於備份策略的技巧。
- IBM's Tivoli Storage Manager for Linux 也可以根據定製的時間表在 Linux 電腦和伺服器上自動執行可靠 的備份、存檔和集中資料管理。此外, 提供了用於使用者管理、存取控制、網路監控 —— 還有更多功能 —— 的產品,都有統一的 環境和介面。
- 通過 IBM developerWorks Tivoli 專區 深入瞭解 Tivoli 解決方案。
- 在 developerWorks Linux 專區 可以找到 更多為 Linux 開發人員準備的參考資料。
- 在 Developer Bookstore Linux 區中定購 打折出售的 Linux 書籍。
- 通過 developerWorks Subscription 使用最新的 IBM 工具和中介軟體來開發與測試您的 Linux 應用程式:您可以自 WebSphere、DB2、 Lotus、Rational、和 Tivoli 得到 IBM 軟體,以及一個可以在 12 個月內使用這些軟體的許可,所有的花費都比您想像的要低。
- 自 developerWorks 的 Speed-start your Linux app 專區下載可以運行於 Linux 之上的經過挑選的 developerWorks Subscription 產品免費測試版本,包括 WebSphere Studio Site Developer、WebSphere SDK for Web services、WebSphere Application Server、DB2 Universal Database Personal Developers Edition、Tivoli Access Manager 和 Lotus Domino Server。要更快速地開始上手,請參閱針對各個產品的 how-to 文章和支援人員。
關於作者
Carlos Justiniano 是 Ecuity, Inc 的一名軟體設計師。他所感興趣的方麵包括通訊和分散式運算。Carlos 為 很多技術雜誌撰寫文章。他還是基於 Linux 的 ChessBrain 項目的奠基人和設計師,那個項目贏得了與分散式運算 相關的 2005 Guinness World Record。您可以通過 carlos.justiniano@ecuityinc.com 與他聯絡。
全文出自 : IBM developerWorks 中國網站