MySQL 4.1 對多語言的支持有了很大變化 (這導致了問題的出現);
          盡管大部分的地方 (包括個人使用和主機提供商),MySQL 3 仍然占主導地位;但 MySQL 4.1 是 MySQL 官方推薦的數據庫,已經有主機提供商開始提供并將會越來越多;
          許多 PHP 程序以 MySQL 作為默認的數據庫管理軟件,但它們一般不區分 MySQL 4.1 與 4.1 以下版本的區別,籠統地稱“MySQL 3.xx.xx 以上版本”就滿足安裝需求了;
          因為 latin1 在許多地方 (下邊會詳細描述具體是哪些地方) 作為默認的字符集,成功的蒙蔽了許多 PHP 程序的開發者和用戶,掩蓋了在中文等語言環境下會出現的問題;
          簡單的說,MySQL 自身的變化和使用 MySQL 的 PHP 程序對此忽略,導致了問題的出現和復雜化,而由于大部分用戶使用的是英文,使這種問題不被重視。這里提到的 PHP 程序,主要就 WordPress 而言。

          [separator]



          MySQL 4.1 字符集支持的原理MySQL 4.1 對于字符集的指定可以細化到一臺機器上安裝的 MySQL,其中的一個數據庫,其中的一張表,其中的一欄,應該用什么字符集。但是,傳統的 Web 程序在創建數據庫和數據表時并沒有使用那么復雜的配置,它們用的是默認的配置,那么,默認的配置從何而來呢?

          編譯 MySQL 時,指定了一個默認的字符集,這個字符集是 latin1;
          安裝 MySQL 時,可以在配置文件 (my.ini) 中指定一個默認的的字符集,如果沒指定,這個值繼承自編譯時指定的;
          啟動 mysqld 時,可以在命令行參數中指定一個默認的的字符集,如果沒指定,這個值繼承自配置文件中的;
          此時 character_set_server 被設定為這個默認的字符集;
          當創建一個新的數據庫時,除非明確指定,這個數據庫的字符集被缺省設定為 character_set_server;
          當選定了一個數據庫時,character_set_database 被設定為這個數據庫默認的字符集;
          在這個數據庫里創建一張表時,表默認的字符集被設定為 character_set_database,也就是這個數據庫默認的字符集;
          當在表內設置一欄時,除非明確指定,否則此欄缺省的字符集就是表默認的字符集;
          這個字符集就是數據庫中實際存儲數據采用的字符集,mysqldump 出來的內容就是這個字符集下的;
          簡單的總結一下,如果什么地方都不修改,那么所有的數據庫的所有表的所有欄位的都用 latin1 存儲,不過我們如果安裝 MySQL,一般都會選擇多語言支持,也就是說,安裝程序會自動在配置文件中把 default_character_set 設置為 UTF-8,這保證了缺省情況下,所有的數據庫的所有表的所有欄位的都用 UTF-8 存儲。

          當一個 PHP 程序與 MySQL 建立連接后,這個程序發送給 MySQL 的數據采用的是什么字符集?MySQL 無從得知 (它最多只能猜測),所以 MySQL 4.1 要求客戶端必須指定這個字符集,也就是 character_set_client,MySQL 的怪異之處在于,得到的這個字符集并不立即轉換為存儲在數據庫中的那個字符集,而是先轉換為 character_set_connection 變量指定的一個字符集;這個 connection 層究竟有什么用我不大明白,但轉換為 character_set_connection 的這個字符集之后,還要轉換為數據庫默認的字符集,也就是說要經過兩次轉換;當這個數據被輸出時,又要由數據庫默認的字符集轉換為 character_set_results 指定的字符集。

          一個典型的環境典型的環境以我自己的電腦上安裝的 MySQL 4.1 為例,我自己的電腦上安裝著 Apache 2,PHP 5 和 WordPress 1.5.1.3,MySQL 配置文件中指定了 default_character_set 為 utf8。于是問題出現了:

          WordPress 按照默認情況安裝,所以所有的表都用 UTF-8 存儲數據;
          WordPress 默認采用的瀏覽字符集是 UTF-8 (Options->Reading 中設置),因此所有 WP 頁面的 meta 中會說明 charset 是 utf-8;
          所以瀏覽器會以 utf-8 方式顯示所有的 WP 頁面;這樣一來 Write 的所有 Post,和 Comment 都會以 UTF-8 格式從瀏覽器發送給 Apache,再由 Apache 交給 PHP;
          所以 WP 從所有的表單中得到的數據都是 utf-8 編碼的;WP 不加轉換的直接把這些數據發送給 MySQL;
          MySQL 默認設置的 character_set_client 和 character_set_connection 都是 latin1,此時怪異的事情發生了,實際上是 utf-8 格式的數據,被“當作 latin1”轉換成……居然還是轉換成 latin1,然后再由這個 latin1 轉換成 utf-8,這么兩次轉換,有一部分 utf-8 的字符就丟失了,變成 ??,最后輸出的時候 character_set_results 默認是 latin1,也就輸出為奇怪的東西了。
          最神奇的還不是這個,如果 WordPress 中設置以 GB2312 格式閱讀,那么 WP 發送給 MySQL 的 GB2312 編碼的數據,被“當作 latin1”轉換后,存進數據庫的是一種奇怪的格式 (真的是奇怪的格式,mysqldump 出來就能發現,無論當作 utf-8 還是當作 gb2312 來讀都是亂碼),但如果這種格式以 latin1 輸出出來,居然又能變回 GB2312!

          這會導致什么現象呢?WP 如果使用 MySQL 4.1 數據庫,把編碼改用 GB2312 就正常了,可惜,這種正常只是貌似正常。

          如何解決問題如果你已經不耐煩了 (幾乎是肯定的),google 一下,會發現絕大部分的解答是,query 之前先執行一下:SET NAMES 'utf8',沒錯,這是解決方案,但本文的目的是說明,這為什么是解決方案。

          要保證結果正確,必須保證數據表采用的格式是正確的,也就是說,至少能夠存放所有的漢字,那么我們只有兩種選擇,gbk 或者 utf-8,下面討論 utf-8 的情況。

          因為配置文件設置的 default_character_set 是 utf8,數據表默認采用的就是 utf-8 建立的。這也應該是所有采用 MySQL 4.1 的主機提供商應該采用的配置。所以我們要保證的只是客戶端與 MySQL 交互之間指定編碼的正確。

          這只有兩種可能,客戶端以 gb2312 格式發送數據,或者以 utf-8 格式發送數據。

          如果以 gb2312 格式發送:

          SET character_set_client='gb2312'
          SET character_set_connection='utf8' 或者
          SET character_set_connection='gb2312'

          都是可以的,都能夠保證數據在編碼轉換中不出現丟失,也就是保證存儲入數據庫的是正確的內容。

          怎么保證取出的是正確的內容呢?考慮到絕大部分客戶端 (包括 WP),發送數據的編碼也就是它所希望收到數據的編碼,所以:

          SET character_set_results='gb2312'

          可以保證取出給瀏覽器顯示的格式就是 gb2312。

          如果是第二種情況,客戶端以 utf-8 格式發送 (WP 的默認情況),可以采用下述配置:

          SET character_set_client='utf8'
          SET character_set_connection='utf8'
          SET character_set_results='utf8'

          這個配置就等價于 SET NAMES 'utf8'。

          WP 應該作什么修改還是那句話,客戶端要發給數據庫什么編碼的數據,數據庫是不可能確切知道的,只能讓客戶端自己說明白,所以,WP 是必須發送正確的 SET... 給 MySQL 的。怎么發送最合適呢?臺灣的 pLog 同仁給出了一些建議:

          首先,測試服務器是否 >= 4.1,編譯時是否加入了 UTF-8 支持;是則繼續
          然后測試數據庫以什么格式存儲 ($dbEncoding);
          SET NAMES $dbEncoding
          對于第二點,WP 的情況是不同的,按照上面的典型配置,只要用 WP,肯定數據庫是用 UTF-8 存儲的,所以要根據用戶設置的以 GB2312 還是 UTF-8 瀏覽來判斷 (bloginfo('charset')),但這個值是要連接數據庫以后才能得到的,所以效率最高的方式是連接數據庫之后,根據這個配置設置一次 SET NAMES,而不必每次查詢之前都設置一遍。

          我的修改方式是這樣的,在 wp_includes/wp-db.php 中增加:

          function set_charset($charset)
          {
          // check mysql version first.
          $serverVersion = mysql_get_server_info($this->dbh);
          $version = explode('.', $serverVersion);
          if ($version[0] < 4) return;

          // check if utf8 support was compiled in
          $result = mysql_query("SHOW CHARACTER SET like 'utf8'",
          $this->dbh);
          if (mysql_num_rows($result) < = 0) return;

          if ($charset == 'utf-8' || $charset == 'UTF-8')
          $charset = 'utf8';;
          @mysql_query("SET NAMES '$charset'", $this->dbh);
          }

          在 wp-settings.php 的 require (ABSPATH . WPINC . '/vars.php'); 后增加:

          $wpdb->set_charset(get_bloginfo('charset'));


          1. MySQL 4.1 在文字上有很大改進,它有了 Character Set 與 Collation 的慨念。

          2. 在 MySQL 4.0 ,一般的程式都會將文字以拉丁文 ( latin) 來儲存,就算我們輸入中文字,結果仍是放在以拉丁文設置的文字欄里頭,這對 MySQL 4.0 與以 MySQL 4.0 為基楚的程式來說,并不會有問題。

          3. 可是 MySQL 4.1 的系統編碼是預設用 UTF-8 的,當要 restore MySQL 4.0 的 backup 檔到 MySQL 4.1 時,亂碼就出現了。原因在于 MySQL 4.1 將 latin 碼轉換過來,而后轉換是并不完全完美的,這導致了出現少量文字出現亂碼現象。

          4. 要解決這亂碼問題并不難。首先,在 MySQL 4.0 備份時,先將所有文字欄變成 binary 類型,然后進行正常備份。第二步,可在 MySQL 4.1 里將剛才的備份 restore。最后,將較早前所變更到 binay 類型的文字欄,再次復原到文字類型。這樣中文編碼的問題就應該可以完全解決。

          5. 將文字欄變更到 binay 類型時,必需設定 binary 欄的長度大過或等于 (>=) 文字欄的長度,否則資料會失去。

          6. 另外,經這樣升級的 MySQL 數據庫,在 MySQL 4.1 里將會正常工作,就算是怎樣 backup 與 restore 都不會再有亂碼問題。
          作者: MySQL 發布日期: 2005-12-14
          mysql4.1是比較煩人,支持多語言的細化設置,再加上phpmyadmin2.6也比較笨,默認就是改不動的utf8,怎么弄都亂碼。
          好了,廢話少說,我們來一步步解決這個問題:
          1.修改/etc/my.cnf文件,改成這樣:
          [mysqld]
          datadir=/var/lib/mysql
          socket=/var/lib/mysql/mysql.sock
          default-character-set=utf8

          [mysql.server]
          user=mysql
          basedir=/var/lib

          [mysqld_safe]
          err-log=/var/log/mysqld.log
          pid-file=/var/run/mysqld/mysqld.pid

          注意:就是加入了一句default-character-set=utf8。

          2./etc/init.d/mysqld restart 重新啟動mysql;
          3.打開phpmyadmin,選擇lang為"Chines simplifies(zh-utf-8)",選擇"MySQL 連接校對"為"utf8_general_ci "點“顯示 MySQL 的運行信息”--“變量”,可以看到:
          character set client utf8 utf8
          character set connection utf8 utf8
          character set database utf8 utf8
          character set results utf8 utf8
          character set server utf8 utf8
          character set system utf8 utf8
          collation connection utf8_general_ci utf8_general_ci
          collation database utf8_general_ci utf8_general_ci
          collation server utf8_general_ci utf8_general_ci
          從這里可以看到character全部變成utf8了。
          有人要問,為什么都要改成utf8呢?改成GB2312不行嗎?
          解釋如下:
          我也不想改成utf8,只是phpmyadmin2.6在mysql4.1的時候只會用utf8,連其他頁面的charset也都是utf8,改成gb2312一定會亂碼,我們只能湊phpmyadmin了。
          只有在mysql3.23的時候,phpmyadmin才會多一個gb2312的頁面charset,這時候是正常的。
          3.將以前的mysql3的庫文件導入mysql4.1的庫
          有兩種情況:
          一是從phpmyadmin上導入,這時候你要注意的是在選擇庫文件的頁面左下腳有個“文件的字符集:”,默認是utf8,要改成gb2312,否則導進去亂碼;
          二是在linux下導入,這時候你需要先在庫文件的頭部加一行:
          SET NAMES 'gb2312';; 注意最后也是;號,別漏了。
          然后執行mysql -u用戶名 -p密碼 xxx.sql > 庫名
          導入完成以后再用phpmyadmin打開看,里面的中文字就是正確的。
          4.從mysql4.1里導出庫文件
          一.用phpmyadmin導出
          導出倒是問題不大,如果phpmyadmin的瀏覽頁面里顯示的中文是正常的,那么導出肯定也是正常的
          二.在linux上導出
          如果用mysqldump導出出現了亂碼也沒有關系,可以運行iconv來轉換一下
          iconv -c -f UTF-8 -t GB2312 庫文件名 > 新的gb2312的庫文件名

          綜上所述,你要注意:
          1。盡量在需要導入的庫文件的開頭加入SET NAMES 'gb2312';;告訴mysql你要導入的是一個gb2312的文件;
          2。可能你需要這個:
          SET NAMES 'utf8';;
          在登陸到mysql后用,把character的一些默認參數改到utf8上,有時可以減少一些困擾,不過也不是必須的。
          在mysql上使用:
          SHOW VARIABLES LIKE 'character_set_%';;
          用來查看當前的狀態。
          3.如果出現亂碼也不要怕,一是你要注意留存原有的備份,二是用iconv來進行轉化。
          在正常使用之前注意做導入導出的測試,確保萬無一失。

          最后加一句:www.quicklinux.org原創文章,轉載請注明出處。呵呵
          郵件:support@quicklinux.org
          作者: MySQL 發布日期: 2005-12-14
          我升級了MYSQL到4.1.2,phpmyadmin用的是2.6.2。數據表里面有中文的字段中文都變成了亂碼,導出數據也是亂碼。我用以前的2.5.7沒有問題,想問一下,應該在phpmyadmin的那個文件里改哪個設置一下才能顯示出來的是正常的中文字?

          和字符相關的變量中這幾個和sql很有關系:
          character_set_client
          character_set_connection
          character_set_results
          此外就是數據庫中對相應字段設置的charact set,如果沒有對字段設置,缺省是table的charact set,table也沒有指定則缺省使用database的。
          上面3個變量的作用是這樣的,client表示客戶端發送過來的字符集,results表示發送到客戶端的字符集(這兩個分開是因為發送過來和發送過去的不一定是同一個客戶端),connection則在客戶端和數據庫起一個連接作用。
          具體是這樣:比如我在mysql命令行設置client為gbk,connection為utf8,results為gbk,數據庫為big5,
          當我發送一個insert語句的時候,這個語句作為gbk代碼,先轉為utf8代碼(connection),再轉為big5(database)插入數據庫。
          而運行一個select語句的時候,從數據庫得到的結果則相反的過程,由big5轉為utf8,再轉為gbk,你得到gbk的結果。
          因此最主要的是讓client和results和你使用的客戶端一致。比如你的網頁是utf8編碼,你就要設置這兩個為utf8。
          而在mysql命令行的時候,我用的是2000,需要設置為gbk
          而我們用的set names XXX,實際上就是同時設置這3個變量為XXX。
          在這樣的情況下,我們可以把一個數據庫中的不同表或不同字段設為不同的字符集,只要上面3個設置正確,就可以在數據庫中同時使用不同的字符集。
          注意要保證你的數據庫中的字符已經使用了正確的字符集,比如如果一開始你設置錯誤,插入數據后,本身數據的編碼就是不正確的,然后即使設置改回來,也不可能得到正確的顯示了。
          還有一個是編碼互相之間的兼容性,如果一個字符在gbk中有,在utf8中沒有,那么在gbk-》utf8-》gbk的過程中,它就變成了“?”
          再說一下具體解決的辦法。
          首先要指定你的升級后的database及table及field的character set,一般來說我們用gb2312或者utf8的,如果不同時使用多種編碼,只要指定database就可以,可以在建庫的sql語句加上相應的character set,在phpMyAdmin里也可以修改。
          然后是導入舊數據。首先要確定自己的數據文件的編碼。如果用phpMyAdmin導入,在界面上有文件編碼的選項,一定要和數據文件的編碼一致。
          如果從mysql的命令行導入,就要自己設置上面說到的3個變量,set names xxx。
          使用其它的客戶端程序一樣要注意。
          這樣就可以讓舊數據轉入新數據庫后的編碼才是正確的,如果這一步錯了,后面不可能得到正確的顯示。
          然后是自己的程序,在連接后就可以執行一次set names xxx,根據你的網頁編碼而定。
          這樣基本就可以保證編碼正確了。
          你很有可能是導入的數據編碼已經不對了
          posted @ 2006-06-06 23:38 edsonjava 閱讀(161) | 評論 (0)編輯 收藏
           
          前言   有同事已經通過艱苦的工作完成了長達好幾百頁的關于Linux的文檔。事實上,在網上還有超過好幾萬頁的各種關于Linux的技術精華,還不包括英文的。有數萬程序員和網絡專家在為這個軟件努力工作。這就是自由的魅力。   我使用Linux有不少時間了,期間也經歷過無數的挫折,同時也得到過很多高手的幫助。我一向喜歡言簡意賅的文字。通過下面的簡單句子和代碼,我希望能夠表達出我使用Linux的體會。也許本文的結構比較凌亂,但我希望它的每一句話都是對你有用的。當然,你要知道一些更詳細的東西,請參閱我同事寫的文檔。   當然,能夠通過查閱這個文檔,使你的工作順利是我最大的心愿。 一、關于Linux的誤區   1、Linux干什么用?   首先,很少有人用Linux做桌面系統,因為Windows桌面系統已經足夠好了。我們主要把Linux用作網絡服務器的操作系統。如果你和你的應用符合下面的幾條,那么你合適使用Linux:   *不愿意花錢在操作系統和網絡應用上。   *用D版系統受良心譴責或害怕承擔責任。   *想得到和花錢的系統差不多的性能。   *在用戶面前顯得水平較高。   *認識幾個弄Linux的高手,或者知道在哪里能夠找到問題答案。   2、每種Linux發行包差別很多嗎?   如果你在上世紀80年代末到95年之前這段時間大量使用PC機的話,那對于Linux你應該很好理解:它就象一個有著32位搶先多任務核心的DOS,其區別在于外表看起來像是一種UNIX。Linux是好多人用智慧堆砌起來的,初學者經常問:“RedHat好還是Slackware好?”。這個人同時還面臨上百種選擇,這的確讓人頭痛。大部分Linux發行包實際上很簡單,幾乎所有的發行包都有相同的內核(也許是不同版本),外部命令和數據文件的差別也僅僅局限于在文件系統中的存放位置不同(這導致了某些兼容性問題,因為在某些地方找不到特定的文件嘛)。另外就是有些發行包為了顯示自己的卓而不群,在發行包中增加了一些自己的實用程序。實際上動手修改內核的廠商不算太多,因為這樣會內核官方版本的不斷更新而手忙腳亂。當然有一些嵌入式系統開發商在Linux基礎上做了自己的系統另說。   擁有眾多的發行包是Linux的一個很討厭的問題,在這一點上,我更喜歡FreeBSD,因為它只有一個官方發行版本,也運行得比較穩定??山oLinux做軟件的程序員太多了,Linux上面的資料也更多。記住:當一個家伙跟你說用哪個發行版本無所謂的時候,那他就是專家。   3、Linux業余愛好者的東西嗎?   這樣的宣傳給了很多人這樣的印象。其實,Linux是一個嚴肅的操作系統,擁有一切操作系統共有的特性。它可以用在很多嚴肅的場合。   4、Linux性能比Windows更好嗎?   這里的答案會讓你失望,據我以往的實際測試,2.2版本的Linux核心的性能比windows2000要低。值得欣慰的是2.4版本的核心性能有大幅度提高基本上接近了Windows2000。但Windows2000復雜的圖形界面占用了相當的系統資源。   5、Linux比Windows更復雜更專業嗎?   從復雜度上說,Windows2000要比Linux復雜很多。在核心技術上,Windows也更先進。   6、Linux更可靠嗎?   應該從兩個角度評價系統的可靠性。(1)系統自身的可靠性,兩者象差不多。人們普遍認為的Windwos不如Linux可靠的印象來源于Windows眾多的良莠不齊的軟件。當然,Linux比Windows結構簡單,在一定程度上也可以提高可靠性。(2)從安全性角度來說,Linux遠遠高于Windows系統,道理很簡單:樹大招風嘛。另外,Linux的源代碼開放機制使得漏洞發現和消滅得很快。而Windows相對就顯得比較官僚了。這里補充一點,我用過的最可靠的系統是BSD類的OS,可靠性和安全性都可圈可點。   7、Linux真的不用花一分錢嗎?   大部分的發行包需要花少量的錢購買。當然你也可以從網絡上DOWN。其實這些發行包未必符合你的應用,一般都需要經過一些改動和定制才能運行好。當然,花的錢跟Windows沒法比。 二、Linux安裝注意事項   現在的大部分發行包都很容易安裝,基本上都是圖形向導式的,每個發行包都不太相同,也無法一一描述,如果你連安裝都不明白,那就別用Linux了。這里僅僅說明幾個注意的問題。   1、如果要和Windows混裝,一定要先裝Windows,后裝Linux。   2、分區的時候,根據計劃安裝的軟件靈活決定分區。一般分區有:/,/root,/usr,/var和swap分區,其中swap分區類型和其他不同需要專門選擇一下,它的空間一般是物理內存的兩倍即可。/root分區是緊急情況root用的,有64兆就行了。   3、當然,為了方便,你可以安裝發行包給你做好的軟件。但我安裝Linux的習慣做法是開始就安裝一個最小系統,然后安裝所有的編譯工具。安裝編譯工具的方法一般都通過你用的發行包的包管理工具實現,這樣最方便。比如在TurboLinux中,運行/usr/sbin/Turbopkg就可以了。在管理工具中選擇所有關于Developoment相關的選項或gcc相關選項,一般就可以了。   4、lilo一定要裝。否則一旦出現分區問題都不好辦。   5、如果和Windows混裝的時候,裝完了系統起不來了。可以用98啟動盤啟動,然后用FDISK /MBR回復主引導分區來保住Windows分區。   在安裝了最小系統和全套的編譯器后,我們應該得到一個比較干凈的系統。在這個系統上,可以下載和安裝各種應用軟件了。 三、基本使用   1、文件系統   無論有多少個分區,整個文件系統都是一棵完整的樹結構。經常用到的目錄有:   (1)/usr:存放各種應用程序文件用。其中的/usr/local用來存放后安裝的軟件   (2)/var:用來存放所有的數據文件   (3)/proc:里面的文件用來表示系統內核的各種配置和狀態。這一塊不是真正的文件系統,而是內存里面的各種數據。可以從這里得到一些常用的系統信息。比如CPU內存什么的。   (4)/etc:這里是放置所有的系統配置文件。一般情況下,后安裝的軟件的配置文件不會放到這里。除非你是用RPM安裝的隨發行包配的軟件或者故意這樣做。我不喜歡把不同軟件的文件混在一起,因此通常讓不同的軟件的配置文件放在各自的目錄中。   2、常用的命令   這里我列出一些經常用的命令,具體的用法可以參見相關手冊頁(希望你的英文不象我這么差)。   vi(一定要會用這個你非常討厭的東西,如果你屈服了,可以選擇另一個叫做pico的編輯器,它有點象DOS的edit)   head(用來看很長的文件用)   tail(同上)   netstat(看網絡狀態)   tar(解開.tar.gz的壓縮包)   ps(察看進程)   kill(干掉進程)   top(看系統狀況)   shutdown(關閉系統)   cat(看文件內容)   ping (看網絡連通狀況)   ftp(傳輸文件)   man(手冊)   上面這些命令都是最最常用的,一定要把基本用法記牢。事實上,每人能記住全部命令或一個命令的全部參數,記住幾個常用的就行了。其他的查書。   3、內核升級   如果你不愿意冒險,可以跳過這個部分。不過根據我實際使用的經驗,2.4.x版本的內核性能比2.2.x的性能至少提高40%,還是很值得一試的。現在最新的發行包幾乎都帶有新的2.4內核,但是版本號想對保守。這里,我的建議是在決定升級任何部分的時候,一定要首先看一下所謂的“currect version release note”信息,里面告訴你本次版本升級都有些什么改動。如果改動的內容不涉及你當前的環境或需求,只是增加了一些邪門設備的驅動,你大可不必急著升級。補充一句話:Linux的內核版本號的中間一位是奇數的是非穩定版本,比如2.3,是偶數的才是穩定版本。   升級內核的步驟如下:   (1)首先在網上找到你打算升級的內核文件,一般名字是:linux-2.x.xx.tar.gz,把這個文件復制到/usr/src。(不知道在哪里找?看看:http://www.kernel.org ,最好找到.tar.gz格式的,比如這里:http://www.kernel.org/pub/linux/kernel/v2.x/)。下面的升級舉例是從2.2.18升級到2.5.7(這是最新的內核了,你使用其它的版本別忘了改變版本號)   (2)解壓縮:tar zxvf linux-2.5.7.tar.gz后生成一個目錄:linux-2.5.7。   (3)進入/usr/src,用ls –l 命令可以看到src里面有一個連接,類似于:linux -> linux-2.2.18/ (連接指向你當前用的內核版本)。首先刪除這個連接(rm linux),用ln -s linux-2.5.7 linux 命令重建連接。我想你一定不會連這里的版本號都照抄吧?   (4)進入linux-2.5.7 目錄,如果不是第一次編譯這個內核,最好用命令:make mrproper 刪掉上次編譯產生的.o文件等,當然以前保存的配置也丟了。   (5)用命令:make menuconfig命令調整內核配置以適應你目前的環境,記住,不懂的配置不要亂動。首要任務是調整各種硬件的環境,比如SCSI卡:SCSI support/SCSI low-level drivers,不知道現在的SCSI卡型號?在/proc/scsi中可以找到。還有網卡,在Network Device Support 里面。不知道現在的網卡型號?在這個文件里面寫著呢:/proc/net/PRO_LAN_Adapters/eth0.info或/proc/pci文件中也可以找到 。在menuconfig中用空格鍵改變選項狀態,前面的<*>表示該功能編譯在內核中,主要是運行速度快。< >表示不需要該功能。表示把該功能編譯成模塊,通常為了減小尺寸,和更換方便而把某些驅動編譯成模塊。   (6)下面的事情比較程序化,照著做:make dep (檢查文件的完整性,過程很復雜)   (7)make bzImage 注意大小寫(真正開始編譯了耶!我覺著這個最過癮了,屏幕“嘩啦嘩啦”的,這時候你會感覺到,多少不知名的程序員在這個復雜的系統中貢獻了自己的一份力量)   (8)make modules (編譯那些被標記為的功能模塊或驅動程序)   (9)make modules_install(把編譯好的模塊復制到指定地點,一般是:/lib/modules/ 。注意:不同版本號的模塊是完全分開在不同目錄中的,因為modules跟內核是緊密相關的,混用容易導致系統崩潰)   (10)cd /usr/src/linux-2.5.7/arch/i386/boot ,用命令:cp /usr/src/linux2.5.7/arch/i386/boot/bzImage /boot/vmlinuz-2.5.7 把文件bzImage文件改名成vmlinuz-2.5.7復制到/boot/   (11)cp /usr/src/linux-2.5.7/System.map /boot/System.map-2.5.7   (12)進入/boot目錄,rm System.map   (13)在/boot目錄中運行ln System.map-2.5.7 System.map 10-13兩個步驟每次重新編譯都要做。   (14)我開始提醒過的,但愿你安裝了lilo (否則你就高唱:“神啊,救救我吧!”),編輯文件:/etc/lilo.conf ,做下面的編輯:   boot=/dev/sda   map=/boot/map   install=/boot/boot.b   prompt   timeout=50   lba32   default=linux-2.5.7   image=/boot/vmlinuz label=linux initrd=/boot/initrd read-only root=/dev/sda5   image=/boot/vmlinuz-2.5.7 label=linux-2.5.7 initrd=/boot/initrd read-only root=/dev/sda5   黑體字部分是后加的和修改的。萬一你沒有安裝lilo,你只能修改/boot下面的連接指向你新的System.map和vmlinuz , 而不用修改lilo了。這樣也能啟動,但是一旦出現問題,你的機器就啟動不了了。   (15)執行命令:lilo (用來更新lilo數據),注意輸出的結果:帶星號的是缺省的。   (16)祈禱,然后reboot 系統重新啟動后,用uname –a 可看到新的內核起作用了。如果出現任何問題不能引導了,你需要在lilo的引導界面選擇原來的內核啟動,進入系統后重新改變內核參數,調整硬件或其他配置。然后重復前面所有過程。 【發表回復】【查看論壇原帖】【添加到收藏夾】【關閉】 -------------------------------------------------------------------------------- lsw 回復于:2002-12-23 11:39:14 四、主要的軟件安裝  前面說過,我的習慣是,裝系統的時候就安裝一個內核和編譯系統,得到了一個干凈的系統后,再安裝其他的軟件就比較清晰。另一點,除非搞不到源代碼版本,一般情況下我都會下載官方版本的源代碼文件,來重新編譯之。同樣的,選擇軟件版本要根據該軟件的Release Note來決定,并非越新越好。這就是為什么很多軟件都是幾個版本齊頭并進的發展之原因。這些軟件不同版本之間的安裝方法會有少許不同,安裝前一定要仔細閱讀目錄中的README文件和INSTALL文件,否則這些少許不同會造成不少得麻煩。下面描述的安裝過程都核版本號緊密相關。另外,所有的軟件都把程序文件的包拷貝到/usr/local/src目錄中再解壓縮,這是習慣。因為在Linux中習慣于把后來的軟件裝在/usr/local中。   (1)安裝DNS服務器   1、從www.isc.org下載bind 域名服務器軟件。我們這里用的是bind8.3.0,bind8分支和bind9分支是并行發展的。根據自己的實際情況選擇合適的bind版本。   2、mkdir /usr/src/bind83   3、下載的文件叫bind-src.tar.gz,復制到/usr/local/src/bind83目錄下。   4、cd /usr/local/src/bind83   5、tar zxvf bind-src.tar.gz   6、cd src   7、make stdlinks   8、make clean   9、make depend   10、make all   11、make install   12、編輯配置文件:/etc/named.conf內容如下,需要更改的部分用黑體標出:   /*    * This is a worthless, nonrunnable example of a named.conf file that has    * every conceivable syntax element in use. We use it to test the parser.    * It could also be used as a conceptual template for users of new features.    */   /*    * C-style comments are OK    */   // So are C++-style comments   # So are shell-style comments   // watch out for ";" -- it‘s important!   options { directory "/var/named";       // use current directory named-xfer "/usr/libexec/named-xfer";       // _PATH_XFER dump-file "named_dump.db";       // _PATH_DUMPFILE pid-file "/var/run/named.pid";       // _PATH_PIDFILE statistics-file "named.stats";       // _PATH_STATS memstatistics-file "named.memstats";       // _PATH_MEMSTATS check-names master fail; check-names slave warn; check-names response ignore; host-statistics no; deallocate-on-exit no;       // Painstakingly deallocate all       // objects when exiting instead of       // letting the OS clean up for us.       // Useful a memory leak is suspected. // Final statistics are written to the // memstatistics-file. datasize default; stacksize default; coresize default; files unlimited; recursion yes; fetch-glue yes; fake-iquery no; notify yes;      // send NOTIFY messages. You can set // notify on a zone-by-zone // basis in the "zone" statement // see (below) serial-queries 4;      // number of parallel SOA queries // we can have outstanding for master // zone change testing purposes auth-nxdomain yes; // always set AA on NXDOMAIN. // don‘t set this to ‘no‘ unless // you know what you‘re doing -- older // servers won‘t like it. multiple-cnames no;    // if yes, then a name my have more // than one CNAME RR. This use // is non-standard and is not // recommended, but it is available // because previous releases supported // it and it was used by large sites // for load balancing. allow-query { any; }; allow-transfer { any; }; transfers-in 10;      // DEFAULT_XFERS_RUNNING, cannot be    // set > than MAX_XFERS_RUNNING (20) transfers-per-ns 2; // DEFAULT_XFERS_PER_NS transfers-out 0; // not implemented max-transfer-time-in 120; // MAX_XFER_TIME; the default number // of minutes an inbound zone transfer // may run. May be set on a per-zone // basis. transfer-format one-answer; query-source address * port *;   /* * The "forward" option is only meaningful if you‘ve defined * forwarders. "first" gives the normal BIND * forwarding behavior, i.e. ask the forwarders first, and if that * doesn‘t work then do the full lookup. You can also say * "forward only;" which is what used to be specified with * "slave" or "options forward-only". "only" will never attempt    * a full lookup; only the forwarders will be used.    */ forward first; forwarders { };     // default is no forwarders topology { localhost; localnets; };     // prefer local nameservers listen-on port 53 { any; };     // listen for queries on port 53 on    // any interface on the system    // (i.e. all interfaces). The    // "port 53" is optional; if you    // don‘t specify a port, port 53    // is assumed. /* * Interval Timers */ cleaning-interval 60;     // clean the cache of expired RRs    // every ‘cleaning-interval‘ minutes interface-interval 60;     // scan for new or deleted interfaces    // every ‘interface-interval‘ minutes statistics-interval 60;     // log statistics every    // ‘statistics-interval‘ minutes maintain-ixfr-base no;     // If yes, keep transaction log file for IXFR max-ixfr-log-size 20;     // Not implemented, maximum size the    // IXFR transaction log file to grow   };   /*    * Control listeners, for "ndc". Every nameserver needs at least one.    */   controls { inet * port 52 allow { any; }; // a bad idea unix "/var/run/ndc" perm 0600 owner 0 group 0;        // the default   };   zone "rd.21vianet.com" in { type master;       // what used to be called "primary" file "rd.21vianet.com.db"; check-names fail; allow-update { none; }; allow-transfer { any; }; allow-query { any; }; // notify yes;       // send NOTIFY messages for this // zone? The global option is used // if "notify" is not specified // here. also-notify { };       // don‘t notify any nameservers other // than those on the NS list for this // zone   };   zone "223.99.211.in-addr.arpa" in { type master; // what used to be called "secondary" file "211.99.223.db"; };   zone "0.0.127.in-addr.arpa" in { type master; file "127.0.0.db";   };   zone "." in { type hint;        // used to be specified w/ "cache" file "named.root";   };   logging { /* * All log output goes to one or more "channels"; you can make as * many of them as you want. */ channel syslog_errors {       // this channel will send errors or syslog user;       // or worse to syslog (user facility) severity error; }; category parser { syslog_errors; // you can log to as many channels default_syslog;      // as you want }; category lame-servers { null; };      // don‘t log these at all channel moderate_debug { severity debug 3;      // level 3 debugging to file file "foo";      // foo print-time yes;     // timestamp log entries print-category yes;      // print category name print-severity yes;      // print severity level /* * Note that debugging must have been turned on either * on the command line or with a signal to get debugging * output (non-debugging output will still be written to * this channel). */ }; /* * If you don‘t want to see "zone XXXX loaded" messages but do * want to see any problems, you could do the following. */ channel no_info_messages { syslog; severity notice; }; category load { no_info_messages; }; /* * You can also define category "default"; it gets used when no * "category" statement has been given for a category. */ category default { default_syslog; moderate_debug; }; };   13、在/var/named/中生成/etc/named.conf中標記的文件:rd.21vianet.com.db,內容如下,需要修改和調整相應部分:   ;Authoriative data for rd.21vianet.com   ;   $TTL 3600   @ IN SOA compaq.rd.21vianet.com. tandongyu.rd.21vianet.com. (     20020101 ;Serial     3600 ;Refresh 1 hour     900 ;Retry 15 mins     604800 ;Expire 7 days     86400) ;Mini 24 hours   ;Name server NS records   @ IN NS compaq.rd.21vianet.com.   ;Mail Exchange (MX) records   rd.21vianet.com. IN MX 0 compaq   ;Address (A) records.   localhost IN A 127.0.0.1   compaq IN A 211.99.223.9   tls65 IN A 211.99.223.8   fbsd IN A 211.99.223.7   14、在/var/named/中生成/etc/named.conf中標記的文件:211.99.223.db,內容如下,你需要修改相應部分:   ;   ;   $TTL 3600   @ IN SOA compaq.rd.21vianet.com. tandongyu.rd.21vianet.com. (     20020101 ;Serial     3600 ;Refresh     900 ;Retry 15 mins     604800 ;Expire 7 days     86400) ;Mini 24 hours   ;NameServer (NS) records   @ IN NS compaq.rd.21vianet.com.   ;Address Point to Name (PTR) records   9 IN PTR compaq.rd.21vianet.com.   8 IN PTR tls65.rd.21vianet.com.   7 IN PTR fbsd.rd.21vianet.com.   15、在/var/named/中生成/etc/named.conf中標記的文件:127.0.0.db,內容如下,你需要修改相應部分:   ; 0.0.127.in-addr.arpa   $TTL 3600   @ IN SOA compaq.rd.21vianet.com. tandongyu.rd.21vianet.com. (      20020101;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum IN NS compaq.rd.21vianet.com.   1 IN PTR localhost.   16、在/var/named/中生成/etc/named.conf中標記的文件:named.root,內容大致如下。該文件標記了14個域名服務器??梢詮膄tp.rs.internic.net獲得該文件的最新樣本:named.hosts,然后改名成你需要的名字,比如:named.root   ; This file holds the information on root name servers needed to   ; initialize cache of Internet domain name servers   ; (e.g. reference this file in the "cache . "   ; configuration file of BIND domain name servers).   ;   ; This file is made available by InterNIC registration services   ; under anonymous FTP as   ; file /domain/named.root   ; on server FTP.RS.INTERNIC.NET   ; -OR- under Gopher at RS.INTERNIC.NET   ; under menu InterNIC Registration Services (NSI)   ; submenu InterNIC Registration Archives   ; file named.root   ;   ; last update: Aug 22, 1997   ; related version of root zone: 1997082200   ;   ;   ; formerly NS.INTERNIC.NET   ;     . 3600000 IN NS A.ROOT-SERVERS.NET.     A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4   ;   ; formerly NS1.ISI.EDU   ;     . 3600000 NS B.ROOT-SERVERS.NET.     B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107   ;   ; formerly C.PSI.NET   ;     . 3600000 NS C.ROOT-SERVERS.NET.     C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12   ;   ; formerly TERP.UMD.EDU   ;     . 3600000 NS D.ROOT-SERVERS.NET.     D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90   ;   ; formerly NS.NASA.GOV   ;     . 3600000 NS E.ROOT-SERVERS.NET.     E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10   ;   ; formerly NS.ISC.ORG   ;     . 3600000 NS F.ROOT-SERVERS.NET.     F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241   ;   ; formerly NS.NIC.DDN.MIL   ;     . 3600000 NS G.ROOT-SERVERS.NET.     G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4   ;   ; formerly AOS.ARL.ARMY.MIL   ;     . 3600000 NS H.ROOT-SERVERS.NET.     H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53   ;   ; formerly NIC.NORDU.NET   ;     . 3600000 NS I.ROOT-SERVERS.NET.     I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17   ;   ; temporarily housed at NSI (InterNIC)   ;     . 3600000 NS J.ROOT-SERVERS.NET.     J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10   ;   ; housed in LINX, operated by RIPE NCC   ;     . 3600000 NS K.ROOT-SERVERS.NET.     K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129   ;   ; temporarily housed at ISI (IANA)   ;     . 3600000 NS L.ROOT-SERVERS.NET.     L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12   ;   ; housed in Japan, operated by WIDE   ;     . 3600000 NS M.ROOT-SERVERS.NET.     M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33   ; End of File   17、我們還需要配置/etc/resolv.conf、/etc/hosts、/etc/hosts.conf文件以適應新的狀況。   18、一切都結束后,用/usr/sbin/ndc start命令啟動bind,同樣的可用stop、restart、reload等命令參數操作。   19、啟動后用nslookup命令(有的系統推薦使用dig命令)檢驗是否正確。如果出現錯誤,該命令將不能啟動。一般的錯誤都是數據庫文件或配置文件筆誤所至。比如少個“.”或者文件明不正確等等。   (2) 安裝sendmail服務器   1、從www.sendmail.org下載最新的版本(這個snedmail倒是有必要升級為最新的版本,因為它的升級主要是安全漏洞問題)。這里說明的是用的sendmail-8.12.2.tar.gz   2、cd /usr/local/src/   3、把文件下載到:/usr/local/src中   4、tar zxvf sendmail-8.12.2.tar.gz   5、cd /usr/local/src/sendmail-8.12.2   6、chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue   7、chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue   8、cd /usr/local/src/sendmail-8.12.2/sendmail   9、sh Build   10、cd /usr/local/src/sendmail-8.12.2/cf/cf   11、建立文件sendmail.mc內容如下,你可根據需要修改相應部分。   divert(-1)   dnl This is the macro config file used to generate the /etc/sendmail.cf   dnl file. If you modify thei file you will have to regenerate the   dnl /etc/sendmail.cf by running this macro config through the m4   dnl preprocessor:   dnl m4 /etc/sendmail.mc > /etc/sendmail.cf   dnl You will need to have the Sendmail-cf pacage installed for this to work.   include(`/usr/local/src/sendmail-8.12.2/cf‘) define(`confDEF_USER_ID‘,`8:12‘) OSTYPE(`linux‘) undefine(`UUCP_RELAY‘) undefine(`BITNET_RELAY‘) define(`confTO_CONNECT‘, `1m‘) define(`confTRY_NULL_MX_LIST‘,true) define(`confDONT_PROBE_INTERFACES‘,true) define(`PROCMAIL_MAILER_PATH‘,`/usr/bin/procmail‘) define(`SMART_HOST‘,compaq.rd.21vianet.com)     <---這條用于(非HUB)缺省使用HUB發送郵件 MASQUERADE_AS(`rd.21vianet.com‘) <------------------------- FEATURE(`masquerade_entire_domain‘)      <---這三條用于郵件地址偽裝 FEATURE(`masquerade_envelope‘)       <------------------------- FEATURE(`smrsh‘,`/usr/sbin/smrsh‘) FEATURE(`mailertable‘,`hash -o /etc/mail/mailertable‘) FEATURE(`virtusertable‘,`hash -o /etc/mail/virtusertable‘) FEATURE(redirect) FEATURE(always_add_domain) FEATURE(use_cw_file) FEATURE(local_procmail) FEATURE(`access_db‘) FEATURE(`blacklist_recipients‘) FEATURE(`accept_unresolvable_domains‘) MAILER(smtp) MAILER(procmail) dnl We strongly recommend to comment this one out if you want to protect dnl yourself from spam. However, the laptop and users on computers that do dnl not hav 24x7 DNS do need this. dnl FEATURE(`relay_based_on_MX‘)   12、sh Build install-cf   13、groupadd smmsp   14、useradd smmsp   15、cd cd /usr/local/src/sendmail-8.12.2/sendmail   16、sh Build install   17、cd /usr/local/src/sendmail-8.12.2/makemap   18、sh Build clean   19、sh Build all   20、sh Build install   21、cd /usr/local/src/sendmail-8.12.2/   22、在本域DNS主數據庫文件中增加MX紀錄:   rd.21vianet.com. IN MX 0 compaq   注意修改相應部分。那個0是有幾個郵件集中器的時候用于標記先后順序的。當有好幾個MX的時候,建議順序寫為10、20、30…   23、在/etc/mail目錄下創建access文件,內容類似如下: 127.0.0.1 RELAY 211.99.223 RELAY 211.99.221.238 RELAY   然后:makemap hash access.db < access   24、創建文件/etc/mail/local-host-names,其內容為本機的擁有的域名信息。   rd.21vianet.com   compaq.rd.21vianet.com   25、創建文件/etc/mail/aliases,內容類似:   MAILER-DAEMON: postmaster postmaster: root bin: root daemon: root nobody: root   運行newaliases創建數據庫。   創建別名文件的意義之一在于當郵件發往域中其他郵件服務器的用戶而不是mail HUB用戶的時候用。   比如增加一條:   atan: atan@fbsd   則導致郵件發往mail HUB的時候自動轉發到atan@fbsd.rd.21vianet.com   26、啟動sendmail: /usr/sbin/sendmail -bd -q30m   排錯:如果有問題導致啟動不了,大部分問題和DNS配置有關,可以使用nslookup檢查DNS是否正常。挨個檢查/etc/mail中的文件內容也是排錯的好辦法。另外,修改配置,不建議直接編輯sendmail.cf文件,建議使用m4宏編譯工具,因為有些帶有安全漏洞或過時的宏在編譯的時候會有提示,這樣以免造成相關安全問題。 -------------------------------------------------------------------------------- lsw 回復于:2002-12-23 11:40:34 (3)安裝DHCP服務器  1、源程序下載地址是:ftp://ftp.isc.org/isc/dhcp/dhcp-3.0.tar.gz ,我們的版本是:dhcpd-3.0   2、復制到:/usr/local/scr后解壓:tar zxvf dhcp-3.0.tar.gz   3、cd /usr/local/src/dhcp-3.0.tar.gz   4、./configure   5、make(如果不是第一次編譯,先make clean)   6、make install   7、cp ./server/dhcpd.conf /etc   8、編輯這個文件,看起來類似下面這樣:(要更改的地方用粗體標出)   # dhcpd.conf   #   # Sample configuration file for ISC dhcpd   #   # option definitions common to all supported networks...   option domain-name "rd.21vianet.com";   option domain-name-servers compaq.rd.21vianet.com;   default-lease-time 86400;   max-lease-time 172800;   ddns-update-style ad-hoc;   # If this DHCP server is the official DHCP server for the local   # network, the authoritative directive should be uncommented.   #authoritative;   # Use this to send dhcp log messages to a different log file (you also   # have to hack syslog.conf to complete the redirection).   log-facility local7;   # No service will be given on this subnet, but declaring it helps the   # DHCP server to understand the network topology.   # This is a very basic subnet declaration.   subnet 211.99.223.0 netmask 255.255.255.224 {     range 211.99.223.2 211.99.223.6;     option routers 211.99.223.1;   }   # This declaration allows BOOTP clients to get dynamic addresses,   # which we don‘t really recommend.   #subnet 10.254.239.32 netmask 255.255.255.224   {     # range dynamic-bootp 10.254.239.40 10.254.239.60;     # option broadcast-address 10.254.239.31;     # option routers rtr-239-32-1.example.org;   #}   # A slightly different configuration for an internal subnet.   #subnet 10.5.5.0 netmask 255.255.255.224 {   # range 10.5.5.26 10.5.5.30;   # option domain-name-servers ns1.internal.example.org;   # option domain-name "internal.example.org";   # option routers 10.5.5.1;   # option broadcast-address 10.5.5.31;   # default-lease-time 600;   # max-lease-time 7200;   #}   # Hosts which require special configuration options can be listed in   # host statements. If no address is specified, the address will be   # allocated dynamically (if possible), but the host-specific information   # will still come from the host declaration.   #host passacaglia {   # hardware ethernet 0:0:c0:5d:bd:95;   # filename "vmunix.passacaglia";   # server-name "toccata.fugue.com";   #}   # Fixed IP addresses can also be specified for hosts. These addresses   # should not also be listed as being available for dynamic assignment.   # Hosts for which fixed IP addresses have been specified can boot using   # BOOTP or DHCP. Hosts for which no fixed address is specified can only   # be booted with DHCP, unless there is an address range on the subnet   # to which a BOOTP client is connected which has the dynamic-bootp flag   # set.   #host fantasia {   # hardware ethernet 08:00:07:26:c0:a5;   # fixed-address fantasia.fugue.com;   #}   # You can declare a class of clients and then do address allocation   # based on that. The example below shows a case where all clients   # in a certain class get addresses on the 10.17.224/24 subnet, and all   # other clients get addresses on the 10.0.29/24 subnet.     #class "foo" {   # match if substring (option vendor-class-identifier, 0, 4) = "SUNW";   #}   #shared-network 224-29 {   # subnet 10.17.224.0 netmask 255.255.255.0 {   # option routers rtr-224.example.org;   # }   # subnet 10.0.29.0 netmask 255.255.255.0 {   # option routers rtr-29.example.org;   # }   # pool {   # allow members of "foo";   # range 10.17.224.10 10.17.224.250;   # }   # pool {   # deny members of "foo";   # range 10.0.29.10 10.0.29.230;   # }   上面這個文件中后面都是注釋,是原來系統給你的配置做的例子,可以不要。當然除非你用到它們,并且清楚它們的含義。   9、建立空文件:touch /var/state/dhcp/dhcpd.leases空文件   10、檢查內核編譯選項:Networking options-----Packet socket: mmapped IO和Socket Filtering選項是否被選中(不知道怎么看?看看前面的文章,用make menuconfig呀),如果沒有就需要重新編譯內核了。   11、route add -host 255.255.255.255 dev eth0   12、roote add -host localhost dev eth0   13、在/etc/rc.d/rc.local最后增加一行route add -host 255.255.255.255 dev eth0   14、reboot系統   15、用dhcpd命令啟動DHCP,用其他的機器試試看能不能自動配置網絡了。 (4) 安裝apache+mysql+php+gd+png+zlib+jpeg+freetype+sslmod   這么一大堆東西為什么要一塊說呢?因為他們中間是有緊密聯系的,尤其是那個PHP,用到其他所有的模塊。要想PHP功能全,只能一步步來了。   1、首先安裝MYSQL:從http://www.mysql.com/downloads/index.html下載自己覺得合適的版本。這里用3.23.42版本。   2、進入目錄/usr/local/src(這個以后就不用說了吧?)解壓縮:tar zxvf mysql-3.23.42.tar.gz   3、cd mysql-3.23.42/   4、configure --prefix=/usr/local/mysql   5、make   6、make install   7、useradd mysql ; groupadd mysql ; su mysql ;(建立命名為mysql的用戶和組,并切換為mysql身份)   8、scripts/mysql_install_db (建立數據庫結構)   9、cd /usr/local/mysql/bin   10、./safe_mysqld & (啟動了)   11、./mysqladmin -u root password "new-password"(你的新密碼,記住MYSQL的密碼核系統密碼是獨立的,缺省是沒有密碼)   12、用mysql程序試試看。   下面的步驟都很程式化,我盡量簡潔地寫出。   13、下載相關的軟件包:地址表格如下   軟件     版本     地址 jpegsrc.v6b.tar.gz  6b ftp://ftp.uu.net/graphics/jpeg zlib.tar.gz 1.1.3 ftp://ftp.uu.net/graphics/png/src freetype-2.0.8.tar.gz 2.0.8 http://www.freetype.org libpng-1.0.10.tar.gz 1.0.10 ftp://ftp.uu.net/graphics/png/src gd-1.8.4.tar.gz 1.8.4 http://www.boutell.com/gd apache_1.3.23.tar.gz 1.3.23 http://www.apache.org php-4.1.1.tar.gz 4.1.1 http://www.php.net number4.tar.gz 4 http://www.php.net/extra rsaref20.tar.Z 2.0 ftp://ftp.ai.mit.edu/pub/deberg openssl-engine-0.9.6c.tar.gz 0.9.6c http://www.openssl.org/source mod_ssl-2.8.6-1.3.23.tar.gz 2.8.6 http://www.modssl.org   下齊了就放在/usr/local/src目錄下,除了number4.tar.gz和rsaref20.tar.Z以外,其他一律用tar zxvf XXXX.tar.gz解壓縮。(過癮吧?)   特殊的,rsaref20.tar.Z 需要先建立一個rsaref-2.0目錄,然后把rsaref20.tar.Z復制到改目錄下用tar zxvf rsaref30.tar.Z釋放壓縮。Number4.tar.gz需要復制到php-4.1.1目錄內,然后用tar zxvf number4.tar.gz解壓縮。   下面的描述我想簡單一點,只寫出進入目錄后執行的命令。那些目錄都是釋放的時候自己建立的,如果你這些操作都在/usr/local/src下面執行,所有的目錄就都在這里面。最好按照順序執行。再羅嗦一句:如果不是第一次編譯,一般情況請執行一次make clean后再編譯。   14、[jpeg-6b]:生成JPEG圖像的函數庫。   ./configure   make   make test   make install   15、[zlib-1.1.3]:壓縮算法庫,是PNG和JPEG需要的   make test   make install   16、[freetype-2.0.8]:字體庫,在圖像上使用字體的時候需要用到,   ./configure --prefix=/usr/local   make   make install   17、[libpng-1.0.10]:生成PNG圖像的函數庫   cp scripts/makefile.linux makefile   make test   pngtest pngnow.png   (如果都通過測試了,請繼續。否則,看看錯誤提示,改正錯誤)   make install   18、[gd-1.8.4]:GD庫,用來動態生成圖像用,這里主要是配合PHP生成圖像。   編輯Makefile 文件:   把下列行取消注釋符號(#):   CFLAGS=-O -DHAVE_LIBXPM -DHAVE_LIBPNG -DHAVE_LIBJPEG   -DHAVE_LIBFREETYPE -DHAVE_LIBTTF   LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lm -lttf   注釋下列行(增加#):  CFLAGS=-O -DHAVE_LIBPNG -DHAVE_LIBJPEG   LIBS=-lgd -lpng -lz -lm   修改下列行:  INCLUDEDIRS=-I. -I/usr/local/include/freetype2 -I/usr/include/X11     -I/usr/X11R6/include/X11 -I/usr/local/include      -I/usr/include/freetype   保存后執行:   make   make install   19、[apache_1.3.23]:步驟一 ./configure --prefix=/usr/local/apache   20、[php-4.1.1]:   如果不是第一次安裝,請刪除:config.cache文件,然后執行先執行make clean   接下來配置環境,輸入一個比較長的命令:   ./configure     --with-apache=/usr/local/src/apache_1.3.23     --with-config-file-path=/local/apache/conf     --with-enable-versioning     --with-mysql=/usr/local/mysql     --with-ftp     --with-gd=/usr/local/src/gd-1.8.4     --with-enabled-bcmath=yes     --with-disable-debug     --enable-memory-limit=yes     --enable-track-vars     --with-zlib     --with-jpeg-dir=/usr/local/src/jpeg-6b     --with-png-dir=/usr/local/src/libpng-1.0.10     --with-freetype-dir=/usr//local/src/freetype-2.0.8   當然你也可以實現準備一個含有上述命令的sh文件,這樣改起來方便些。我就是這樣做的。   make   make install   21、[rsaref-2.0]:RSA加密模塊   前面說過,這個目錄的釋放是特殊的,先見目錄后釋放,希望你是這樣做的。   cp -rp install/unix local   cd local   make   mv rsaref.a librsaref.a   22、[openssl-engine-0.9.6c]:openssl引擎   ./config -prefix=/usr/local/ssl -L`pwd`/../rsaref-2.0/local/ rsaref –fPIC   make   make test   make install   23、[mod_ssl-2.8.6-1.3.23]   ./configure --with-apache=../apache_1.3.23   24、[apache_1.3.23]步驟二   ./configure --prefix=/usr/local/apache --enable-shared=ssl      --enable-module=ssl --activate-module=src/modules/php4/libphp4.a   make   make certificate TYPE=custom(回答一些問題)  make install   25、收尾工作:   編輯/usr/local/apache/conf/httpd.conf文件,增加一行:   AddType application/x-httpd-php .php   26、用命令/usr/local/apache/bin/apachectl configtest檢查一下配置文件的正確性。   27、用/usr/lcoal/apache/bin/apachectl start啟動apache服務器   28、在/usr/local/apache/htdocs建立一個test.php文件包含下列內容:       phpinfo();   >   29、在別的機器上用瀏覽器看一下這個機器:http://xxx.xxx.xxx.xxx/test.php會出現php的配置總匯,看看前面編譯的模塊都在不在。   30、檢驗ssl很麻煩,需要用apachectl startssl啟動apache然后還要生成一大堆證書。這里就不討論了。   31、把/usr/local/apache/bin/apachectl文件復制到/etc/rc.d/init.d中,然后在/etc/rc.d/rd3.d中建立個符號連接指向/etc/rc.d/init.d中的上述文件:   ln -s ../init.d/apachectl S70apachectl   這樣系統啟動的時候就可以自動啟動apache和她的哪一大堆模塊了。   呼~~~~(喘口氣)到這里,就基本上完成了一個功能很全的WEB服務器系統了。   (5)安裝 ftp 服務器   (6)安裝 pop3服務器   有的郵件服務器自己帶pop3功能(比如Qmail、Xmail),如果你用這幾種郵件服務器軟件,當然就不用安裝pop3了。目前,常用的郵件服務器里面不帶pop3的好象只有sendmail和postfix等少數幾種。這幾種郵件服務器軟件使用的都是系統用戶,而我們安裝的pop3也只是對系統用戶的郵件進行彈出操作的。這里我們使用的版本和下載地址是:   qpopper4.0.3.tar.gz     http://www.eudora.com/qpopper_general/   同樣的,把文件下載到/usr/local/src中,按照下列步驟安裝:   tar zxvf qpopper4.0.3.tar.gz   cd qpopper4.0.3   ./configure   make   make install   完成后,qpopper安裝在/usr/local/sbin中(如果你愿意把它放在其他地方,可以在前面用./configure –prefix=/your_path指定),文件名叫作popper。通常情況下,popper是作為一個inetd(超級網絡服務進程)的子進程加載的。這樣需要編輯文件/etc/inetd.conf并做下面改動: ...   # POP3 mail server   #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d   pop-3 stream tcp nowait root /usr/local/sbin/popper qpopper –s   ...   增加黑體的這一行,注釋掉原來的(上面這一行),注意,如果你的安裝路經不同,記著改過來呀。然后,用下面的命令得到inetd的進程號:   ps –ax | grep inetd   得到結果類似:   248 ? S 0:00 inetd   什么?哪個是進程號?就是最前面那個數字。然后用下面的命令重新啟動inetd:   kill –HUP 248   用下面的命令看看pop3是不是啟動了。   netstat -ln|grep 110   如果結果是這樣,就恭喜了。   tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN   這里還要補充一點,少數情況下,pop3進程需要獨立的監聽端口,也就是不作為inetd的子進程裝載,上面過程需要做如下改動:   ./configure的時候加上--enable-standalone參數。   編輯/etc/inetd.conf不增加黑體一行,但需要注釋掉原來的pop-3一行(如果有的話)。   啟動的時候,直接運行/usr/local/sbin/popper xxx.xxx.xxx.xxx:110即可。后面的參數是本地需要幾監聽的IP地址和端口。注意,沒有特殊需要,端口必須是110。最后要說的是:其實最簡單的辦法就是用你使用的Linux發行包帶的pop3軟件,安裝的時候直接選上即可。 -------------------------------------------------------------------------------- lsw 回復于:2002-12-23 11:43:32 (7)安裝imap服務器  幾乎所有的發行包都帶有imap服務器軟件(一般是華盛頓大學版本),最好的辦法是用你的發行包安裝IMAP服務器。事實上,我個人覺得IMAP服務器很少被使用。下載最常規的IMAP服務器源碼地址是:ftp://ftp.cac.washington.edu/imap/imap.tar.Z   tar zxvf imap.tar.Z   cd imap-2001a   make slx   (如果不行依次試驗一下其他你覺得可能的系統類型,用vi看一下Makefile中列的名稱)   然后配置/etc/inetd.conf,讓inetd允許imap服務。[本節內容沒有試驗成功,編譯總是過不去]   (8)安裝squid服務器   SQUID是一個優秀的代理服務器軟件,它可以很靈活的被配置為各種應用形式,其中包括正向代理,反向加速模式和透明代理等。但是SQUID目前只能代理HTTP協議,代理FTP協議需要配置瀏覽器仿真主動FTP協議。下面的步驟是安裝SQUID的過程。   1、下載反向代理服務器軟件采用squid,下載地址:http://www.squid-cache.org/   下載后存放在/usr/local/src目錄里,文件名是squid-2.4.STABLE2-src.tar.gz   2、tar zxvf squid-2.4.STABLE2-src.tar.gz 解壓縮   3、cd /usr/local/src/squid-2.4.STABLE2 進入目錄   4、./configure --prefix=/usr/local/squid --enable-heap-replacement --disable-internal-dns建立環境,把squid安裝/usr/local/squid中。第二個參數是指定使用更先進的緩沖算法。第三個參數是取消內部DNS解析(如果使用在遠程高速緩存模式,比如GSLB,需要增加選項:--disable-internal-dns,目的是關閉內部DNS.否則內部DNS不理睬你在etc/hosts中的設定,直接尋找域名服務器,這樣就會造成轉發循環。就是cache發送給物理服務器的更新請求(因為用域名)也會被用戶的GSLN設備解析回來而形成循環。)   5、make 開始編譯   6、make install 安裝到剛才--prefix=指定的路徑當中   7、安裝完成后,會在您指定的安裝路徑里產生一個squid目錄,squid目錄下有四個目錄:bin/ etc/ libexec/ logs/。其中etc里面是配置文件,bin里面是執行文件,logs里面是日志文件。   8、安裝結束后就是調試服務器,使其按照您的要求工作。Squid的配置文件只有一個,在etc目錄里,名字是squid.conf,所有的配置選項都在這個文件里面。而且每個配置項目都有注釋說明。首先,在squid文件里面找到下列配置項:   cache_mem ---這里可以添上您準備給squid作為高速緩存使用的內存大小。注意,如果您的機器有N兆內存,那么,推薦您在這里添的數字是N/3。   cache_dir /usr/local/squid/cache 100 16 256 這里的第一個數字100是您準備給squid作為cache使用的硬盤空間大小,單位是兆。如果您想劃100M空間當作cache,那么這里就寫100。   cache_mgr webmaster@test.com.cn這里填寫cache管理員的Email地址,系統出錯會自動提醒cache管理員。   cache_replacement_policy和memory_replacement_policy的參數由于使用了--enable-heap-replacement編譯參數,就不能使用缺省的lru算法了,你可以在下列三種里面選一個:   heap GDSF : Greedy-Dual Size Frequency   heap LFUDA: Least Frequently Used with Dynamic Aging   heap LRU : LRU policy implemented using a heap   例如:   cache_replacement_policy heap LRU   memory_replacement_policy heap LRU   下面設定ACL訪問控制列表:為了簡單起見,我們在這里開放所有的權限。ACL分為兩個部分:ACL定義部分,和http_access部分。在access_http部分用到前面的定義。前面定義了:   acl all src 0.0.0.0/0.0.0.0   我們注釋掉所有的http_access行加一句:   http_access allow all ---注意:all是前面acl定義的。   這樣就開放了所有的權限。以后有需要的,再繼續往上加各種限制即可。   9、以root身份創建組nogroup :   %su root (如果當前不是root)  #groupadd nogroup   #useradd nobody (如果沒有這個用戶)   10、進行目錄/usr/local ,以root身份執行下面的命令,改變整個Squid目錄的所有者為nobody.nogroup   #cd /usr/local   #chown nobody.nogroup -R squid   11、su 作為nobody,進行/usr/local/squid/bin目錄,執行#squid -z 創建cache交換目錄   #su nobody   $ cd /usr/local/squid/bin   $./squid -z   12、成功后,測試一下:/usr/local/squid/bin/squid -NCd1 該命令正式啟動Squid。如果一切正常,你會看到一行輸出 :Ready to serve requests.   13、用ctrl-c退出前臺測試。   14、把squid作為守護進程啟動就直接運行:/usr/local/squid/bin/squid   15、檢查狀態用squid –k check   16、停止squid用squid -k shutdown   如果是配置基本的正向代理,上面的已經可以使用了。下面的步驟用于配置支持多域名的反向代理服務器。還好,SQUID的所有配置都在/usr/local/squid/etc下面,和反向代理有關的幾項介紹如下:   17、http_port 80 “http_port”參數指定Squid監聽瀏覽器客戶請求的端口號。   18、icp_port 0 “icp_port”參數指定Squid從鄰居(neighbour)服務器緩沖內發送和接收ICP請求的端口號。這里設置為0是因為這里配置Squid為內部Web服務器的加速器,所以不需要使用鄰居服務器的緩沖。   19、emulate_httpd_log on 打開“emulate_httpd_log”選項,將使Squid仿照Web服務器的格式創建訪問記錄。如果希望使用Web訪問記錄分析程序,就需要設置這個參數。   20、redirect_rewrites_host_header off 缺省地,Squid將改寫任何重定向請求的主機頭部。若系統運行Squid為加速器模式,則這時不需要重定向特性。該參數在負載過重的情況下要旁路重定向器時才打開   21、httpd_accel_host vartual 此處設置反向代理的主機名,如果對后面多個域名進行緩沖,請使用虛擬主機模式(如此)。   22、httpd_accel_port 80 此處設置反向代理的WEB服務端口號。   23、#httpd_accel_with_proxy off 把這行注釋掉,此處設置開反向代理的同時,是否開普通代理緩存服務。如果這行不注釋掉,就沒有高速緩存功能。   24、定義訪問控制列表:   acl port80 port 80   acl accel_host1 dstdomain .test.com   acl accel_host2 dstdomain .test.net   … …   http_access allow accel_host1 port80   http_access allow accel_host2 port80   http_access deny all;   25、完成后,用squid –k reconfigure重新裝載配置文件。   (9)安裝SSH   ---   (10)配置Linux為路由器   ---   (11)配置Linux網關和安裝ipchains/iptables防火墻   在Linux上面的防火墻,最最常用的是ipchains,而且通常情況下是作為網關的附加部分安裝的。Ipchains的規則是很復雜的,靈活性也很強,可以配制成各種五花八門的樣子。這些都需要和你自己的實際情況相結合。這里,我們只介紹一種基于網關的簡單配置。   安裝IPCHAINS一般都不用你操心,因為幾乎所有的Linux發行包都把該軟件作為必須安裝的卻省配置。另一個原因是ipchains是跟內核(kernel)有很大的關系,因此最好在安裝系統的時候選上相關選項(如果有)。在標題里面我們還提到了iptables,這個工具在表面上等同于ipchains,只不過是用于2.4內核的(2.4內核在這方面的代碼幾乎是重新寫過的,功能有了長足的提高)。關于iptables工具的配置我們在后面介紹。你只需要記住2.2核心下使用ipchains,2.4核心下使用iptables即可。   首先,你的服務器需要兩塊網卡(或更多),這種機器叫做“多宿主主機”,是專門的用于做網關或路由器的。這里插一句:一般情況下,作為普通服務器的主機即使負載再重就需要一塊網卡就夠了,只有做網關或路由器的時候才需要多宿主主機。這并不象一般人認為得那樣增加一塊網卡可以增加一份帶寬,事實上,一塊網卡就可以提供足夠的帶寬。并且,還有人錯誤的把兩塊網卡接在同一個交換機上分配兩個地址,這更是錯誤的,因為這樣產生了額外的循環路由,會產生大量的內部警告錯誤,某些系統就會報警。   1、制作一個雙界面(雙宿主)的主機。   通常,現在的發行包的安裝程序都可以識別兩塊網卡,這樣就省事了。但是也有不少發行包只識別第一塊網卡(也許是出于前面說的原因),或者你要在一臺在用的機器上加一塊網卡(因為你不愿意重裝系統),那么就按照下面的辦法處理。   1.1、我們就說PCI網卡。安裝前首先看看網卡芯片,記住芯片的型號(希望你自己攢過機器)。   1.2、安裝MAN手冊(用發行包)   1.3、在/usr/doc/HOWTO/english/txt/Ethernet-HOWTO文件(如果是壓縮的就釋放)中搜索你的網卡型號,找到對應的驅動模塊名稱。   1.4、如果模塊沒有,還需要重新編譯核心。在menuconfig網絡設備一欄選中你的型號然后標記為*或M,編譯完核心后別忘了編譯模塊:make modules;make modules_install。(不會的話再仔細溫習一下前面編譯內核的部分)   1.5、用depmod –a命令建立/etc/modules.conf(如果已經有就不用了),也有的發行包叫做conf.modules   1.6、編輯該文件加上一行:alias eth1 XXXX,其中XXXX是你剛才查到的模塊名稱。一般該模塊文件位于:/lib/modules/內核版本號/net…中的XXXX.o文件。這個文件是你編譯內核模塊的時候產生的,你在內核配置的時候,凡是標記為M的都會被編譯成.o文件放在這里。同樣的,你選擇的網卡驅動也是會編譯成模塊在這里的。   1.7、運行modprobe eth1使模塊有效。   1.8、修改/etc/sysconfig/network文件中需要修改的部分。   1.9、建立或修改/etc/sysconfig/network-script/ifcfg-eth1文件(照抄那個eth0的即可),設定地址是你的真實情況,比如設為eth1要接的網段。這兩個文件(eth0/eth1是啟動的時候的腳本參數文件)   1.10、重新啟動一下網絡:/etc/rc.d/init.d/network restart   1.11、用ifconfig看看是否eth0/eth1都啟動了。   1.12、大功告成   2、調整和編譯核心:如果作為網關,有些核心選項需要配置。注意:這里的內核編譯選項僅僅適合于2.2.X版本,2.4版本完全不同。   2.1、在/usr/src/linux中運行make menuconfig配置核心下列選項:   Networking options中 [*] Network firewalls   [*] IP: advanced router   [*] IP: firewalling   [*] IP: firewall packet netlink device   [*] IP: transparent proxy support   [*] IP: masquerading   [*] IP: ICMP masquerading   [*] IP: masquerading special modules support    IP: ipautofw masq support (EXPERIMENTAL)    IP: ipportfw masq support (EXPERIMENTAL)    IP: ip fwmark masq-forwarding support (EXPERIMENTAL)   [*] IP: masquerading virtual server support (EXPERIMENTAL)   (12) IP masquerading VS table size (the Nth power of 2)   具體選項不同版本的內核不盡相同,你看著差不多就可以了。編譯成模塊或編進核心[*]可以自由選擇。   2.2、按照前面說的編譯內核,重新啟動后就具有網關功能了。啟動后驗證一下文件:/proc/sys/net/ipv4/ip_forward內容是否為1。(別告訴我不知道怎么看8-))   3、設置ipchains   本來這項工作是非常復雜的,但是我們這里講的簡單,讓網關通了就行。   3.1、先看一下目前我們目前的假想環境:你的機器有兩塊網卡,一塊連接在內網交換機配內部網絡地址,另一塊在外網交換機配公網地址。在這個機器ping 內網和外網的機器應該都能通。并且在內網的機器ping 該機器的外網地址也通,在外網的機器ping該機器內網的地址也同樣通。這說明轉發功能是有效的。   3.2、再試驗一下:在內部網絡把網關設為你的機器的內網地址,然后ping 外網的任一臺機器(不是這臺機器的外網地址),結果是不通。原因是ICMP包發出去后外網的機器不知道怎么回答,那里沒有合適的路由,因為這個包的回應地址是內網。   3.3、現在設置ipchains:(ipchains軟件適用2.2.X的內核,在2.4.X的內核中不適用。2.4.X的內核推薦使用iptables,關于該軟件的用法在下面介紹)   ipchains –A forward –s 192.168.1.0/24 –j MASQ   黑體部分是內網地址。這句話的意思是,把所有內網發送的包都偽裝成外部網的地址(那個機器的外網地址),這樣,外部其他機器回應的時候就會發送到這臺機器,經過轉發就回來內網了。好了,一個簡單的網關做好了。如果你需要實現防火墻(包過濾功能),則需要配置更加復雜的過濾規則,這些規則應該同時作用于input/output/forward鏈。   3.4、自動啟動:設定了復雜的鏈,需要保存。在/etc/rc.d中建立一個文件:rc.ipfwadm把你的鏈腳本加進去就可以了。最后給這個文件+x屬性(chmod +x rc.ipfwadm)。   4.在2.4.X內核中使用iptables建立Linux防火墻(網關)。   4.1 說明和下載   前面已經提到過2.4 內核中要使用iptables來做類似于ipchains在2.2內核中實現的事情。事實上,在2.4內核中的iptables包含了兩個完全不同的部分:包過濾和地址轉換。這兩個功能在邏輯上是分開的,考慮到操作習慣上的問題才集成在一個配置程序(iptables)上。如果你安裝了帶有2.4內核的發行包,那么一般都帶有iptables,并且在內核配置上也配置好了。如果要編譯新的內核或者原來的內核沒有支持iptables,需要選上相關的選項。使用make menuconfig 配置內核的時候操作:進入:Networking Options至少選擇上:   [*] Network packet filtering (replaces ipchains)   [*] Network packet filtering debugging (NEW)   進入:IP: Netfilter Configuration --->   [*] Connection tracking (required for masq/NAT) (NEW) FTP protocol support (NEW) IRC protocol support (NEW)   等等……   把下面的選項全部標記<*>   逐級返回上面菜單后保存配置,然后按照編譯內核的那一套程序進行即可(參見前面的內容)。這里需要說明的是,內核支持了iptables功能,還需要有外部程序才行。如果你是直接安裝的帶有2.4內核的發行包,應該已經帶有iptables實用程序了。但是如果你是從2.2核心的發行包直接升級到2.4內核,盡管按照上面的做法配置的核心,但是還不能使用iptables。還必須下載和編譯iptables外部程序才能使用iptables功能。下載的地址是:http://www.netfilter.org ,下載的文件是iptables-1.2.6a.tar.bz2或更新的版本。   4.2 安裝:   這個.bz2文件比較奇怪吧?把文件復制到/usr/local/src中,然后用下列命令釋放編譯和安裝: bzip2 -dc iptables-1.1.2.tar.bz2 |tar vxf - (最后那個‘- ’別忘了)   你的系統可能沒有bzip2工具,如果沒有,你就去下一個:   進入新生成的目錄 :cd iptables-1.2.6a 編譯和安裝:make ; make install   4.3 配置   如果你需要配置一個簡單的網關,你僅僅需要配置一個轉發加地址轉換功能即可,我提供的參考腳本如下:   #begin   echo 1 > /proc/sys/net/ipv4/ip_forward   modprobe iptable_nat   modprobe ip_conntrack   modprobe ip_conntrack_ftp   modprobe ip_nat_ftp   iptables -F INPUT   iptables -F FORWARD   iptables –F OUTPUT   iptables -F POSTROUTING -t nat   iptables -t nat -F   iptables -P FORWARD DROP   iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT   iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT   iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24     -j SNAT --to 211.99.223.2   #end   其中3行modprobe是當你在內核中把iptables相關功能編譯成模塊(選成)的時候才用到的(也可能不止3行)。其中插入模塊(modprobe)的幾行比較重要,有時候當你作完NAT后,發現FTP不好用了,就要手工插入ip_nat_ftp模塊(語法是:modprobe ip_nat_ftp)。黑體的地址部分可能是需要根據你網絡的實際情況來決定的。最后一句話的意思是把凡是源地址是192.168.1.x的包做地址轉換,轉換為網關外側地址211.99.223.2。好了,你已經建立起一個基本的網關了。其實iptables的功能及其強大,配置也非常靈活。其中的防火墻功能通過-t filter參數實現,地址轉換功能通過-t nat實現(就像上面一樣)。防火墻功能(packet filter)主要是3個鏈:INPUT,FORWARD,OUTPUT,地址轉換功(nat)主要是3個鏈:PREROUTING,POSTROUTING,OUTPUT。觀察當前的狀態可以使用下面的命令:iptables –L –t filter 或 iptables –L –t nat。
          posted @ 2006-06-01 15:39 edsonjava 閱讀(223) | 評論 (0)編輯 收藏
           
          ?文件與目錄操作命令
          1.1文件內容查詢命令 grep、fgrep、egrep
          語法:grep[選項][查找模式][文件名1,文件名2,……]
          選項: -E 每個模式作為一個擴展的正則表達式對待
          -F 每個模式作為一組固定字符串對待,而不作為正則表達式
          -i 比較時不區分大小寫
          -l 顯示首次匹配匹配串所在的文件名并用換行符將其分開。當在文件中多次出現匹配串時,不重復顯示次文件名;
          -x 只顯示整行嚴格匹配的行
          1.2文件查找命令 find、locate
          語法:find 起始目錄 尋找條件 操作
          以名稱和文件屬性查找
          -name‘字串‘ 查找文件名匹配所給字串的所有文件,字串內可用通配符*、?、[]。
          -lname‘字串‘ 查找文件名匹配所給字串的所有符號鏈接文件,字串內可用通配符*、?、[]。
          -gid n 查找屬于ID號為n的用戶組的所有文件。
          -uid n 查找屬于ID號為n的用戶的所有文件。
          -group‘字串‘ 查找屬于用戶組名為所給字串的所有的文件。
          -user‘字串‘ 查找屬于用戶名為所給字串的所有的文件。
          -path‘字串‘ 查找路徑名匹配所給字串的所有文件,字串內可用通配符*、?、[]。
          -perm 權限 查找具有指定權限的文件和目錄,權限的表示可以如711、644。
          -type x 查找類型為 x的文件,
          語法:locate 相關字
          1.3文件的復制、刪除和移動命令文件復制命令cp
          [選項] 源文件或目錄 目標文件或目錄
          選項:
          - a 通常在拷貝目錄時使用
          -d 拷貝時保留連接
          -f 刪除已經存在的目標文件而不提示
          -i 和f選項相反
          -p 此時cp除復制源文件內容外,還將其修改的時間和訪問權限也復制到新文件中
          -r 若給出的源文件是一目錄文件,此時cp將遞歸復制該目錄下的所有的子目錄和文件,此時目標文件必須為一個目錄名;
          -l 不作拷貝,只是鏈接文件
          文件移動命令 mv
          [選項] 源文件或目錄 目標文件或目錄
          -i 交互式操作
          -f 禁止交互式操作
          文件刪除命令 rm
          [選項] 文件…
          -f 忽略不存在的文件,從不給出提示
          -r 指示rm將參數中列出的全部目錄和子目錄均遞歸地刪除
          -i 進行交互式刪除
          1.4文件鏈接命令ln
          [選項] 目標 [鏈接名] 或 ln [選項] 目標 目錄
          選項:- s 建立符號鏈接
          1.5目錄的創建和刪除命令
          mkdir 創建一個目錄
          語法:mkdir [選項] dirname
          選項:- m 對新建目錄設置存取權限
          -p 可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在,加上此選項后,系統將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄。
          rmdir 刪除空目錄
          語法:rmdir [選項] dirname
          選項: - p 遞歸刪除目錄dirname,當子目錄刪除后其父目錄為空時,也一同被刪除。
          1.6改變工作目錄,顯示目錄內容命令
          1、改變工作目錄:cd [directory]
          2、顯示當前工作的目錄的絕對路徑: pwd
          3、顯示目錄內容:ls [選項] [目錄或是文件]
          選項:
          - a 顯示指定目錄下所有子目錄與文件,包括隱藏文件;
          -c 按照文件的修改時間排序
          -C 分成多列顯示各項
          -d 如果參數是目錄,只顯示其名稱而不顯示其下的個文件
          -F 在目錄名后面標記“/”,可執行文件后面標記“*”,符號鏈接后面標記“@”,管道(或FIFO)后面標記“|”,socket文件后面標記“=”。
          -l 以長格式來顯示文件的詳細信息
          -L 若指定的名稱為一個符號鏈接,則顯示鏈接所指向的文件
          -t 顯示時按修改時間而不是名字排序
          -u 顯示時按文件上次存取的時間而不是名字排序
          4、改變文件或目錄的訪問權限命令
          chmod [who] [+| - | = ] [mode] 文件名?
          Who選項:
          - u表示用戶,即文件和目錄的所有者
          -g表示同組用戶
          -o(other)表示其他用戶
          -a (all)表示所有用戶
          操作符號:
          + 添加某個權限 - 取消某個權限
          = 賦予給定權限并取消其他所有的權限(如果有的話)
          mode 選項:
          - r 可讀
          -w 可寫
          -x 可執行
          chgrp [-R] group filename? 改變目錄或文件所屬的組
          chown [-Rv] 用戶或組 文件
          1.7備份與壓縮命令
          1、tar命令 為文件和目錄創建檔案
          語法:tar [主選項+輔助選項] 文件或者目錄
          u 主選項
          c 創建新的檔案文件。如果用戶想備份一個目錄或是一些文件,則選此項
          r 把要存檔的文件追加到檔案文件的末尾
          t 列出檔案文件的內容,查看已經備份了哪些文件;
          u 更新文件
          x 從檔案文件中釋放文件;
          u 輔助選項
          b 該選項為磁帶機設定的,其后跟一位數字,用來說明區塊的大小,系統預設值為20
          f 使用檔案文件或設備,這個選項通常是必選的
          k 保存已經存在的文件。例如把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋;
          m 在還原文件時,把所有文件的修改時間設定為現在;
          M 創建多卷的檔案文件,以便在幾個磁盤中存放;
          v 詳細報告tar處理的文件信息
          w 每一步都要求確認
          z 用gzip來壓縮/解壓縮文件
          2、gzip命令 壓縮/解壓縮命令
          語法:gzip [選項] 壓縮(解壓縮)的文件名
          選項:-c 將輸出寫到標準輸出上,并保留原有文件
          -d 將壓縮文件解壓
          -l 顯示每個壓縮文件的詳細信息
          -r 遞歸式地查找指定目錄并壓縮其中的所有文件或者是解壓縮
          -t 測試、檢查壓縮文件是否完整
          -v 對每一個壓縮和解壓的文件,顯示文件名和壓縮比
          3、unzip 命令
          用MS windows下的壓縮軟件winzip壓縮的文件在linux系統下展開
          語法:unzip [選項] 壓縮文件名.zip
          選項: -x 文件列表 解壓縮文件,但不包括指定的file文件
          -v 查看壓縮文件目錄,但不解壓
          -t 測試文件有無損壞 ,但不解壓
          -d 目錄 將壓縮文件解到指定目錄下
          -z 只顯示壓縮文件的注解
          -n 不覆蓋已經存在的文件
          -o 覆蓋已經存在的文件且不要求用戶確認
          -j 不重建文檔的目錄結構,把所有文件解壓到同一目錄下
          1.8在LINUX環境下運行DOS命令
          linux系統提供了一組稱為mtools的可移植工具,可以讓用戶輕松地從標準的DOS軟盤上讀寫文件和目錄。
          mcd 目錄名 改變MSDOS目錄
          mcopy 源文件 目標文件 在MSDOS和UNIX之間復制文件;
          mdel 目錄名 刪除MSDOS目錄
          mdir 目錄名 顯示MSDOS目錄
          mformat 驅動器號 在低級格式化的軟盤上創建MSDOS文件系統
          rnlabel 驅動器號 產生MSDOS卷標
          mmd 目錄名 刪除MSDOS目錄
          mren 源文件 目標文件 重新命名已存在的MSDOS文件
          mtype 文件名 顯示MSDOS文件的內容
          2 設備管理命令
          linux采用下面的形式定義一個IDE硬盤:/dev/hd[drive][partition]
          SCSI硬盤使用同樣的機制表示: /dev/sd[drive][partition]
          對于一般的LINUX分區,可以用mkfs將其格式化并生成文件系統,命令如下:
          mk2fs -c <partition> <size>
          裝載文件系統:mount -t ext2 [-o optioms] partition mountpiont
          其中,-t為指定裝載文件系統的類型;-o指定一些選項,如只讀ro,可讀可寫rw等等;partition定義分區名稱;mountpiont定義文件系統被裝載的目錄名稱。
          裝載CD-ROM文件系統:mount -t iso9660 -r /dev/cdrom /mnt/cdrom
          裝載軟驅文件系統: mount -t msdos -rw /dev/fd0 /dev/mnt/floppy
          卸載文件系統 umount /mnt/cdrom
          磁帶設備的安裝要注意以下幾點:
          1、 首先要選擇一個唯一的SCSI ID號,然后再將設備鏈接到適當的位置
          2、 選擇驅動程序。
          3、 生成設備文件。SCSI磁帶設備的主要設備號是9,次要設備號是0。設備文件名通常是/dev/nrst0(不支持回繞的磁帶設備)或/dev/nst0(支持回繞的磁帶設備)
          用 ls /dev/*rst*
          檢查磁帶設備文件是否存在,如果不存在,用
          mknod -m 666 /dev/nrst0 c 9 9
          mknod -m 666 /dev/rst0 c 9 0 生成
          4、 可以對塊長度、緩存、磁帶密度等參數進行一些設置,例如
          mt setblk 20 將塊長度指定為20
          mt setblk 0 指定塊程度沒有限制
          5、 通過檢查系統的啟動信息可以確定系統是否識別了新的磁帶設備。用dmesg命令,查看是否有以下類似的信息:
          aha274x:target 4now synchronous at 4.4Mb/s
          Vendor:TANDBERG Model:TDC 3800 Rev: =05:
          Type: Sequential-Access ANSI SCSI revision: 02
          Detected scsi tape st0 at scsi0, id4, lun0
          Scsi : detected 1 SCSI tape 1 SCSI crom 1 SCSI disk total
          3 軟件包管理命令
          3.1軟件安裝的步驟
          在LINUX系統上安裝軟件的步驟有:
          1、 查找所要安裝軟件的源文件
          2、 把源文件解開放到一個目錄中,命令如下:
          tar zxvf <源文件名>
          3、 針對本操作系統配置源文件??梢允蔷庉媘ake文件或其他文件,也可能是運行該軟件自帶的自動配置工具,如./configure
          4、 make源文件,通常是運行make命令,即執行 make
          5、 安裝二進制文件和其他支撐文件,運行命令: make install
          6、 最后,完成所有其他必須的配置
          3.2軟件包管理命令
          rpm -ivh <軟件包>
          // 安裝指定的軟件包,并在安裝過程中用#表示安裝的進度
          rpm -Uvh <軟件包>
          // 更新一個已經存在的或還沒安裝好的軟件包,并刪除所有該軟件包的舊版本。
          rpm -e
          //卸載一個rpm軟件包
          rpm -qa
          // 查看系統中已經安裝的軟件包
          rpm -q <軟件包>
          // 查看系統中某個軟件包的版本號;
          rpm -qlp <軟件包>
          //列出某個軟件包中的所有文件
          rpm -qf <軟件包>
          //找出一個文件屬于哪個軟件包
          4 LINUX系統常用命令
          4.1 與系統管理有關的命令
          Wall (Write All)
          對全部已 登錄的用戶發送信息,用戶可以先反要發送的信息寫好存入一個文件中,然后輸入:# wall < FileName
          例:Wall ‘Thank you !’
          Write
          向某一用戶發送信息。
          Write xxq
          hello
          posted @ 2006-06-01 15:30 edsonjava 閱讀(133) | 評論 (0)編輯 收藏
           

          Linux,在今天的廣大電腦玩家耳中已經不再是那個曾經陌生又遙遠的名字,大家提起Linux時,不再是把它當做與微軟抗衡的一面大旗或自由軟件愛好者的精神支柱。如果說幾年前的Linux是星星之火的話,今天的它已經真正地形成了燎原之勢。

            Linux,在今天的廣大電腦玩家耳中已經不再是那個曾經陌生又遙遠的名字,大家提起Linux時,不再是把它當做與微軟抗衡的一面大旗或自由軟件愛好者的精神支柱。如果說幾年前的Linux是星星之火的話,今天的它已經真正地形成了燎原之勢。隨著越來越多成熟的Linux發行版的推出以及Linux推廣的許多問題(安裝不方便、中文化困難、軟件匱乏、缺乏統一標準等)得到 圓滿解決,現在Linux已經真正地向廣大的電腦愛好者們敞開了大門。

            一、安裝前的準備

            你完全可以打消Linux對計算機硬件是否支持的顧慮,放心大膽地安裝。

            1.檢查硬件支持

            在安裝Linux之前,先確定你的計算機的硬件是否能被Linux所支持。

            首先,Linux目前支持幾乎所有的處理器(CPU)。其次,早期的Linux只支持數量很少的顯卡、聲卡,而如今,如果要安裝Linux,已經不需要再為硬件是否能被Linux支持擔心了。經過十多年的發展,Linux內核不斷完善,已經能夠支持大部分的主流硬件,同時各大硬件廠商也意識到了Linux操作系統對其產品線的重要性,紛紛針對Linux推出了驅動程序和補丁,使得Linux在硬件驅動上獲得了更廣泛的支持。

            另外,如果你的聲卡、顯卡是非常新的型號,Linux內核暫時無法支持,那也不要緊,RedHat會自動把無法準確識別的硬件模擬成標準硬件來使用,讓硬件一樣可以在Linux發揮作用。

            由于設計Linux時的初衷之一就是用較低的系統配置提供高效率的系統服務,所以安裝Linux并沒有嚴格的系統配置要求,只要Pentium以上的CPU、64MB以上的內存、1GB左右的硬盤空間,就能安裝基本的Linux系統并且能運行各種系統服務。但是如果要順暢地運行X-Window,就需要有足夠的內存,建議128MB以上。

            現在,你可以打消Linux對計算機硬件是否支持的顧慮,放心大膽地安裝了吧。
           2.確認安裝方式

            RedHat Linux9.0采用了穩定的內核Linux Kernel 2.4.20,配合GCC 3.2.1,以及GNU libc 2.3.2。這些最新的特性能夠保證整個系統的優越表現。

           ?。?)從光盤安裝

            最簡單,最方便的安裝方法當然是從CD安裝,你可以享受最人性化的,類似于Windows的安裝。你只要將計算機設置成光驅引導,把安裝CD1放入光驅,重新引導系統,在安裝界面中直接按回車,即進入圖形化安裝界面(圖1)。



          圖 1

            由圖可見,在提供“豪華”的圖形化GUI安裝界面的同時,REDHAT Linux 9.0仍然保留了以往版本中的字符模式安裝界面,這對于追求安裝速度與效率的用戶一直是很有吸引力的。因為許多用戶是將RedHat 9安裝成服務器來使用的,不需要X-Window以及GUI安裝界面。

            RedHat 9的安裝步驟中比以往多了一個環節,那就是對安裝光盤介質的檢測。它允許在開始安裝過程前對安裝光盤介質進行內容校驗,以防止在安裝的中途由于光盤無法讀取或是內容錯誤造成意外的安裝中斷,導致前功盡棄。

            REDHAT Linux 9.0如果完全安裝將達到7張光盤,安裝時間長達幾十分鐘。如果因為一張光盤的內容錯誤導致安裝失敗,這將浪費很多安裝時間。所以,建議在安裝之前對光盤進行介質檢測與校驗以保證安裝順利進行。
          (2)從硬盤安裝

            如果沒有安裝光盤,而是從網上直接下載Linux的ISO映像文件,能不能用下載的ISO文件進行安裝而不用刻錄成光盤呢?當然可以!

            從硬盤安裝RedHat Linux 9.0通常需要三個文件①shrike-i386-disc1.iso;②shrike-i386-disc2.iso;③ shrike-i386-disc3.iso。這代表了安裝時需要的三張光盤。由于是映像文件,系統無法直接讀取,所以需要先將ISO里的文件還原。

            這里推薦大家使用Daemon Tool(http://www.linuxeden.com/download/winapps/daemon333.exe)這個Windows下的軟件將ISO文件“解”到硬盤上。比方說shrike-i386-disc1.iso可以解壓縮到C:盤的cd1目錄,shrike-i386-disc2.iso解壓縮到C:盤的cd2目錄,shrike-i386-disc3.iso可以解壓縮到C:盤的cd3目錄待用。

            接下來重新啟動系統進入MS-DOS方式,進入我們剛才解壓出來的C\cd1目錄,里面有個dosutils目錄,執行里面一個名為autoboot.bat的DOS批處理文件,系統就會再次重新啟動,進入Linux的安裝界面。這時安裝程序就會提示你選擇是用光盤安裝還是從硬盤安裝,選擇從硬盤安裝后,系統會提示輸入安裝文件所在的目錄。

            需要注意的是,我們剛解壓縮的ISO文件是在Windows中操作的,如果直接輸入c:\cd1,Linux安裝程序是無法識別的,我們需要將c:\cd1對應到Linux安裝程序能夠識別的格式,因此這里應該輸入的是/dev/hda1/cd1。

            二、正式開始安裝

            你會覺得簡直就和安裝Windows一樣了。

            通過上面的敘述,無論是從光盤安裝,還是從硬盤安裝,我們都可以方便地進入正式的安裝過程。讓我們來看看安裝過程中幾個重要的地方。

            1.選擇系統默認語言

            RedHat支持世界上幾乎所有國家的語言,這里只要在簡體中文前面打上鉤,并將系統默認語言選擇為簡體中文(圖2),那么在安裝過程結束,系統啟動后,整個操作系統的界面都將是簡體中文的了,用戶不用做任何額外的中文化操作和設置。



          圖 2

            2.分區操作

            接下來,是磁盤分區的工作,這也許是整個安裝過程中惟一需要用戶較多干預的步驟,REDHAT Linux 9.0提供了兩種分區方式——自動分區和使用DISK DRUID程序進行手動分區(圖3)。



          圖 3

           ?。?)自動分區:如果是全新的計算機,上面沒有任何操作系統,建議使用“自動分區”功能,它會自動根據磁盤以及內存的大小,分配磁盤空間和SWAP空間。

            這是一個“危險”的功能,因為它會自動刪除原先硬盤上的數據并格式化成為Linux的分區文件系統(EXT3、REISERFS等),所以除非計算機上沒有任何其他操作系統或是沒有任何需要保留的數據,你才可以使用“自動分區”功能。

            (2)手動分區:如果硬盤上有其他操作系統或是需要保留其他分區上的數據,建議采用DISK DRUID程序進行手動分區。DISK DRUID是一個GUI的分區程序,它可以對磁盤的分區進行方便的刪除、添加和修改屬性等操作,它比以前版本中使用的字符界面Fdisk程序的界面更加友好,操作更加直觀。下面我們來看看如何使用DISK DRUID程序對硬盤進行分區。

            因為Linux操作系統需要有自己的文件系統分區,而且Linux的分區和微軟Windows的分區不同,不能共用,所以,需要為Linux單獨開辟一個(或若干個)分區。Linux一般可以采用EXT3分區,這也是REDHAT Linux 9.0默認采用的文件系統。

            為Linux建立文件分區可以有兩種辦法,一種是利用空閑的磁盤空間新建一個Linux分區,另一種是編輯一個現有的分區,使它成為Linux分區。如果沒有空閑的磁盤空間,就需要將現有的分區刪除后,騰出空間,以建立Linux分區。
           DISK DRUID程序中有明顯的新建、刪除、編輯、重設等按鈕。用戶可以直觀地對磁盤進行操作。在使用DISK DRUID對磁盤分區進行操作時,有四個重要的參數需要仔細設定:它們是掛載點、文件系統類型、驅動器、分區大?。▓D4)。



          圖 4

            掛載點:它指定了該分區對應Linux文件系統的哪個目錄,Linux允許將不同的物理磁盤上的分區映射到不同的目錄,這樣可以實現將不同的服務程序放在不同的物理磁盤上,當其中一個物理磁盤損壞時不會影響到其他物理磁盤上的數據。

            文件系統類型:它指定了該分區的文件系統類型,可選項有EXT2、EXT3、REISERFS、JFS、SWAP等。Linux的數據分區創建完畢后,有必要創建一個SWAP分區,它實際上是用硬盤模擬的虛擬內存,當系統內存使用率比較高的時候,內核會自動使用SWAP分區來模擬內存。

            大?。褐阜謪^的大?。ㄒ訫B為單位),Linux 數據分區的大小可以根據用戶的實際情況進行填寫,而SWAP大小根據經驗可以設為物理內存的兩倍,但是當物理內存大于1GB時,SWAP分區可以設置為2GB。

            允許的驅動器:如果計算機上有多個物理磁盤,就可以在這個菜單選項中選中需要進行分區操作的物理磁盤。

            經過磁盤分區的操作,安裝過程中相對最復雜的一個步驟已經過去,接下來的安裝將是一馬平川。讓我們來繼續選擇要安裝的系統組件。
          3.選擇安裝組件

            REDHAT Linux 9.0和先前的版本在安裝組件的選擇上非常相似,用戶既可以選擇桌面計算機、工作站、服務器、最簡化安裝這四個安裝方法中的一個,也可以自己定義需要安裝哪些軟件包,并且安裝程序會實時地估算出需要的磁盤空間,對用戶非常方便。

            系統組件安裝完畢后,安裝程序會自動將用戶選擇的軟件包從光盤介質拷貝到計算機的硬盤上,中途不需人工干預,并且在安裝每個系統組件時都會對該組件做簡短的說明。

            在選擇軟件包時,如果你想進一步配置系統,可以選定制軟件包集合。建議定制,選上KDE桌面環境,這樣你就有兩個可以和WindowsXP媲美的真彩圖標的桌面(圖5)。



          圖 5

            怎么樣,安裝過程很簡單吧?當然,這還不是最后一步,因為在安裝完所有系統組件后,安裝程序還會“體貼”地提醒你制作一張啟動磁盤,以備不測。

            到此為止,Linux系統就已經順利地安裝完成了。
          三、更改啟動方式

            它比Windows更好玩一點。

            作為默認,REDHAT Linux 9.0在啟動時會自動啟動X-Window進入圖形化操作界面。而許多Linux鐵桿玩家已經習慣了在Console字符界面工作,或是有些玩家嫌X-Window啟動太慢,喜歡直觀快速的Console操作。

            1.進入字符界面

            為了在Linux啟動時直接進入Console界面,我們可以編輯/etc/inittab文件。找到id:5:initdefault:這一行,將它改為id:3:initdefault:后重新啟動系統即可。我們看到,簡簡單單地將5改為3,就能實現啟動時進入X-Window圖形操作界面或Console字符界面的轉換,這是因為Linux操作系統有六種不同的運行級(run level),在不同的運行級下,系統有著不同的狀態,這六種運行級分別為:

            0:停機(記住不要把initdefault 設置為0,因為這樣會使Linux無法啟動 )
            1:單用戶模式,就像Win9X下的安全模式。
            2:多用戶,但是沒有 NFS 。
            3:完全多用戶模式,標準的運行級。
            4:一般不用,在一些特殊情況下可以用它來做一些事情。
            5:X11,即進到 X-Window 系統。
            6:重新啟動 (記住不要把initdefault 設置為6,因為這樣會使Linux不斷地重新啟動)。

            其中運行級3就是我們要進入的標準Console字符界面模式。

            2.自由轉換字符界面和X-Window圖形界面

            在了解了啟動自動進入X-Window圖形操作界面和Console字符操作界面的轉換后,也許你會想,這兩種操作界面各有各的好處,我能不能“貪心”一點,同時擁有這兩種操作界面呢?在無所不能的Linux操作系統中,這個要求當然是可以得到滿足的。

            在X-Window圖形操作界面中按“Alt+Ctrl+功能鍵Fnn=1~6”就可以進入Console字符操作界面。這就意味著你可以同時擁有X-Window加上6個Console字符操作界面,這是一件多么令人振奮的事情啊!

            在Console字符操作界面里如何回到剛才的X-Window中呢?很簡單,按“Alt+Ctrl+F7”即可。這時Linux默認打開7個屏幕,編號為tty1~tty7。X-Window啟動后,占用的是tty7號屏幕,tty1~tty6仍為字符界面屏幕。也就是說,用“Alt+Ctrl+Fn”組合鍵即可實現字符界面與X Window界面的快速切換。

            Linux的老用戶們都知道,X-Window是一個非常方便地圖形界面,它能使用戶用鼠標最簡單的進行操作,但是它也有不少缺點:比如啟動和運行速度慢、穩定性不夠、兼容性差、容易崩潰等。但是一旦X-Window系統出了問題,并不會使整個Linux系統的崩潰而導致數據丟失或系統損壞,因為當X-Window由于自身或應用程序而失去響應或崩潰時,我們可以非常方便地退出X-Window進入Console進行故障處理,要做的只是按“Alt+Ctrl+Backspace”鍵,這意味著只要系統沒有失去對鍵盤的響應,X-Window出了任何問題,都可以方便地退出。

          posted @ 2006-05-31 22:54 edsonjava 閱讀(217) | 評論 (0)編輯 收藏
           
          什么是ISO文件

          ISO文件一般以iso為擴展名,是復制光盤上全部信息而形成的鏡像文件,其文件格式為iso9660。
          許多Linux操作系統的安裝包都是以ISO文件的形式發布的。在得到相應的ISO文件后,可以將其內容燒錄到光盤上。這樣做出來的光盤與購買的安裝光盤基本上是相同的。用這個光盤啟動計算機,就可以安裝Linux操作系統了。
          本章所討論的是硬盤安裝法,是不需要燒錄光盤的。但我們需要讀取ISO文件中的信息。

          Linux下操作ISO文件

          在Linux下,以root身份執行以下格式的命令就可以從/path目錄中讀到xxx.iso這個文件中的內容。
          實際使用時,應該根據實際情況修改/path和xxx.iso。
          mount -t iso9660 -o loop xxx.iso /path
          如果想制作ISO文件,把光盤放到光驅中,然后執行如下的拷貝命令就可以把光盤上的內容拷貝到一個ISO文件中去。實際使用時,應該根據實際情況修改xxx.iso。
          cp /dev/cdrom xxx.iso


          Windows下操作ISO文件

          在windows下,一般需要專用工具軟件才能操作ISO文件。比如WinISO、WinImage、Dameon Tools
          等。
          如果僅僅是想讀取ISO文件中的內容,則可以用WinRAR。WinRAR3.0以上版本都支持iso9660文件
          格式。用WinRAR打開ISO文件,選中需要的內容,將其解壓出來就可以了。

          Linux操作系統安裝盤的ISO文件

          紅旗Linux4.1桌面版的iso安裝文件在Linux環境下掛裝到/mnt/iso目錄后看到的內容。
          如果把這個iso文件刻成光盤,那么看到的光盤內容也是這個樣子。
          值得注意的有兩個目錄。一個是images,在這個目錄里包含了一些1.44MB軟盤的鏡像文件,其中bootdisk.img可以用來制作安裝用啟動軟盤;另一個是dosutils,其中包含了一些DOS工具,比如rawrite.exe,用這個軟件可以把軟盤的鏡像文件寫到軟盤里。
          Linux啟動安裝法

          這種方法需要制作一張Linux啟動盤。
          先把iso文件中images文件夾里的bootdisk.img讀出來單獨存儲到硬盤上。
          如果是在Linux下,就把軟盤插入軟驅,然后執行下面的命令把bootdisk.img寫入軟盤:
          dd if=bootdisk.img of=/dev/fd0如果是在DOS/WINDOWS下,則還要把iso文件中dosutils文件夾里的rawrite.exe讀出來并與 bootdisk.img保存在同一個目錄下。然后在DOS提示符下執行rawrite,按提示插入軟盤,將bootdisk.img寫入軟盤。
          做好Linux啟動盤后,用它引導啟動計算機。當提示詢問何種安裝方式時,選擇硬盤安裝
          方式(Hard Drive),并提供正確的iso文件位置信息,就能啟動iso文件中的安裝程序了。
          按照安裝程序的提示,就可以完成安裝了。
          在安裝程序的引導下安裝參見“啟動虛擬主機安裝Linux”。
          posted @ 2006-05-31 22:51 edsonjava 閱讀(342) | 評論 (0)編輯 收藏
           
          輕松玩轉VMware虛擬機(3)

          應用以及技巧

          在設置完和安裝完虛擬機之后,我們需要開始考慮如何發揮其最大的作用。在筆者的使用過程中,發現對于一些初學者和玩家而言,極為有用和有趣的用途:

          1.使用虛擬機虛擬老操作系統,在虛擬的系統中玩老游戲

          這個作用也是朋友們使用最多的功能。由于最新的Windows XP操作系統已經完全取消了DOS,所以不少喜歡懷舊的朋友想要在新機器上運行老游戲的話,安裝一個DOS系統是必不可少的??墒菫榱艘粋€老游戲重新格式化安裝系統的話,好像有些得不償失,所以在此時,虛擬機就派上了用處。你只需要打開虛擬機,放入光盤或者軟盤,簡單設置和安裝即可得到一個新的操作系統,這個虛擬的操作系統和你在物理機器上安裝的操作系統是一摸一樣的,你可以方便快捷地使用這個操作系統進行游戲。

          2.使用虛擬機學習和體驗新的操作系統和新技術

          拋開發燒友和游戲來說,使用虛擬機的還有很大一部分用戶都是需要采用虛擬機來模擬非當前操作系統或者比較復雜的網絡環境,通過在虛擬的操作系統環境中進行操作,熟悉操作和新技術,來達到事半功倍的目的。VMware只是一個軟件,可以幫助你在一個操作系統的環境下安裝另一個操作系統,所以在安裝操作系統之前,仍然需要對硬盤進行分區和格式化的操作。正因為此,我覺得虛擬機最好玩的地方在于,對于一個新手來說,這個東西可以讓你學習如何對硬盤分區,并設置活動分區,然后格式化,然后裝系統。像一些直接操作硬盤尤其是分區表和fat的軟件,也可以用虛擬機來學習應用,這樣不會對硬盤有什么大的傷害。同時由于VMware虛擬機軟件允許同時裝多個虛擬機,譬如說,主機的操作系統是Windows 2000,這樣你可以再裝一個Windows 98或Windows 2000,甚至Linux,這樣就可以在Windows的環境下,一邊用QQ,一邊學習Linux了。

          3.使用虛擬機來測試操作系統ISO文件

          可能不少朋友都會覺得這個想法很奇怪,難道檢測ISO文件不能使用別的辦法而非要使用虛擬機嗎?其實檢測操作系統ISO的文件最簡單的辦法的確是使用VMware軟件,因為如果想要檢測該ISO文件的話,您需要把ISO文件刻盤,然后重新安裝才能了解到刻出來的盤是否真的成功,程序文件是否完全,有無丟失,而當你使用了虛擬機軟件之后,麻煩就少了許多,你現在完全可以使用虛擬機軟件來檢測ISO文件的好壞。首先使用VMware創建一個新的虛擬機,選擇"Custom"然后選擇"Windows XP Professional"作為操作系統。如果愿意,你可以編輯一下虛擬機的名稱和保存位置。你也可以重新調整一下分配給虛擬機的內存大小,接著設置你的網絡連接,這里我建議你選擇"Do not use a network connection"因為它和我的網絡連接有沖突,而且在這個測試中也沒必要使用網絡。選擇"Create a new virtual disk",然后如果愿意你也可以重設一下虛擬機磁盤的大小,默認的大小就是可以使用的最大值。如果你僅僅是為了測試,用不了4GB,那么磁盤文件就不會占據4GB的空間,但如果虛擬機使用超過了4GB,軟件會自動分配給虛擬機更多的磁盤空間。如果你想要測試OEM預安裝模式,并且要使用6GB左右的空間,那么你最好在這里就調整得大一些。完成后,選擇"Edit virtual machine settings",選中光驅,然后選擇"Use ISO Image",選中你的ISO文件,點擊“確定”,然后啟動虛擬機,安裝過程就開始了。等到安裝結束后,你就得知這個刻錄的ISO文件是否文件齊全,是否有錯誤了。

          4.使用VMware虛擬機截圖

          可能很多朋友都不會想到這一點,但是這個好玩的做法的確存在。相信大家都看到過微軟操作系統藍屏的照片或者圖片,大家在笑過之后是否會疑惑如果系統藍屏了那我們該如何截圖呢?如果有數碼相機的話,很簡單,只需要拍照就可以了。但是沒有數碼相機呢?那你就需要使用到VMware虛擬機了,所以大家見到的很多操作系統藍屏和BIOS設置的圖片都是使用VMware虛擬機截出來的圖片。這下大家應該不再迷惑了,知道了那些圖片是如何而來的了。

          其實VMware虛擬機還有更多更有趣的玩法,這些都需要大家去慢慢摸索,筆者在這里介紹的也只是VMware虛擬機用途的冰山之一角,更多的好玩之處大家慢慢琢磨,相信大家會發現其擁有更多好玩和實用的功能。在這里筆者還要大家注意的就是VMware虛擬機軟件的運行需要大量的資源,尤其是內存,不然會明顯地感到機器很慢,機器一定要在256M內存以上才可安裝使用,在這里也希望大家能快速上手。一臺電腦裝幾十個系統?不是不可能嘛!

          posted @ 2006-05-31 22:22 edsonjava 閱讀(545) | 評論 (0)編輯 收藏
           
          輕松玩轉VMware虛擬機(2)

          建立一個虛擬系統

          雙擊桌面的“VMware”圖標,即可進入VMware的主窗口,點擊右側的New Virtual Machine即可新建一個虛擬系統,之后選擇Typical,再選擇一種要安裝的操作系統(如圖2、圖3)。

          ?

          現在選擇你建立的虛擬系統,點擊上方工具欄中的POWER ON鍵便可開機了(如圖4)。

          其他按鈕分別是POWER OFF:關機。Suspend:掛起,可以讓虛擬機記錄下當前虛擬系統的狀態,下次可以用Resume重新恢復選擇掛起時的運行狀態,以便接著工作。Reset:重啟,相當于物理計算機的RESET按鈕。Full Screen:全屏,將虛擬機全屏顯示。現在一臺和真實計算機一樣的機器已經建起來了,點擊虛擬機的窗口,你的鼠標就融入虛擬系統了,你可以和使用一臺真的計算機一樣使用它了,而且任何設置都不會影響到你本機。如果想回到主機系統,則可以按Ctrl+Alt使鼠標回到主機系統。不要在虛擬機中使用Ctrl+Alt+Del組合鍵,因為主機系統同樣也會對這個組合鍵做出反應,你應當使用Ctrl+Alt+Ins來代替。

          虛擬機的啟動過程和你的PC的啟動過程也是沒有什么不同的,一開始是自檢,這時按F2可以進入BIOS設置。每一臺虛擬機都有它自己的BIOS。

          請到BIOS中去設置啟動順序(這里的BIOS當然是虛擬機中的BIOS)。之后便可使用光盤來啟動安裝(虛擬機可以用光盤鏡像如:ISO、vcd文件作為光盤。比如從網上下載的Linux ISO文件,不需刻盤,可直接安裝。軟驅同理)。在光盤啟動后要選擇Text mode。實際上你即便是選擇圖形模式,安裝程序檢測后還是會跳到Text mode。而有時在檢測的過程中會死機。在安裝其他版本的Linux就沒有這種情況。安裝的時間可能比在一臺單獨的PC上安裝的時間要略長。

          你會發現在虛擬機中的設備和你實際的設備完全不一樣,VMware為了保證系統的兼容性和穩定性,把現有的設備都虛擬成了最標準的、兼容性最好的設備。由于實際驅動設備的程序仍是在本機系統上運行的驅動程序,實際上的效率并沒有多少降低。所以不要試圖按照自己的機器配置系統。除此之外,在虛擬機中不用也不能安裝任何驅動程序。(未完待續)

          ?

          posted @ 2006-05-31 22:21 edsonjava 閱讀(243) | 評論 (0)編輯 收藏
           
          輕松玩轉VMware虛擬機(1)

          ??? 筆者的一個朋友是個游戲狂人,他能夠在Windows XP操作系統下裝DOS玩DOS版的《紅色警戒》、《三國志》和《大富翁》等游戲,甚至還為了一個日文的老游戲而裝了日文版的DOS,他在電腦里安裝了多個操作系統,甚至還使用了多重啟動的管理軟件來管理這些操作系統。其實不用這么麻煩,在一個操作系統平臺上安裝另外幾個操作系統實在是太簡單了。

          ??? 如果你厭倦了Windows,想嘗試一下Linux,卻害怕Linux的重新分區;也許你喜歡試一試各種軟件,卻討厭重裝系統;也許你已經安裝了多個操作系統,可是當你需要切換操作系統的時候只能重新啟動;也許你是個懷舊的游戲玩家,經常為操作系統不支持某游戲而惱火……那你一定要用VMware虛擬機,一切都會變得簡單易行。

          ??? VMware是VMware公司出品的一個多系統安裝軟件。利用它,你可以在一臺電腦上將硬盤和內存的一部分拿出來虛擬出若干臺機器,每臺機器可以運行單獨的操作系統而互不干擾,這些“新”機器各自擁有自己獨立的CMOS、硬盤和操作系統,你可以像使用普通機器一樣對它們進行分區、格式化、安裝系統和應用軟件等操作,還可以將這幾個操作系統聯成一個網絡。在虛擬系統崩潰之后可直接刪除不影響本機系統,同樣本機系統崩潰后也不影響虛擬系統,可以下次重裝后再加入以前做的虛擬系統。同時它也是唯一的能在Windows和Linux主機平臺上運行的虛擬計算機軟件。VMware虛擬機軟件不需要重開機,就能在同一臺電腦使用好幾個OS,不但方便,而且安全。

          ??? [點擊下載VMware] http://software.pchome.net/system/sysenhance/4673.html

          ??? 安裝虛擬平臺

          ??? 在安裝上沒必要作過多的介紹,請大家注意的是VMware只能安裝在WinNT/2000/XP或Linux,以及FreeBSD下。裝好之后,你可以發現你多了兩塊名為VMware Virtual Ethernet Adapter (basic host-only support for VMnet1)和VMware Virtual Ethernet Adapter (Network Address Translation (NAT) for VMnet8)的虛擬網卡,這也是VMware的特色所在,因為在VMware下你可以使用虛擬網卡進行聯網設置及其試驗(如圖1)。

          posted @ 2006-05-31 22:19 edsonjava 閱讀(184) | 評論 (0)編輯 收藏
           


          網上有很多很多用js對表格進行排序的例子,比如說http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndude/html/dude07232001.asp
          這個是微軟的3個表格操作的例子,都做成了htc組件了
          但是有個問題就是在mozilla等非IE瀏覽器下面都不能實現效果
          于是去網上找了個例子,是可以進行在大部分瀏覽器下的排序的,可惜沒有微軟自己做的那么好,比如 顯示目前是以何例何方式在排序的信息,對于此我特意改寫了一下js代碼,特意給出代碼
          注意是html和js混合的,沒有分開,需要的可以自己分開來
          經過我測試,效果良好:-)并且代碼簡潔易懂
          以下是我改版國外的js后的代碼
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "<!--************************************************************************-->
          <!--* Copyright 2002 by Mike Hall????????????????????????????????????????? *-->
          <!--* Please see
          http://www.brainjar.com for terms of use.???????????????? *-->
          <!--************************************************************************-->
          <html xmlns="<head>
          <title>BrainJar.com: Table Sort</title>
          <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
          <link href="/common/article.css" rel="stylesheet" type="text/css" />

          <script type="text/javascript">//<![CDATA[
          var blankImg="blank.gif";
          var downImg="down.gif";
          var upImg="up.gif";
          var imgElsrc=new Array();

          function setImg(obj,col)
          {
          ?for(var i=0;i<imgElsrc.length;i++)
          ?{
          ??var imgTemp = document.getElementById("img"+i);
          ??if(i!=col)
          ??{
          ???imgTemp.src=blankImg;
          ??}else
          ??{
          ???if (obj.reverseSort[col])
          ???imgElsrc[col] = downImg;
          ???else
          ???imgElsrc[col] = upImg;
          ???
          ???imgTemp.src=imgElsrc[col];
          ??}
          ?}/*alert(imgElsrc.length)*/
          }
          function sortTable2(col) {

          ? // Get the table section to sort.
          ? var tblEl = document.getElementById("planetData2");
          ? // Set up an array of reverse sort flags, if not done already.
          ? if (tblEl.reverseSort == null)
          ??? tblEl.reverseSort = new Array();

          ? // If this column was the last one sorted, reverse its sort direction.
          ? if (col == tblEl.lastColumn)
          ??? tblEl.reverseSort[col] = !tblEl.reverseSort[col];

          ? // Remember this column as the last one sorted.
          ? tblEl.lastColumn = col;

          ? //初始化圖片的數組
          ? colLength=tblEl.rows[0].cells.length;
          ?if (imgElsrc.length<colLength)
          ?{
          ?imgElsrc=new Array(colLength);
          ?}
          ? // Set Image
          ??setImg(tblEl,col);

          ? // Set the table display style to "none" - necessary for Netscape 6
          ? // browsers.
          ? var oldDsply = tblEl.style.display;
          ? tblEl.style.display = "none";

          ? // Sort the rows based on the content of the specified column using a
          ? // selection sort.

          ? var tmpEl;
          ? var i, j;
          ? var minVal, minIdx;
          ? var testVal;
          ? var cmp;

          ? for (i = 0; i < tblEl.rows.length - 1; i++) {

          ??? // Assume the current row has the minimum value.
          ??? minIdx = i;
          ??? minVal = getTextValue(tblEl.rows[i].cells[col]);

          ??? // Search the rows that follow the current one for a smaller value.
          ??? for (j = i + 1; j < tblEl.rows.length; j++) {
          ????? testVal = getTextValue(tblEl.rows[j].cells[col]);
          ????? cmp = compareValues(minVal, testVal);
          ????? // Reverse order?
          ????? if (tblEl.reverseSort[col])
          ??????? cmp = -cmp;
          ????? // If this row has a smaller value than the current minimum, remember its
          ????? // position and update the current minimum value.
          ????? if (cmp > 0) {
          ??????? minIdx = j;
          ??????? minVal = testVal;
          ????? }
          ??? }

          ??? // By now, we have the row with the smallest value. Remove it from the
          ??? // table and insert it before the current row.
          ??? if (minIdx > i) {
          ????? tmpEl = tblEl.removeChild(tblEl.rows[minIdx]);
          ????? tblEl.insertBefore(tmpEl, tblEl.rows[i]);
          ??? }
          ? }

          ? // Restore the table's display style.
          ? tblEl.style.display = oldDsply;

          ? return false;
          }

          //-----------------------------------------------------------------------------
          // Functions to get and compare values during a sort.
          //-----------------------------------------------------------------------------

          // This code is necessary for browsers that don't reflect the DOM constants
          // (like IE).
          if (document.ELEMENT_NODE == null) {
          ? document.ELEMENT_NODE = 1;
          ? document.TEXT_NODE = 3;
          }

          function getTextValue(el) {

          ? var i;
          ? var s;

          ? // Find and concatenate the values of all text nodes contained within the
          ? // element.
          ? s = "";
          ? for (i = 0; i < el.childNodes.length; i++)
          ??? if (el.childNodes[i].nodeType == document.TEXT_NODE)
          ????? s += el.childNodes[i].nodeValue;
          ??? else if (el.childNodes[i].nodeType == document.ELEMENT_NODE &&
          ???????????? el.childNodes[i].tagName == "BR")
          ????? s += " ";
          ??? else
          ????? // Use recursion to get text within sub-elements.
          ????? s += getTextValue(el.childNodes[i]);

          ? return normalizeString(s);
          }

          function compareValues(v1, v2) {

          ? var f1, f2;

          ? // If the values are numeric, convert them to floats.

          ? f1 = parseFloat(v1);
          ? f2 = parseFloat(v2);
          ? if (!isNaN(f1) && !isNaN(f2)) {
          ??? v1 = f1;
          ??? v2 = f2;
          ? }

          ? // Compare the two values.
          ? if (v1 == v2)
          ??? return 0;
          ? if (v1 > v2)
          ??? return 1
          ? return -1;
          }

          // Regular expressions for normalizing white space.
          var whtSpEnds = new RegExp("^\\s*|\\s*$", "g");
          var whtSpMult = new RegExp("
          \\s\\s+", "g");

          function normalizeString(s) {

          ? s = s.replace(whtSpMult, " ");? // Collapse any multiple whites space.
          ? s = s.replace(whtSpEnds, "");?? // Remove leading or trailing white space.

          ? return s;
          }

          //]]></script>
          </head>
          <body>

          <div id="main">


          <p>Let's try it out. Here's another table with the same planet data. But this
          one uses the modified version of <code>sortTable().</code></p>

          <table border="1">
          ? <caption style="caption-side:bottom;">The Planets</caption>
          ? <thead>
          ??? <tr style="vertical-align:bottom">
          ????? <th style="text-align:left"? ><a href="" onclick="return sortTable2(0)">Name</a><image id="img0" src="blank.gif"></th>
          ????? <th style="text-align:center"><a href="" onclick="return sortTable2(1)">Diameter (mi.)</a><image id="img1" src="blank.gif"></th>
          ????? <th style="text-align:center"><a href="" onclick="return sortTable2(2)">Distance<br />(mi. x 1000000)</a><image id="img2" src="blank.gif"></th>
          ????? <th style="text-align:center"><a href="" onclick="return sortTable2(3)">Rotation (hrs.)</a><image id="img3" src="blank.gif"></th>
          ????? <th style="text-align:center"><a href="" onclick="return sortTable2(4)">Period (days)</a><image id="img4" src="blank.gif"></th>
          ??? </tr>
          ? </thead>
          ? <tbody id="planetData2">
          ??? <tr>
          ????? <td style="text-align:left">Mercury</td>
          ????? <td style="text-align:right">3032</td>
          ????? <td style="text-align:right">36.0</td>
          ????? <td style="text-align:right">1407.6</td>
          ????? <td style="text-align:right">88</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Venus</td>
          ????? <td style="text-align:right">7521</td>
          ????? <td style="text-align:right">67.2</td>
          ????? <td style="text-align:right">5832.5</td>
          ????? <td style="text-align:right">225</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Earth</td>
          ????? <td style="text-align:right">7926</td>
          ????? <td style="text-align:right">93.0</td>
          ????? <td style="text-align:right">23.9</td>
          ????? <td style="text-align:right">365</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Mars</td>
          ????? <td style="text-align:right">4222</td>
          ????? <td style="text-align:right">141.6</td>
          ????? <td style="text-align:right">24.6</td>
          ????? <td style="text-align:right">687</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Jupiter</td>
          ????? <td style="text-align:right">88846</td>
          ????? <td style="text-align:right">483.8</td>
          ????? <td style="text-align:right">9.9</td>
          ????? <td style="text-align:right">4331</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Saturn</td>
          ????? <td style="text-align:right">74897</td>
          ????? <td style="text-align:right">890.8</td>
          ????? <td style="text-align:right">10.7</td>
          ????? <td style="text-align:right">10747</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Uranus</td>
          ????? <td style="text-align:right">31763</td>
          ????? <td style="text-align:right">1784.8</td>
          ????? <td style="text-align:right">17.2</td>
          ????? <td style="text-align:right">30589</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Neptune</td>
          ????? <td style="text-align:right">30775</td>
          ????? <td style="text-align:right">2793.1</td>
          ????? <td style="text-align:right">16.1</td>
          ????? <td style="text-align:right">59800</td>
          ??? </tr>
          ??? <tr>
          ????? <td style="text-align:left">Pluto</td>
          ????? <td style="text-align:right">1485</td>
          ????? <td style="text-align:right">3647.2</td>
          ????? <td style="text-align:right">153.3</td>
          ????? <td style="text-align:right">90588</td>
          ??? </tr>
          ? </tbody>
          </table>

          <p>You can now change the sort direction of each column independently.</p>

          <p>The sort function can be modified in other ways to better accommodate both
          the table data and its presentation. We'll look at some ideas next.</p>

          <p class="footer"><a href="default5.asp">Prev</a>
          |
          <a href="default7.asp">Next</a></p>
          </div>

          </body>
          </html>
          主要增加了圖片顯示狀態的功能,即增加函數setImg

          另外還提供一個非常簡單的js排序函數,但是好像只可以在IE下使用,代碼如下
          /*表格排序是對表格而言的,與表格的生成無關。就是說,無論用何種方式產生的表格排序時都一樣。這是排序函數,很簡單。
          分升序和降序,要求傳入參數:obj 表格名或id; n 排序列,第一列為0*/
          function table_sort_asc(obj,n) {
          ? var i,j;
          ? var tab = eval("document.all."+obj);
          ? if(tab.tagName != "TABLE") return;
          ? for(i=0;i<tab.rows.length-1;i++)
          ?for(j=i+1;j<tab.rows.length;j++)
          ??if(tab.rows[i].cells[n].innerHTML > tab.rows[j].cells[n].innerHTML)
          ???tab.rows[i].swapNode(tab.rows[j]);
          }

          function table_sort_desc(obj,n) {
          ? var i,j;
          ? var tab = eval("document.all."+obj);
          ? if(tab.tagName != "TABLE") return;
          ? for(i=0;i<tab.rows.length-1;i++)
          ?for(j=i+1;j<tab.rows.length;j++)
          ??if(tab.rows[i].cells[n].innerHTML < tab.rows[j].cells[n].innerHTML)
          ???tab.rows[i].swapNode(tab.rows[j]);
          }

          除了用js來進行排序外,還可以用xml+xslt進行排序,但是還是有瀏覽器不兼容的問題,比較麻煩,我搜集了一些網上常用的表格排序的例子,現在放在網站上,提供下載

          posted @ 2006-05-30 17:55 edsonjava 閱讀(1015) | 評論 (0)編輯 收藏
           

          Fun with Tables

          Dave Massy
          Microsoft Corporation

          July 24, 2001

          Ever find yourself staring at a table of statistical data, straining to fathom its full implications? If so, you're not alone. A static table of data displayed on the screen doesn't always lend itself to ready comprehension. There are, however, some cool, dynamic behaviors you can apply to standard HTML tables that will allow your users to see the data in a variety of ways. These behaviors not only add interest, they can help considerably in reading and comparing data in a table. This month we'll take a look at these behaviors, and how you can use them to make your tables communicate—dynamically.

          Before we look at these behaviors in detail, let's recall what a behavior is and the benefits it can bring to a DHTML page. The best way to think of a behavior is as a reusable DHTML component. There are two types of behavior: attached behaviors and element behaviors. Attached behaviors were introduced in Microsoft? Internet Explorer 5.0 and can be attached to any element in the HTML document using cascading style sheets (CSS) to add to the functionality of that element. Element behaviors were introduced in Internet Explorer 5.5, and take the concept further with the ability to implement your own custom elements for use in an HTML Document. For more information, see DHTML Behaviors.

          The behaviors we'll look at in this article are all attached behaviors, so they will work in Internet Explorer 5.0 or later, and are implemented as HTML components, often referred to as HTC files. Because they are implemented as HTC files, they can be deployed on a server alongside the HTML files that use them, without any installation on the client machine. We will look at three behaviors: a highlighter, a sort function, and a column drag behavior. All three are written as HTML Component (HTC) files and therefore require no additional installation. They simply need to be placed on the server along with the HTML files. The files are published here, so you can take a close look at how they work (in any text editor), and modify them if you wish to change or add new functionality.

          Note???These behaviors will work in Microsoft Internet Explorer for Windows version 5.0 or later. Because they are attached behaviors, when viewed in other browsers, users will see the original table displayed as it was authored, without the added dynamic functionality.

          Highlighter

          The first behavior we'll look at is the highlighter.

          View the code.

          View the sample.

          First, run the qualhl.htm file and you'll see a standard table of data. Now mouse over some of the rows of data; the rows highlight, visually aligning the data on one row. Now click on the row; the clicked row remains highlighted in a different color.

          Utilizing this behavior is simple. Here's the relevant code from the HTML file:

          <TABLE style="behavior:url(tablehl.htc);" slcolor='#FFFFCC' hlcolor='#BEC5DE' >
          

          The table tag includes a style that attaches the behavior by pointing to the tablehl.htc file, which adds the highlighting functionality. The behavior takes note of two attributes: the hlcolor, which defines the color of the mouseover highlighting, and the slcolor, which defines the color of the row selected by the mouse click. There is also an event that fires on the table called onrowselect when the mouse is clicked on a particular row. You can handle the event in your own script on the page if you wish.

          I won't go into the details of how the behavior itself works, but if you take a look at the .htc file in any text editor, you can see that it changes the background color of the rows of the table appropriately through the use of runtimeStyle, and exposes the properties at the top of the file.

          Sorter

          The sorter behavior does something a little more interesting, as it allows sorting to take place on the head of the table, based on the column contents.

          View the code.

          View the sample.

          By running the qualsort.htm, you can see that with this behavior attached to the table, clicking any column head in the table results in the content sorting accordingly. Attaching this behavior to the table is equally simple:

          <TABLE style="behavior:url(sort.htc);" >
          

          It does require that the table be well formed using THEAD to define the column head, and TBODY to contain the rest of the table data.

          The behavior itself enacts a simple sort algorithm, but uses the DHTML Object Model to adjust the content of the HTML table to the appropriate order when a head is clicked. We also make use of some small image files to indicate at the top of the column the sort key and the direction of the sort.

          This ability to sort data in tables is helpful in making sense of complex sets of statistics.

          Drag

          The third behavior I want to show here for tables is a little more fun.

          View the code.

          View the sample.

          If you open qualdrag.htm, you will find that you can drag any of the heads to another column, thus rearranging the table.

          Once again, attaching this behavior to a standard table that uses a THEAD and a TBODY is easy:

          <TABLE style="behavior:url(sort.htc);" >
          

          The behavior exposes a dragcolor attribute, so the color of the target can be specified.

          Since an HTML table is laid out in row order, and not in column order, the manipulations of the content of the table are a little more complex in this behavior than with the sort functionality.

          Together

          Because these behaviors have been written as separate components, they can be combined on the same table by using the following syntax:

          <TABLE style="behavior:url(dragdrop.htc) url(tablehl.htc) url(sort.htc);" >
          

          View the sample.

          This CSS syntax allows complimentary behaviors to be used on the same tag without separating out different elements. Further, if you are always going to use these behaviors together, we can combine their functionality into one single .htc file.

          View the code.

          View the sample.

          If you open Qual.htm, you will find all three behaviors attached to the table.

          Make Your Own Modifications

          These behaviors, which came from an IE team demonstration, show the power of DHTML and attached behaviors, and are a great example of how you can add functionality to an ordinary HTML page and still have it display fine in older browsers. You are free to make use of these behaviors in your own pages, and I encourage you to make your own modifications as well. If you do make any interesting modifications, let me know at DHTMLDud@Microsoft.com. (Please understand, though, that I can't guarantee a response to every submission).

          ?


          DHTML Dude

          David Massy occasionally wears sun glasses and pretends to be a dude, but when the dark glasses are removed, he works as a technical evangelist on Windows and Internet Explorer technologies, which means he talks to customers of Microsoft about how they might best use the technologies. Before becoming a technical evangelist, Dave worked on the Internet Explorer team as a program manager. Since Dave is originally from England, he is valiantly struggling to educate his American colleagues on how to pronounce tomato correctly.

          posted @ 2006-05-30 17:54 edsonjava 閱讀(256) | 評論 (0)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          主站蜘蛛池模板: 定陶县| 杭锦后旗| 抚州市| 甘孜| 旅游| 东方市| 仙游县| 舞阳县| 明光市| 泸州市| 江北区| 桂平市| 白河县| 云南省| 博乐市| 噶尔县| 绵阳市| 临武县| 滨海县| 乌鲁木齐县| 黑龙江省| 稷山县| 阿图什市| 怀化市| 铁岭县| 宁陕县| 邵阳县| 白沙| 华容县| 石河子市| 东乡县| 万州区| 页游| 揭阳市| 论坛| 惠安县| 定边县| 特克斯县| 健康| 响水县| 同江市|