This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

FreeBSD 2.X 常見問答集

FreeBSD 2.X 常見問答集

FreeBSD 文件計畫

這份文件是 FreeBSD 2.X 的常見問答集。除非有特別加註,否則這些項目目都適 用於 FreeBSD 2.0.5 及以後的版本。如果條目內容中有 <XXX> 則是尚未 完成的部份。如果您對協助本計畫的進行有興趣的話,請寄一封電子郵件到 FreeBSD 文件計畫的 mailing list <freebsd-doc@FreeBSD.org>。 您可以從 FreeBSD World Wide Web server 拿到這份文件的最新版本。您也可以 利用 HTTP 來下載一份龐大的 HTML 文件,或是經由 FreeBSD FTP 站 下載純文字,postscript,或 PDF 版本的檔案。您也可以在這裡使用 搜尋資料 的功能。


Table of Contents
前言
1. 安裝 FreeBSD
2. 硬體的相容性
3. 常見問題解決
4. 商業軟體
5. 一般應用程式
6. 核心設定
7. 系統管理
8. X Window System 及 Virtual Consoles
9. 網路設定
10. PPP
11. Serial 通訊
12. 其它各式各樣的問題
13. 給有心深入研究的 FreeBSD hacker
14. 感謝

前言

歡迎來到 FreeBSD 2.X FAQ!

跟其他 Usenet 上的 FAQ 一樣,這份文件主要涵蓋了有關 FreeBSD 這套作 業系統最常被問到的問題 (當然包括了回答!)。雖然說我們本來的目的是為了 減少網路頻寬的浪費以及避免同樣的問題一再出現,但是 FAQ 已經被視為是一 種很有價值的資訊了。

我們已經儘可能地使這份 FAQ 更豐富了;如果您對如何使其更進步有任何 建議,請隨時寄電子郵件給 FAQ 維護者

Q: 什麼是 FreeBSD?
Q: 發展 FreeBSD 的目的是什麼?
Q: 為什麼要叫做 FreeBSD?
Q: 最新版的 FreeBSD 是那一版?
Q: 什麼是 FreeBSD-current?
Q: 什麼是 FreeBSD-stable?
Q: 新的 FreeBSD 將於什麼時候推出?
Q: FreeBSD 只能在 PC 上使用嗎?
Q: 誰負責 FreeBSD 的發展?
Q: 我要如何取得 FreeBSD?
Q: 我在那裡可以找到有關 FreeBSD mailing lists 的資訊?
Q: 在那裡可以找到 FreeBSD Y2K 的相關資訊?
Q: 有什麼討論 FreeBSD 的新聞討論群組嗎?
Q: 有專門討論 FreeBSD 的 IRC 頻道嗎?
Q: FreeBSD 相關書籍
Q: 我要如何去存取您們的錯誤回報資料庫呢?
Q: 那裡可以找到 PostScript、PDF 或是純文字格式的 FAQ?
Q: 那裡可以找到 ASCII 或是 PostScript 版的使用手冊?
Q: ASCII 版的使用手冊不是純文字檔!
Q: 我想成為 FreeBSD 的 mirror 站臺!
Q: 我想要翻譯文件
Q: 其他資訊來源

Q: 什麼是 FreeBSD?

A: 簡單地來說,FreeBSD 2.X 是一套根據 U.C. Berkeley's 4.4BSD-lite release for the i386 platform 所完成的 UN*X-like 作業系統。它同時也間 接使用了 William Jolitz 移植到 i386 上的 U.C. Berkeley's Net/2,也就是 386BSD。不過現在 386BSD 的程式碼只剩下極少數還留存在 FreeBSD 中。您可 以在 FreeBSD 首頁 找到有關什 麼是 FreeBSD 以及它可以幫您做些什麼的相關資訊。

FreeBSD 已被廣泛地被世界各地的公司行號,ISP,研究人員,電腦專家,學 生,以及家庭用戶所使用,用在工作,教育,以及娛樂上。您可以在 FreeBSD Gallery看到一些有 關他們的資料。

如果想看關於 FreeBSD 更深入的資料,請看 FreeBSD 使用手冊

Q: 發展 FreeBSD 的目的是什麼?

A: FreeBSD 計畫的目的是提供可以任意使用且沒有限制的軟體。我們在程式碼 (以及計晝本身) 上付出了大量心血,雖然我們沒有特別強調,不過並不要求任 何金錢上的回饋。我們相信我們首要的``任務''就是提供程式碼給每一個使用 者,不管他們的目的是什麼;這麼一來,這些程式碼才能被用在最多地方,也 才能發揮它們最大的利益。我們相信這就是自由軟體最基本的目標之一,而且我 們會盡全力去支持它。

在我們 source tree 中有部份的程式碼是採用所謂的 GPL 或是 LGPL 版權 宣告,雖然這些版權宣告是用來保障而非限制使用者的權利,畢竟是不那麼自由 了些。由於這些 GPL 的軟體在商業使用上會引起非常複雜的版權問題,因此只 要有機會,我們會盡量以採用比較鬆的 BSD 版權的軟體來取代這些 GPL 版權宣 告的軟體。

Q: 為什麼要叫做 FreeBSD?

A:

  • 您可以免費使用它,即使是用於商業用途。

  • 整個 FreeBSD 作業系統完整的原始程式都可以免費取得,而且在使用 及散佈各方面也只受到最小的限制 (不論是否用於商業用途)。

  • 任何人都可以自由地把他對系統的改良或錯誤修正的程式碼加入 source tree 之中 (當然要符合幾個先決條件)。



如果讀者您的母語不是英語的話,您要特別注意這裡的``free''兩種用法的 意思是不一樣的:一種的意思是``免費'',另一種的意思是``自由''。您可以拿 FreeBSD 去做任何您想要做的事,除了一些例外,例如您宣稱 FreeBSD 是您寫 的。

Q: 最新版的 FreeBSD 是那一版?

A: 3.3 是目前最新的 stable 版;它於 1999 年 9 月發行。它同時也是目前最新的 release 版。

簡單的說,-stable 的主要訴求對象是對於穩定性及低變異性的需求 遠勝過對最新 -current snapshot 中特別新功能的需求,例如 ISP 或公 司行號的使用者。這兩種 "branch" 都有可能會產生 release 版,但只有當你 能接受 -current 遠比 -stable 容易更動這一點,才應該用 -current

Release 版要每幾個月才會發行一次, 雖然有很多人藉由原始碼來和 FreeBSD 的最新動態同步(見 FreeBSD-currentFreeBSD-stable 的相關問題),但這樣會要某種程度的付出,因為原 始碼是會不斷更動的。

Q: 什麼是 FreeBSD-current?

A: FreeBSD-current 指的是正 在發展中的版本,它終將在適當的時機成為 4.0-RELEASE。它實在是只適合給 系統發展者以及有毅力的業餘愛好者使用。如果想要得到有關如何使用 -current 的深入資訊,請參考 使用手冊相關部份

如果您對作業系統本身並不是很熟悉,或是您沒辦法分辨您遇到的問題是真 的發生了問題亦或是暫時性的小狀況,那麼您就不應該使用 FreeBSD-current。 這個分支的程式碼有時候變動得很快,而且可能會因此而使您有好幾天的時間無 法更新您的系統。我們假設使用 FreeBSD-current 的使用者都有能力去分析他 們所遇到的問題並且只回報真正的問題而非小狀況。如果您在 -current mailing list 中提到類似``make world 造成一些有關 groups 的錯誤''的問題, 有時候會被其他人輕視。

有時候我們會為這些 -current 發展中的程式碼發表 snapshot,更有甚者,我們 還會發表 CDROM 型式的 snapshot。發表這些 snapshot 的目的在於:

  • 測試最新版的安裝程式。

  • 提供一個簡單的方法給那些喜歡使用 -current 但是沒有時間和頻寬去 每天昇級的使用者。

  • 為了替我們發展中的程式保留一個固定的參考點,以防止我們未來造成 不幸。(雖然 CVS 可以正常地防止類似這種的可怕事件 :)

  • 為了確保所有需要測試的新功能都可以得到最多的測試。



無論如何,我們不保證 snapshot 的品質。為了穩定性,您最好使用完全 release 的版本。

您可以直接從 ftp://current.FreeBSD.org/pub/FreeBSD/ 取得 snapshot release,不管是 4.0-current 或是 3.0-stable,平均每天都會產生一個 snapshot 的版本。

Q: 什麼是 FreeBSD-stable?

A: 回溯到 FreeBSD 2.0.5 剛發表的時候,我們決定把 FreeBSD 的 release 分成兩支。一支叫做-stable, 我們只對它做錯誤修正及小幅度的修改 (這是給 ISP 和商業公司等對實驗中功 能不感興趣的單位所使用的)。另外一支叫做 -current,從 2.0 版發行以 後就不間斷地朝著 4.0-RELEASE (以及以後的版本) 前進著。下面就是版本演 進的示意圖:

                 2.0
                  |
                  |
                  |  [2.1-stable]
 *BRANCH*       2.0.5 -> 2.1 -> 2.1.5 -> 2.1.6 -> 2.1.7.1  [2.1-stable ends]
                  |                            (Mar 1997)
                  |
                  |
                  |  [2.2-stable]
 *BRANCH*       2.2.1 -> 2.2.2-RELEASE -> 2.2.5 -> 2.2.6 -> 2.2.7 -> 2.2.8 [end]
                  |       (Mar 1997)    (Oct 97) (Apr 98) (Jul 98) (Dec 98)
                  |
                  |
               3.0-SNAPs  (started Q1 1997)
                  |
                  |
             3.0.0-RELEASE (Oct 1998)
                  |
                  |  [3.0-stable]
 *BRANCH*        3.1  (Feb 1999) -> 3.2 -> ... future 3.x releases ...
                  |               (May 1999)
                  |
                 \|/
                  +
          [4.0-current continues]



-current 這個分支正緩慢地朝向 4.0 以及以後的版本前進著,而之前的 2.2-stable 分支則隨著 2.2.8 的發表而功成身退。3.0-stable 將會成為主要 的發展線,3.3 將會在 1999 年第三季公布,4.0 是目前的 "current 分支", 4.0 的第一次 release 應該會在 2000 年第一季。

Q: 新的 FreeBSD 將於什麼時候推出?

A: 一般而言,當 FreeBSD core team 認為已經累積了足夠多的新功能和錯誤修 正,而且這些更動並不影響系統穩定度的時候,他們才會推出新版的 FreeBSD。 雖然等待這些好東西的時間令人有點沮喪,但是大多數的使用者都認為這種謹慎 的態度是 FreeBSD 最好的部份之一。

平均而言,我們每四個月發行一次 release。

為了滿足那些需要 (或想要) 刺激的使用者,通常 SNAP 的發表是相當頻繁 的,特別是在 release 發表之前一個月左右。

Q: FreeBSD 只能在 PC 上使用嗎?

A: FreeBSD 3.x 目前可以在 DEC Alpha 上使用,就像在 x86 架 構下使用一樣。我們對移植到 SPARC 上也有相當的興趣,不過這部份的計畫還 沒有完全明朗化。

如果您的機器不是以上這些架構,而且您現在就要的話,我們建議您參考 NetBSD 或是 OpenBSD

Q: 誰負責 FreeBSD 的發展?

A: 如果是一些有關 FreeBSD 計畫的關鍵性決定,像是整個計畫的走向或是決 定誰可以改 source tree 裡的程式碼這類的事,是由一個約 15 個人所組成的 core team 來決定。而有 另一群約 150 個 commiters 有權利可以直接修改 FreeBSD 的 source tree。

無論如何,大多數的改變都會事前在 mailing lists 先討論過,而且每個人都可以參與 討論。

Q: 我要如何取得 FreeBSD?

A: 每個 FreeBSD 的重要版本都可以經由匿名 ftp 從 FreeBSD FTP site 取得。

  • 如果是目前的 2.2-stable release,2.2.8R,請看 2.2.8-RELEASE 這個目錄。

  • 如果是目前的 3.0-stable release,3.0-RELEASE,請看 3.0-RELEASE 這個目錄。

  • 隨著 RELENG_2_2 分支 (後來的 2.2.8) 慢慢地進入維護階段,我們每 天都會發行 2.2 Snapshot。我們目前正妥善維護著 RELENG_2_2 這個分支,除非 對系統安全或是系統的可靠性有所增強,否則我們將不再更動。

  • 隨著 RELENG_3 分支 (後來的 3.0-release) 慢慢朝著 3.2-RELEASE 發展,我們也會每天發行 3.0 Snapshot

  • -current 分支每天都會推出 4.0 Snapshot,純粹是為了熱心的測試者以及發展人員所提供的。



FreeBSD 的 CDROM 可以從下列地方取得 :

Walnut Creek CDROM 4041 Pike Lane, Suite F Concord, CA 94520 USA Orders: +1 800 786-9907 Questions: +1 925 674-0783 FAX: +1 925 674-0821 email: WC Orders address WWW: WC Home page

如果您在澳洲,您可以找:

Advanced Multimedia Distributors Factory 1/1 Ovata Drive Tullamarine, Melbourne Victoria Australia Voice: +61 3 9338 6777

CDROM Support BBS 17 Irvine St Peppermint Grove WA 6011 Voice: +61 9 385-3793 Fax: +61 9 385-2360

在英國:

The Public Domain & Shareware Library Winscombe House,Beacon Rd Crowborough Sussex. TN6 1UL Voice: +44 1892 663-298 Fax: +44 1892 667-473

Q: 我在那裡可以找到有關 FreeBSD mailing lists 的資訊?

A: 您可以在 使用手冊 - mailing-lists 中找到完整的資訊。

Q: 在那裡可以找到 FreeBSD Y2K 的相關資訊?

A: 您可以在 FreeBSD Y2K 專欄 取得完整的資訊。

Q: 有什麼討論 FreeBSD 的新聞討論群組嗎?

A: 您可以在 使用手冊 - 新聞討論群組 中找到完整的資訊。

Q: 有專門討論 FreeBSD 的 IRC 頻道嗎?

A: 是的,大部份主要的 IRC 網路主機都提供了 FreeBSD 的聊天頻道:

  • EFNet 所提供的 #FreeBSD 頻道是一個 FreeBSD 的論 壇,但是您可能無法從那邊得到技術方面的支援,您也別想在那邊找到任何 人可以幫您避免掉閱讀 man page 以及自己研究的痛苦。那是一個以聊天為 主的頻道,在那邊聊到 FreeBSD 和聊到性、運動、以及核子武器的機會是 一樣高的。 我們已經警告過您了。 您可以經由 irc.chat.org 來連線。

  • DALNET 所提供的 #FreeBSD 頻道,在美國可以經由 irc.dal.net 來連線,在歐洲可以經由 irc.eu.dal.net 來連線。

  • UNDERNET 所提供的 #FreeBSD 頻道,在美國可以經由 us.undernet.org 來連線,在歐洲可以經由 eu.undernet.org 來連線。

  • 最後,您也可以加入 BSDNET 所提供的 #FreeBSD 頻 道,這是一個小型的 BSD 專用聊天網路,可以經由 irc.FreeBSD.org 來連線。



以上的這些頻道都是不同的,而且它們並沒有互相連通。它們聊天的方式也 不儘相同,所以您可能每個都要去嚐試一下,以找到最適合您的頻道。

Q: FreeBSD 相關書籍

A: 您或許可以試試看 doc mailing list: <freebsd-doc@FreeBSD.org> 上的 FreeBSD 文件計畫 (如果您 能加入這是計畫那是再好不過的了)。這個 mailing list 是用來討論 FreeBSD 文件的。如果您想要發問問題的話,我們也有 questions mailing list: <freebsd-questions@FreeBSD.org>

您也可以從 FreeBSD 使用手冊 取得 FreeBSD``使用手冊''。請注意,這份文件仍處於製作階段,有很多部份都 還沒有完成。

有關 FreeBSD 的書籍中,最好的應該就是 Greg Lehey 著作,Walnut Creek CDROM Books 出版的``The Complete FreeBSD''了。現在這本書已經出到第二版 了,總共 1750 頁左右,內容包括安裝,系統管理指導,程式安裝協助,以及 manual pages。這本書 (以及最新版的 FreeBSD release) 可以向 Walnut Creek CheapBytes,或是任何一間 您喜歡的書局訂購。他的 ISBN 號碼是 1-57176-227-2。

然而,因為 FreeBSD 2.2.X 是以 4.4BSD-Lite2 為基礎來發展的系統,所以 大部份 4.4BSD 的手冊都適用於 FreeBSD 2.2.X。O'Reilly and Associates 出版了下列手冊:

  • 4.4BSD System Manager's Manual By Computer Systems Research Group, UC Berkeley 1st Edition June 1994, 804 pages ISBN: 1-56592-080-5

  • 4.4BSD User's Reference Manual By Computer Systems Research Group, UC Berkeley 1st Edition June 1994, 905 pages ISBN: 1-56592-075-9

  • 4.4BSD User's Supplementary Documents By Computer Systems Research Group, UC Berkeley 1st Edition July 1994, 712 pages ISBN: 1-56592-076-7

  • 4.4BSD Programmer's Reference Manual By Computer Systems Research Group, UC Berkeley 1st Edition June 1994, 886 pages ISBN: 1-56592-078-3

  • 4.4BSD Programmer's Supplementary Documents By Computer Systems Research Group, UC Berkeley 1st Edition July 1994, 596 pages ISBN: 1-56592-079-1



您可以在 WWW 上找到相關介紹:

4.4BSD books description。因為銷售情形並不是很好,所以您可能很 難去取得這些書籍。

如果您想對 4.4BSD 的核心架構有更深層的認識,您絕不能錯過這本書 :

McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and John Quarterman.

The Design and Implementation of the 4.4BSD Operating System. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-54979-4

一本有關系統管理的好書:

Evi Nemeth, Garth Snyder, Scott Seebass & Trent R. Hein, ``Unix System Administration Handbook'', Prentice-Hall, 1995 ISBN: 0-13-151051-7

NOTE 請確認您買到的的確是第二版,它是紅色書皮的,第一版的不是。

這本書涵蓋了一些基礎的東西,包括 TCP/IP,DNS,NFS,SLIP/PPP, sendmail,INN/NNTP,printing,等。這本書蠻貴的 (大約 US$45-$55) ,不過它的確有這個價值。它也附了一片內含一些 工具程式原始碼的 CDROM;大部份的東西在 FreeBSD 2.2.6R 的 CDROM 裡也有 ( 通常 FreeBSD CDROM 裡的是比較新版的) 。

Q: 我要如何去存取您們的錯誤回報資料庫呢?

A: 所有使用者 open 的變更要求都可以經由我們 web 界面的 PR submissionquery 來查詢 (或是回報) 我們的錯誤回報資料庫。send-pr(1) 這個指令也 可以經由電子郵件來回報錯誤或是要求變更。

Q: 那裡可以找到 PostScript、PDF 或是純文字格式的 FAQ?

A: 最新的 FAQ 可以從 FreeBSD 網站或是任何一個 mirror 站臺取得,不論是 PostScript 或是純文字的 (包括 7 bit ASCII 以及 8-bit Latin1) 都有。

PostScript 格式 (大約 150KB):



PDF 格式 (大約 280KB):



純文字格式 (大約 88KB):



Q: 那裡可以找到 ASCII 或是 PostScript 版的使用手冊?

A: 最新的 FAQ 可以從 FreeBSD 網站或是任何一個 mirror 站臺取得,不論是 PostScript 或是純文字的 (包括 7 bit ASCII 以及 8-bit Latin1) 都有。

PostScript 格式 (大約 1.7MB):



ASCII 格式 (大約 1080KB):



ISO 8859-1 格式 (大約 1080KB):



Q: ASCII 版的使用手冊不是純文字檔!

A: 是的,ASCII 和 Latin1 格式的 FAQ 以及使用手冊嚴格來說並不能算是純 文字檔;它們包含了一些印出底線以及重覆列印的控制碼以便能直接由點矩陣 式印表機輸出。如果您想把它們轉成一般的文字檔的話,可以利用 col:

          $ col -b < inputfile > outputfile
      



Q: 我想成為 FreeBSD 的 mirror 站臺!

A: 當然可以!有很多方法可以 mirror 我們的網頁。

  • 利用 CVSUP:您可以利用 CVSUP 從 cvsup.FreeBSD.org 取得格式化 過的檔案。您只需要把下面這行加入您的 cvsup 設定檔:

    www release=current hostname=/home base=/usr/local/etc/cvsup 
    prefix=/usr/local/www/data/www.FreeBSD.org delete old use-rel-suffix



  • 利用 rsync:請參閱 the mirroring page 以獲得更多資訊。

  • 利用 ftp mirror:您可以利用您喜歡的 ftp mirror 工具從 FTP 站 臺中取得網頁資料。就從 ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/www 開始吧。



Q: 我想要翻譯文件

A: 嗯,我們沒能力給您薪水,不過如果您能提供翻譯好的文件的話,我們會送 您 CD 或是 T-shirt,並把您加入使用手冊裡 Contributor 的行列。

Q: 其他資訊來源

A: 下列 newsgroups 中包括了 FreeBSD 相關的討論:



網頁資源:



FreeBSD 使用手冊也有一分很完整的 參考書籍列表,如果您 正想買書的話,這部份值得一看。


Chapter 1. 安裝 FreeBSD

Q: 我該下載哪些檔案以取得 FreeBSD?
Q: 救命!啟動的軟碟 image 檔無法塞到一片單獨的軟碟片裡!
Q: 安裝 FreeBSD 的指令在哪裡?
Q: 要執行 FreeBSD 我還需要什麼?
Q: 我只有 4MB RAM,那我能安裝 FreeBSD 嗎?
Q: 我該怎麼製作自訂的安裝軟碟片?
Q: 我可以在我的 PC 上擁有超過一個以上的作業系統嗎?
Q: Windows 95 可以跟 FreeBSD 並存嗎?
Q: Windows 95 把我的啟動管理員殺掉了!我該怎麼把它救回來?
Q: 我可以在一個有壞軌(bad blocks)的磁碟上進行安裝嗎?
Q: 當我啟動安裝軟碟片時,奇怪的事情發生了!
Q: 救命!我不能從 tape 安裝!
Q: 用一條並聯線(PLIP)連接兩台 FreeBSD。
Q: 我可以在我的膝上型電腦用 PLIP(Parallel Line IP)安裝嗎?
Q: 我該怎麼使用一個磁碟裝置的 geometry?
Q: 當我分割磁碟機時有任何限制嗎﹖
Q: 可以使用磁碟管理程式(disk managers)嗎﹖或是,我有一個巨大的磁碟機!
Q: 當我啟動 FreeBSD,我看到 ``Missing Operating System''
Q: 我看不到 boot manager 的 'F?' 提示號。
Q: 我有 >16MB RAM。這會導致任何問題嗎﹖
Q: 我需要安裝完整的原始程式(sources)嗎﹖
Q: 我需要建立一個核心嗎﹖
Q: 我不是住在美國,那我可以使用 DES 嗎﹖
Q: 啟動軟碟開始讀了可是卻停在``Probing Devices...''螢幕。
Q: 當我安裝好重新啟動系統後,我看到``panic: cant mount root'' 的錯誤訊息。
Q: 記憶體的限制是什麼﹖
Q: ffs 檔案系統的限制是什麼﹖
Q: 我該怎麼在軟碟上放入 1TB 檔案?
Q: 在啟動新的 kernel 時,看到 "archsw.readin.failed" 這個錯誤訊息

Q: 我該下載哪些檔案以取得 FreeBSD?

A: 通常你只需要一張軟碟 image 檔,floppies/boot.flp,把它拷 貝到 1.44MB 軟碟片上然後啟動它,再去下載其他的部份(安裝程序會管 理你的 TCP/IP 連線,以及 tapes,光碟機,軟碟機,DOS 分割區,及 其他只要是安裝過程中需要用到的事物)。

若你只需要自己下載 distributions(可迅速的由 DOS 檔案系統來安裝) ,以下是我們建議你抓來安裝的 distributions:

  • bin/

  • manpages/

  • compat*/

  • doc/

  • src/ssys.*



安裝程序的完整指令,以及更多普遍性安裝時會碰到的問題可以在 Handbook entry on installing FreeBSD.這裡找到。

Q: 救命!啟動的軟碟 image 檔無法塞到一片單獨的軟碟片裡!

A: 一張 3.5 英吋(1.44MB)軟碟片可以容納 1474560 位元組的資料。 啟動的 image 檔就剛好是這個大小。

在準備啟動軟碟片時常見的錯誤有:

  • 使用 FTP 時沒有使用 binary 模式下載軟碟 image。

    某些 FTP client 軟體它們內定的傳輸模式是 ascii 並且試著更改任何的 end-of-line 字元,以符合這個 client 系統 本身的轉換。大部分情形下這必然會毀損啟動 image 檔,檢查一下 你下載的啟動 image 檔大小:如果這不是完全地與 server 端上的大小相同,那麼你的下載程序就有問題。

    解決方法:在你連接上 server 但尚未開始下載映像檔之前, 看到 FTP 命令提示號時打 binary

  • 使用 DOS 的 copy 命令(或等效的 GUI 工具)來把啟 動 image 檔傳送到軟碟片。

    類似像 copy 的程式,在啟動 image 檔被建立並且直接 開機後並沒有功用。映像檔裡有完整的磁碟內容,磁軌對磁軌,這代 表著你無法用磁片上固定的檔案去取代它。 你必須把它傳送到軟碟片的``raw''上,使用低階化工具(像是 fdimagerawrite),這些在 installation guide to FreeBSD裡面多有描述。



Q: 安裝 FreeBSD 的指令在哪裡?

A: 你可以在這裡找到安裝指令。 Handbook entry on installing FreeBSD.

Q: 要執行 FreeBSD 我還需要什麼?

A: 你需要一台 386 或更好的 PC,包含 5MB 或更多的 RAM 以及至少 60MB 的磁碟空間。可以僅使用一個低階的 MDA 圖形卡,如果你要執行 X11R6 ,就需要 VGA 或更好的視訊卡。

另外可參考第二章節: 硬體的相容性

Q: 我只有 4MB RAM,那我能安裝 FreeBSD 嗎?

A: FreeBSD 2.1.7 是最後一個可在 4MB 系統上被安裝的版本。新版的 FreeBSD,像是 2.2,需要至少 5MB 來安裝它在一個全新的系統上。

FreeBSD 的所有版本,包括 3.0,都能在 4MB 的記憶體下執行,不 過安裝時不能只用 4MB。如果你想這樣,你可以在安裝時加入額外的 記憶體,然後等系統可以執行後,換回 4MB。或是你可以把你的磁碟 機切出一個 4MB 以上置換空間,安裝好系統後再把置換空間砍掉。

FreeBSD 2.1.7 也有不能在 4MB 安裝的情形。正確的說,應該是指 不能在基本的 640kB 加上 3MB 延伸記憶體裡安裝。如果你的主機板 可以重新找回在 640kB 到 1MB 範圍中那些``遺失''的記憶體,那麼 或許你還是可以把 FreeBSD 2.1.7 裝起來。

試著進入你的 BIOS 設定選單並找一個``remap''選項,把它打開。 你或許也該把 ROM shadowing 給關掉。

只在安裝時使用 4MB 可能容易一點,建立一個只有你需要的選項的 核心程式,然後就可以只用 4MB。

你也可以安裝 2.0.5 然後再把你的系統用 2.1.7 安裝程式裡 ``upgrade''的選項升級到 2.1.7 版本。

安裝後如果你建立一個自訂的核心,這將會在 4MB 下執行。曾有 人成功的用 2MB 開機(不過系統幾乎不能用 :-))。

Q: 我該怎麼製作自訂的安裝軟碟片?

A: 目前你無法*只*製作一個自訂的安裝軟碟片。你必須做出整個全新的 release 系統,這裡面就包括你的安裝軟碟片。某些在 /usr/src/release/floppies/Makefile 裡的程式碼假設能讓 你*只*做出那些軟碟片,但是事實上還不行。

要做出自訂的 release 版本,請遵循 這裡 的指令。

Q: 我可以在我的 PC 上擁有超過一個以上的作業系統嗎?

A: 請參考 The multi-OS page.

Q: Windows 95 可以跟 FreeBSD 並存嗎?

A: 先安裝 Windows 95,然後再裝 FreeBSD。FreeBSD 的啟動管理員 會接著管理啟動 Win95 和 FreeBSD 的工作。假使你第二個才去裝 Win95,它將會問都不問的粗魯地把你的啟動管理員覆寫過去。假 如這已經發生,請看下一節。

Q: Windows 95 把我的啟動管理員殺掉了!我該怎麼把它救回來?

A: 你可以用以下兩種方法之一來重新安裝 FreeBSD 的啟動管理員:

  • 執行 DOS,進入你的 FreeBSD distributions 的 tools/ 目錄 並找到 bootinst.exe。你可以這樣執行它:

    bootinst.exe boot.bin

    這樣啟動管理員將會再次被安裝。

  • 用 FreeBSD 啟動軟碟片再次開機然後進入 Custom 安裝選單 項目,選擇 Partition,選擇那個包含啟動管理員的磁碟機(大多是 第一個),然後當分割區編輯器(partition editor)出現時,第一件 事(意思就是:不要做任何更改) 先選擇 (W)rite。會出現確認的詢 問,回答 yes,然後當你看到 Boot Manager 的選擇提示時,確定 你選的是"Boot Manager"這項。 這會把啟動管理員重新寫回磁碟裡。跳離安裝選單然後就跟正常情形 一樣重新啟動硬碟。



Q: 我可以在一個有壞軌(bad blocks)的磁碟上進行安裝嗎?

A: FreeBSD 的 bad block (bad144 命令) 處理並非 100% 完全(用圖形化來看),而且很不幸我要告 訴你假如你有一個 IDE 或 ESDI 裝置包含大量的 bad blocks,那麼 FreeBSD 可能不適合你!這表示,對其他大多數的 IDE 系統可能有 用,你可能想在放棄前先嘗試看看。

如果你有一個有 bad blocks 的 SCSI 裝置,請看 這裡的解答

Q: 當我啟動安裝軟碟片時,奇怪的事情發生了!

A: 如果你看到奇怪的事情,像是機器停住了或是當你試著從安裝磁片起 動時突然自動重新開機了,這裡有三個問題你該先問問自己:-

  1. 你是否使用一個新的,剛格式化過,沒有任何錯誤的軟碟片(可 以是一張全新剛拆封的,而非是那種已經你的床下躺了三年,是雜誌贈 送的封面磁片)?

  2. 你是否用 binary 模式下載軟碟映像檔? (不用不好意思,就算是我們之中最好的一個人也曾意外的把 binary 檔用 ASCII 模式下載至少一次!)

  3. 如果你正在使用像是 Windows95 或 Windows NT 這幾種新型的 作業系統,你有沒有把系統關機然後啟動到最原始狀態,只有 DOS? 這些 OS 看起來會阻礙那些直接操作硬體的程式,像是建立磁碟的程式 ,只要在 GUI 環境下的 DOS shell 就會導致這個問題。



也有過報告有關 Netscape 會導致下載啟動軟碟的問題,因此如果你 可以,最好使用別種不同的 FTP client 。

Q: 救命!我不能從 tape 安裝!

A: 如果你從 tape 安裝 2.1.7,你必須用每個 tar blocksize 是 10 (5120 bytes)建立這個 tape。內定的 tar blocksize 是 20(10240 bytes),然而用這種內定大小建立的 tape 無法用來安裝 2.1.7R; 如果你用這種 tapes,你會看到有關資料記錄區大小過大的抱怨訊 息。

Q: 用一條並聯線(PLIP)連接兩台 FreeBSD。

A: 找一條 laplink 線,確定兩邊電腦的核心都支援 lpt 驅動程式。

      $ dmesg | grep lp
      lpt0 at 0x378-0x37f irq 7 on isa
      lpt0: Interrupt-driven port
      lp0: TCP/IP capable interface
      



把 laplink 線插入並聯界面上。

用 root 身分在兩台電腦上設定 lp0 的網路界面參數。舉例,如果 你想用 max 連接 moritz:

                 max <-----> moritz
IP Address    10.0.0.1      10.0.0.2
      



max 端應該這樣開始:

# ifconfig lp0 10.0.0.1 10.0.0.2
     



moritz 則這樣:

# ifconfig lp0 10.0.0.2 10.0.0.1
     



好了!也請你看看 lp(4) 和 lpt(4) 的 manpages。

你也該把這些主機加到 /etc/hosts 裡面。

     127.0.0.1               localhost.my.domain localhost 
     10.0.0.1                max.my.domain max
     10.0.0.2                moritz.my.domain moritz
     



用以下方法檢查是否有正常動作:

on max:

$ ifconfig lp0
lp0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 10.0.0.1 --> 10.0.0.2 netmask 0xff000000 



$ netstat -r
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use     Netif Expire
moritz              max              UH          4   127592       lp0



$ ping -c 4 moritz
PING moritz (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms
64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms

--- moritz ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms



Q: 我可以在我的膝上型電腦用 PLIP(Parallel Line IP)安裝嗎?

A: 用 laplink 並聯線連接兩台電腦以使用這個特性:

            +----------------------------------------+
            |A-name A-End   B-End   Descr.  Port/Bit |
            +----------------------------------------+
            |DATA0  2       15      Data    0/0x01   |
            |-ERROR 15      2               1/0x08   |
            +----------------------------------------+
            |DATA1  3       13      Data    0/0x02   |
            |+SLCT  13      3               1/0x10   |
            +----------------------------------------+
            |DATA2  4       12      Data    0/0x04   |
            |+PE    12      4               1/0x20   |
            +----------------------------------------+
            |DATA3  5       10      Strobe  0/0x08   |
            |-ACK   10      5               1/0x40   |
            +----------------------------------------+
            |DATA4  6       11      Data    0/0x10   |
            |BUSY   11      6               1/0x80   |
            +----------------------------------------+
            |GND    18-25   18-25   GND -            |
            +----------------------------------------+
      



請參考 Mobile Computing 網頁的 這個註解

Q: 我該怎麼使用一個磁碟裝置的 geometry?

A: (一台磁碟的"gromrtry",我們指的是這台磁碟上 cylinders,heads 和 sectors/track 的數目 - 為了方便且稱之為 C/H/S。這是 PC 的 BIOS 用來讀/寫磁碟的依據)。

為了某些理由,這似乎會導致很多困擾。首先,一台 SCSI 裝置的 physical geometry 跟 FreeBSD 在使用的 disk blocks 是完 全無關的。事實上,並沒有所謂"physical geometry"這種東西,這 是指磁碟機上磁區密度的變化 - 製造商要求是"真實的"physical geometry 通常是指,他們所能找出浪費最少空間的 geometry 結果。 對 IDE 磁碟來說,FreeBSD 使用 C/H/S 方式工作,但是所有現在 的磁碟已經在內部參考時把它轉換成 block 了。

另外就是所謂的logical geometry - 這是當 BIOS 問"你的 geometry 是什麼?"的時候,所得到的答案並且把它用來存取磁碟。 當開機時 FreeBSD 使用 BIOS 資料,讓這個正確是相當重要的。另外 ,如果你在同一個磁碟機上有一個以上的作業系統,他們必須都同意 grometry,否則你在開機時會有大問題!

對 SCSI 磁碟機來說,geometry 的使用是依靠啟動控制器來支援 extended translation (這通常稱之為"對>1GB DOS 磁碟機 的支援或"類似的稱呼)。如果不支援,那麼使用 N cylinders,64 heads 和 32 sectors/track,這裡'N'是指磁碟機的 MB 容量。舉例 來說,一個 2GB 的磁碟機應該假設它有 2048 cylinders,64 heads 和 32 sectors/track。

如果它確定 打開的(通常提供這種方法在 MSDOS 下有某些限 制),並且磁碟容量超過 1GB,使用 M cylinders,每個 track 63 sectors (*而非* 64),以及 255 heads,這裡 'M' 是每 MB 的磁碟容量除以 7.844238 (!)。所以我們的這個範例,2G 磁碟機就有 261 cylinders, 每個 track 63 sectors 以及 255 heads。

如果你不確定以上這個,或是 FreeBSD 在安裝過程中要偵測 geometry 的正確性時失敗了,最簡單的解決方法通常是在磁碟上建立一個小的 DOS 分割區。正確的 geometry 應該能被偵測到(而且如果你不想保留它, 你總是可以在分割區編輯器裡把這個 DOS 分割區移除掉,或是把它留下 來,給程式化網路卡使用或隨你高興怎麼用它)。

另外,有一個免費而有用的公用程式叫 ``pfdisk.exe'' 隨著 FreeBSD 散播出來(位於 FreeBSD CDROM 的 tools 子目錄 下或是在大多數的 FreeBSD ftp 站台內可找到),這個程式可用來找 出另一作業系統正在使用磁碟機上的哪塊 geometry。然後你就可以在 分割區編輯器裡面輸入它。

Q: 當我分割磁碟機時有任何限制嗎﹖

A: 是的。你必須確認你的 root 分割區是在 1024 cylinders 之內,讓 BIOS 可以從其中啟動核心。(注意:這是 PC 的 BIOS 功能限制,而不 是 FreeBSD 的)

對 SCSI 裝置來說,這通常暗示著 root 分割區將放在開始的 1024 MB(或是開始的 4096MB,如果 extended translation 是打開的 - 請 參考前一節)。對 IDE 來說,相關的部份是 504MB。

Q: 可以使用磁碟管理程式(disk managers)嗎﹖或是,我有一個巨大的磁碟機!

A: FreeBSD 認識 Ontrack Disk Manager 並且允許使用它,其他的 disk managers 則不在支援之列。

如果你只想在磁碟機上使用 FreeBSD 那麼你根本不需要 disk manager。 只要把磁碟設定成 BIOS 能抓到的最大空間(通常是 504 megabytes),那麼 FreeBSD 應該就可以算出你事實上擁有多少空間。如果你正使用一個 MFM 控制器來控制的老磁碟,你可能需要明白的告訴 FreeBSD 要使用多少個 cylinders。

如果你想在磁碟上使用 FreeBSD 和另一個作業系統,你可能不需要 disk manager:只要確定 FreeBSD 的啟動分割區跟其他作業系統的 slice 都位於開始的 1024 cylinders 內。如果你相當地小心,一個 20 megabytes 的啟動分割區應該就夠了。

Q: 當我啟動 FreeBSD,我看到 ``Missing Operating System''

A: 這是一個典型的情形,當 FreeBSD 與 DOS或其他作業系統在處理磁碟 geometry 上有衝突的時候就會發生。你需要重新安裝 FreeBSD,但是請遵照說明上面所提到的指令應該就可以了。

Q: 我看不到 boot manager 的 'F?' 提示號。

A: 這是前一頁所描述問題的另一個徵兆。你的 BIOS geometry 和 FreeBSD 的 geometry 設定不相同!如果你的控制器或 BIOS 支援 cylinders translation (通常被標示成``>1GB drive support''),試著把這個 設定打開然後重新安裝 FreeBSD。

Q: 我有 >16MB RAM。這會導致任何問題嗎﹖

A: 從效能的角度來看,不會。FreeBSD 2.X 內含 bounce buffers,這允許 你的 bus mastering controller 存取超過 16MB。(注意如果你正使用 ISA 裝置這應該是必需的,儘管一個或兩個更早的 EISA 和 VLB 裝置也 可能需要它)。

也請參考 >64M machines 這節,假如你有這麼多記憶體,或你使用的是 Compaq 或是其他能處理 這麼多有用記憶體的機器。

Q: 我需要安裝完整的原始程式(sources)嗎﹖

A: 通常是不需要。然而,會強烈建議你至少安裝 ``base'' 這個 source kit,這包含數個這裡簡單描述過的檔案,還有 ``sys'' (kernel) source kit,這包含核心程式的 sources。系統裡面不需 要有 sources 才能操作,然而,除了 kernel-configuration 程式 config 以外。缺少核心的 sources,我們的建築架構是設定 成讓你可以從別處如 NFS 來掛上唯獨的原始程式,因此還是可以製 作新的 binaries。(因為 kernel-source 的限制,我們建議你不要 直接把它掛在 /usr/src 下,最好用其他適合的符號性重 複連結到 source tree 的上層架構。

線上擁有 sources 並知道如何建立一個系統,將會讓你在升級今後 FreeBSD 的 releases 版本更容易一點。

要實際的選擇 sources 的一個子集合,在你在系統安裝工具的 Distributions 選單時,使用 Custom 選單項目。src/install.sh script 將會把 sources distribution 的部份安裝進去,主要是看 你傳入哪些參數。

Q: 我需要建立一個核心嗎﹖

A: 建立一個新的核心在 FreeBSD 安裝過程中是絕對必需的一個步驟。 但新版 releases 帶來一個更友善的核心設定工具指令的好處。在 FreeBSD 啟動提示號(boot:)時,使用 "-c" flag 你就會進入一個設 定螢幕,這允許你做常見 ISA 卡的核心設定。

仍然建議你最後建立一個核心,只包含你需要的驅動程式,這是為了 節省一點 RAM,但是對大多數的系統來說這卻不是嚴格的要求。

Q: 我不是住在美國,那我可以使用 DES 嗎﹖

A: 如果對你來說使用 DES 格式的加密技術不是絕對需要的,你可以使 用 FreeBSD 的內定加密技術,有更好 的安全性,並且沒有額外 的限制。FreeBSD 2.0 的密碼現在使用內定的 MD5-based 加以 混合,要用自動破解密碼的程式去破解它,比起 DES 需要使用更多 CPU 強化性以便用自動密碼破解器,它還允許更長的密碼。今日不使 用 MD5-based 加密技術的唯一理由是在 FreeBSD 和非 FreeBSD 系統上使用相同的密碼項目。

因為 DES 加密演算法不能由 US 合法輸出到國外,非 US 使用者不 應該從 US FTP 站台下載這個軟體(secrdist的任一部份)。

然而另外還有個有效的 libcrypt,原始程式基本上由澳洲的 David Burren 寫成。這個程式碼目前在某些非 US FreeBSD mirror 站台上可以找到。這個沒有限制的 libcrypt 原始程式,以及使用它 的 binaries 程式,可以在以下 FTP 站台獲得:

South Africa

ftp://ftp.internat.FreeBSD.org/pub/FreeBSD ftp://storm.sea.uct.ac.za/pub/FreeBSD

Brazil

ftp://ftp.iqm.unicamp.br/pub/FreeBSD

Finland

ftp://nic.funet.fi/pub/unix/FreeBSD/eurocrypt



非 US 的 securedist 可以當限制性 US securedist 的完全替代。這個 securedist package 安裝方法跟 US package 完全一樣(細節請參考安裝須知)。如果你要裝 DES 加密法 你應該儘可能地在安裝其他軟體之前先裝好它,再裝其他軟體。

非 US 使用者請勿從 USA 下載任何加密軟體。這會導致站台的管理 者因為被下載的軟體惹上數個法律性的困難。

一個非 US 的 Kerberos distribution 亦正在發展中,現行版本通 常可由匿名 FTP braae.ru.ac.za 來獲得。

也有一個 mailing list 專門用來討論 非 US 加密軟體。欲獲得更多資訊,寄一封信,在信件內容包含單獨一行訊息說 ``help'' 到以下位址:

.

Q: 啟動軟碟開始讀了可是卻停在``Probing Devices...''螢幕。

A: 如果你安裝了 IDE Zip 或 Jaz 裝置,移除它並重新試一遍。 啟動軟碟片可能會被這些裝置混淆了。當系統安裝好以後你可以再 把它接回來。希望這在之後的 release 版本可以被修正。

Q: 當我安裝好重新啟動系統後,我看到``panic: cant mount root'' 的錯誤訊息。

A: 這個錯誤是因為啟動區塊跟核心程式對磁碟裝置的認知不相同。通常這個 錯誤會出現在雙磁碟的 IDE 系統,硬碟放在 master,或是在分離的 IDE 控制器上只有單一磁碟機,但是 FreeBSD 裝在 secondary IDE 上 。當核心指定第二個磁碟控制器的第一個磁碟機 wd2 時,啟動 block 卻認為系統裝在 wd1(第二個 BIOS 磁碟機)。偵測完裝置後,核心程式 試著把啟動 block 認為的啟動磁碟(wd1) mount 起來,事實上卻是 wd2 ,所以失敗了。

要修正這個問題,以下幾種方法之一都可以解決:

  1. 當 Boot: 提示號出現時,輸入: 1:wd(2,a)kernel 然後按 Enter。如果系統開始了,就執行以下命令:

    echo "1:wd(2,a)kernel" > /boot.config

    讓它變成內定的 boot string。

  2. 把 FreeBSD 磁碟機移到 primary IDE controller,因此硬碟機是 連續的。

  3. Rebuild your kernel, 修改有關 wd 設定的行數:

    controller      wdc0    at isa? port "IO_WD1" bio irq 14 vector wdintr
    disk            wd0     at wdc0 drive 0
    # disk            wd1     at wdc0 drive 1 # comment out this line

    controller      wdc1    at isa? port "IO_WD2" bio irq 15 vector wdintr
    disk            wd1     at wdc1 drive 0 # change from wd2 to wd1
    disk            wd2     at wdc1 drive 1 # change from wd3 to wd2

    安裝新的核心程式。 如果你移動你的磁碟機,並希望把先前的設定恢復,只要把磁碟用預期 的設定置換回來然後重新開機。你的系統應該就能成功的啟動。



Q: 記憶體的限制是什麼﹖

A: 對記憶體來說,(理論上)限制是 4 gigabytes。更多資訊可參考wcarchive 的設定 。 如果您預定在一台機器上安裝這麼多記憶體,您需要更加小心,您可能要使用 ECC 記憶體以減少 9/18 pin 記憶體模組之間的相容性問題。

Q: ffs 檔案系統的限制是什麼﹖

A: 對 ffs filesystems 而言,最大理論值限制在 8 terabytes(2G blocks ),或當使用內定 8K block 大小時,限制是 16TB。還有,軟體限制是 1 terabytes,但如果是經過修改的檔案系統上 4 terabytes 是可能(並 且存在)的。

單一 ffs 檔案的大小最大是趨近 1G blocks(4TB) - 假如 block 大小是 4K。

                           maxfilesize
                ----------------------------------
                2.2.7    3.0
fs block size   -stable  -current  works  should-work
-------------   -------  --------  -----  -----------
4K              4T-1       4T-1    4T-1   4+T
8K              32+G       8T-1    32+G   16T-1
16K             128+G      16T-1   128+G  32T-1
32K             512+G      32T-1   512+G  64T-1
64K             2048+G     64T-1   2048+G 128T-1
     



當 fs block 大小是 4K,triple indirect block 運作並且所有的事情 都應該以表示成使用 triple indirect block 的最大 fs block 來作限 制(近似於 1K^3 + 1K^2 + 1K),但在 fs block 數目上卻有一個(錯誤) 的 1G-1 限制。對 fs block 數目的限制應該是 2G-1。在 fs block 數目接近 2G-1 時有點錯誤,但當 fs block 大小是 4K 時這個 block 數目是不能達到的。

block 大小如果是 8K 或更大,fs block 數目應該限制在 2G-1,但實 際 fs block 數目卻限制在 1G-1,除了在 -stable 時 triple indirect blocks 是無法達到的,所以最多 fs block 數目的限制可以表示成用 double indirect blocks(近似於(blocksize/4)^2 + (blocksize/4)) ,且在 -current 下超過這個限制可能會導致問題產生。使用正確的 2G-1 block 限制的確會導致問題發生。

Q: 我該怎麼在軟碟上放入 1TB 檔案?

A: 我自己就在軟碟片上放好幾個 :-)。檔案的最大容量事實上跟磁碟最大 的容量並沒有密切相關。磁碟的最大容量是 1TB,這是一個檔案大小可 以超過磁碟容量的一個特色。

以下範例會在一個使用整個 32K 空間這樣小的 root partition 磁碟 上建立一個大小是 8T-1 的檔案(3 indirect blocks and 1 data block )。dd 指令需要讓 dd 能在一個大檔案下執行。

ttyv0:bde@alphplex:/tmp/q> cat foo
df .
dd if=/dev/zero of=z bs=1 seek=`echo 2^43 - 2 | bc` count=1
ls -l z
du z
df .
ttyv0:bde@alphplex:/tmp/q> sh foo
Filesystem  1024-blocks     Used    Avail Capacity  Mounted on
/dev/sd0a         64479    27702    31619    47%    /
1+0 records in
1+0 records out
1 bytes transferred in 0.000187 secs (5346 bytes/sec)
-rw-r--r--  1 bde  bin  8796093022207 Sep  7 16:04 z
32 z
Filesystem  1024-blocks     Used    Avail Capacity  Mounted on
/dev/sd0a         64479    27734    31587    47%    /
ttyv0:bde@alphplex:/tmp/q> exit



Bruce Evans, September 1998

Q: 在啟動新的 kernel 時,看到 "archsw.readin.failed" 這個錯誤訊息

A: 在啟動 loader 之前會看到 "|" 這個符號在轉,這時可以按任何鍵中斷,然 後再指定要載入那個 kernel。仔細來說,你已經更新 kernel 的原始碼、也用它 做了新的 kernel,但卻 *沒有重新 make world*。我們不支援這麼做,請先 make world,再更新 kernel。


Chapter 2. 硬體的相容性

Q: FreeBSD 支援哪些硬碟的介面?
Q: FreeBSD 支援哪一些 SCSI 卡?
Q: FreeBSD 支援哪一些 CD-ROM?
Q: FreeBSD 支援 ZIP 嗎?
Q: FreeBSD 有支援 JAZ、EZ 及其他像這一類可以移動的設備嗎?
Q: 有那些 multi-port serial 卡被 FreeBSD 所支援?
Q: 我有一隻 bus mouse。我該如何設定?
Q: 我如何使用 PS/2 mouse 或是 PS/2 keyboard?
Q: 是否有可能在 X Window 之外使用滑鼠呢?
Q: 如何在 text console 裡剪貼?
Q: 我的滑鼠上有滾輪,能不能在 FreeBSD 下使用?
Q: 我能在我的 laptop 上使用滑鼠/軌跡球/touchpad 嗎?
Q: FreeBSD 支援哪些 tape 周邊?
Q: FreeBSD 支援 tape changer 嗎?
Q: FreeBSD 支援哪些音效卡?
Q: es1370 的音效卡用 pcm 驅動程式聽不到聲音?
Q: FreeBSD 支援哪些網路卡?
Q: 我的電腦沒有浮點運算器,這聽起來好像不太好?
Q: 2.X 還支援哪些設備?
Q: FreeBSD 支援電源管理系統嗎?
Q: 在 Micron systems 的主機板上我沒有辦法進入 FreeBSD
Q: 我有一塊新買的 Adaptec 卡,但是 FreeBSD 找不到它。
Q: 我這有一個 PnP 的 modem,但是 FreeBSD 沒找到咧?
Q: 我該如何在 serial console 前看到 boot: 這個提示符號?
Q: 為什麼我的 3Com PCI 網路卡沒有辦法在 Micron 主機板上工作?
Q: FreeBSD 支援 Symmetric Multiproccessing (SMP) 嗎?

Q: FreeBSD 支援哪些硬碟的介面?

A: FreeBSD 支援 EIDE 及 SCSI 週邊 (有著相容的 controller; 請參考下一段),以及使用「Western Digital」介面的週邊 (MEM、 、RLL、ESDI,當然,IDE 也在包括內)。但少數使用專有的 ESDI 的介面無法運作:像是 WD1002/3/6/7 介面等等。

Q: FreeBSD 支援哪一些 SCSI 卡?

A:Handbook 裡有完整的資料。

Q: FreeBSD 支援哪一些 CD-ROM?

A: 首先,任何接在 SCSI 介面上的 CDROM 都有被 FreeBSD 所支援。

其次,下面所列的 CD-ROM 也都有被支援:

  • Mitsumi LU002 (8bit), LU005 (16bit) 及 FX001D (16bit 兩倍速)。

  • Sony CDU 31/33A

  • 接在 Sound Blaster 上非 SCSI 介面的 CD-ROM

  • Matsushita/Panasonic CD-ROM

  • 相容於 ATAPI IDE 介面的 CD-ROM



已經知道非 SCSI 的週邊設備會比 SCSI 的慢很多,另外,有一些 ATAPI CDROM (這也就是說非 SCSI 的 CDROM) 可能無法運作。

對了,2.2 版的 FreeBSD CDROM (由 Walnut Creek 整理的) 支援光碟開機。

Q: FreeBSD 支援 ZIP 嗎?

A: FreeBSD 當然支援 SCSI ZIP。但是 ZIP 只能夠被設定在 SCSI ID 5 或是 6 。但如果 SCSI 卡上的 BIOS 支援它,你甚至可以用它來開機。我們不曉得哪一 塊卡可以讓你把卡的 ID 設在除了 0 或 1 以外的地方開機... 看看你的說明手 冊 (果你成功的話,也請你讓我們知道)

ATAPI (也就是 IDE 介面) ZIP 已經在 FreeBSD 2.2.6 及以後的版本被支援了。

FreeBSD 從 3.0 開始也支援 Parallel Port Zip。如果你用的版本夠新的 話,先檢查 kernel 設定檔中是否有 scbus0da0 ppbus0vp0 這幾個驅動程式(Generic kernel 設定檔 中除了 vp0 之外都有)。加了這幾個驅動程式之後,Parallel Port Zip 就可 以當作 /dev/da0s4,看是用 mount /dev/da0s4 /mnt、或是(DOS 磁片 mount_msdos /dev/da0s4 /mnt 來讀寫。

也可以參考有關 可移除設備的註解 , 及 格式化的資料 的資料。

Q: FreeBSD 有支援 JAZ、EZ 及其他像這一類可以移動的設備嗎?

A: 除了 IDE 的 EZ drive 外,其他的應該都是 SCSI 介面。所以你應該將大部 份設備看成 SCSI 磁碟機,把剩下那些的 IDE EZ 的設備看成 IDE 設備。

我們並不確定 FreeBSD 對於更換 jaz 磁片時的支援怎樣 。但我們知道必需在抽換 jaz 磁片前將這個檔案系統先卸下。當然,你必需確 定在開機時這些設備的電源是打開的,以便讓 FreeBSD 可以偵測到。

參考格式化的資料

Q: 有那些 multi-port serial 卡被 FreeBSD 所支援?

A: 你可以參考 其他週邊設備 的清單。

雖然有些卡是沒牌的,但也可以在 FreeBSD 下工作,像是號稱支援 AST 的卡。

參考 sio 這份說明文件可以讓你了解更多有關於這一類卡的資訊。

Q: 我有一隻 bus mouse。我該如何設定?

A: FreeBSD 支援由 Microsoft,Logitech 及 ATI 所生產的 bus mouse 及 InPort bus mouse。這些滑鼠的 driver 都已經內含在 GENERIC 裡面了。如果你自己有重新 做一個 kernel,請確定有沒有把下列這一行加入你的 kernel config file:

        device mse0 at isa? port 0x23c tty irq5 vector mseintr
      



買 bus mouse 時應該會含一塊介面卡。這塊卡允許你設定不同的 port address 及 IRQ number。參考你的說明手冊及 mse man page 來得到更多的資訊.

Q: 我如何使用 PS/2 mouse 或是 PS/2 keyboard?

A: 如果你的 FreeBSD 是 2.2.5 以上的版本 (含 2.2.5),那麼你需要的 driver 不僅放到 kernel 裡面了,而且你的 PS/2 設備應該可以在開機時被偵測到。

如果你用的是 2.1.x 到 2.2.5 (不含 2.2.5) 版的 FreeBSD,你可以在 開機的時候進入「kernel configuration menu」裡去啟動,也就是在開機時出現 boot: 的符號後打入 -c。因為預設值是關掉的,所以你必需自己去啟動它。

如果你用的是更舊的版本,你需要自己編一個 kernel,在你的核心設定檔裡面加入:

        device psm0 at isa? port "IO_KBD" conflicts tty irq 12 vector psmintr
      



如果你對於自己編一個核心沒有經驗,請參考 自訂核心 這葵獄〝。

如果在開機時有找到 psm0 卻不能使用,請確定在 /dev 下有 psm0 這個設備檔。 如果沒有,你應該用 root 的身份輸入下面這行來做出:

        cd /dev; sh MAKEDEV psm0
      



Q: 是否有可能在 X Window 之外使用滑鼠呢?

A: 如果你用的是 default console driver,也就是 syscons,而想要用 滑鼠指標來剪貼文字,那麼就執行滑鼠的 daemon,也就是 moused,然後 用下面這兩行來啟動它:

        moused -p /dev/xxxx -t yyyy
        vidcontrol -m on
      



xxxx 的地方填入 mouse 的 device name,而 yyyy 填入這隻滑鼠的 protocol type。你可以參考 moused 這個 man page 來找看看有那些 protocol types 可以填。

如果你想要在開機時就執行 moused。在 2.2.1 版之前 (含 2.2.1),到 /etc/sysconfig 設定下面的值:

        mousedtype="yyyy"
        mousedport="xxxx"
        mousedflags=""
      



在 2.2.2 版以後 (含 2.2.2) 到 /etc/rc.conf 設定下面的值:

        moused_type="yyyy"
        moused_port="xxxx"
        moused_flags=""
      



另外從 2.2.6 版開始,moused 可以自動決定 protocol type,除非滑鼠實在 是太舊了。如果太舊的話,在 moused_type 填入 ``auto'',然後祈禱 可以偵測的到。

當執行 moused 後,想要在其他程式裡使用滑鼠需要像 X Window 這類的應用 程式,參考 另外這段

Q: 如何在 text console 裡剪貼?

A: 當執行 moused 後,(參考前一節),按住左鍵, 移動滑鼠來選擇一個區域之後放開。然後,按下中鍵或右鍵,就可以貼上去了。

在 2.2.6 版後 (含 2.2.6),按下中鍵會執行貼上這個動作,但按下右鍵會延伸 所選取的區域。如果你的滑鼠沒有中鍵,你可以用模擬的方式或是重新定義滑鼠按 鍵的方式來達成「延伸」的功能。參考 moused 這個 man pages 來得到更多相關資訊。

Q: 我的滑鼠上有滾輪,能不能在 FreeBSD 下使用?

A: 很不幸的,在大多數的情況下不行。這些帶有滾輪的滑鼠需要用特 殊的驅動程式。除非滑鼠有被你的程式或是驅動程式所支援,不然這些滑 鼠只能夠當成是普通的兩鍵或三鍵的滑鼠使用。

Q: 我能在我的 laptop 上使用滑鼠/軌跡球/touchpad 嗎?

A: 參考上一段的答案,並且參考 Mobile Computing 網頁的 這個註解

Q: FreeBSD 支援哪些 tape 周邊?

A: FreeBSD 支援 SCSI,QIC-36 (QIC-02 介面) 及 QIC-40/80 (Floppy 介面) tape drives。 包括 8-mm (aka Exabyte) 及 DAT drives。已經知道 QIC-40/80 drives 很慢。

某些早期的 8-mm drives 並不相容於 SCSI-2,可能沒有辦法在 FreeBSD 上運作。

Q: FreeBSD 支援 tape changer 嗎?

A: FreeBSD 2.2 利用 ch 這個設備來支援 SCSI changers,你可以參考 chio 這個指令。 如何控制 changer 的方法可以在 chio 這份說明文件裡找到。

如果你不是用 AMANDA 或 其他已經被知道的 changer,記住,你只知道如何將一個 tape 從其中一個移到另外一個, 所以你需要記住那一個 tape 在裡面,及現在有那一個 tape 需要放回去。

Q: FreeBSD 支援哪些音效卡?

A: FreeBSD 支援 SoundBlaster,SoundBlaster Pro,SoundBlaster 16, Pro Audio Spectrum 16,AdLib 及 Gravis UltraSound sound cards。 但對於 MPU-401 及其相容 MIDI 卡的支源有限。對於使用 Microsoft Sound System 的卡可以透過 pcm 的驅動程式來使用它。

NOTE 這個驅動程式只適用於聲音方面,而且並不支援在這些 卡上的 CD-ROM,SCSI 或 joysticks。但也有些例外,像是 SoundBlaster、 SoundBlaster SCSI 介面及某些非 SCSI CDROMS 有被支援,但你無法使用這 些設備開機。

Q: es1370 的音效卡用 pcm 驅動程式聽不到聲音?

A: 您可以在每次開機時執行這個命令:

mixer pcm 100 vol 100 cd 100

Q: FreeBSD 支援哪些網路卡?

A: 參考乙太網路卡 ,裡面有完整的清單。

Q: 我的電腦沒有浮點運算器,這聽起來好像不太好?

A: Note 這只會影響到用 386/486SX/486SLC 的人 - 使用其他的 CPU 都 已經內含浮點運算器了。

一般來說這不會造成任何問題,但當你要用的時候,無論在效率上與精密度上, 模擬浮點運算的程式碼不能兼顧 (參考浮點運算模擬器)。 尤其是在 X 下面畫弧形時會很慢。所以,我們還是會建議買一顆浮點運算器。

NOTE 有些數學運算器比其他的好。但是沒有人強迫你買 Intel 的。 除非你確定你買的可以在 FreeBSD 上正確的工作。

Q: 2.X 還支援哪些設備?

A: 請多多參考 Handbook ,裡面有列出。

Q: FreeBSD 支援電源管理系統嗎?

A: FreeBSD 支援某些機器上的 APM。請參考 LINT 這個 kernel 設定檔, 並找看看 APM 這個關鍵字。

Q: 在 Micron systems 的主機板上我沒有辦法進入 FreeBSD

A: Micron 的某些主機板沒有遵守 PCI BIOS 的規定,而導至於當進入 FreeBSD 時掛掉。因為這些 PCI 的設備沒有在開機時向主機板報告他的的位置。

進入 BIOS 後,將「Plug and Play Operating System」這項給 disable 掉 可以暫時解決這個問題。如果你想得到更多有關 Micron 的訊息,可以參考 http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron

Q: 我有一塊新買的 Adaptec 卡,但是 FreeBSD 找不到它。

A: Adaptec 新的 AIC789x 系列晶片組在剛出爐的 CAM SCSI 環境下可以使用。 2.2-STABLE 需要 patches,在 ftp://ftp.FreeBSD.org/pub/FreeBSD/development/cam/。A CAM-enhanced 開機磁片在 http://www.FreeBSD.org/~abial/cam-boot/。無論你是用那一個,請先參考 README

Q: 我這有一個 PnP 的 modem,但是 FreeBSD 沒找到咧?

A: 你需要把 modem 的 PnP ID 加到 serial 驅動程式的 PnP ID 表裡,然後將 PnP 的功能給打開。在你的核心設定檔裡加入 controller pnp0 後再重新 編譯一個 kernel,然後重新啟動你的系統。核心會列出它所找到的所有設備的 PnP ID。請將這些 modem 的 PnP ID 複製到 /sys/i386/isa/sio.c, 大約 2777 行的地方。你可以找 "SUP1310" 這個字串來幫助你找到 ”siopnp_ids[]”這個表。重新編譯一個 kernel 之後重新開機,你的 modem 應該會被找到了。

在開機時必須手動輸入類似下面的字串,使得 kernel 可以看到你的 modem:

   pnp 1 0 enable os irq0 3 drq0 0 port0 0x2f8
   



Q: 我該如何在 serial console 前看到 boot: 這個提示符號?

A:

  1. 在你的核心檔裡面加入一行 options COMCONSOLE,然後重新編譯你的核心,

  2. 然後到 /boot.config 裡寫入 -P 這兩個字。

  3. Unplug the keyboard from the system.



參考 /usr/src/sys/i386/boot/biosboot/README.serial 來了解更多的資訊。

Q: 為什麼我的 3Com PCI 網路卡沒有辦法在 Micron 主機板上工作?

A: 某些 Micron 主機板沒有遵守 PCI BIOS 的規定而使得 PCI 的週邊設備沒有回報 他們的位置。這使得在進入 FreeBSD 時會掛掉。

如果要暫時解決這個問題,請在 BIOS 裡 disable「Plug and Play Operating System」

有關 Micron 更多的訊息可以參考: http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron

Q: FreeBSD 支援 Symmetric Multiproccessing (SMP) 嗎?

A: SMP 只在 3.0-STABLE 及其之後的發行版本中被支援.


Chapter 3. 常見問題解決

Q: 我的硬碟有壞軌!
Q: FreeBSD 抓不到我的 Bustek 742a EISA SCSI 卡!
Q: FreeBSD 抓不到我的 HP Netserver 的 SCSI 控制卡!
Q: CMD640 IDE 控制晶片出了什麼問題?
Q: 我一直看到類似 ``ed1: timeout'' 的訊息
Q: 在我想要掛上 CDROM 時,出現``Incorrect super block''的訊息
Q: 當我想掛上 CDROM 時,出現了 ``Device not configured'' 的錯誤訊息
Q: 我的印表速度破天荒的慢。我該怎麼做?
Q: 我的程式有時會因 ``Signal 11'' 這個錯誤而停止
Q: 當我開機時,螢幕變黑,且不停閃動!
Q: 我有 128 MB 的 RAM,但是系統只用其中的 64MB
Q: FreeBSD 2.0 因為 ``kmem_map too small!'' 而發生 panic!
Q: 用新 kernel 開機時,出現 ``CMAP busy panic'' 這個錯誤訊息
Q: ahc0: brkadrint, Illegal Host Access at seqaddr 0x0
Q: Sendmail 一直抱怨 ``mail loops back to myself''
Q: 在遠端機器(remote machine)執行全螢幕的軟體時,有不正常的情形!
Q: 我的機器一直顯示 "calcru: negative time..."

Q: 我的硬碟有壞軌!

A: 若是 SCSI 硬碟的話,應該有能力自動作 re-mapping 的動作。 然而,因為一些神秘的因素,在出廠時,很多硬碟的這項功能是關閉的.

要將其重新開啟,您需要編輯裝置的第一個 page 模式 (first device page mode),在 FreeBSD 上可以用下面的指令辦到 (以 root 身分執行

        scsi -f /dev/rsd0c -m 1 -e -P 3
      



然後將 AWRE 和 ARRE 的數值從 0 變成 1:-

        AWRE (Auto Write Reallocation Enbld):  1
        ARRE (Auto Read Reallocation Enbld):  1
      



上面這段是由 Ted Mittelstaedt 所提供:

若為 IDE 硬碟,任何的壞軌通常都是麻煩的預兆。目前所有較新的 IDE 硬 碟,內部都有自動 remapping 壞軌的能力。目前所有 IDE 硬碟製造商,都提供 了更久的保證,而且會幫您更換出現壞軌的硬碟。

如果您仍想要修復產生壞軌的 IDE 硬碟,您仍可以試著去下載 IDE 硬碟製造 商所提供的檢測程式,並用它來檢查您的硬碟。有時這些軟體可以強迫硬碟電路 重新檢查硬碟的壞軌,並將它們標示出來.

對 ESDI,RLL 及 MFM 的硬碟來說,通常壞軌是正常現象,也不是什麼麻煩的 前兆。在 PC 上,磁碟控制卡和 BIOS 負責標示壞軌的任務。這對一些使用 BIOS 來存取磁碟的作業環境(如 DOS)是沒有問題的。然而,FreeBSD 的磁碟驅動程式 並不經過 BIOS 來存取磁碟,所以,有個 bad144 的機制用來取代這項功能。 bad144 只能用在 wd 這個磁碟驅動程式上,它無法用在 SCSI 硬碟上。bad144 的工作方法是將所有找到的壞軌資料存到一個特別的檔案堙C

使用 bad144 的警告 - 存著壞軌資料的特別檔案是放在硬碟的最後一軌 上。因為這個檔案儲存的壞軌資料中,有可能有些資料是指向硬碟最前端所發生 的壞軌情形,就是可能儲存 /kernel 這個檔的地方,所以它一定要能被開機程式 所讀取,而開機程式是透過 BIOS 來讀取 kernel 檔。這表示了使用 bad144 的 硬碟絕不能擁有超過 1024 個 cylinder,16 個 head 及 63 個 sector。 這造成了使用 bad144 的硬碟的大小不能大於 500 MB。

要使用 bad144 很簡單,只要在開始安裝時,在 FreeBSD fdisk 畫面把 "Bad Block" 掃瞄設為 ON 即可。在 FreeBSD 2.2.7 以後都可以使用此方法。 但這個硬碟的 cylinder 一定要在 1024 以下。使用前,我們建議這個硬碟要 至少先使用四個小時,以便熱膨脹與磁軌偏移達一般狀態。

如果這個硬碟擁有超過 1024 個 cylinder (像大容量的 ESDI 硬碟), ESDI 控制卡利用一個特別的轉換模式使它能在 DOS 下工作。 而如果您在 fdisk 堛 "set geometry" 中輸入 "轉換過" 的 geometry,wd 這 個驅動程式能了解這些轉換模式。您也絕對不能使用 dangerously dedicated 模 式來建立 FreeBSD 的分割區,因為它會忽略 geometry 這個參數。 此外,就算 fdisk 使用您所輸入的 geometry 參數,它依然會去讀取這硬碟的 真正資料,而會嘗試去建立一個過大的 FreeBSD 分割區。如果磁碟的 geometry 已經被 "轉換" 過了,那麼這個分割區 "必須" 以手動輸入 block 數目的方法來 建立。

一個快速的小技巧是利用 ESDI 控制卡來設定大容量的 ESDI 硬碟,用 DOS 開 機片開機,再將它 format 為 DOS 的分割區。然後重開機進入 FreeBSD 安裝程序 ,在 fdisk 畫面,把DOS 分割區的 blocksize 和 block number 抄下來。然後重 新設定 geometry 使其跟 DOS 使用的一樣。刪除 DOS 分割區,然後使用您剛剛抄 下的 blocksize 來建立一個 cooperative FreeBSD 分割區。然後設定這個分割區 為可開機,再打開壞軌掃瞄。在真正的安裝過程中,bad144 會在任何檔案系統被 建立前先被執行。(您可以按 Alt-F2 來監看這一切)如果在建立壞軌資料檔時發生 了問題,您會需要設定一個較大的磁碟 geometry - 這表示您需要重開機,然後全 部再重新開始 (包括重新分割以及在 DOS 下重新 format)。

如果 remapping 的功能已經啟動了,而您依然一直看到壞軌產生,那麼考慮 換一台硬碟吧。壞軌的情形只會隨時間增加而更為嚴重。

Q: FreeBSD 抓不到我的 Bustek 742a EISA SCSI 卡!

A: 下面的資訊是給 742a 這張卡用的,但是其他 Buslogic 的卡或許也可以 適用。 (Bustek 就是 Buslogic)

742a 這張卡有兩個主要的「版本」。一個是版本 A-G,另一個是版本 H 及其以後。版本資訊可以從介面卡邊緣的流水號最後面得知。742a 這張 卡有兩個唯讀晶片在它上面,一個是 BIOS 晶片,而另一個是韌體晶片。 FreeBSD 並不在乎您卡上的 BIOS 版本,但是韌體的版本就很重要了。如果 你打電話給他們技術支援專線的話,他們會寄給您最新的版本供您升級。 BIOS 和韌體晶片是一起送來的。 您需要將卡上 BIOS 和韌體版本,依您卡 版本的不同,升級到最新的一版。

版本 A-G 的卡最高只能將 BIOS/韌體 升級到 2.41/2.21 版,而版本 H 後,目前 BIOS/韌體的最新版本是 4.70/3.37。這兩個韌體版本間的差異在 於,3.37 這版支援 ``round robin''

Buslogic 的卡上面也都有序號。如果您卡的版本較舊,您可以試著打電 話給 Buslogic 的RMA 部門,然後給他們您的序號,看能不能跟他們交換一 張較新版本的卡。如果那張卡夠舊的話,他們會換給你。

FreeBSD 2.1 只支援韌體 2.21 版以後的版本。如果您韌體版本比這個還 舊的話,那麼您的卡就不能被辨識出是 Buslogic 的卡。它有可能會被辨識成 Adaptec 1540。較早的 Buslogic 卡上的韌體有一個 AHA1540``模擬''模式, 這對一張 EISA 卡來說並不是件好事。

如果您有一張較舊版本的卡,而您取得 2.21 版韌體的話,您需要檢查一下 jumper W1 的位置,將它調至 B-C,原始設定是 A-B。

742a EISA 卡沒有在 在擁有 >16 MB 記憶體的機器上 這段中所提過的 ``>16MB'' 問題。這個問題只會發生在 Vesa-Local 匯流排的 Buslogic SCSI 卡上。

Q: FreeBSD 抓不到我的 HP Netserver 的 SCSI 控制卡!

A: 基本上這個是一個已知的問題。在 HP Netserver 機器上的 on-board EISA 介面 SCSI 控制卡占據了定址為第 11 的 EISA 槽,因此所有的 ``真實'' EISA 槽都在它之前。可是,在 EISA 定址空間 >= 10 時,會與指定給 PCI 用的定址空間相衝突,且 FreeBSD 的 auto-configuration 無法正確的處理 這個情形。

因此,現在你能做的最好事情就是在 kernel 堻]定 EISA_SLOTS 這個選項為 12 ,然後當作沒有這個問題 :)。 請依照 Handbook 中有關 kernel 的設定 堜珨〞漱隤k來 設定與編譯您的 kernel

當然,在安裝到這種機器上時,這是一個雞生蛋蛋生雞的問題。 為了解決這個問題,在 UserConfig 中有一個特別的方法, 安裝時不要進入 ``visual'' 介面,相反的,在命令列模式中,鍵入

        eisa 12
        quit
      



然後就如以往一樣安裝您的系統。雖然我們建議您編譯與安裝一個 屬於自己的 kernel,但

dset 現在也已經了解這個參數,且會儲存它。

希望,在未來的版本中能對這個問題有一個好的解決方法。

注意: 您無法在 HP Netserver 上使用 dangerously dedicated 磁碟模式。您可以參考 這份註解以獲得更多資訊。

Q: CMD640 IDE 控制晶片出了什麼問題?

A: 它的問題在於無法同時處理兩個 channel 的指令。

現在已經有個解決方法了,且會自動在您使用這塊晶片時啟動。 如果需要更詳盡的解釋,請查閱有關磁碟驅動程式的說明(man 4 wd)

如果您目前是使用 CMD640 IDE 控制晶片,加上 FreeBSD 2.2.1 或 2.2.2,而且您又想要使用到第二個 channel 時,請在您的 kernel 設 定中加入 options "CMD640" 然後重新編譯一個新的 kernel。 這個 option 在 2.2.5 版以後是內定啟動的。

Q: 我一直看到類似 ``ed1: timeout'' 的訊息

A: 這個通常是由於中斷衝突(interrupt conflict)所造成的 (例如,兩塊卡 使用到了相同的 IRQ)。 FreeBSD 在 2.0.5 版以前都容許這個情形, 就算有 IRQ 衝突情形,網路卡也應該仍可正常運作。 然而,在 2.0.5 版及其以後,已不再容許有 IRQ 衝突的情形了。 請於開機時使用 -c 這個選項,然後更改 ed0/de0/..。等的設定,使其 和您網路卡本身的設定一致。

如果您是使用您網路卡上的 BNC 接頭,您或許也會因不良的終端電阻設定, 而發生裝置 (device) timeout 的情形。要檢查是否有這種情形,您可以在 網路卡上直接接上終端電阻 (不要接網路線),然後看看這個錯誤訊息是不是 就消失了。

有些 NE2000 的相容卡,如果它的 UTP 埠沒有接網路線,或是該網路線並 沒被使用的話,也會出現這個錯誤訊息。

Q: 在我想要掛上 CDROM 時,出現``Incorrect super block''的訊息

A: 您必須告訴 mount 您想掛上的 device 的檔案格式。在原始設定堙A mount 會假設您的檔案格式為 ``ufs''。如果您想要掛上 CD-ROM 堛瑰仵蛂A 您需要在 mount 時指定 ``-t cd9660'' 這個選項。當然,這是假設光碟片是使用 ISO 9660 的檔案系統 (絕大多數光碟片皆是用這套檔案系統) 且在 1.1 版以後,FreeBSD 已經能看得懂 Rock Ridge (長檔名) 這個延伸格式。

舉例來說,如果您想將 ``/dev/cd0c'' 這個 CDROM 裝置 (device) 掛在 /mnt 下,您需要執行:

        mount -t cd9660 /dev/cd0c /mnt
      



要注意的是,您的裝置名稱可能會不一樣 (在此範例中是 ``/dev/cd0c'',它是根據您的 CDROM 介面而定的。 另外要注意的,``-t cd9660'' 這個選項只是呼叫 ``mount_cd9660'' 這個指令,所以上面這個範例 也可以縮短為:

        mount_cd9660 /dev/cd0c /mnt
      



Q: 當我想掛上 CDROM 時,出現了 ``Device not configured'' 的錯誤訊息

A: 這通常是表示您的 CD-ROM 堶惆S有光碟片,或者是這台機器無法被 匯流排 (bus) 抓到。放片光碟片在光碟機堙A如果它是 IDE (ATAPI) 的 光碟機的話,檢查一下它的 master/slave 狀態。光碟機通常需要幾秒鐘 的時間才能備妥 (ready),所以請耐心等候。

有時這是發生在 SCSI CD-ROM 上,因為它在匯流排重置 (bus reset) 時來不及回應,所以消失了。如果您擁有的是 SCSI CD-ROM,請嘗試在 kernel 設定檔中加入以下的設定,然後重新編譯。

        options "SCSI_DELAY=15"
      



Q: 我的印表速度破天荒的慢。我該怎麼做?

A: 如果是平行埠,且唯一的問題就是速度很慢的話,試著設定您的 印表機埠為 ``polled'' 模式:

        lptcontrol -p
      



有些新的 HP 印表機似乎無法在 interrupt 模式中正常工作, 很明顯的是因為一些時脈問題 (但還不是很瞭解為什麼會如此)

Q: 我的程式有時會因 ``Signal 11'' 這個錯誤而停止

A: 這個通常是因為有問題的硬體 (記憶體,主機板等等) 所造成的. 試試在您的 PC 上跑個記憶體測試程式看看。注意,就算您試過的每一種記 憶體測試程式都回報說您的記憶體沒有問題,但是,有一些低品質的記憶體, 雖然能通過記憶體測試,不過在真正工作時卻會出問題 (例如從 Adaptec 1542 等等 SCSI 控制卡做 bus mastering DMA、在編輯 kernel 時、 或是系統的負載很高時)

SIG11 FAQ (位址在下面) 指出記憶體的速度不夠快通常是這個問題的原因。 試著在您的 BIOS 設定中增加記憶體 wait 狀態的時間,或是更換更快的記憶 體。

以我而言,我曾遇過由不良的快取記憶體或是不良的 on-board 快取卡 所造成的這個問題。試著在 BIOS 設定中取消 on-board (第二階) 快取, 看看這樣能不能解決這個問題

這兒有一份很好的 FAQ: SIG11 問題的 FAQ

Q: 當我開機時,螢幕變黑,且不停閃動!

A: 這個問題,已知是由 ATI Mach 64 顯示卡所引起的。因為這塊卡使用到 2e8 這個位址,而這與第四個序列埠(serial port)所使用的位址相同。而 sio.c 這個驅動程式,不知道是 bug 或是功能(feather),就算您沒有第四個序列埠, 或是已經將 sio3 (第四個序列埠)取消了,它依然會去嘗試驅動它。

直到這個問題被解決以前,您可以使用這個方法:

  1. 在開機提示(看到boot: 時)打入 -c。 (這會讓 kernel 進入設定模式)

  2. 取消 sio0sio1sio2 and sio3 (全部) 這可以讓 sio 驅動程式不動作 -> 於是問題解決。

  3. 輸入 exit 以繼續啟動程序



如果您想要使用您的序列埠,您需要修改 /usr/src/sys/i386/isa/sio.c,在該檔中找出 0x2e8 這個字串 移除這個字串及它前面的逗號(保留後面的),然後重新編譯一個新的 kernel

就算使用了上面這些方法,X Window 仍然有可能無法順利執行。有些新的 ATI Mach 64 顯示卡(特別是 ATI Mach Xpression),無法在目前版本的 XFree86 上正常工作;啟動 X Window 時螢幕變黑,或是會有奇怪的問題 發生。您可以到 XFree86 的網站 找到 new beta release 這個連結(link),來取得 X-server 的 beta 版,它的 相容情形應該就比較好了。您需要取得下列這些檔案:

AccelCards,BetaReport,Cards,Devices,FILES,README.ati, README.FreeBSD,README.Mach64,RELNOTES,VGADriver.Doc, X312BMa64.tgz

以這些檔案取代您原有的舊檔案,然後切記再跑 xf86config 一遍。

Q: 我有 128 MB 的 RAM,但是系統只用其中的 64MB

A: 因為 FreeBSD 是使用呼叫 BIOS 來取得記憶體大小的方法,因此它只能 偵測到 16 bits 位元長度的 KByte 大小 (65535 KBytes = 64MB) (或者更少..。有些 BIOS 將最高記憶體大小限為只有 16MB) 如果您擁有 64MB 以上的 RAM,FreeBSD 會嘗試去偵測出它,但是有可能 會失敗。

要解決這個問題,您需要使用下面所提的 kernel 設定選項。 雖然有方法可以從 BIOS 中取得記憶體的完整資訊,但是目前我們在 bootblock 中並沒有多餘的空間來做這件事。當某天 bootblock 空間 不足的情形獲得解決時,我們將會使用 BIOS 的延伸功能來取得記憶 體的完整資訊...但現在我們將它放在 kernel 設定選項中。

options "MAXMEM=<n>"

n 是指您的記憶體大小,以 KB 為單位。以一台有 128MB RAM 的 機器來說,您可使用 131072 這個數字。

Q: FreeBSD 2.0 因為 ``kmem_map too small!'' 而發生 panic!

A: 注意 這個訊息也有可能是 ``mb_map too small!''

這個 panic 是表示系統用光了給網路緩衝區的所有的虛擬記憶體 (特 別是 mbuf clusters)。您可以增加給 mbuf clusters 的 VM 的數量, 只要加入:

options "NMBCLUSTERS=<n>"

在您的 kernel 設定檔中,<n> 是一個在 512-4096 間的數字, 依您想提供多少同時的 TCP 連接數目多寡而定。我會建議試試 2048 - 這數字應該可以完全避免這個 panic 了。您可以執行: netstat -m 來監看有多少 mbuf clusters 在系統上正被 配置/使用。NMBCLUSTERS 的數值內定為 512 + MAXUSERS * 16

Q: 用新 kernel 開機時,出現 ``CMAP busy panic'' 這個錯誤訊息

A: 用來偵測過期 /var/db/kvm_*.db 檔案的機制偶爾會"出鎚" 而使用一個含不正確資料的檔案有時就會導致 panic。

如果發生了這個問題,請重新開機,進入單使用者模式,然後執行:

        rm /var/db/kvm_*.db
      



Q: ahc0: brkadrint, Illegal Host Access at seqaddr 0x0

A: 這是一個和 Ultrastor SCSI 控制卡有關的衝突

在開機時,進入 kernel 設定選單 取消 uha0,它是造成這個問題的原因

Q: Sendmail 一直抱怨 ``mail loops back to myself''

A: 這個問題在 sendmail 的 FAQ 中是這樣回答的:-

        * 我一直收到有關 "Local configuration error" 的信件,例如:

        553 relay.domain.net config error: mail loops back to myself
        554 <user@domain.net>... Local configuration error

        我要如何解決這個問題?

        您利用 MX 設定,讓要寄到某 domain (如: domain.net) 的信件,
        寄到您所指定的機器 (在這個例子中為 relay.domain.net),但是這
        部機器並未被設定接受 domain.net 的信件。把 domain.net 加到
        /etc/sendmail.cw 中 (如果您有使用 FEATURE(use_cw_file)) 或是
        在 sendmail.cf 中加入 "Cw domain.net"
      



sendmail FAQ 現在已不再隨著 sendmail "出貨"。 它目前是被定期的發表在: comp.mail.sendmail comp.mail.misccomp.mail.smail comp.answers,和 news.answers。 您也可以寄一封 Email 到 mail-server@rtfm.mit.edu,然後在信件內文中寫上 "send usenet/news.answers/mail/sendmail-faq" 這個指令 以取得這份文件。

Q: 在遠端機器(remote machine)執行全螢幕的軟體時,有不正常的情形!

A: 或許遠端機器並非將您的終端機形態設為 FreeBSD console 所用 的 cons25,而是設為其它種類。

這兒有幾個解決這個問題的方法:

  • 在 logging 進遠端機器後,更改您的 shell 變數 TERM 為 ansi 或是 sco

  • 在 local 端用一些可以模擬 VT100 的模擬器,如 screen screen 提供您在一個 terminal 埵P時跑好幾個 session 的能力,而且它本身也是一個相當好的軟體。

  • 在遠端機器的終端機資料庫(terminal database)中加入 cons25 的資料。

  • 啟動 X 然後利用 xterm 來 login 進遠端的機器。



Q: 我的機器一直顯示 "calcru: negative time..."

A: 跟中斷 (interrupt) 有關的不同硬體 與/或 軟體的搭配都有可能造成 這個問題。這有可能是 bug 或是某個裝置本身的問題。在平行埠上使用 大的 MTU 來作 TCP/IP 傳輸可以重現這個問題。若是圖形加速卡造成這個 問題的話,您應該先檢查卡的中斷設定。

這個問題的邊際效應是會造成有些 process 出現 "SIGXCPU exceeded cpu time limit" 的訊息,而不正常中斷

若版本是 1998 年 11 月 29 日以後的 FreeBSD 3.0,如果這個 問題一直無法以其他方法解決,就只能設定 sysctl 變數:

               sysctl -w kern.timecounter.method=1



這樣會對效能有些影響,但是若考慮到這個問題帶來的後果,這樣做是值 得的。如果這個問題還是存在的話,將 sysctl 那個值依然設為 1,然後 增加 kernel 設定檔中 "NTIMECOUNTER" 這個選項的數值。如果您將 "NTIMECOUNTER" 增加到 20 依然無法解決這個問題,那麼您機器上的中斷 已經多到無法保持穩定的狀態了。


Chapter 4. 商業軟體

注意這一節的內容還是相當少,不過我們當然希望各個公司能為它加 點內容 :) FreeBSD 組織和列在這裡的任何一家公司都沒有金錢上的利害 關係,列出來只是對大眾的公開服務(同時也認為在 FreeBSD 上的商業興 趣,會對 FreeBSD 長久生機有極正面的效益)。我們鼓勵商業軟體的廠商 把他們的產品包括在下面的名單中,在 Vendors page 可以看到較長列表。

Q: 我可以在哪邊找到給 FreeBSD 用的 Motif?
Q: 我可以在哪邊找到給 FreeBSD 用的 CDE?
Q: 有沒有要錢,但是高效率的 X servers?
Q: 在 FreeBSD 上有任何的資料庫嗎?
Q: 可以在 FreeBSD 上執行 Oracle 嗎?

Q: 我可以在哪邊找到給 FreeBSD 用的 Motif?

A: 可以聯絡 Apps2go 取得 FreeBSD ELF 版本的 Motif 2.1 套件。

這個套件裡有:

  • OSF/Motif manager, xmbind, panner, wsm.

  • Development kit with uil, mrm, xm, xmcxx, include and Imake files.

  • Static and dynamic ELF libraries(給 FreeBSD 3.0 及以後版本 使用)

  • Demonstration applets.



因為 Apps2go 也有提供 NetBSD 和 OpenBSD 的版本,所以在訂購 時請特別指定是要 FreeBSD 版本的 Motif!他們目前只提供以 FTP 的方式取得 這份套件。

更多資訊

Apps2go WWW 首頁

Sales Support email 信箱。

電話 (817) 431 8775 or +1 817 431-8775



也可以聯絡 Metro Link 取得給 FreeBSD ELF 或 a.out 版本的 Motif 2.1 套件。

這份套件包括:

  • OSF/Motif manager, xmbind, panner, wsm.

  • Development kit with uil, mrm, xm, xmcxx, include and Imake files.

  • Static and dynamic libraries(FreeBSD 3.0 及之後版本是用 ELF;FreeBSD 2.2.8 及之前的是用 a.out)

  • Demonstration applets.

  • Preformatted man pages.



由於 Metro Link 也有提供 Linux 的版本,所以訂購時要特別指 明是 FreeBSD 版本的 Motif!可以由光碟或從 FTP 來取得這個套件。

聯絡 Xi Graphics,他們提供了一個給 FreeBSD 用的 a.out 格式的 Motif 2.0 套件。

在這套件中包括了:

  • OSF/Motif manager, xmbind, panner, wsm.

  • Development kit with uil, mrm, xm, xmcxx, include and Imake files.

  • Static and dynamic libraries(給 FreeBSD 2.2.8 和更早版本用的)

  • Demonstration applets.

  • Preformatted man pages.



在你跟他們訂購 Motif 時,請一定註明你要的是 FreeBSD 的版本! 因為 Xi Graphics 也同時提供了 BSDI 跟 Linux 版本的 Motif。 目前發行的版本是放在四塊磁片中,將來他們會將所有的東西都放到光碟裡, 就像他們所發行的 CDE 一樣。

Q: 我可以在哪邊找到給 FreeBSD 用的 CDE?

A: Xi Graphics 以前有賣 FreeBSD 用的 CDE,不過現在已經 停止發售了。

KDE 是另一個原始碼公開的 X11 桌面程式,有很多地方和 CDE 相當類似。

Q: 有沒有要錢,但是高效率的 X servers?

A: 有,Xi GraphicsMetro Link 都有提供給 FreeBSD(或其他 Intel 平台上)用的 X 視窗加速產品。

Metro Link 提供的高效能 X Server 使用了 FreeBSD 內的 package 整套工 具,因此設定十分容易,支援目前市面上各大廠牌的顯示卡。只有 binary 檔案, 可以從 FTP 站相當方便地直接下載,更不用說 Metro Link 這套產品的價格是 非常合理的 $39。

Metro Link 也有提供 FreeBSD 上的 ELF 和 a.out Motif(往上面看看)。

更多的資訊

Metro Link WWW 首頁

Sales Support email 信箱

電話 (954) 938-0283 or +1 954 938-0283



Xi Graphics 所提供的高效能 X Server 有非常簡單的設定方式,並且支援 了目前市面上當紅的各大廠牌的顯示卡。它只給你 Binary 檔案,是用磁片的方 式發行,FreeBSD 跟 Linux 版本都相同。Xi Graphics 同時也提供了專門給 laptop 用的高效能 X Server。

5.0 版有提供免費的 "compatibility demo" 版本,你可以在 FreeBSD 的原 廠四片光碟中找到,當然你也可以直接在網路上取得。

Xi Graphics 也有在賣 FreeBSD 用的 Motif 跟 CDE(往上面看看)。

更多的資訊

Xi Graphics WWW 首頁

SalesSupport email 信箱

電話 (800) 946 7433 or +1 303 298-7478.



Q: 在 FreeBSD 上有任何的資料庫嗎?

A: 有! 請看 FreeBSD 網站上商業軟體公司這一部份。

還有請參考 ports 中 Databases 相關的收集。

Q: 可以在 FreeBSD 上執行 Oracle 嗎?

A: 可以,下面這個網頁會說明如何在 FreeBSD 上執行 Linux 版的 Oracle:




Chapter 5. 一般應用程式

Q: 嗯..我要在哪找到我要的程式呢?
Q: 我可以在哪邊找到 libc.so.3.0?
Q: ghostscript 在我的 386/486SX 上有點問題呢!
Q: 當我執行 SCO/iBCS2 的程式時,它掛在 socksys
Q: 我要如何在我的機器上設定 INN (Internet News)?
Q: 我該使用那個版本的 Microsoft FrontPage?
Q: FreeBSD 支援 Java 嗎?
Q: 那裡可以找得到 ld.so?

Q: 嗯..我要在哪找到我要的程式呢?

A: 請看看 ports 目錄 吧。 這邊有份已經 port 到 FreeBSD 的軟體列表。目前有超過 1800 個軟體已經被 port 到 FreeBSD 上,並且每天都在增加中。所以有空就多看看這份列表, 不然你也可以訂閱 freebsd-announce 這份 mailing list,會有人將 每個星期最新的軟體列表貼在上面。

大部份的 ports 應該都可以在 2.2,3.0 跟 4.0 的系統上使用, 並且還有部份的 ports 可以在 2.1.x 的系統上運作。 每次當 FreeBSD release 時,都會有一份 ports tree 被放在這一個 release cd 裡面的 ports/ 目錄裡。

我們也支援一種叫 ``package'' 的概念,基本上就是 gzip 壓縮、可用 來發行的 binary 檔案,但是裡面藏了一些相當有用的資訊,可以給各種自 訂安裝來使用。使用者不必知道某個 package 裡究竟有包括哪些檔案,就可 以很方便地重複將它安裝/反安裝。

你可以執行 /stand/sysinstall 後,在 post-configuration 選單下選擇 package 這個安裝選項;或是對某個有興趣的 package 檔案執 行 pkg_add(1),把它裝起來。Package 檔案通常以 .tgz 作為延伸檔名,手上有 FreeBSD CDROM 的人可以在 packages/All 這個目錄下找到這類檔案。對不同的 FreeBSD 版本,也可以從下列位址由網 路上取得:

給 2.2.8-release/2.2.8-stable 用的

ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-2.2.8/

給 3.2-release/3.2-stable 用的

ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-3-stable/

給 4.0-current 用的

ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-4-current/



或是離你最近的 mirror 站。

要注意的是,因為新的 port 一直在增加中,所以並不是所有 port 都 有相對應的 package。最好定時檢查 ftp.FreeBSD.org, 看看有哪些 package 可以用。

Q: 我可以在哪邊找到 libc.so.3.0?

A: 你可能在一台 2.1.x 的機器上,跑著給 2.2/3.x/4.0 的軟體。 請再往上面一個章節看,正確的取得給你機器用的 port/package。

Q: ghostscript 在我的 386/486SX 上有點問題呢!

A: 你沒有浮點運算器,對吧? 你必須在你的 kernel 中加入數學運算模擬器,你可以跟著下面的步驟做, 並在更改過你的 kernel 設定檔後,重新編譯過一次。

        options GPL_MATH_EMULATE
      



NOTE 當你加入上一行的同時,你必須將 MATH_EMULATE 移除掉。

Q: 當我執行 SCO/iBCS2 的程式時,它掛在 socksys

A: 你必須先修改 /etc/sysconfig (or /etc/rc.conf) 這檔案最後一個章節,將下面所講到的變數 設成 YES:

        # Set to YES if you want ibcs2 (SCO) emulation loaded at startup
        ibcs2=NO
      



這會在開機時將 ibcs2 這一個 kernel 模組載入。

你還要將你的 /compat/ibcs2/dev 改成下面這樣:

lrwxr-xr-x  1 root  wheel         9 Oct 15 22:20 X0R@ -> /dev/null
lrwxr-xr-x  1 root  wheel         7 Oct 15 22:20 nfsd@ -> socksys
-rw-rw-r--  1 root  wheel         0 Oct 28 12:02 null
lrwxr-xr-x  1 root  wheel         9 Oct 15 22:20 socksys@ -> /dev/null
crw-rw-rw-  1 root  wheel   41,   1 Oct 15 22:14 spx
      



你只需要將 socksys 轉向到 /dev/null 去騙過 open & close 的動作。在 -current 裡面的 ibcs2 相關程式碼將會處 理其餘的部份,這種作法比以前的方式乾淨太多了。 假如你想要使用 spx 方面的程式,在你的核心設定檔裡面加上 SPX_HACK

Q: 我要如何在我的機器上設定 INN (Internet News)?

A: 在你使用 package 或者是 port 安裝完 inn 之後, Dave Barr's INN Page 是個非常好的開始,你可以在那邊找到 INN 的 FAQ。

Q: 我該使用那個版本的 Microsoft FrontPage?

A: Use the Port, Luke!在 ports tree 中已經有一個包含 FrontPage 的 Apache 版本了。

Q: FreeBSD 支援 Java 嗎?

Q: 那裡可以找得到 ld.so?

A: 如果您希望在 3.1-R 之後的 ELF 機器上執行像 Netscape Navagator 等 的 aout 程式,它會需要 /usr/libexec/ld.so 和 aout library。這些都包 括在 compat22 套件中,您可以用 /stand/sysinstall 或 compat22 子目錄 下的 install.sh 裝起來。

同時也請您看一下 3.1-R 和 3.2-R 的 ERRATA。


Chapter 6. 核心設定

Q: 我想自訂核心程式,這會很困難嗎?
Q: 我的核心因為 _hw_float 遺失而編譯失敗。
Q: multi-port serial code 的中斷衝突。
Q: 我該怎麼啟動 QIC-40/80 的支援?

Q: 我想自訂核心程式,這會很困難嗎?

A: 不會!請查閱 使用手冊中的核心設定一節

注意:我會建議你在你讓核心能正常工作後,做一個 kernel.YYMMDD日期形式的備份,這樣下次如果你很不幸的玩壞 了設定,至少可以不需要使用最原始的kernel.GENERIC。假如你 正從一個沒有在 GENERIC kernel 裡面支援的控制器裡啟動,這顯得特 別重要(沒錯,這是筆者的經驗)。

Q: 我的核心因為 _hw_float 遺失而編譯失敗。

A: 讓我猜看看,你把 npx0 從你 的核心設定檔移除了,因為你沒有數學運算器,對嗎?錯了!:-) 這個 npx0必須要有的。就算你沒有數學運算器,你仍必須 引入npx0裝置。

Q: multi-port serial code 的中斷衝突。

A: Q. 當我編譯一個 multi-port serial code 的核心時,它告訴我 只有第一個被偵測到,其他的則因中斷衝突而跳過了,我該怎麼修正它?

A. 這個問題是因為 FreeBSD 使用內建程式碼避免因為硬體或軟體 衝突導致核心程式過於肥大或無用。要修正這種情形的方法是除了一個 port 外把其他所有的 IRQ 設定都做保留。這裡有一個範例:

        #
        # Multiport high-speed serial line - 16550 UARTS
        #
        device sio2 at isa? port 0x2a0 tty irq 5 flags 0x501 vector siointr
        device sio3 at isa? port 0x2a8 tty flags 0x501 vector siointr
        device sio4 at isa? port 0x2b0 tty flags 0x501 vector siointr
        device sio5 at isa? port 0x2b8 tty flags 0x501 vector siointr
      



Q: 我該怎麼啟動 QIC-40/80 的支援?

A: 你需要在 generic config 檔中把以下這行的註解取消(或是把它加到你的 設定檔),在 fdc 這行加入``flags 0x1''然後重新編譯核心。

controller  fdc0  at isa? port "IO_FD1" bio irq 6 drq 2 flags 0x1 vector fdintr
disk        fd0   at fdc0 drive 0                       ^^^^^^^^^
disk        fd1   at fdc0 drive 1
#tape       ft0   at fdc0 drive 2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      



接著,你可以在/dev執行以下命令,建立一個叫 /dev/ft0 的裝置:

        sh ./MAKEDEV ft0
      



是給第一個裝置使用。同理 ft1 是第二個,以此類推。

你將會有個叫/dev/ft0的裝置,可以透過一個特殊的程式叫 ``ft''的來管理它 - 請看 ft 的 man page 有更進一步說明。

版本比-current早的系統在處理壞的磁帶媒體時有些問題,如果你 的ft磁頭有一直在同一個地方來回移動的問題,嘗試從-current 裡的/usr/src/sbin/ft找出最新版的 ft 並且試看看。


Chapter 7. 系統管理

Q: 系統起始設定檔在哪?
Q: 我該如何簡單地加入使用者﹖
Q: 我該怎麼把新硬碟加入 FreeBSD 系統中﹖
Q: 我有一個新的可移除裝置,我該怎麼使用﹖
Q: 我該怎麼 mount 次要的 DOS 分割區﹖
Q: 我可以在 FreeBSD 下 mount 其他異質性檔案系統嗎﹖
Q: 我該如何使用 NT loader 來啟動 FreeBSD﹖
Q: 我該如何用 LILO 啟動 FreeBSD 和 Linux﹖
Q: 我怎麼使用 BootEasy 來啟動 FreeBSD 和 Linux﹖
Q: 一個所謂``危險奉獻(dangerously dedicated)''的磁碟有害嗎﹖
Q: 我如何能加入更多的置換空間(swap space)﹖
Q: 我不會設定我的印表機。
Q: 我系統上的鍵盤配置錯了。
Q: 我無法讓 user quotas 正常工作。
Q: 我的 ccd 有何不妥﹖
Q: 為何我不能編輯我 ccd 的磁碟標記﹖
Q: FreeBSD 支援 System V IPC 格式指令集?
Q: 我該如何使用 sendmail 透過 UUCP 來遞送郵件?
Q: 當我用撥接連上網路時該怎麼設定信件遞送?
Q: 咦!我忘記 root 的密碼了!
Q: 我該怎麼保留讓 Control-Alt-Delete 不能重新啟動系統?
Q: 我該怎麼把 DOS 文字檔案重新格式化成 UNIX 的?
Q: 我該怎麼用名稱砍掉 process?
Q: 為何在 root 的 ACL 時 su 好像有問題?
Q: 我該怎麼移除 Kerberos?
Q: 我該怎麼增加系統的虛擬終端機?
Q: /dev/snd0 這個裝置做不出來!
Q: 可以不用開機,重新讀取 /etc/rc.conf、再次啟動 /etc/rc 嗎?
Q: 什麼是 sandbox?
Q: 我該怎麼讓一般使用者掛上軟碟機及其他可移除媒體?

Q: 系統起始設定檔在哪?

A: 從 2.0.5R 到 2.2.1R,主要的設定檔是 /etc/sysconfig。 所有的選項都被指定在這個檔,而其他像 /etc/rc /etc/netstart 只是引用它。

觀察 /etc/sysconfig 這個檔並修正其值以適合你的系統。 這個檔用註解填滿以表示何處該放置什麼設定。

在 2.2.1 以後及 3.0 ,/etc/sysconfig 更名為一個更容 易描述的檔名叫 rc.conf ,並且語法簡化了些。/etc/netstart 亦更名為 /etc/rc.network 因此所有的檔案都可以用 cp /usr/src/etc/rc* /etc 來拷貝。

/etc/rc.local 出現並可以用來啟動額外的本地服務像是 INN 或某些自訂選項。

/etc/rc.serial 用來初始化序列埠(像是鎖定埠的特性等)。

/etc/rc.i386 是 Intel 專用設定,像是 iBCS2 模擬或是 PC 系統主控台設定。

由 2.1.0R 開始,你也可以在 /etc/sysconfig (或 /etc/rc.conf) 裡指定一個目錄擁有"本地"起始檔:

        # Location of local startup files.
        local_startup=/usr/local/etc/rc.local.d
      



每個以 .sh 結尾的檔將以字母順序被執行。

假如你想確保某個執行順序又不想改所有的檔名,你可以使用一個簡單 的架構如下,利用事先安排到每個檔名前的數字來確保順序:

        10news.sh
        15httpd.sh
        20ssh.sh
      



這可能看起來有點醜(或類似 SysV :-)) 但是它提供一個簡單而規律的 架構讓本地加入的套件不須編輯 /etc/rc.local 就能重新排 序。許多的 ports/packages 假設 /usr/local/etc/rc.d 是 本地起始的目錄。

Q: 我該如何簡單地加入使用者﹖

A: 使用 adduser 指令。如果需要更複雜的使用方式,請用 pw 這個指令。

要再次移除使用者,使用 rmuser 指令。

Q: 我該怎麼把新硬碟加入 FreeBSD 系統中﹖

A: 察看 www.FreeBSD.org 的磁碟格式化指導文件。

Q: 我有一個新的可移除裝置,我該怎麼使用﹖

A: 可移除裝置無論是 ZIP 或 EZ(或甚至是軟碟機,如果你要這樣使用 它),或是一個新的硬碟,只要是安裝並由系統重組,而你有磁片匣 /軟碟片/或其他東西可以插入,那這些裝置都是類似功能的東西。

(本節主要由 Mark Mayo's ZIP FAQ 引入)

假如是 ZIP 或軟碟機,你已經在上面有 DOS 檔案系統,可以使用 像這樣的命令:

        mount -t msdos /dev/fd0c /floppy
      



這是針對軟碟機,或是以下命令:

        mount -t msdos /dev/da2s4 /zip
      



使用 ZIP 的出廠預設值。

其他磁片,用 fdisk/stand/sysinstall 察看 如何配置。

接下來這個範例是 ZIP 裝在 da2,在第三個 SCSI 磁碟。

除非是軟碟機,或一個你計畫跟其他人分享使用的可移除裝置,在 安裝 BSD 檔案系統可能是一個比較好的主意。你將擁有長檔名支援 ,至少兩倍以上的效率增進,還有更高的穩定度。首先,你需要重新 製作 DOS 層的分割區/檔案系統。你可以使用 fdisk /stand/sysinstall,或對一個你不想支援多重作業系統的 小磁碟,只要把它劃分成整個 FAT 分割表(slices)並用以下 BSD 分 割法:

        dd if=/dev/zero of=/dev/rda2 count=2
        disklabel -Brw da2 auto
      



你可以使用 disklabel 或 /stand/sysinstall 去建立多重 BSD 分割區。無疑的如果你正在硬碟機上增加置換空間(swap space)時 你就需要這麼做,但是在可移除裝置如 ZIP 上可能就是無意義的。

最後,建立一個新的檔案系統,也就是在 ZIP 裝置上是使用整個磁碟:

        newfs /dev/rda2c
      



並且把它 mount 起來:

        mount /dev/da2c /zip
      



/etc/fstab 加入下面這一行可能是一個好主意,你以後就只 要打"mount /zip" :

        /dev/da2c /zip ffs rw,noauto 0 0
      



Q: 我該怎麼 mount 次要的 DOS 分割區﹖

A: 次要 DOS 分割區是在所有主要分割區之後被找到,舉例,如果你有一個 "E" 分割區在第二個 SCSI 裝置的第二個 DOS 分割區,你需要在 /dev 下 建立 "slice 5" 的特殊檔案,然後 mount /dev/da1s5:

        # cd /dev
        # ./MAKEDEV sd1s5
        # mount -t msdos /dev/da1s5 /dos/e
      



Q: 我可以在 FreeBSD 下 mount 其他異質性檔案系統嗎﹖

A: Digital UNIX UFS 光碟機可以在 FreeBSD 上直接 mount。從 Digital UNIX 和其他支援 UFS 格式的系統 mount 磁碟分割區可能更 複雜,主要細節是依賴作業系統的磁碟分割法。

Linux: 2.2 及以後的版本支援 ext2fs 分割區,請查閱 mount_ext2fs 有更多資訊。

NT: 已經有一個 FreeBSD 下可以使用的唯讀 NTFS 驅動程式 存在,更多資訊你可以察看 Mark Ovens 在 http://ukug.uk.freebsd.org/~mark/ntfs_install.html 的指導介紹。

如果您能提供任何這個主題的其他資訊,我們會很感激。

Q: 我該如何使用 NT loader 來啟動 FreeBSD﹖

A: 以下所描述的程序在 2.2.x 和 3.x(使用 3-stage 開機模式)系統之間有相當大的不同。

最普遍的想法是把你原本 FreeBSD root 分割區的第一個磁區拷貝到 DOS/NT 分割區裡的一個檔案內。假設你命名它為: c:\bootsect.bsd (由 c:\bootsect.dos 授意而來),接著你可以編輯 c:\boot.ini 檔案內容如下:

        [boot loader]
        timeout=30

        default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
        [operating systems]
        multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows NT"
        C:\BOOTSECT.BSD="FreeBSD"
        C:\="DOS"
      



對 2.2.x 版本的系統來說,此程序假設 DOS,NT,FreeBSD,或其他作業系統已經被安裝在 <同一個> 磁碟的各自分割區。本例中我的 DOS & NT 是在第一 個分割區而 FreeBSD 在第二個。我也把 FreeBSD 安裝成由 native partition 啟動,而不是 從磁碟的 MBR。

Mount 一個 DOS 格式化的軟碟(假如你已經轉換到 NTFS)或 FAT 分 割區到 /mnt

        dd if=/dev/rda0a of=/mnt/bootsect.bsd bs=512 count=1
      



重新開機進入 DOS 或 NT。NTFS 使用者把 bootsect.bsd 以及/或 bootsect.lnx 從軟碟拷貝到 C:\。修改 boot.ini 的屬性(存取許可):

        attrib -s -r c:\boot.ini
      



編輯並從上述 boot.ini 的範例加入相關適當的項目,再把屬性回復 :

        attrib +r +s c:\boot.ini
      



如果 FreeBSD 是由 MBR 啟動,在你重新設定從哪個 native 分割區啟動後 ,用 DOS 的 ``fdisk'' 命令回復它。

對 FreeBSD 3.x 版本的系統而言步驟就簡單多了。

假如 FreeBSD 是跟 NT 啟動區安裝在同一個分割區,將 /boot/boot1 拷貝成 c:\bootsect.bsd ,若 FreeBSD 跟 NT 啟動區安裝在不同分割區,則將 /boot/boot0 拷貝成 c:\bootsect.bsd 。然後參照前 面描述修改 c:\bootsect.ini 這個檔案。

Q: 我該如何用 LILO 啟動 FreeBSD 和 Linux﹖

A: 如果你在同一個磁碟機裡有 FreeBSD 和 Linux,只要跟隨 LILO 的安 裝指令,從一個非 Linux 作業系統啟動。簡略說明如下:

啟動 Linux,並在 /etc/lilo.conf 中加入以下幾行:

          other=/dev/hda2
              table=/dev/hda
              label=FreeBSD
          
(上面是假設你的 FreeBSD slice 在 Linux 是 /dev/hda2 ;請 配合自己的設定)。然後,用 root 執行 lilo 應該就完成了。

假如 FreeBSD 在另外一個磁碟,你必須在 LILO 選項中加入 ``loader=/boot/chain.b'',舉例:

          other=/dev/dab4
              table=/dev/dab
              loader=/boot/chain.b
              label=FreeBSD
          


某些情形你必須指定 BIOS 磁碟代號給 FreeBSD boot loader 以期從第 二磁碟成功的啟動。舉例,假如 FreeBSD SCSI 磁碟在 BIOS 中偵測 是 BIOS disk 1,那在 FreeBSD boot loader 的提示號出現時你必須指 定:

      Boot: 1:da(0,a)/kernel
      



在 FreeBSD 2.2.5 和之後的版本,你可以設定 boot(8) 這樣每次啟動時就會自動執行。

Linux+FreeBSD mini-HOWTO 是 FreeBSD 和 Linux 共用操作的良好 參考文件。

Q: 我怎麼使用 BootEasy 來啟動 FreeBSD 和 Linux﹖

A: 在 Linux 啟動分割區安裝 LILO 取代主要啟動資料(Master Boot Record)。接著你可以從 BootEasy 啟動 LILO。

假如你正在用 Windows-95 和 Linux,這有一個建議方法:要更簡單 的從 Linux 再次啟動在於你是否應該重新安裝 Windows95(這是一個 善妒的作業系統,它壓迫不讓其他作業系統存在於 Master Boot Record 內)。

Q: 一個所謂``危險奉獻(dangerously dedicated)''的磁碟有害嗎﹖

A: 安裝程序允許你選擇兩種不同的方法來分割你的 磁碟機。內定方法為了在同一台機器上和其他作業系統可以相容,於是 使用 fdisk table entries(FreeBSD 裡稱之為``slices''),FreeBSD 的 slice 就是使用整個自己的分割區。可供選擇的是,你可以選擇安裝 啟動選擇器(boot-selector) 在磁碟機數個可能的作業系統上來回切換。

另外一個可選擇的用法是把整個磁碟撥給 FreeBSD 使用,並且不做其他 作業系統的相容性考量。

因此為何叫它``危險的''﹖一個處於這種模式的磁碟機不包含能被正 常 PC 公用程式視為有效的 fdisk table。依循它們被設計的模式,只 要它們在這樣一個磁碟機中一旦被觸及可能就會產生錯誤的提示,或更 糟糕的,可能未經提示或通知你就把 FreeBSD bootstrap 弄壞。另外 ,``危險奉獻''的磁碟 layout 會誤導許多廠牌的 BIOSsen(BIOS 偵測) 像是AWARD(比如說在 HP Netserver 和 Micronics 等以及其他許多系 統),和 Symbios/NCR(如在 SCSI controllers 中很流行的 53C8xx 系列)。這並非一個完整的列表,還有更多未列出。這種誤導的徵兆包 括由 FreeBSD bootstrap 啟動,當硬碟無法被找到時而印出 "read error" 的訊息,以致於整個系統在啟動中整個停滯。

那為何又要有這種模式呢?它只節省磁碟空間中數 kbyte 的大小, 而對一個新的安裝過程中卻可能產生實際的困難。`危險奉獻'模式原本 的想法是基於避免一個全新 FreeBSD installer 中最常見的問題 - 為 了要在磁碟機上配合 BIOS 的 ``geometry'' 數目。

``Geometry''是一個有點落伍的概念,但是卻仍在 PC 的 BIOS 中 使用並且與磁碟機交互運作著,當 FreeBSD installer 建立 slice 時 ,它必須記錄這些 slices 在磁碟機上的位置,這方法必須和 BIOS 希 望能找到它們的位置一致。假如錯了,你將不可能啟動系統。

``Dangerously dedicated''模式(後面會簡稱為 DD mode)試著要讓 這個問題簡單一點,某些情形下它做對了。但這只能當成最後的下下之 策 - 還有更好的方法可以解決這問題的絕大部份。(譯者:這部份用了 許多的口語用詞,原文照錄以供對照。)

``Dangerously dedicated'' mode tries to work around this by making the problem simpler. In some cases, it gets it right. But it's meant to be used as a last-ditch alternative - there are better ways to solve the problem 99 times out of 100.

因此,當你在安裝時怎麼避免要使用``DD''模式?在開始時記下 BIOS 要求使用磁碟機的 geometry,你可以在啟動的 ``boot:''提示 號出現時,以``-v''指定核心印出這個訊息,或是在 loader 裡面 使用``boot -v''。在 installer 開始動作前,核心會印出一串 BIOS geometries。別緊張 - 等 installer 開始啟動後使用 scrollback 方式去讀這些數字,按照慣例地 BIOS 磁碟機的單元會跟 FreeBSD 列 舉出來的一樣,IDE 先,然後才是 SCSI。

當你在分割你的磁碟時,檢查在 FDISK 螢幕上出現的磁碟 geometry 是正確的(也就是說要跟 BIOS 的數字相符合);如果錯了,用``g''按鍵 修改。當你在螢幕上看不到任何磁碟機,或假使磁碟機已經由另一個系 統中移除時,特別應該這麼做。值得注意的是這只是指定你要由哪個磁碟 上啟動;FreeBSD 將會自行找出在你系統上的其他磁碟機。

一旦你取得 BIOS 跟 FreeBSD 兩者對磁碟機 geometry 的共識,你 的困難幾乎已經迎刃而解,而且再也不需要使用``DD''mode。然而,假 如你仍擔心當你嘗試啟動時會看到``read error''訊息,這時候你能做 的就是禱告然後試看看 - 反正也沒什麼好失去的。

要把``危險奉獻''的磁碟回復到正常 PC 使用,基本上有兩個選擇。 第一,是你把足夠的 NULL 位元組寫入 MBR 確保任何隨後的安裝程 式相信這只是一個空白的磁碟。舉例來說你可以這樣做:

        dd if=/dev/zero of=/dev/rda0 count=15
      



或是採用另外一個,非正式的 DOS ``特色'':

        fdisk /mbr
      



這將會安裝一個全新的主要啟動記錄,因此會破壞 BSD bootstrap。

Q: 我如何能加入更多的置換空間(swap space)﹖

A: 最好的方法是增加你 swap 分割區的大小,或利用這個方便理由的好處去 增加另一個硬碟。慣例算法是用主記憶體的兩倍當置換空間(swap space) ,然而如果你只有很少量的主記憶體,你可能想另外設定 swap。設定足夠 的置換空間,並為以後記憶體擴充預作準備可能是個好主意,這樣以後就 不需要再做一次置換空間的設定。

在分散的磁碟上增加置換空間會比單純地在同一個磁碟加入置換空間 讓效率來的快一點。舉一個例子來說,如果你正在一個磁碟裡編譯來 源程式,而置換空間在另一個磁碟,這會比置換空間跟編譯程式都在 同一個磁碟時來得快。這對 SCSI 磁碟機特別正確。

當你有好幾個磁碟機時,在每個磁碟上設定一個 swap 分割區是有 利的,甚至最後使用一整個磁碟機當置換空間。一般來說,每個系統 上的快速磁碟都應設定某些 swap,FreeBSD 內定支援最多四個交錯式 swap 裝置。通常設定多重 swap 分割區時你會想讓它們都使用同樣大 小,但有時我們會想讓主要 swap 分割區(primary swap partition) 更大一點以容納核心程式的 core dump。你的 primary swap partition 至少必須和主記憶體一樣大,以能容納一個 kernel core。

IDE 磁碟並不允許同時在同一通道裡存取兩個裝置(FreeBSD 不支援 mode 4,因此所有的 IDE 磁碟 I/O 是``可程式化的'')。然而我仍 會建議你把置換空間放在分別的磁碟。磁碟機這麼便宜,實在沒什麼 好擔心的。

在 NFS 上做置換僅在以下情形被建議使用:你沒有自己的磁碟可 以使用。FreeBSD 4.0 以前 release 的版本在 NFS 上做置換是相當 緩慢而無效率的,但在等於 4.0 或之後的 release 版本就有合理的 速度了。即使如此,還是受到網路有效頻寬和在 NFS server 上額外 裝載的限制。

這裡有個範例是用 64MB vn-swap (/usr/swap0,當然你能用 任何你想用的名字)。

確定你的核心程式建立時有包含以下這行:

        pseudo-device   vn 1   #Vnode driver (turns a file into a device)
      



在你的設定檔中。GENERIC 這個核心已經包含這項了。

  1. 建立一個 vn-device

              cd /dev
              sh ./MAKEDEV vn0
            



  2. 建立一個置換檔 (/usr/swap0)

              dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
            



  3. 設定適當的存取權於(/usr/swap0)

              chmod 0600 /usr/swap0
            



  4. /etc/rc.conf 中啟動置換檔

              swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
            



  5. 重新開機。



要馬上啟動置換檔,鍵入:

        vnconfig -ce /dev/vn0c /usr/swap0 swap
      



Q: 我不會設定我的印表機。

A: 請參閱 Handbook 裡有關列印的部份。這應該能解決你大部分的問題,請看 Handbook entry on printing.

Q: 我系統上的鍵盤配置錯了。

A: kbdcontrol 程式有一個選項可以讀取鍵盤配置檔案。在 /usr/share/syscons/keymaps 有一些配置檔。選擇一個跟你的 相關的並讀取它。

        kbdcontrol -l uk.iso
      



/usr/share/syscons/keymaps.kbd 延展集兩個都由 kbdcontrol 所斷定。

可以從 /etc/sysconfig (或 rc.conf) 來設定,請看此檔裡相關的註解。

在 2.0.5R 及其之後的版本,所有跟文字字型,鍵盤對應相關的設定都在 /usr/share/examples/syscons

以下是目前支援的對應設定:

  • Belgian ISO-8859-1

  • Brazilian 275 keyboard Codepage 850

  • Brazilian 275 keyboard ISO-8859-1

  • Danish Codepage 865

  • Danish ISO-8859-1

  • French ISO-8859-1

  • German Codepage 850

  • German ISO-8859-1

  • Italian ISO-8859-1

  • Japanese 106

  • Japanese 106x

  • Latin American

  • Norwegian ISO-8859-1

  • Polish ISO-8859-2 (programmer's)

  • Russian Codepage 866 (alternative)

  • Russian koi8-r (shift)

  • Russian koi8-r

  • Spanish ISO-8859-1

  • Swedish Codepage 850

  • Swedish ISO-8859-1

  • Swiss-German ISO-8859-1

  • United Kingdom Codepage 850

  • United Kingdom ISO-8859-1

  • United States of America ISO-8859-1

  • United States of America dvorak

  • United States of America dvorakx



Q: 我無法讓 user quotas 正常工作。

A:

  1. 不要在 '/' 打開 quotas,

  2. 把 quotas 檔放在它必須強迫置入的檔案系統內,舉例:

              FS      QUOTA FILE
              /usr    /usr/admin/quotas
              /home   /home/admin/quotas
              ...
            





Q: 我的 ccd 有何不妥﹖

A: 這種情形的徵兆是:

        # ccdconfig -C
        ccdconfig: ioctl (CCDIOCSET): /dev/ccd0c: Inappropriate file type or format
        #
      



通常這會發生在你嘗試要連結 `c' 分割區,這內定的型別是`無法使用的' 。ccd 驅動程式需要的基礎分割區型別為 FS_BSDFFS,編輯你要試著連結的磁碟 標記並更改分割區的型別為`4.2BSD'。

Q: 為何我不能編輯我 ccd 的磁碟標記﹖

A: 這種情形的徵兆是:

        # disklabel ccd0
        (這裡印出某些明顯的資料,所以試著編輯它)
        # disklabel -e ccd0
        (編輯,儲存,然後離開)
        disklabel: ioctl DIOCWDINFO: No disk label on disk;
        use "disklabel -r" to install initial label
        #
      



這是因為由 ccd 傳回的磁碟標記事實上是一個`假的'而沒有真正在磁碟 上。你可以把它完全寫入來解決這個問題,像這樣:

        # disklabel ccd0 > /tmp/disklabel.tmp
        # disklabel -Rr ccd0 /tmp/disklabel.tmp
        # disklabel -e ccd0
        (this will work now)
      



Q: FreeBSD 支援 System V IPC 格式指令集?

A: 是的,FreeBSD 支援 System V-style IPC。這包括共享記憶體,訊息跟 信號。你需要在你的核心設定檔內加入下列幾行以啟動它們。

        options    SYSVSHM
        options    "SHMMAXPGS=64"   # 256Kb of sharable memory
        options    SYSVSEM          # enable for semaphores
        options    SYSVMSG          # enable for messaging
      



重新編譯並安裝。

注意: 如果你要執行 GIMP 你可能需要增加 SHMMAXPKGS 到某些荒 謬的數目像是 4096(16M!),256Kb 對 X11R6 共享記憶體來說已經充分足 夠了。

Q: 我該如何使用 sendmail 透過 UUCP 來遞送郵件?

A: 跟隨 FreeBSD 套裝而來的 sendmail 設定是適合那些直接連上網際網路 的站台。想透過 UUCP 交換郵件的站台必須另外安裝 sendmil 的設定檔 案。

手動修改 /etc/sendmail.cf 是絕對必要的。第 8 版的 sendmail 提供一個全新的入口以透過一些像 m4 的處理就能 產生設定檔,這事實上是一個高層概念等級的技巧性設定。你應該可以在以 下檔案裡使用它:

        /usr/src/usr.sbin/sendmail/cf
      



假如你不是用 full sources 方式安裝系統,那麼 sendmail 設定項目可 能已經分散成好幾個來源分布檔在等著你,假設你已經 mount 光碟機,做 以下動作:

        cd /usr/src
        tar -xvzf /cdrom/dists/src/ssmailcf.aa
      



別驚慌,這只有數十萬個位元組的大小。在 cf 目錄裡的 README 可以提供一個 m4 設定法的基本介紹。

以 UUCP 遞送來說,建議你最好使用 mailertable 特點。 建構一個資料庫讓 sendmail 可以使用它自己的路徑決策。

首先,你必須建立自己的 .mc 檔。 /usr/src/usr.sbin/sendmail/cf/cf 目錄是這些檔案的家。 查看一下,已經有好幾個範例檔,假設你已經命名自己的檔叫 foo.mc,你要做的只是把它轉換成一個有效的 sendmail.cf

        cd /usr/src/usr.sbin/sendmail/cf/cf
        make foo.cf
        cp foo.cf /etc/sendmail.cf
      



一個典型的 .mc 檔看起來可能像這樣:

        include(`../m4/cf.m4')
        VERSIONID(`Your version number')
        OSTYPE(bsd4.4)

        FEATURE(nodns)
        FEATURE(nocanonify)
        FEATURE(mailertable)

        define(`UUCP_RELAY', your.uucp.relay)
        define(`UUCP_MAX_SIZE', 200000)

        MAILER(local)
        MAILER(smtp)
        MAILER(uucp)

        Cw    your.alias.host.name
        Cw    youruucpnodename.UUCP
      



nodnsnocanonify 特性將避免任何在遞送郵件 時會用到 DNS 的機會。UUCP_RELAY 項目的出現理由很奇怪, 就不要問為何了。簡單的放入一個網際網路上可以處理 .UUCP 虛擬網域 位址的主機名稱;通常,你只需要在這裡填入你 ISP 的信件回覆處 (mail replay)。

你已經做到這裡了,你還需要這個叫 /etc/mailertable 的 檔案。一個典型的範例如下:

        #
        # makemap hash /etc/mailertable.db < /etc/mailertable
        #
        horus.interface-business.de   uucp-dom:horus
        .interface-business.de        uucp-dom:if-bus
        interface-business.de         uucp-dom:if-bus
        .heep.sax.de                  smtp8:%1
        horus.UUCP                    uucp-dom:horus
        if-bus.UUCP                   uucp-dom:if-bus
        .                             uucp-dom:sax
      



如你所見,這是某個真實檔案裡的一部份。首三行處理網域定址信件 不應該被送出到內定路徑,而由某些 UUCP 鄰居(UUCP neighbor)取代 的特殊情形,這是為了``縮短''遞送的路徑。下一行處理到本地乙太 網路網域的信件讓它可以使用 SMTP 來遞送。最後,UUCP 鄰居提到 .UUCP 虛擬網域的記載,允許一個``uucp-neighbor!recipient''推翻內定規則。最後一行則以一 個單獨的句點做結束,以 UUCP 遞送到提供當你全世界性郵件閘門的 UUCP 鄰居。所有在 uucp-dom: 關鍵字裡的節點名稱必須都是 有效的 UUCP 鄰居,你可以用 uuname 命令去確認。

提醒你這個檔案在使用前必須被轉換成 DBM 資料庫檔案,最好在 mailertable 最上面用註解寫出命令列來完成這個工作。當你每次更換你 的 mailertable 後你總是需要執行這個命令。

最後提示:如果你不確定某些特定的信件路徑可用,記得把 -bt 選項加到 sendmail。這會將 sendmail 啟動在 address test mode ;只要按下 ``0'',接著輸入你希望測試的信件路徑位址。最後一行告訴你使 用內部的信件代理程式,代理程式的會通知目的主機,以及(可能轉換的)位址 。要離開此模式請按 Control-D。

        j@uriah 191% sendmail -bt
        ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
        Enter <ruleset> <address>
        > 0 foo@interface-business.de
        rewrite: ruleset  0   input: foo @ interface-business . de
        ...
        rewrite: ruleset  0 returns: $# uucp-dom $@ if-bus $: foo \
        < @ interface-business . de >
        > ^D
        j@uriah 192%
      



Q: 當我用撥接連上網路時該怎麼設定信件遞送?

A: 如果你已經有一個固定的 IP 數字,你不需要調整任何內定值。設好 你要指定的網路名稱,其他的 sendmail 都會幫你做完。

如果你拿到的是動態配置的 IP 數字而使用撥接 ppp 連接到網 際網路,你可能已經在你的 ISP 信件主機上有一個信箱。假設你的 ISP 網域是 myISP.com,你的使用者名稱是 user。亦假 設你稱自己的主機名稱是 bsd.home 而你的 ISP 告訴你可以使用 relay.myISP.com 當作信件回覆處。

為了從你的信箱接收信件,你將需要安裝取信程式以便從信箱取回信件。 Fetchmail 是一個不錯的選擇因為它支援許多不同的通訊協定,通常 你的 ISP 會提供 POP3。如果你選擇使用 user-ppp,你可以在連線到網路 成功後自動抓取你的信件,只要在 /etc/ppp/ppp.linkup 裡面 設定以下這項:

        MYADDR:
          !bg su user -c fetchmail
      



假使你正使用 sendmail(如下所示)傳送信件到非本地帳號 ,置入以下命令:

         !bg su user -c "sendmail -q"
      



在上面那項命令之後。這會強迫 sendmail 在連接上網路後馬上開始處 理 mailqueue。

我假設你在 bsd.home 機器上有一個 user 的帳號。在 bsd.home 機器上 user 的家目錄裡建立一個 .fetchmailrc 的檔案:

        poll myISP.com protocol pop3 fetchall pass MySecret;
      



無須贅言,這個檔除了 user 外不應該被任何人讀取,因為它包含 了 MySecret 這個密碼。

為了在寄信時有正確的抬頭 from: ,你必須告訴 sendmail 使用 而非 。你可能會希望告訴 sendmail 從 relay.myISP.com 送出所有信件,加快信件傳送。

以下的 .mc 檔應能滿足你的要求:

        VERSIONID(`bsd.home.mc version 1.0')
        OSTYPE(bsd4.4)dnl
        FEATURE(nouucp)dnl
        MAILER(local)dnl
        MAILER(smtp)dnl
        Cwlocalhost
        Cwbsd.home
        MASQUERADE_AS(`myISP.com')dnl
        FEATURE(allmasquerade)dnl
        FEATURE(masquerade_envelope)dnl
        FEATURE(nocanonify)dnl
        FEATURE(nodns)dnl
        define(SMART_HOST, `relay.myISP.com')
        Dmbsd.home
        define(`confDOMAIN_NAME',`bsd.home')dnl
        define(`confDELIVERY_MODE',`deferred')dnl
      



如何轉換這個 .mc 檔案到 sendmail.cf 檔的詳細細節請 參考上一節。另外,在更新 sendmail.cf 以後不要忘記重新啟動 sendmail。

Q: 咦!我忘記 root 的密碼了!

A: 不要驚慌!只要重新啟動系統,在看到 Boot: 時輸入 boot -s 即可進入單使用者模式(在 3.2-RELEASE 之前的版本請改用 -s )。 在問要使用哪個 shell 時,按下 ENTER。你會看到一個 # 的提示號,輸入 mount -u / 以重新掛上(mount)你的根檔案系統可供讀/寫。執行 passwd root 以更換 root 密碼,然後執行 exit 繼續啟動程序。

Q: 我該怎麼保留讓 Control-Alt-Delete 不能重新啟動系統?

A: 如果你是使用 FreeBSD 2.2.7-RELEASE 或之後版本的 syscons(系統內定的主控台驅動程式),把下列這行放到核心設定檔內然後重做一個新的核心:

    options SC_DISABLE_REBOOT

若是使用 FreeBSD 2.2.5-RELEASE 或之後版本的 PCVT 主控台驅動程式, 則以下列選項代替:

    options PCVT_CTRL_ALT_DEL

其他更早期的 FreeBSD 版本,請修改你正在使用的主控台鍵盤對應,並將所有 boot 關鍵字以 nop 取代。內定的鍵盤對應是在 /usr/share/syscons/keymaps/us.iso.kbd。你可能需要明白的 吩咐 /etc/rc.conf 去讀取這個鍵盤對應以確保更動生效。當 然如果你正在用適合你國籍的鍵盤對應,你應該編輯那一個。

Q: 我該怎麼把 DOS 文字檔案重新格式化成 UNIX 的?

A: 簡單地使用這個 perl 命令:

perl -i.bak -npe 's/\r\n/\n/g' file ...



file 就是要處理的檔案。這個修改是在內部完成,原始的檔案會儲存成 副檔名為 .bak 的檔案。

或者你可以使用 tr 這個命令:

tr -d '\r' < dos-text-file > unix-file



dos-text-file 是包含 DOS 文字的檔案,而 unix-text-file 則是包含 轉換的輸出結果。這比使用 perl 還要快上一點點。

Q: 我該怎麼用名稱砍掉 process?

A: 使用 killall

Q: 為何在 root 的 ACL 時 su 好像有問題?

A: 這個錯誤是因為 Kerberos 分散認證系統。這個問題並不是很嚴重但是令人 厭煩。你可以用 -K 選項去執行 su,或是像下個問題所描述的移除 Kerberos。

Q: 我該怎麼移除 Kerberos?

A: 要從系統裡移除 Kerberos,重裝你正在執行的 release 版本的 bin distribution。如果你有 CDROM,你可以 mount cd(假設在 /cdrom)並執 行:

cd /cdrom/bin
./install.sh



Q: 我該怎麼增加系統的虛擬終端機?

A: 如果你有許多 telnet,ssh,X 或是 screen 使用者,你或許會用完虛擬 終端機,這能教你怎麼加更多:

  1. 建立並安裝一個新的核心程式並且加入這行到設定檔:

           pseudo-device pty 256
         



  2. 執行這個命令:

         # cd /dev
         # ./MAKEDEV pty{1,2,3,4,5,6,7}
         



    會造出 256 個虛擬終端機的裝置節點。

  3. 編輯 /etc/ttys 並加入符合 256 個終端機的行數。它們應 該符合已經存在單項的格式,舉例來說,它們看起來像:

           ttyqc none network
         



    字母設計的順序是 tty[pqrsPQRS][0-9a-v],使用正規表示式。

  4. 用新的核心程式重新啟動電腦就可以了。



Q: /dev/snd0 這個裝置做不出來!

A: 可以用這個命令產生音效卡所需要的 snd0 裝置:

     # cd /dev
     # sh MAKEDEV snd0



這個命令並不會做出 /dev/snd0,而是產生 mixer0audio0dsp0 及類似的裝置。雖然如此,如果您想使用 音效,仍然要執行這個命令。

Q: 可以不用開機,重新讀取 /etc/rc.conf、再次啟動 /etc/rc 嗎?

A: 先進入單人使用者模式,然後再回到多使用者模式。

在主控台執行:

     # shutdown now
     (Note: without -r or -h)

     # return
     # exit



Q: 什麼是 sandbox?

A: "Sandbox" 是系統安全用的術語,有兩個意義:

  • 放在某些虛擬防護牆裡的執行程序,這些防護牆是用來阻止某些人侵入 這道程序,進而出入於更大的系統中。

    這道程序可以完全在防護牆裡動作。也就是說,它所執行的任何程式不 可能會滲透到牆的外面。所以如果您對它有安全上的顧慮,並不需要特別去 監聽它的一舉一動,反正它只能在牆內活動。

    舉例來說,可以用 userid 來做這道防護牆,這正是 security(7) 和 named(8) 說明文件中的定義。

    現在就用 'ntalk' 這個服務作說明(見 /etc/inetd.conf)。這個服務 以前的 userid 是 root,現在執行時則是用 tty。tty 這個 userid 就是一 個 sandbox,如果有人能夠順利用 ntalk 侵入系統,現在他就算進得來也只 能用 tty 這個 userid。

  • 放在某個模擬機器裡的程式,這比上述來得更嚴密。基本上這表示能侵入 該程式的人相信他能再進入所屬的機器,但事實上只會進入模擬出來的機器, 無法進一步修改任何資料。

    達到這個目的最常用的方法,就是在某個子目錄下做出模擬的環境,然後 用 chroot 執行該程式,這樣該程式的根目錄便是這個子目錄,而非系統真 正的根目錄。

    另一個常見作法是將某個檔案系統 mount 成唯讀,但在它上面另外製造 出程式以為可以寫入的檔案系統。這個程式會相信它可以對其他檔案讀寫, 但只有它看不到這個唯讀效應 - 系統執行的一般程式都看得到。

    我們試圖將這類 sandbox 盡量透明化,讓使用者或侵入者無法看到他是 否在某個 sandbox 裡面。



UNIX 實作兩種 sandbox,一個在程式層面,另一個則是由 userid 來達成。

每個 UNIX 執行程序會用防火牆將它和所有其他程序隔開,某個程序不可以 隨意修改其他程序位址的資料。這和 Windows 中,程式可以輕易修改其他位址 資料的情況,大不相同。

每個 UNIX 程序都屬於某個特定的 userid。如果該 userid 不是 root,就 會將它和其他使用者的程序隔開。Userid 同時也用於硬碟資料的存取權上。

Q: 我該怎麼讓一般使用者掛上軟碟機及其他可移除媒體?

A: 一般使用者應該也要有掛上裝置的功能,接下來是方法:

  1. root 針對可移除媒體的區塊裝置 (block device) 指定適當的存取權限。

    舉例來說,為了讓使用者能使用第一個軟碟機,用以下方法:

        # chmod 777 /dev/fd0
    
  2. root 設定 vfs.usermount 這個 sysctl 變數為 1

        # sysctl -w vfs.usermount=1
    

這樣使用者就可以在他們自己的目錄下掛上 /dev/fd0

    %  mkdir ~/my-mount-point
    %  mount -t msdos /dev/fd0 ~/my-mount-point

解除已經掛上的裝置也很簡單:

    % umount ~/my-mount-point

然而啟動 vfs.usermount 這個 sysctl 參數可能會有負面的安全性影響, 一個要存取 MSDOS 格式媒體的較佳方式請參考以下這個 link: mtools


Chapter 8. X Window System 及 Virtual Consoles

Q: 我想要執行 X ,我該怎麼做?
Q: 為什麼我不能在 X 裡使用滑鼠?
Q: X Window 的選單和對話框不能正常運作!
Q: 什麼是 virtual console?我要怎麼做才能用多一點?
Q: 我要怎麼從 X 切換到 virtual console?
Q: 我要怎麼做才能在開機時啟動 XDM?
Q: 當我執行 xconsole 時,發生了 "Couldn't open console" 的錯誤
Q: 我的 PS/2 滑鼠在 X 中有點不正常
Q: 我的 PS/2 滑鼠不能透過 MouseSystem 來運作
Q: 當我建立 X 程式時,imake 說它找不到 Imake.tmpl 。它在那?
Q: 我要怎麼做才能設定左撇子用的滑鼠?
Q: 要如何安裝 splash 圖形顯示程式?那裡可以找得到呢?

Q: 我想要執行 X ,我該怎麼做?

A: 最簡單的方法就是在安裝系統的時候一併安裝。

然後看看 xf86config 的 man page ,這個程式可以幫您設定 XFree86(tm) 使它 能夠使用您的顯示卡/滑鼠等週邊。

您或許也想試試看 Xaccel server。詳情請看 Metro Link 或是 Xi Graphics 這一段。

Q: 為什麼我不能在 X 裡使用滑鼠?

A: 如果您用的是 syscons (內定的 console 驅動程式) 的話,您可以經由設定 FreeBSD 來讓它支援在每個 virtual console 使用滑鼠。為了避免和 X 產生衝 突,syscons 使用了一個叫做``/dev/sysmouse''的虛擬裝置。所有滑 鼠產生的 event 都會利用 MouseSystems 這個協定來傳到 sysmouse 這個裝置 。如果您希望在一個或以上的 virtual console 上使用滑鼠,並且 能夠 使用 X 的話,我們建議您這樣設定:

        /etc/rc.conf:
          moused_type=ps/2          # or whatever your actual type is
          moused_port=/dev/psm0     # or whatever your real port is
          moused_flags=

        /etc/XF86Config
          Section Pointer
              Protocol "MouseSystems"
              Device   "/dev/sysmouse"
              .....
      



有些人比較喜歡在設定 X 的時候用 "/dev/mouse" 這個裝置。如 果您要讓它能夠正常工作的話,您就必須把 "/dev/mouse" 連結到 /dev/sysmouse

        # cd /dev
        # rm -f mouse
        # ln -s sysmouse mouse
      



Q: X Window 的選單和對話框不能正常運作!

A: 把 Num Lock 關掉試試。

如果您的 Num Lock 在開機時的預設值是開著的話,您必須把下列這行放到 XF86Config 設定檔中的 "Keyboard" 部份。

        # Let the server do the NumLock processing.  This should only be
        # required when using pre-R6 clients
            ServerNumLock
      



Q: 什麼是 virtual console?我要怎麼做才能用多一點?

A: 簡單來說,virtual console 就是可以讓您不必做太多複雜的設定如使用網 路或執行 X ,而在同一臺機器上同時做好幾件事的方法。

當啟動系統並顯示完所有開機訊息之後,您就會在螢幕上看到一個 login 的 提示符號。在這個時候您就可以輸入您的 login name 以及 password ,然後就 可以在第一個 virtual console 上開始工作了 (或者開始玩!) 。

在某些情況下,您可能會想要作其他的工作,例如說是看看您正在執行的程 式的說明文件,或是當您在 FTP 傳輸的等待時間中看看您的郵件。您只需要按 Alt-F2 (按住 Alt 鍵不放,並按下 F2 鍵) ,然後您就會在第二個 "virtual console" 上看到一個 login 提示符號!當您想要回到原來的工作時,請按 Alt-F1。

FreeBSD 在安裝時的預設值是使用三個 virtual console ,您可以用 Alt-F1,Alt-F2,以及 Alt-F3 在它們之間做切換。

如果您想要多一點 virtual console 的話,您只需要編輯 /etc/ttys 這個檔 ,在 "Virtual terminals" 這個註解後面加入 "ttyv4" 到 "ttyvc" 的欄位:

        # Edit the existing entry for ttyv3 in /etc/ttys and change
        # "off" to "on".
        ttyv3   "/usr/libexec/getty Pc"         cons25  on secure
        ttyv4   "/usr/libexec/getty Pc"         cons25  on secure
        ttyv5   "/usr/libexec/getty Pc"         cons25  on secure
        ttyv6   "/usr/libexec/getty Pc"         cons25  on secure
        ttyv7   "/usr/libexec/getty Pc"         cons25  on secure
        ttyv8   "/usr/libexec/getty Pc"         cons25  on secure
        ttyv9   "/usr/libexec/getty Pc"         cons25  on secure
        ttyva   "/usr/libexec/getty Pc"         cons25  on secure
        ttyvb   "/usr/libexec/getty Pc"         cons25  on secure
      



您想用幾個就設幾個。您設越多 virtual terminal ,它們就用掉越多系統 資源;如果您只有不到 8MB 的記憶體的話,這影響就大了。您可能也會想把 "secure" 換成 "insecure" 。

IMPORTANT NOTE 如果您想要執行 X 的話,您 必須 為它保留 ( 或關掉) 至少一個 virtual terminal 。這就是說,如果您想在按十二個 Alt 功能鍵時都有 login 提示符號,而且又在同一部電腦上也想執行 X 的話,那麼 這真是太不幸了 - 您只能用十一個。

取消一個 console 最簡單的方法就是把它關掉。舉例來說,如果您像上面講 的一樣設定了全部的 12 個 terminal 並且想要執行 X ,您必需把 virtual terminal 12 從:

        ttyvb   "/usr/libexec/getty Pc"         cons25  on secure
      



設成:

        ttyvb   "/usr/libexec/getty Pc"         cons25  off secure
      



如果您的鍵盤只有 10 個功能鍵的話,您就要改成這樣:

        ttyv9   "/usr/libexec/getty Pc"         cons25  off secure
        ttyva   "/usr/libexec/getty Pc"         cons25  off secure
        ttyvb   "/usr/libexec/getty Pc"         cons25  off secure
      



(您也可以直接把這幾行砍掉。)

一旦您改了 /etc/ttys, 下一個步驟就是要確定您有足夠的 virtual terminal 裝置。最簡單的方法就是:

        # cd /dev
        # ./MAKEDEV vty12                 # For 12 devices
      



再過來,想要啟動這些 virtual console 最簡單 (也是最乾淨) 的做法就是 重開機。然後,如果您不想重開機的話,您可以把 X Window 關掉,然後用 root 的身份執行下列指令:

        kill -HUP 1
      



當您執行這個命令前,您一定要完全把 X Window 關掉。如果您不這麼做的 話,您的系統可能會在您執行 kill 命令後出現當掉或鎖死的情況。

Q: 我要怎麼從 X 切換到 virtual console?

A: 如果您螢幕上正在顯示 X Window 的話,您可以用 Ctrl-Alt-F1 等按鍵來切 換到 virtual console 。注意,一旦您從 X Window 切換到任一個 virtual console 之後,您就可以只用 Alt- 功能鍵來切換到其他 virtual terminal 或 是切回 X Window 。您不必同時按著 Ctrl 鍵。如果在比較舊的版本中您用 Ctrl 鍵來切回 X Window 的話,您會發現您的文字螢幕被卡在 "control-lock" 模式下。您只需要再按一次控制鍵就可以恢復原狀。

Q: 我要怎麼做才能在開機時啟動 XDM?

A: 有兩種方法可以啟動 xdm 。一種方法是從 /etc/ttys 來啟動,可以參考 man page 中的範例;另一種方法是在 rc.local 執行 xdm ,或是在 /usr/local/etc/rc.d 放一個 X.sh 。這兩 種方法都是合法的,如果您試某一種方法無效的話,您可以試試另外一種。這兩 種方法的結果是一樣的:X 會顯示一個圖形化的 login: 提示。

用 ttys 的方法的優點,在於指明了 X 在啟動時到底是用那個 vty,並且將 logout 時重新啟動 X server 的責任丟給 init。 rc.local 的方法則是在當啟 動 X 出了問題時,可以很輕鬆地把 xdm 殺掉來解決問題。

如果是用 rc.local 的方法,在執行 xdm 時您不能加任何參數(也就 是跑成 daemon)。必須在 getty 執行後才能啟動 xdm,否則 getty 和 xdm 會 互相衝突而鎖住 console。最好的方式是在 script 中加個 sleep,讓它暫停 10 秒鐘左右,接著才執行 xdm。

前一版的 FAQ 說您必須把您想讓 X 使用的 vt 加到 /usr/X11R6/lib/X11/xdm/Xservers 檔裡去。這是不必要的:X 會自 動使用第一個找到的可用 vt

Q: 當我執行 xconsole 時,發生了 "Couldn't open console" 的錯誤

A: 如果您是用 startx 來啟動 X 的話,/dev/console 的權限並不會改變,結果就是 xterm -Cxconsole 這類的程式無法正常執行。

這一切的問題,都是因為 console 的權限是採用系統預設值。在一個多使用 者的系統裡,我們不希望每個使用者都可以直接寫入系統 console 。如果使 用者是從機器的 VTY 直接 login 的話,那麼 fbtab 可以解決這類的問題。

簡單地說,請確保 /etc/fbtab 這個檔案中的這一行沒有被註解掉:

        /dev/ttyv0 0600 /dev/console
      



這一行設定的存在可以確保從 /dev/ttyv0 登入的使用者可以控制 console 。

Q: 我的 PS/2 滑鼠在 X 中有點不正常

A: 您的滑鼠和您的滑鼠驅動程式可能存在有不同步的現象。

在 2.2.5 以及更早的系統裡,從 X 切到 virtual terminal 然後再切回來 就可以使它們重新做同步的動作。如果這個問題常常發生的話,您可以在您的 核心設定檔中加入下面這個選項然後重新編譯:

        options PSM_CHECKSYNC
      



如果您沒有建立核心程式的經驗,請看 自訂核心 這一節。

加上這個選項以後,滑鼠和滑鼠驅動程式間的同步問題應該就比較不會出現 了。如果這個問題仍然存在的話,在移動滑鼠時按按滑鼠按鍵可以使滑鼠和滑 鼠驅動程式重新做同步的動作。

該注意的是這個選項並不是對每一個系統都有效,它可能會讓接在 PS/2 滑 鼠位置的 ALPS GlidePoint 裝置失去 "tap" 這項功能。

在 2.2.6 及其後的版本,同步的確認已經有了較好的解決辦法,而且這些都 已經是 PS/2 滑鼠驅動程式的標準了。這個方法也可以在 GlidePoint 上正常工 作。 (因為確認的程式碼已經成為一個標準功能,所以在這些版本中我們不在提 供 PSM_CHECKSYNC 的選項了。) 不過在極少數的案例中,這些驅動程式會誤報 同步性錯誤,然後您就會看到這樣的核心訊息:

        psmintr: out of sync (xxxx != yyyy)
      



然後您就會發現您的滑鼠不能正常運作了。

如果您發生了這樣的狀況,您必須藉由把 PS/2 滑鼠驅動程式的 flag 設成 0x100 來把同步確認的程式碼給取消掉。然後在開機提示符號時用 "-c" 選項來進入 UserConfig

        boot: -c
      



然後,在 UserConfig 的命令列中鍵入:

        UserConfig> flags psm0 0x100
        UserConfig> quit
      



Q: 我的 PS/2 滑鼠不能透過 MouseSystem 來運作

A: 有一些報告指出某些廠牌的 PS/2 滑鼠只能在 "高解析度" 狀態下才能運作 。如果不是的話,滑鼠游標會常常跑到螢幕的左上角去。

非常不幸的,這個問題在 2.0.X 和 2.1.X 下是無解的。在 2.2 到 2.2.5 版,您可以對 /sys/i386/isa/psm.c 使用下列 patch 然後重建您的 核心。如果您沒有建立核心程式的經驗,請看 自訂核心 這節。

diff -u psm.c.orig psm.c
@@ -766,6 +766,8 @@
     if (verbose >= 2)
  log(LOG_DEBUG,"psm%d: SET_DEFAULTS return code:%04x\n",
      unit,i);
+    set_mouse_resolution(sc->kbdc,PSMD_RES_HIGH);
+
 #if 0
     set_mouse_scaling(sc->kbdc);  /* 1:1 scaling */
     set_mouse_mode(sc->kbdc); /* stream mode */
      



在 2.2.6 及以後的版本,在 PS/2 滑鼠驅動程式中設定 0x04 的 flag 會 把滑鼠設成高解析度模式。在開機提示符號時用 "-c" 選項來進入 UserConfig

        boot: -c
      



然後,在 UserConfig 的命令列中鍵入:

        UserConfig> flags psm0 0x04
        UserConfig> quit
      



前一節有提到另一個可能導致滑鼠問題的原因。

Q: 當我建立 X 程式時,imake 說它找不到 Imake.tmpl 。它在那?

A: Imake.tmpl 是 Imake 套件的一部份,Imake 是標準的建立 X 程式的工具。 Imake.tmpl 和其他數個 header file 一樣是建立 X 程式的必要檔案,您可以在 X prog distribution 中找到它們。您可以用 sysinstall 來安裝或是直接從 X distribution 中手動安裝。

Q: 我要怎麼做才能設定左撇子用的滑鼠?

A: 在您的 .xinitrc 或是 .xsession 中執行 xmodmap -e "pointer = 3 2 1" 的指令。

Q: 要如何安裝 splash 圖形顯示程式?那裡可以找得到呢?

A: 就在發行 FreeBSD 3.1 之前,我們加進了在開機時顯示 "splash" 圖形的新功能。目前用來顯示在螢幕上的檔案必須是 256 色的點矩陣圖形 (*.BMP 、或 ZSoft PCX(*.PCX 的格式。除此之外,解析 度也必須在 320x200 以下,才能和標準 VGA 顯示卡搭配使用。如果您編譯 kernel 時有加入 VESA 支援,那麼最大解析度可以到 1024x768。注意 VESA 的 支援需要加入 VM86 這個 kernel 選項。VESA 支援實際上可以在編譯 kernel 時加入 VESA 選項、或載入 VESA 的 kld module 來達成。

您要修改控制 FreeBSD 開機步驟的設定檔,才能使用 splash 顯示圖形的功 能。設定檔在發行 FreeBSD 3.2 前有些更動,所以現在有兩個方法可以載入 splash 的功能:

  • FreeBSD 3.1

    先選出用來顯示在螢幕上的圖形,3.1 版只支援 Windows 的點矩陣格式。 選好了您要的圖檔後,將它拷到 /boot/splash.bmp。接著把下面幾 行加入 /boot/loader.rc 中:

              load kernel
              load -t splash_image_data /boot/splash.bmp
              load splash_bmp
              autoboot
          



  • FreeBSD 3.2 以後的版本

    除了加入對 PCX 檔案的支援外,FreeBSD 3.2 也改進了開機程序的設定 方式。如果您願意的話,可以用上述 FreeBSD 3.1 的方法,將 splash_bmp 換成 splash_pcx 來載入 PCX 檔案即可。 如果想用新的設定方式,您的 /boot/loader.rc 必須包括這幾行:

              include /boot/loader.4th
              start
          



    並且 /boot/loader.conf 也要包括這幾行:

              splash_bmp_load="YES"
              bitmap_load="YES"
          



    這是假設您用 /boot/splash.bmp 來當作 splash 的螢幕顯 示。如果想用 PCX 的檔案,將它拷成 /boot/splash.pcx,如上 述做出 /boot/loader.rc,再將這幾行加到 /boot/loader.conf 中:

              splash_pcx_load="YES"
              bitmap_load="YES"
              bitmap_name="/boot/splash.pcx"
          





現在就只剩下 splash 用來顯示的圖檔,您可以在 http://www.cslab.vt.edu/~jobaldwi/splash/ 找到各種樣品.


Chapter 9. 網路設定

Q: 我應該到哪邊找有關無磁碟開機 (diskless booting) 的資料?
Q: FreeBSD 的主機可以當作某個網路上的路由器 (router) 嗎 ?
Q: 我可以透過 FreeBSD 將我的 Win95 機器連上 Internet 嗎?
Q: 為什麼我在 compile ISC 最新版的 BIND 程式時老是失敗?
Q: FreeBSD 支援 SLIP 和 PPP 嗎?
Q: FreeBSD 支援 NAT 或 Masquerading 嗎?
Q: 我沒有辦法建立 /dev/ed0 這個 device!
Q: 我如何建立 Ethernet aliases?
Q: 我如何指定我的 3C503 使用其他不同的的 network port?
Q: 我在連上/輸出 FreeBSD 的 NFS 時出現問題.
Q: 為什麼我不能 NFS-mount Linux 的機器?
Q: 為什麼我不能 NFS-mount Sun 的機器?
Q: 我在使用 PPP 連線到 NeXTStep 機器時有問題.
Q: 我要怎樣才能把 IP multicast support 打開?
Q: 哪些網路卡是使用 DEC PCI chipset?
Q: 為什麼要用 FQDN 才能連到其他機器?
Q: 所有網路動作都會出現 ``Permission denied'' 錯誤訊息
Q: IPFW 會造成多大的網路延遲?
Q: 要如何把對某台機器的網路服務要求(service request)轉向到另一台?
Q: 那裡可以找到管理頻寬的工具?
Q: 怎麼會跑出 ``/dev/bpf0: device not configured'' 這個訊息?

Q: 我應該到哪邊找有關無磁碟開機 (diskless booting) 的資料?

A: 無磁碟開機就是讓 FreeBSD 主機從網路上開機,並且從網路上的 server 上讀取 其他必要的檔案,而非由主機的硬碟上取得這些檔案。詳細的資料可以參考 FreeBSD 手冊的無磁碟開機篇

Q: FreeBSD 的主機可以當作某個網路上的路由器 (router) 嗎 ?

A: 由於網際網路的標準化和程式設計的充分經驗之賜,我們 能夠在 FreeBSD 系統內建封包轉傳 (packet fowarding) 的功能。你可以 將這個功能打開,只要將這個變數設定為 YES rc.conf 這個檔案中

        gateway_enable=YES          # Set to YES if this host will be a gateway
      



這個選項會將 sysctl 變數設定 net.inet.ip.forwarding 1.

在大部分的狀況下,你還必須再跑一個處理 routing 的程式,告訴網路上的其他 主機關於你的 router 設定的資料;FreeBSD 出廠時便內附一個標準的 BSD routing 程式 routed,如果你的網路設定更為複雜,你可以試試看 GaTeD (可以由 http://www.gated.org/ 下載) 這個程式自 3_5Alpha7 後支援 FreeBSD。

我們有必要告訴你,就算是 FreeBSD 以這種方式設定完成 ,它還是無法完全滿足 Internet 對 router 的標準定義 ,不過,就日常使用而言它已經足夠應付使用者的需求了。

Q: 我可以透過 FreeBSD 將我的 Win95 機器連上 Internet 嗎?

A: 基本上,會問這種問題的人在家裡至少有兩台電腦,一台跑 FreeBSD 另外一台跑 Win95;這個主意是將 FreeBSD 主機連上 Internet,然後透過這台 FreeBSD 主機,讓跑 Win95 的電腦能夠上網。 這個問題算是前一個問題的一個特例。

這邊有重要的文件。教你怎麼把 FreeBSD 的主機設定成 PPP Dialup Router

注意: 在這種狀況下你至少要有兩個以上的固定 IP addresses, 有時是三個以上或更多組 IP 同時使用,視你的需求而定。 如果你沒有固定的 IP 可以使用,你可以考慮使用 private IP 子網路,並安裝 proxies 例如 SQUID 或是 the TIS firewall toolkit 在你的 FreeBSD 主機上。

另外可以參考 natd

Q: 為什麼我在 compile ISC 最新版的 BIND 程式時老是失敗?

A: 在 ``cdefs.h'' 檔案中的定義與 FreeBSD 系統中內附 的檔案定義有所衝突。直接把 compat/include/sys/cdefs.h 砍掉就可以了。

Q: FreeBSD 支援 SLIP 和 PPP 嗎?

A: 是的。 你可以查查 man pages 中關於 slattachsliploginpppd 以及 ppp 的說明。 pppd ppp 都提供撥進及撥出的功能。 Sliplogin 專門處理有關撥入的功能,而 slattach 處理有關撥出的功能。

這些程式有詳細的說明,你可以在 handbook中找到:



如果你只能藉由"shell account"的方式上網的話, 你可能會想看看 slirp 這個軟體。它可以讓你的電腦直接連上 (某些) 服務, 例如 ftp 和 http 等等。

Q: FreeBSD 支援 NAT 或 Masquerading 嗎?

A: 如果你有一個近端的子網路(有一台以上的機器),但是你的 Internet provider 卻只分配一個 IP number 給你 (或者你只分配到一個動態的 IP number),你可以參考 natd 這個程式。 Natd 讓你可以透過這一個 IP number 讓整個子網路的電腦都能 連上 internet 。

ppp 這個程式也提供類似的功能,如果你下 -alias 這個選項的話。 alias library 在這兩個處理方式中都會被使用到。

Q: 我沒有辦法建立 /dev/ed0 這個 device!

A: 在 Berkeley 網路架構中,只有 kernel 程式碼可以直接存取網路界面卡。 請參考 /etc/rc.network 這個檔案和 manual pages 取得與其他不同網路程式 更進一步的資訊。如果你覺得你完全搞混了的話,您應該找一本與其他 BSD 相關 作業系統網路管理有關書來參考;除了少數顯著的不同外,FreeBSD 的網路管理 基本上和 SunOS 4.0 和 Ultrix 是一樣的。

Q: 我如何建立 Ethernet aliases?

A: 把 ``netmask 0xffffffff'' 加到你的 ifconfig 命令列中,例如:

        ifconfig ed0 alias 204.141.95.2 netmask 0xffffffff
      



Q: 我如何指定我的 3C503 使用其他不同的的 network port?

A: 如果您想使用其他的 port,你必須在 ifconfig 的命令中指定額外的參數. 內定的 port 是 ``link0''。要使用 AUI port 代替 BNC port 的話,改用 ``link2''。這些 flags 應該改變 ifconfig_* 的變數來指定,你可以在這個檔案裡面找到 /etc/rc.conf.

Q: 我在連上/輸出 FreeBSD 的 NFS 時出現問題.

A: 某些 PC 的網路卡比其他的好(含蓄的說來) 這種狀況在造成 NFS 這種對網路敏感的程式有時會出現問題.

參考 the Handbook entry on NFS 以獲得這個主題的更多資訊.

Q: 為什麼我不能 NFS-mount Linux 的機器?

A: 某些版本的 Linux NFS 程式碼只接受 privileged port 的 mount request ; 試用這行指令看看

        mount -o -P linuxbox:/blah /mnt
      



Q: 為什麼我不能 NFS-mount Sun 的機器?

A: 跑 SunOS 4.X 的 Sun 工作站只接受來自 privileged port 的 mount request ; 試用這行指令看看

        mount -o -P sunbox:/blah /mnt
      



Q: 我在使用 PPP 連線到 NeXTStep 機器時有問題.

A: 把 TCP extensions 取消,這個設定在 /etc/rc.conf 裡面. 把以下這個值設成 NO:

        tcp_extensions=NO
      



Xylogic 的 Annex 主機也有相同的問題,您要做相同的修改才能連上 這些主機。

Q: 我要怎樣才能把 IP multicast support 打開?

A: FreeBSD 2.0 以後的版本內定都有 支援 Multicast host 操作。如果您想將您的主機設定成 multicast router 的話,您必須重新 compile 您的 kernel,加入 MROUTING 的選項,並且執行 mrouted。如果您的/etc/rc.conf 裡面的 mrouted_enable 這個參數是設定成"YES" 的話.FreeBSD 2.2 及之後的 版本會在開機時執行 mrouted

MBONE 的各種工具可以在他們 ports 下所屬叫做 mbone目錄中找到。 如果您在找視訊會議的工具如 vic vat 的話, 到那邊找找!

如果需要更進一部的訊息,可到 Mbone Information Web尋找。

Q: 哪些網路卡是使用 DEC PCI chipset?

A: 以下是 Glen Foster提供的清單:

        Vendor          Model
        ----------------------------------------------
        ASUS            PCI-L101-TB
        Accton          ENI1203
        Cogent          EM960PCI
        Compex          ENET32-PCI
        D-Link          DE-530
        Dayna           DP1203, DP2100
        DEC             DE435, DE450
        Danpex          EN-9400P3
        JCIS            Condor JC1260
        Linksys         EtherPCI
        Mylex           LNP101
        SMC             EtherPower 10/100 (Model 9332)
        SMC             EtherPower (Model 8432)
        TopWare         TE-3500P
        Zynx            ZX342
      



Q: 為什麼要用 FQDN 才能連到其他機器?

A: 你也許會發現要連的機器其實是在另一個網域。舉個例子,假設你是在 foo.bar.edu 這個網域中,想要連到在 bar.edu 裡一台叫 ``mumble'' 的 機器,則必須用 Fully-Qualified Domain Name,也就是 ``mumble.bar.edu'',而不是只用 ``mumble'' 來指向它。

傳統的 BSD BIND resolver 允許用這種方式解出機器的位址,但是 FreeBSD 內附 bind 版本 的內定方式,則是除了你所在的網域以外,不支援其他非 FQDN 的縮寫。 所以如 mumble 這種不合格的機器名稱,必須在 mumble.foo.bar.edu,否則就會從網域的最底層開始找。

這和先前的做法不同,也就是不用 mumble.bar.edumumble.edu 繼續搜尋。看一下 RFC 1535,裡面有提到為什麼之 前的做法不好,甚至算是個安全漏洞。

這裡有個不錯的解法,把 /etc/resolv.conf 裡的這一行:

        domain foo.bar.edu
      



換成這一行:

        search foo.bar.edu bar.edu
      



但是要確定搜尋順序不會違反 RFC 2535 所謂的 ``boundary between local and public administration''。

Q: 所有網路動作都會出現 ``Permission denied'' 錯誤訊息

A: 如果在編譯 kernel 時加了 IPFIREWALL 這個選項,要曉得 2.1.7R 內定是拒絕所有未經核准的網路封包(但在開發 2.1-STABLE 時改掉了)。

如果不小心弄錯了 firewall 的設定,以 root 身份執行這個命令,接著 網路功能就會正常:

        ipfw add 65534 allow all from any to any
      



也可以在 /etc/rc.conf 設 "firewall_type='open'" 這個選項。

如果想知道如何設定 FreeBSD firewall,請看 Handbook 相關部份

Q: IPFW 會造成多大的網路延遲?

A: 這個問題的答案大多要看你怎麼訂 firewall 規則、還有 CPU 速度。對大 多數在 ethernet 上的程式及規則不多的情況下,延遲小到可以忽略。但如果 你想要精確數字來滿足好奇心,繼續往下讀。

下面是在 486-66 2.2.5-STABLE 上所作的測量,我們修改了 IPFW 原始碼 來測量在 ip_fw_chk 函式上所花的時間,每處理 1000 個封包後就會在 console 上顯示結果。

測試了兩組,每組各有 1000 個規則。第一組重複下面規則,故意設計成 最糟的情況:

        ipfw add deny tcp from any to any 55555
      



藉由檢查 port number,這樣會使 IPFW 在決定某個封包不符合條件前執 行大部份的檢查程式,因此造成最差的狀況。在重複這個規則 999 次後,接 著是 allow ip from any to any

第二組設計成以極快的速度跳過檢查規則:

        ipfw add deny ip from 1.2.3.4 to 1.2.3.4
      



一碰到封包的來源不符合規則所述,會很快跳過檢查讓封包通過。和上面 一樣,第 1000 個規則是 allow ip from any to any

在第一種情況中,處理每一個封包所造成的延遲大約是 2.703 ms,所以每 個規則大概會造成 2.7 microsecond 的延遲。所以在這些規則之下,理論上每 秒最多可以處理 370 個封包。在 10Mbps ethernet 和一個封包大概 1500 byte 的假設下,大概只會用到 55.5% 的網路頻寬。

第二種情況,每個封包花了大約 1.172ms,所以每條規則大約用了 1.2 microsecond。理論上每秒最多可以處理 853 個封包,耗盡 10Mbps 的頻寬。

上面測試用到的大量規則、及這些規則本身並不代表真實世界的情況,他們 只是用來產生所表示的數據。若想要訂出一套有效率的規則,記得這幾件事:

  • 在最前面放一個專門處理大量 TCP 流量的可用規則,在這條前面不 要放任何 allow tcp 的相關敘述。

  • 把常常觸發的規則放在前面,不常用到的則丟到後面(當然在不 影響 firewall 出入允許設定的前提下)。執行 ipfw -a l 就可看到封包的統計數目,來看最常用到哪些規則。



Q: 要如何把對某台機器的網路服務要求(service request)轉向到另一台?

A: 在 ports 目錄的 sysutils 種類中有個叫 'socket' 的 package,可以幫 你轉向 FTP 或其他類似的網路服務。只要把該網路服務的命令改成呼叫 socket 即可,如下(在 /etc/inetd.conf 裡):

ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.foo.com ftp



其中 'ftp.foo.com' 和 'ftp' 分別是被轉到的機器和 port 名稱。

Q: 那裡可以找到管理頻寬的工具?

A: FreeBSD 上有兩套頻寬管理工具: ALTQ 可以免費使用, Emerging Technologies 出的 Bandwidth Manager 則是商用軟體。

Q: 怎麼會跑出 ``/dev/bpf0: device not configured'' 這個訊息?

A: 柏克萊封包過濾器(Berkeley Packet Filter) (bpf) 在程式使用前必須在 kernel 打開它的驅動程式,把下面這一行加入 kernel 設定檔中,編個新的 kernel:

 pseudo-device bpfilter # Berkeley Packet Filter+       



在重新開機之後,還要做出 device node,在 /dev 下執行:

           # sh MAKEDEV bpf0       


如果想要更進一步知道如何做出各種 device node,請看 handbook 中有關 device node 的說明


Chapter 10. PPP

Q: 我不能使用 ppp,我做錯了什麼嗎 ?
Q: 我一執行 ppp,它就掛在那邊不動了
Q: Ppp 在 -auto 模式下不能撥號
Q: 什麼叫做 "No route to host"
Q: 我的連線在三分鐘後自動斷掉了
Q: 我的連線因為負荷太重而斷線
Q: ppp 會不定時的斷線
Q: 連線會不定時當掉
Q: 在看到 Login OK! 的訊息以後就沒有反應了
Q: 我一直看到 magic being the same 的錯誤訊息
Q: LCP 的溝通一直到連線關閉才結束
Q: Ppp 在連線後就卡住了
Q: 用 shell 跳出 Ppp 做測試時,連線似乎卡住了
Q: 在 null-modem 線上建立的 Ppp 好像不會自動斷線
Q: 為什麼 ppp 在 -auto 模式下會無緣無故播號?
Q: 這些 CCP 錯誤訊息是指?
Q: 傳檔案時發生 IO 錯誤,然後 Ppp 就掛掉了
Q: 為什麼 ppp 不會記錄我的連線速度?
Q: Ppp 不理會 chat script 中的 `\' 字元
Q: Ppp 碰到了 seg-fault,但找不到 ppp.core 這個檔?
Q: 在 -auto 模式下,使 ppp 播號的程式在連線後卻連不到目的地
Q: 為何玩大多數遊戲時,都不能使用 -alias 這個參數?
Q: 那裡可以找到常用埠的列表?
Q: 什麼是 FCS 錯誤?
Q: 沒有一個方法可以用,我完蛋了啦!

Q: 我不能使用 ppp,我做錯了什麼嗎 ?

A: 你應該先看看 ppp man pageppp 使用說明。使用以下指令來打開記錄 (logging) 的功能

        set log Phase Chat Connect Carrier lcp ipcp ccp command
      



這個命令可以在 ppp command prompt 或者是在 /etc/ppp/ppp.conf 組態檔案中加入。 (加在 default section 的開頭最好). 確定在 /etc/syslog.conf 裡面有這麼一行:

        !ppp
        *.*              /var/log/ppp.log
      



而且/var/log/ppp.log 這個檔案存在。 如此一來 你可以從 log 檔案中知道到底發生了什麼事情。 先不用擔心檔案的內容你看不懂,如果你要向人求救的話 ,救你的人會看得懂的。

如果你系統上的那份 ppp 不提供 "set log" 的指令的話,你應該去下載 最新版本。 這個版本在 FreeBSD 2.1.5 以上的版本都可以使用。

Q: 我一執行 ppp,它就掛在那邊不動了

A: 會發生這種情形通常是你的 hostname 沒有辦法解出來。解決這個問題 最好的辦法是確定 /etc/hosts 會被你的 resolver 第一個參考到。 你可以修改/etc/host.conf 並且把hosts 放到最前面。接著,只要把你的機器名稱放到 /etc/hosts 裡面就可以了。如果你沒有 local network 的話,修改 localhost 這一行:

127.0.0.1 foo.bar.com foo localhost
        



否則,就把你主機的資訊加入檔案中。你可以參考相關的 man pages 以獲得進一步的資訊。

如果你順利的完成這些動作,你應該可以成功的執行 ping -c1 `hostname`

Q: Ppp 在 -auto 模式下不能撥號

A: 首先確定你的內定路由 (default route) 是否有設定。下 netstat -rn 這個指令,你應該能夠看到如以下範例的兩個 entries:

Destination        Gateway            Flags     Refs     Use     Netif Expire
default            10.0.0.2           UGSc        0        0      tun0
10.0.0.2           10.0.0.1           UH          0        0      tun0
        



這些設定是假設您使用的 address 跟 handbook 裡面的、或是 man page 的範例、或者和 ppp.conf.sample 裡的設定相同。如果您沒有設定 default route,那麼有可能您現在使用舊版本的 ppp,舊的 ppp 會看不懂 ppp.conf 裡的 HISADDR。如果您的系統 ppp 是在 FreeBSD 2.2.5 之前的話,修改這一行

          add 0 0 HISADDR
        



成為

          add 0 0 10.0.0.2
        



default route 這行沒有出現的另一個原因是你設錯了 default router,這個設定在 /etc/rc.conf 檔案中(這個檔案在 release 2.2.2 前叫 /etc/sysconfig),你需要在 ppp.conf 中加入這 麼一行

          delete ALL
        



如果發生這種情形,回到 handbook userppp 最後設定 的說明中查詢。

Q: 什麼叫做 "No route to host"

A: 這個狀況通常是因為缺少了這段設定

          MYADDR:
            delete ALL
            add 0 0 HISADDR
        



請檢查您的 /etc/ppp/ppp.linkup 檔案中是否有這些設定。 只有在您使用動態 IP(dynamic IP) 或不知道您 gateway 的 IP 時才需要 設定這個。如果您是使用 interactive mode 的話,您可以在進入 packet mode 後輸入如下命令(如果 ppp 提示符號變成大寫的 PPP,便代表已 經進入 packet mode):

          delete ALL
          add 0 0 HISADDR
        



您可以參考 handbook 中 PPP 和動態 IP 位址 的部份,有較詳盡的說明。

Q: 我的連線在三分鐘後自動斷掉了

A: ppp 預設的 timeout 值是三分鐘。可以用以下這行命令調整

          set timeout NNN
        



這代表如果在 NNN 秒內網路都沒有動靜的話,ppp 就會自動關閉 連線。如果 NNN 設成 0,那麼將不會因為沒有資料來往而關閉連線。 你可以把這行命令放到 ppp.conf 這個檔案裡面,或是在 interactive mode 裡面輸入這個指令,也可以用 telnetpppctl 連到 ppps 伺服器的 socket,在連線後隨時調整 timeout 的值。參考 ppp man page 以獲得更詳盡的資料.

Q: 我的連線因為負荷太重而斷線

A: 如果您設定要用 Link Quality Reporting(LQR),您和對方主機之間就 有可能遺失太多的 LQR 封包。Ppp 會因此判斷電話線路有問題,然後就會 切斷連線。在 FreeBSD 2.2.5 版以前,內定會使用 LQR,現在的內定值是 不用。LQR 可以用這一行命令取消

          disable lqr
        



Q: ppp 會不定時的斷線

A: 有時候如果線路上有太多雜訊,甚至如果您使用了電話插撥服務的話, 您的數據機將會掛斷電話,因為它誤認這些訊息是 lost carrier。

大部分的數據機都有容忍暫時失去 carrier 的設定。以 USR Sportster 為例,失去 carrier 和掛斷電話之間的時間,是以 1/10 秒為單位存在 S10 暫存器中。如果要讓您的數據機能容忍更長的時間,你可以在 dial string 裡面加入以下 "送出命令 - 等待字串" 的部份:

          set dial "...... ATS10=10 OK ......"
        



參考數據機內附的說明書以取得更詳細的資料。

Q: 連線會不定時當掉

A: 許多人的連線會毫無來由的卡住,首先要做的是找出連線那一方當掉。

如果用的是外接數據機,就用 ping 來看在傳資料時,TD 燈號 會不會閃。如果會的話(並且 RD 不會閃),代表是對方出問題;如果 不會,則是自己的問題。如果用內接數據機,先在 ppp.conf 中加入 set server 這道指令,當連線當掉時,執行 pppctl 連到 ppp。如果網 路連線突然好了(因為 ppp 看到用來診斷問題的 socket)或無法連上(假設 在一開始可以執行 set socket 這道指令),表示本地出問題。如果連 得上 ppp 卻仍然不能用,用 set log local async 打開本地的非同步 記錄,接著在另一個視窗(或終端機)執行 ping 在連線上傳送資料。 非同步記錄的功能會同時顯示送出和接收的資料,如果資料只出不進,就是對 方機器出問題。

知道是本地或對方出問題後,就有兩種可能:

Q: 對方的機器沒有回應

A: 在這方面能作的相當有限,大部份的 ISP 會因為你不是用 Microsoft 作業系統而不願幫忙。可以在 ppp.conf 中加入 enable lqr, 允許 ppp 偵測對方的錯誤而掛斷,但這個過程相當慢,所以不大實用。也 許不想告訴 ISP 你是用 user-ppp 上線的....

首先,用下面兩道命令關掉所有本地的壓縮功能:

            disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
            deny pred1 deflate deflate24 protocomp acfcomp shortseq vj
          



然後重新連線,確定這樣不會有所不同。如果反而有進步或甚至將問題 解決掉,就用試誤法來找出是那個設定造成的。這樣在聯絡 ISP 時就可以 提供相當有用的資料(雖然會很容易看出你不是用 Microsoft 的產品)。

在聯絡 ISP 之前,打開本地的非同步記錄功能,接著就等連線再度當掉, 這可能會用到相當大的硬碟空間。最後從連接埠讀進的資料可能會相當有用, 它通常是 ASCII 文字,甚至有可能會說明問題出在那裡(``Memory fault, core dumped''?)。

如果 ISP 願意協助的話,應該會在他們那一端也打開記錄功能,那麼在 下次連線當掉時,就可以告訴你為何會出問題。很歡迎將詳細內容送到 brian@Awfulhak.org,甚至要 求 ISP 直接向我連絡。

Q: 自己的 Ppp 當掉了

A: 這裡能做的最多就是重新編譯 ppp:在 Makefile 最後面加上 CFLAGS+=-g STRIP=,接著做 make clean && make && make install。在 ppp 當 掉時,先用 ps ajxww |fgrep ppp 找出 ppp 的 process id,然後執 行 gdb ppp PID。在 gdb 提示符號下,可以用 bt 找出 stack trace。

將結果送到 brian@Awfulhak.org.

Q: 在看到 Login OK! 的訊息以後就沒有反應了

A: 在 FreeBSD 2.2.5 以前的版本上,一旦連線建立完成以後, ppp 會等對方的機器啟動 Line Control Protocol (LCP)。很多 ISP 不會自動 啟動,而是等待由 client 端來啟動。要強迫 ppp 主動啟動 LCP,請 執行這個命令:

          set openmode active
        



Note: 通常如果兩邊都啟動訊息交換的話,通常不會造成任何副作 用,所以 openmode 目前內定是打開的。然而,下一段將解釋在什麼狀況下 這樣設定 真的 會造成副作用。

Q: 我一直看到 magic being the same 的錯誤訊息

A: 有時就在連上之後,在記錄檔會看到 "magic is the same" 的訊息。通 常這些是無害的,有時候某一端則會斷線。大多數的 ppp 實作無法解決這個 問題,就算似乎連上了,在記錄檔也可以看到一直重複的 configure request 和 configure acknowledgement 之類的溝通訊息,ppp 最後會放棄而關掉連 線。

會發生這種問題的通常情況是,伺服器用速度慢的硬碟、在通訊埠上執行 getty、並且等到使用者登入後才用 script 或程式執行 ppp;也有聽說用 slirp 就一定會發生類似問題的報告。原因是在 getty 結束和 ppp 開始執行 的這段時間內,client 端的 ppp 開始送出 Line Control Protocol(LCP) 封 包,由於伺服器通訊埠的 ECHO 仍在打開狀態,client 端的 ppp 就會看到送 出去的封包被 "反彈" 回來。

在用 LCP 溝通時,有部份是要連線兩邊分別建立自己的 magic number, 來偵測及避免封包被 "反彈" 回來的狀況。協定標準中說當對方試圖用和自己 相同的 magic number 溝通時,要送給對方一個 NAK 的訊號(表示不接受), 接著對方就會選另一個數字。但在伺服器通訊埠 ECHO 仍打開的這段期間, client 端的 ppp 送出 LCP 封包,看到相同的 magic number,於是送出 NAK 訊號。這個 NAK 也會被 "反彈" 回來,被誤認由對方送出,因此 client 端會改變自己的 magic number。這樣 magic number 的變動次數會非常地多, 並且也全都存在對方的終端機緩衝區中。當伺服器啟動 ppp 時,它馬上就 被 magic number 的大量更動所淹沒,並且(幾乎是立刻)決定已經試夠了 LCP 而放棄;在這期間,client 端雖然再也看不到被反彈的封包,但卻來得 及看到伺服器把電話線掛掉。

允許讓對方來作 LCP 溝通可以避免這種情形,在 ppp.conf 中加下面這 一行:

          set openmode passive
        



這行告訴 ppp 由對方來啟動 LCP,不過有些伺服器永遠都不會主動溝通 ,在這種情況下,可以這麼設定:

          set openmode active 3
        



這是要 ppp 等個三秒鐘,然後再開始送 LCP 相關要求。如果對方在這 段時間送出 LCP 封包,ppp 就不會等足三秒而立刻回應。

Q: LCP 的溝通一直到連線關閉才結束

A: 目前 ppp 在實作上有個會出問題的 "功能",不會將 LCP、CCP & IPCP 這幾種封包的回應和原先要求作對照。結果是如果有一方的 ppp 啟動時比對方慢了六秒以上,對方會在其間多送出兩個 LCP 的設定 要求,後果相當嚴重。

假設有兩端 AB 都在執行 ppp,A 在連線後立刻 送出 LCP 要求,B 則花了七秒才開始,所以當 B 啟動時,A 早已送出三個 LCP REQ(request)。我們也假設連線已將 ECHO 關掉,否則就 會看到上個問題提到的 magic number 問題。B 啟動時也會送出 REQ, 同時對 A 送出的第一個 REQ 回應,送出 ACK(acknowledge)。A 收到這 個 ACK 後會進入 OPENED 狀態,同時也對 B 的第一個 REQ 送出 ACK。但在這段期間,B 會看到 A 之前多送出的兩個 REQ,因而也 以兩個 ACK 回應。B 接著看到 A 傳來的第一個 ACK,因此也進入 OPENED 狀態。但這時 A 收到 B 多送的兩個 ACK。根據 RFC 的規定,會對第二個 ACK 送出第四個 REQ 而回到 REQ-SENT 狀態 (再重複一次 REQ-ACK 的過程),但一看到第三個 ACK,A 以為是 B 回應剛剛送出的 REQ,又進入 OPENED 狀態。此時 B 收到 A 發出的第四個 REQ,根據 RFC,會對這個 REQ 送出 ACK,然後再送出 第二個 REQ(也是再重複一次 REQ-ACK 的過程)。A 收到這個 REQ 後 會再重新送 REQ 而回到 REQ-SENT 狀態,接著又收到 ACK 而進入 OPENED 狀態。因此雙方都會以為收到的 ACK 是對方回應剛剛送出去的 REQ,最後 A 會一直在 OPENEDREQ-SENT 兩種狀態間切 換,對 B 則是 OPENED ACK-SENT

這種惡性循環會一直持續著,直到有一方發現自己在原地打轉而放棄繼續 下去。

避免這種情況的最好方式,是將某一端設成被動模式-也就是等另一 方先開始溝通,用這道命令:

          set openmode passive
        



用這個選項時要小心,應該和這個命令一起用:

          set stopped N
        



這會設定 ppp 等待對方開始溝通的時間上限,另一個方法是用:

          set openmode active N
        



其中 N 是在主動溝通之前先等待的秒數,man page 有更詳細的說明。

Q: Ppp 在連線後就卡住了

A: 在 FreeBSD 2.2.5 之前的版本,有可能因為 ppp 在處理 Predictor1 壓縮時發生錯誤,使得在連線後馬上就卡住。只有當連線雙方都試圖用不同 種 Compression Control Protocol(CCP) 溝通時,才會發生這種情形。這個 問題已經解決了,但如果仍在用舊版的 ppp,可以用這種方法避免:

          disable pred1
        



Q: 用 shell 跳出 Ppp 做測試時,連線似乎卡住了

A: 在用 shell! 命令時,ppp 會執行 shell(ppp 也會把你指定的參數傳給 shell),Ppp 會等到這些命令結束後才繼續。如果 有使用到 ppp 連線的命令,連線會像是被凍住了,這是因為 ppp 正在 等這些指令結束。

如果想執行程式,用 !bg 這個命令,它會把程式丟到背景執行,ppp 接著就能繼續保持連線。

Q: 在 null-modem 線上建立的 Ppp 好像不會自動斷線

A: 由於 null-modem 本身用的線材,ppp 沒有辦法自動決定是否 某個直接連線已經斷掉。當使用這類方式的連線時,一定要打開 LQR:

          enable lqr
        



內定是會接受 LQR,如果對方用它來溝通的話。

Q: 為什麼 ppp 在 -auto 模式下會無緣無故播號?

A: 如果 ppp 非預期地播號,就必須要找出原因,然後設定播號過濾 器(dfilter, Dial filter)來避免這種情形。

要找出原因,先用這個命令:

          set log +tcp/ip
        



這樣會記錄經由連線的所有資料。下次如果又無故播號,就可以從記錄 旁邊的時間很快找到原因。

現在可以避免因為這些原因播號。通常是在作 DNS 查詢時才會發生這種 問題,要避免因 DNS 查詢而連線(這樣不會使 ppp 在連線狀態 下擋掉這些封包),用下面這幾行:

          set dfilter 1 deny udp src eq 53
          set dfilter 2 deny udp dst eq 53
          set dfilter 3 permit 0/0 0/0
        



這種做法並不永遠適用,因為它事實上使得你無法用 demand-dial 功能 - 大部份程式在做網路相關動作前都會用到 DNS 查詢。

在 DNS 這個情況下,應該試著找出到底是誰想要解出主機名稱,通常幾 乎都是由 sendmail 所造成,所以要在 sendmail 設定檔中指示它不要做任何 DNS 查詢。在 Mail 設定 一節中有詳細說明如何作出 自己的設定檔、及裡面應該放哪些設定,你也許想要將下一行加入 .mc 檔中:

          define(`confDELIVERY_MODE', `d')dnl
        



這會使 sendmail 先擋著所有信件,直到送信時再一齊送出去(通常 sendmail 執行時是用 ``-bd -q30m'' 這個參數,告訴它每三十分鐘才送信) 或是有人執行 ``sendmail -q''(也許可以放在 ppp.linkup 裡)。

Q: 這些 CCP 錯誤訊息是指?

A: 我在 log 檔一直看到這些錯誤訊息:

          CCP: CcpSendConfigReq
          CCP: Received Terminate Ack (1) state = Req-Sent (6)
        



這是因為 ppp 試圖作 Predictor1 壓縮方面的溝通,但對方的機器卻完 全不用壓縮功能。這些訊息是無害的,但如果不想看到它的話,可以把本地 ppp 的 Predictor1 壓縮也一起關掉:

          disable pred1
        



Q: 傳檔案時發生 IO 錯誤,然後 Ppp 就掛掉了

A: 在 FreeBSD 2.2.2 及先前的版本中,tun 的驅動程式有個問題,它不會 接收那些大過 tun 介面 MTU 的封包。如果收到比 MTU 大的封包,它會用 syslogd 記錄為 IO 錯誤。

但 ppp 規格中有提到,不管 LCP 溝通的結果如何,MRU 最小的可接受 值永遠是 1500。所以有可能你不小心將 MTU 調低於 1500,ISP 會不理它而送出 1500 大小的封包,然後就會觸發上述的 "功能"。

在 FreeBSD 2.2.2 及之前的版本中,永遠不要將 MTU 調低於 1500,就 可以解決這個問題。

Q: 為什麼 ppp 不會記錄我的連線速度?

A: 如果要記錄電腦和數據機間的每一行 ``對話'',用下一行打開:

          set log +connect
        



這會使 ppp 記錄所有資料,直到播號字串最後一個等待的數據機傳回值 為止。

如果使用 PAP 或 CHAP (因為沒有 "set login" 命令,所以設定檔中 CONNECT 之後就不會看到任何對話),想要看到連線速度的話,確定 ppp 等待的數據機傳回值是 CONNECT 這一整行,像這樣:

          set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"
        



這樣在看到 CONNECT 後不會送出任何東西,接著再等個換行字元,強 迫 ppp 讀取回應的 CONNECT 一整行。

Q: Ppp 不理會 chat script 中的 `\' 字元

A: Ppp 會去分析設定檔中的每一行,這樣它才會正確解讀像是 set phone "123 456 789" 的字串(你應該知道這個數字只是 <一個> 參數,如果要指定雙引號 (") 這個字元,必須在它前面用反斜線 (\)將它隔開)。

當解譯程式分析每個參數時,為了找出字串中所有像是 ``\P'' ``\T'' 的跳脫字元(見 man page),必須重新解譯該參數。在這種雙重分析之下, 你必須記得用正確的跳脫數目。

假設要對數據機送出 ``\'' 這個字元,應該像是:

          set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"
        



這樣則會得到下面這串:

          ATZ
          OK
          AT\X
          OK
        



如果是

          set phone 1234567
          set dial "\"\" ATZ OK ATDT\\T"
        



則會得到下面結果:

          ATZ
          OK
          ATDT1234567
        



Q: Ppp 碰到了 seg-fault,但找不到 ppp.core 這個檔?

A: Ppp (或任何類似的程式) 應該不可能有 core dump。由於 ppp 執行時 的 effective user id 是 0 (即以 root 身份執行),作業系統在終止 ppp 前不會對磁碟寫它的 core 映像檔。如果 ppp 真的因為 segmentation violation 或其他一般會 core dump 的 signal 而終止、並且確定用 的是最新版本(見本節開頭),那麼你可以這麼做:

          $ tar xfz ppp-*.src.tar.gz
          $ cd ppp*/ppp
          $ echo STRIP= >>Makefile
          $ echo CFLAGS+=-g >>Makefile
          $ make clean all
          $ su
          # make install
          # chmod 555 /usr/sbin/ppp
        



你現在已經裝上可以用來除錯的 ppp 版本,由於權限上沒有作特別設定, 所以必須以 root 來執行 ppp,順便也要注意是在那個目錄執行的。

現在如果 ppp 碰到了 segmentation violation,就會將 coredump 存在 ppp.core 檔中,接下來就是:

          $ su
          # gdb /usr/sbin/ppp ppp.core
          (gdb) bt
          .....
          (gdb) f 0
          .....
          (gdb) i args
          .....
          (gdb) l
          .....
        



根據你的問題來取得相關資料,就可以診斷問題出在那裡。

如果熟悉 gdb,也許會想找出其他的詳細資料,像是那個動作造成 dump、及相關變數的位址及數值等。

Q: 在 -auto 模式下,使 ppp 播號的程式在連線後卻連不到目的地

A: 這是設定 ppp 在 -auto 模式向對方取得動態 IP 時的已知問題, 在最新版的 ppp 已經解決了 - 在 man page 中用 iface 關鍵字找找 看。

當用到網路的程式呼叫 connect(2) 時,socket endpoint 會設成 tun 這個界面的 IP,kernel 接著產生要送出 去的第一個封包,把它傳給 tun,Ppp 讀到這個封包後就會開始建立連 線。如果 ppp 用的是動態分配 IP,那麼就會改變 tun 界面的位址, 原先的 socket endpoint 就成為不正確的值。接著送到對方的封包通常都會 被丟掉,就算能順利達到對方機器,由於該來源 IP 已給其他人使用,任何回 應也不會被傳回本地的機器上。

理論上,有好幾種方法可以解決這個問題。如果 ISP 願意每次都提供相同 IP 當然是最好 :-),目前版本的 ppp 會做到這一點,但大多數的 ppp 實作不會這麼做。

從 client 端最容易的解決方式是,永遠都不要改變 tun 界面的 IP 值, 但是將所有出去的封包來源 IP 從原先的 tun 界面 IP 改為連線時取得的 IP,基本上這就是最新版 ppp iface-alias 選項的做法(使用 了 libalias(3) 和執行 ppp 時的 -alias 參數)-記住之前所有 用過的 tun 界面 IP,再把全部換成最近一次拿到的位址。

另一種方法(可能是最可靠)是寫個可以修改所有 socket endpoint 值的 system call。當拿到新的 IP 時,Ppp 就可以用它來修改所有執行程式 所建立的 socket。當 DHCP client 程式對 socket 重新使用 bind() 時,也 可以用同樣的呼叫。

還有一個可能則是允許不用 IP,就可以啟用某個網路界面。送出去的封包 來源 IP 會設成 255.255.255.255,直到 SIOCAIFADDR 這個 ioctl 第一次執 行完成為止。這樣會完全連結 socket 的兩端,而由 ppp 來修改來源的 IP 值,但只有當原來 IP 值是 255.255.255.255 時、或者 IP 值和 IP 偵錯 碼需要修改時才會去更動。這種方式有點算是 hack,即 kernel 可以對沒設 定好的界面送出壞掉的封包,因為假設會有其他機制可以修正這種錯誤。

Q: 為何玩大多數遊戲時,都不能使用 -alias 這個參數?

A: 遊戲或類似程式不能和 libalias 搭配使用的原因是,外面的機器試著對 著內部的機器開啟連線、或(不請自來地)送出 UDP 封包,而 alias 封包的 軟體不知道它應該把這些封包送到裡面的機器去。

解決的方式是,先確定現在只有執行那個會出問題的程式,然後在 gateway 機器上對 tun 界面執行 tcpdump、或在上面打開記錄 tcp/ip 的功 能(``set log +tcp/ip'')。

在啟動出問題的程式時,應該會在 gateway 機器上看到有封包通過,當外 界有傳回封包時則會被丟掉(這就是問題所在)。記下這些封包要送到目的地 的那個埠,然後關掉程式。重複幾次,看看是否都要送到同樣固定的埠,如果 是的話,在 /etc/ppp/ppp.conf 相關位置加上這一行,就可使程式正確運作:

          alias port proto internalmachine:port port
        



其中 ``proto'' 是 ``tcp'' 或 ``udp'',``internalmachine'' 是要接 收這些封包的機器,``port'' 則是這些封包要送到那個埠。

如果要在其他機器上執行同樣程式,必須重複同樣過程修改上一行設定, 否則就不能正常使用;也不可能在兩台內部機器上同時使用-畢竟外界只是把 這個內部網路看成一台機器而已。

如果封包不一定送到同樣的埠,你有三種選擇:

1) 在 libalias 加入對它的支援, /usr/src/lib/libalias/alias_*.c 有一些 ``特例'' 的示範(alias_ftp.c 是個不錯的原型檔)。通常是讀取某些可以認得出的外送封包,找出要外面連 到內部機器某個埠的指令,然後在 alias 表中設定 ``route'',以後再收到 這種封包就知道要往那裡送。

這是最困難的解法,但也是最好的,並且還可以在多台機器上用同樣程式。

2) 使用 proxy。舉例來說,該應用程式也許支援 socks5,或是 有個 ``passive'' 的選項(像是 ``cvsup'')可以避免對方向內部機器提出 連線的要求。

3) 用 ``alias addr'' 把所有資料都轉給內部機器,這是最後 才用的暴力法。

Q: 那裡可以找到常用埠的列表?

A: 現在還沒有,但可以將這些弄成一個名單(如果有人感興趣的話)。 在下面的例子裡,把 internal 換成玩遊戲那台機器的 IP。

  • Quake

    alias port udp internal:6112 6112

    如果想用其他方式,www.battle.net 有 Quake 對 proxy 支援的說明。



  • Quake 2

    alias port udp internal:27901 27910



  • 紅色警戒(Red Alert

    alias port udp internal:8675 8675

    alias port udp internal:5009 5009



  • Half Life

    alias port udp internal:27005 27015



  • PCAnywhere 8.0

    alias port udp internal:5632 5632

    alias port tcp internal:5631 5631



Q: 什麼是 FCS 錯誤?

A: FCS 是 Frame Check Sequence 的縮寫。每一個 ppp 封包都附有偵錯碼來確定收到的資料的確是送出的資料。如果進來的某個 封包 FCS 不正確,就丟掉這個封包、再把 HDLC 裡的 FCS 計數器加 1。 用 show hdlc 便可看到 HDLC 裡的各種錯誤計數值。

不良線路(或封包被串列埠的驅動程式丟掉)有時候就會發生 FCS 錯誤, 雖然它的確會大大拖慢壓縮協定,不過通常這沒什麼大不了。如果你用的 是外接數據機,確定有保護線路不受外界干擾 - 這樣說不定就解決了。

如果在連上時馬上就凍住、並且還看到一大堆 FCS 錯誤的話,有可能 是因為你的連線並非是 8 bit clean。確定數據機不是用軟體流程控制 (XON/XOFF),如果你的連線 <一定> 要用軟體流程控制的話,用 set accmap 0x000a0000 這道命令告訴 ppp 跳過 ^Q 和 ^S 這兩個字元。

看到一大堆 FCS 錯誤的另一個原因,是連線另一端不再使用 PPP 溝通。這時候也許應該打開 async 的記錄功能,來決定是否進來的 資料其實是 login 或 shell 提示符號。如果另一端是 shell 提示符號, 先執行 close lcp、接著 term 就可以重新連接到對 方機器的 shell 下,而不用掛掉電話線。

如果記錄檔裡沒有任何資訊可以指示連線為何斷掉,那麼就該問問另一 端的管理員(你的 ISP?) 怎麼會這樣結束。

Q: 沒有一個方法可以用,我完蛋了啦!

A: 如果上面說的都沒用,就盡可能找出所有資訊,這包括了設定檔、如何 啟動 ppp、log 檔的相關部份、連線前後的 netstat -rn 輸出結果,把這些送到 freebsd-questions@FreeBSD.org mailing list 或 comp.unix.bsd.freebsd.misc newsgroup,這樣應該就會有人指點 正確的方向。


Chapter 11. Serial 通訊

這一章主要是在討論 FreeBSD 上有關 serial 通訊的問題。有關 PPP 以及 SLIP 的問題是放在 Chapter 9 這一節。

Q: 我要怎麼知道 FreeBSD 是不是有抓到我的 serial port?
Q: 我要怎麼知道 FreeBSD 是不是有抓到我的 modem 卡?
Q: 我升級到 2.0.5 以後我的 tty0X 居然不見了!
Q: 我要如何在 FreeBSD 下存取 seral ports?
Q: 我要如何啟動對 serial 多埠卡的支援?
Q: FreeBSD 可以控制多張 serial 多埠卡使用同一個 irq 嗎?
Q: 我可以為 port 設定預設參數嗎?
Q: 我要怎樣才能讓 modem 接受 dialup 登入呢?
Q: 我要怎麼把 dumb terminal 連上 FreeBSD?
Q: 為什麼我不能執行 tipcu 呢?
Q: FreeBSD 不支援我的 stock Hayes modem --- 我要怎麼辦?
Q: 我什麼時候要直接鍵入 AT 指令?
Q: pn 欄中的 [@] 不能用了!
Q: 我要怎麼在命令列下撥電話呢?
Q: 我每次用的時候都要輸入 bps 速度嗎?
Q: 透過一台 terminal server 來存取主機。
Q: tip 可以在一次連線中選擇多台機器嗎?
Q: 為什麼我按兩次 CTRL+P,可是卻只送出了一個 CTRL+P?
Q: 突然間我打的東西都變成大寫了??
Q: 我要如何使用 tip 來傳檔案呢?
Q: 我要怎麼用 tip 來跑 zmodem 呢?
Q: 就算我設定無誤,FreeBSD 好像還是找不到我的 serial port?

Q: 我要怎麼知道 FreeBSD 是不是有抓到我的 serial port?

A: 當 FreeBSD 開機的時候,它會根據您在 kernel 中的設定來偵測您的 serial port。您可以在這些訊息出現的時候檢查,也可以在系統開機之後用 下面的指令來觀察:

        dmesg | grep sio
      



這裡有一些輸出的範例:

        sio0 at 0x3f8-0x3ff irq 4 on isa
        sio0: type 16550A
        sio1 at 0x2f8-0x2ff irq 3 on isa
        sio1: type 16550A
      



這代表您有兩個 serial port。第一個 port 佔用 irq 4,port address 是 0x3f8 ,而且用的是 16550A 型的 UART 晶片。第二個 port 用的是同 型的晶片,不過它佔用的是 irq 3 ,它的 port address 在 0x2f8 。 內接式 modem 卡會被辨識成是 serial port -- 唯一的差別就是該 port 上 總是接上 modem 而已。

GENERIC kernel 支援兩個 serial port ,它們的設定值就如同上面的 範例一樣。如果您系統上的設定不一樣,或者您另外接了內接式 modem 卡, 或是您系統的實際 serial port 數比您在 kernel 設定中的還要多的話,您 只要重新建立 kernel 就好了。詳情請看 如何建立 kernel

Q: 我要怎麼知道 FreeBSD 是不是有抓到我的 modem 卡?

A: 請看上一個問題。

Q: 我升級到 2.0.5 以後我的 tty0X 居然不見了!

A: 不要緊張,它們已經被併到 ttydX 裝置下去了。不過您還是得到自己 修改設定檔才能讓它們正常工作。

Q: 我要如何在 FreeBSD 下存取 seral ports?

A: 第三個 serial port,sio2 (就是 DOS 下的 COM3) ,以 dial-out 裝置來看是位於 /dev/cuaa2 ,而以 dial-in 裝置來看則是位於 /dev/ttyd2 。這兩個裝置有什麼不同 呢?

您在 dial-in 時使用的是 ttydX 。當您用 block 模式開啟 /dev/ttydX 時,會有一隻 process 在對應的 cuaaX 上等它 變成 inactive ,然後一直等到 carrier detect line 變成 active 為止。 當您開啟 cuaaX 裝置時,它會去確定目前 ttydX 裝置是不是正 在使用 serial port。如果它可以用的話,它就會把 serial port 從 ttydX 裝置手中搶過來。同樣的,cuaXX 裝置不會去管 carrier detect。有了這樣的設計,再加上一台會自動回應的 modem,您就可以令同 一台 modem 可以被遠端使用者拿來登入,您自己也可以拿來 dialout,系統 會自動檢查是否有衝突的現象。

Q: 我要如何啟動對 serial 多埠卡的支援?

A: 同樣的,在 kernel 設定那一節有提到有關設定 kernel 的資訊。要設定一 張 serial 多埠卡,您必需在您的 kernel 設定檔中為每一個 serial port 都設一行 sio 的設定。但是您只能在它們之中選一個來設定 irq 以及 vector 。卡上的所有 port 會共享同一個 irq 。一般來說我們都把它設在最 後一個 serial port 上。不要忘了指定 COM_MULTIPORT 這個 option 。

下面是一個把 AST 4-port 卡 設在 irq 7 的例子:

        options "COM_MULTIPORT"
        device sio4 at isa? port 0x2a0 tty flags 0x781
        device sio5 at isa? port 0x2a8 tty flags 0x781
        device sio6 at isa? port 0x2b0 tty flags 0x781
        device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr
      



這裡的 flags 設定是指 master port 的 minor number 是 7 (0x700),在偵測時做檢查 (0x080),以及所有的 port 共享一個 irq (0x001) 。

Q: FreeBSD 可以控制多張 serial 多埠卡使用同一個 irq 嗎?

A: 還沒支援。您必需為每張卡設定不同的 irq 。

Q: 我可以為 port 設定預設參數嗎?

A: 通常您會想為您的應用程式開啟 ttydX (或是 cuaaX) 裝置。當 一個 process 開啟裝置以後,它會有一組預設的終端機 I/O 設定。您可以用 下面這個指令來觀察這些設定

        stty -a -f /dev/ttyd1
      



當您改變了某個裝置的設定後,這些設定會一直作用,直到這個裝置被關閉 了為止。當它被重開啟後,又回到原先的預設值了。如果想要改變預設值,您 可以開啟並修改 ``初始狀態'' 裝置的設定。舉例來說,如果您想改變 ttyd5 的預設值,把 CLOCAL 模式打開,8 bits,並且使用 XON/XOFF 流量控制,您可以這樣做:

        stty -f /dev/ttyid5 clocal cs8 ixon ixoff
      



您可以在 /etc/rc.serial 裡做這樣的設定。現在每一個開啟 ttyd5 的應用程式都會預設使用這些設定了。您依然可以用同樣的方法 去改變這些設定。

您也可以藉由設定 ``鎖定狀態'' 裝置來防止其他應用程式去更動這些設定 。舉例來說,想要把 ttyd5 的速度鎖定在 57600 bps,您要這樣做

        stty -f /dev/ttyld5 57600
      



這樣一來,每一個開啟 ttyd5 的應用程式都只能使用 57600 bps 的速 度了。

當然,您必需確定您的初始狀態以及鎖定狀態的裝置只能被 root 寫入 。MAKEDEV 這個 script 並 不會 在建立這些裝置時自動幫您設 定好。

Q: 我要怎樣才能讓 modem 接受 dialup 登入呢?

A: 您是不是想當 ISP?首先,您要有一部以上可以自動接聽的 modem。您的 modem 必須要有 carrier-detect 的功能。它也要能夠在 data terminal ready (DTR) 由開轉為關時重新設定自己。它或許也要能夠使用 RTS/CTS 流量控制或是不做任何流量控制。最後,它必須能夠在電 腦和它自己的傳輸中使用定速,但是在它和遠端 modem 的連線方面則要有協 商傳輸速度的能力。

對 Hayes 指令集相容 modem 來說,下面的指令會把上一段所講的全部設好 並存在非揮發性記憶體中:

        AT &C1 &D3 &K3 &Q6 S0=1 &W
      



看看下面的 傳送 AT 指令集 這一節可以得 更多有關如何不利用 MS-DOS 終端程式來做這些設定的資料。

接下來,在 /etc/ttys 為您的 modem 做設定。列在這個檔案中的是所有系統會 待 login 的 ports 。像下面這樣加入一行:

        ttyd1 "/usr/libexec/getty std.57600" dialup on insecure
      



這一行指令第二個 serial port (/dev/ttyd1) 是一個以 57600 bps 速度在傳輸的 modem,並且不做同位檢查 ( std.57600 是在 /etc/gettytab 檔裡指定的)。 這個 port 的終端機型態是 ``dialup''。這個 port 設成 ``on'' 而且是 ``insecure'' 的 --- 意思是 root 不能從這裡連線進來。您必需為每個 dialin port 都做類似 ttydX 的設定。

通常我們會用 ``dialup'' 來做為終端機型態。如果使用者登入時的啟始型 態是 dialup 的話,很多使用者都會在他們的 .profile 或是 .login 檔中設 定他們真正的終端機型態。上面的例子中我們舉的是 insecure 的例子。如果 您想要在這個 port 變成 root 的話,您必須用一般使用者的身份登入,然後 ``su'' 成 root 。如果您用的是 ``secure'' 的話,則 root 可以直接登 入。

在對 /etc/ttys 做過修改之後,您必須送一個 hangup 或是 HUP 的 signal 給 init process:

        kill -HUP 1
      



這樣會強迫 init process 去重讀 /etc/ttys 。 然後 init process 就會在所有的 ``on'' port 上重新啟動 getty process 。您可以用下列指令來檢查您的 port 是不是可以 login 了

        ps -ax | grep '[t]tyd1'
      



您會見到類似這樣的結果:

        747 ??  I      0:00.04 /usr/libexec/getty std.57600 ttyd1
      



Q: 我要怎麼把 dumb terminal 連上 FreeBSD?

A: 如果您要把別的電腦當成是 FreeBSD 的終端機的話,您只需要在兩者的 serial port 之間牽一條 null modem 排線即可。如果您有一個真的終端機 的話,看看它的指令集吧。

然後,像上一個問題一樣修改 /etc/ttys 。舉例來說,如果您把一個 WYSE-50 終端機接在第五個 serial port 上的話,就要用這樣的設定:

        ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure
      



這個例子示範的是 /dev/ttyd4 所代表的 port 用的是 wyse50 終 端機,連線速度 38400 bps,不使用同位檢查 (std.38400 是從 /etc/gettytab 設定的) 而且 root 可以 login (secure) 。

Q: 為什麼我不能執行 tip cu 呢?

A: 在您的系統中,tipcu 很可能只能由 uucp 使用者和 dialer 群組才能執行。您可以用 dialer 群組來控制到底有誰可 以存取您的 modem 以及遠端系統。您只要把您自己加到 dialer 群組中就可 以了。

另外一種方法是,您可以讓您系統上所有使用者都可以執行 tip cu ,只要您

        # chmod 4511 /usr/bin/cu
        # chmod 4511 /usr/bin/tip
      



Q: FreeBSD 不支援我的 stock Hayes modem --- 我要怎麼辦?

A: 事實上,tip 的 man page 已經過時了。一般的 Hayes dialer 已經內建在系 統內。您只要在 /etc/remote 指定 ``at=hayes'' 就可以了。

可惜的是,Hayes 的驅動程式不夠聰明,有些新 modem 上的進階功能它無法 辨識出來 --- 例如 BUSYNO DIALTONE ,或是 CONNECT 115200 這類的訊息它就會搞混。您在使用 tip 的時候必須 把它們關掉 (用 ATX0&W) 。

還有,tip 的 dial 逾時時間是 60 秒。您的 modem 可能要設得更短, 否則 tip 會認為發生了通訊上的問題。試試看ATS7=45&W

事實上 tip 還沒有完全支援它。解決方法是去修改 /usr/src/usr.bin/tip/tip 目錄裡的 tipconf.h 。很顯然您 必須要有原始程式碼才能這麼做。

把 ``#define HAYES 0'' 改成 ``#define HAYES 1'' 。然後 ``make'' 並 ``make install'' 。之後一切都會恢復正常了。

Q: 我什麼時候要直接鍵入 AT 指令?

A: 在您的 /etc/remote 檔裡加一個 ``direct'' 。舉例來說,如果您的 modem 連接在第一個 serial port,/dev/cuaa0,則您要加入下面 這一行:

        cuaa0:dv=/dev/cuaa0:br#19200:pa=none
      



在 br 欄中設定您 modem 所支援的最高速。之後,鍵入 tip cuaa0 之後 您就連上您的 modem 了。

如果您的系統上沒有 /dev/cuaa0 ,您就先這樣:

        # cd /dev
        # ./MAKEDEV cuaa0
      



或是您可以用 root 執行 cu 指令,像這樣:

        # cu -l``line'' -s``speed''
      



這裡的 line 是指您的 serial port (例如 /dev/cuaa0) ,speed 是指您的傳輸速度 (例如 57600) 。如果您下完 AT 指令後,鍵入 ~. 可以離開。

Q: pn 欄中的 [@] 不能用了!

A: 電話號碼欄中的 [@] 記號是用來告訴 tip 去 /etc/phones 找電話號碼。 但是 [@] 同時也是 /etc/remote 這類檔案中的特殊字元。您可以加上反斜線:

        pn=\@
      



Q: 我要怎麼在命令列下撥電話呢?

A: 在您的 /etc/remote 放一個 ``generic''。舉例來說:

        tip115200|Dial any phone number at 115200 bps:\
        :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du:
        tip57600|Dial any phone number at 57600 bps:\
        :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:
      



然後您就可以像 ``tip -115200 5551234'' 這樣用了。如果您比較喜 歡用 cu 的話,使用 generic cu 欄位:

        cu115200|Use cu to dial any number at 115200bps:\
        :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:
      



然後輸入 ``cu 5551234 -s 115200'' 。

Q: 我每次用的時候都要輸入 bps 速度嗎?

A: 您可以使用類似 tip1200 或是 cu1200 的欄位,不過在您使用之 前請先確定您的 br 欄可以支援這個速度。tip 認為 1200 bps 是一個很好的預設值,這也就是為什麼要叫做 ``tip1200'' 的原因 了。當然您也可以不要用 1200 bps 。

Q: 透過一台 terminal server 來存取主機。

A: 除了每次等您連上 server 並鍵入 ``CONNECT <host>'' 以外, 比較好的方法是用 tip 的 cm 。舉例來說,看看 /etc/remote

        pain|pain.deep13.com|Forrester's machine:\
        :cm=CONNECT pain\n:tc=deep13:
        muffin|muffin.deep13.com|Frank's machine:\
        :cm=CONNECT muffin\n:tc=deep13:
        deep13:Gizmonics Institute terminal server:\
        :dv=/dev/cua02:br#38400:at=hayes:du:pa=none:pn=5551234:
      



可以讓您只打 ``tip pain'' 或是 ``tip muffin'' 就可以連上 pain 或 muffin;然後 ``tip deep13'' 可以連上 terminal server。

Q: tip 可以在一次連線中選擇多台機器嗎?

A: 通常這個問題發生在:一間大學有一些 modem,而且有上千名學生要用...

/etc/remote 裡為您的大學設一個欄位,並使用 [\@] 作為 它的 pn

        big-university:\
        :pn=\@:tc=dialout
        dialout:\
        :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:
      



然後,把大學的撥接電話放在 /etc/phones 中:

        big-university 5551111
        big-university 5551112
        big-university 5551113
        big-university 5551114
      



tip 會依照表列的順序依次嚐試,最後放棄。如果您要一直試的話,您可以在 while 迴圈裡執行 tip

Q: 為什麼我按兩次 CTRL+P,可是卻只送出了一個 CTRL+P?

A: CTRL+P 是內定的 ``force'' 字元,用來告訴 tip 下一個字元 是一般字元。您可以藉由 ~s (代表 ``設定變數'') 把其他字元設成強 迫字元。

鍵入 ``~sforce=<single-char>'' 後面接一個 newline 。 <single-char> 可以是任意單一字元。如果您只打 <single-char> ,則 nul 就被設成是 force character,您可 以藉由按 CTRL+2 或是 CTRL+SPACE 來按出 nul 。SHIFT+CTRL+6 是一個不 錯的 <single-char> ,我看過一些終端機都是這麼設定。

您也可以在 $HOME/.tiprc 中設定 force character:

        force=<single-char>
      



Q: 突然間我打的東西都變成大寫了??

A: 您應該是按到了 CTRL+A,在 tip 中為沒有 caps-lock 鍵的使用者所設計的 ``raise character''。您可以像上個問題 一樣利用 ~s 來把 ``raisechar'' 這個變數改成合理的值。事實上, 如果您認為您永遠都不會用到這兩個功能的話,您可以把它設成跟 force character 一樣。

下面是一個為 Emacs 使用者所設定的 .tiprc ,Emacs 使用者常常會用到 CTRL+2 和 CTRL+A:

        force=^^
        raisechar=^^
      



^ 就是 SHIFT+CTRL+6 。

Q: 我要如何使用 tip 來傳檔案呢?

A: 如果您的對像也是 UNIX 系統的話,您可以用 ~p (put) 和 ~t (take) 來收送資料。這兩個命令會在遠端機器執行 catecho 來收送檔 案。用法是:

        ~p <local-file> [<remote-file>]
        ~t <remote-file> [<local-file>]
      



它不會做錯誤檢查,所以您最好用別的通訊協定,例如 zmodem 。

Q: 我要怎麼用 tip 來跑 zmodem 呢?

A: 首先,從 ports 中選一個 zmodem 程式來安 裝 (例如在 comms 目錄下的 lrzsz 或是 rzsz) 。

在接收檔案方面,您要先在遠端啟動傳送程式。然後按 enter 再鍵入 ``~C rz'' (如果您安裝 lrzsz 的話就要打 ``~C lrz'') 就可以 開始接收了。

在傳送檔案方面,您要先在遠端啟動傳送程式。然後按 enter 再鍵入 ``~C sz <files>'' (或是 ``~C lsz <files>'') 就 可以把檔案送到遠端系統了。

Q: 就算我設定無誤,FreeBSD 好像還是找不到我的 serial port?

A: 如果您的主機板或是卡上有用到 Acer 的 UART 晶片的話,FreeBSD 在開機時 的 sio 偵測可能會不正確。您可以從 www.lemis.com 找到 patch 來修正這個問題。


Chapter 12. 其它各式各樣的問題

Q: 為甚麼 FreeBSD 用的 swap 空間比 Linux 多?
Q: 為甚麼要用(甚麼是) a.out 和 ELF 執行檔格式?
Q: 好吧,但為甚麼會有這麼多種不同的格式?
Q: 為甚麼 chmod 不會改變符號連結(symlink)的存取權限?
Q: 為甚麼帳號 仍然 限制為八個字元?
Q: 我能在 FreeBSD 下跑 DOS 程式嗎?
Q: 甚麼是 ``sup'',如何使用?
Q: How cool is FreeBSD?
Q: 誰在我的記憶體插槽中沙沙作響??
Q: MFC 是甚麼意思?
Q: 'BSD' 是什麼意思?
Q: 要幾個 FreeBSD hacker 才能換掉一個電燈泡?

Q: 為甚麼 FreeBSD 用的 swap 空間比 Linux 多?

A: 不是這樣的。如果你的意思是: ``為甚麼我的 swap 看起來滿了?'' 那是因為把東西放在 swap 裡後拿回來的速度會比 pager 經由檔案系 統拿回(未修改)的執行碼快。

事實上,記憶體中 dirty pages 的量並未減少; clean pages 則在需 要的時候移走。

Q: 為甚麼要用(甚麼是) a.out 和 ELF 執行檔格式?

A: 要了解為甚麼 FreeBSD 使用 a.out 格式,首先你要知道一些 目前 Unix 中使用最廣泛的三種格式:

  • a.out

    最早和`古典'的 unix 目的檔格式。使用一種短而緊密的檔頭, 伴隨一個通常用來辨認格式的魔術數字(參考 a.out(5) 有更多細節)。具有三個節區:.text,.data,和.bss 加上一個符號表和字串表。

  • COFF

    SVR3 目的檔格式。檔頭包含了一個節區表,所以可以具備比 .text,.data,.bss 還多的節區。

  • ELF

    COFF 的後繼者,具有多個節區以及 32-bit 或 64-bit 的 possible values。主要的缺點:ELF 是在每個系統架構只 會有一種 ABI 的假設下設計出來的。事實上這個假設錯的離譜, 即使是商業的 SYSV 世界,也至少有 SVR4,Solaris,SCO 三種 ABI。

    FreeBSD 藉由一個工具,把程式需要那種 ABI 的資訊 烙印ELF 執行檔上。 參考 man page brandelf 取得更多資訊。



FreeBSD 來自 "古典" 陣營,傳統上都使用 a.out 格式,這是在好幾代的 BSD 中證明可靠的計術。 雖然可以在 FreeBSD 上可以建立以及執行原生的 ELF 執行檔( 以及核心),剛開始 FreeBSD 反對轉換到以 ELF 做為預設的 格式。為甚麼?嗯,當 Linux 開始痛苦地轉換至ELF,並非因為要逃離 a.out格式,而是因為他們沒有彈性的,以跳躍表為基礎的共享程式庫機制。那是一種非常難以使用,發展 者不喜歡的東西。既然已經存在的ELF工具提供了共享程式庫的解決方案,而且看來是"前衛的方法" ,所需的代價就可接受因而轉換。

在 FreeBSD 的狀況中,我們的共享程式庫機制更接近 SunOS 的 型式,也就是,易於使用。然而,從 3.0 開始,FreeBSD 正式支援 ELF 為預設格式。 即使a.out 格式仍然非常好,我們編譯工具的撰寫者,GNU 的成員, 已中止了對,a.out 格式的支援。這迫使我們維護另一份版本的 compiler 和 linker ,也使得我們不能從最新的 GNU 發展成果中獲得好處。此外對 ISO-C++ 的需求,尤其是建構者和解構 者,也帶動未來版本中對 ELF 的原生支援。

Q: 好吧,但為甚麼會有這麼多種不同的格式?

A: 在黑暗的過去,只有簡陋的硬體。簡陋的硬體僅支援小型、簡單的系統。 a.out 在簡單的系統上勝任愉快 (PDP-11)。當 unix 移植到其他平台時, a.out 保留了下來,因為對早期的 Motorola 68K,VAX 之類的架構已經 夠用了。

然後有些聰明的硬體工程師覺得讓軟體多做點事,那 CPU 的電晶體就能少一點而跑的更快。要在這種 新式硬體上工作(現在稱為RISC), a.out 就不適合了,所以許多的格式就發 展出來,以提供比受限制而又簡單的 a.out 更好的效能。像是 COFF ECOFF,以及一些比較不出名的格式,每一種 都被創造出來,但是卻都達到各自的極限,直到 ELF 出面解決這一切。

此外,當程式越來越大而磁碟(以及主記憶體)相對來說較小時,共享程式庫的概念就發展出來了, 虛擬記憶體系統也變得越來越精巧。當每一種進步都在 a.out 上完成時, 它的可用性也越來越低。另外,人們還要在執行時期可以動態載入,或是丟棄執行過的初始化程式 以節省記憶體。程式語言也變得更精巧而且人們想要在 main 之前執行別的程式碼。許多繁雜的技巧 用在a.out 上以解決這些問題。a.out 要解決這些 問題需要越來越多額外的負擔和複雜度。ELF可以輕易的解決這些問題,但是 從基本上可以工作的系統轉換成 ELF 卻很棘手。所以要等到維護 a.out 比轉換到 ELF 棘手。

然而,隨著時間過去, FreeBSD 的 build tools 形成了平行的兩支 (尤其是組譯器和 loader)。FreeBSD 這支加進了共享程式庫以及修正了 一些錯誤。原來撰寫這些程式的 GNU 成員則重寫了這些程式,以更簡單 的方式支援跨平台編譯、多種格式等等。許多人想要做出以 FreeBSD 為 目的平台的跨平台編譯器,不幸的是 FreeBSD 的 as 和 ld 不能做這項 工作。新的 GNU 工具(binutils)加入了跨平台編譯、ELF、共享程 式庫、 C++ 擴充,等等。此外,許多廠商以 ELF 格式發行產品, 而能夠在 FreeBSD 上跑的話當然很好。而且如果能跑 ELF 格式的 執行檔,為甚麼還要理 a.out ?牠是一匹又累又老的馬,過去非常 有用,但是時候讓牠退休了。

ELF 比 a.out 更應有表達力(expressive?)而且具有更多的 擴充性。ELF工具維護的比較好,而且提供跨平台編譯的支援, 這對許多人來說是很重要的。ELF 可能比 a.out 慢一點,但差異 非常難測量出來。這兩者之間還有許多細節上的不同,例如分頁的對應方式,初始化程 式碼的作法等等。這些並不是很重要,但就是不同。在以後 GENERIC 核心不會支援 a.out ,當不再有執行傳統 a.out 程式 的需要時,會從核心移除。

Q: 為甚麼 chmod 不會改變符號連結(symlink)的存取權限?

A: 你必須把 ``-H'' 或是 ``-L'' 與 ``-R'' 選項一起使用. 參考 chmodsymlink man pages 以取得更多資訊.

警告: ``-R'' 選項會讓 chmod遞迴。用在目錄或是連結到目錄的符號連結時要小心。如果你要改變一個符號連結參 考到的目錄之存取權限,使用 chmod 且不要 加任何選項,並且在 symlink 的結尾加上斜線(``/'')。舉例來說 ,如果 ``foo'' 連結到 ``bar'',而你要更改 ``foo'' 的 權限 (事實上是 ``bar''),那就用:

        chmod 555 foo/
      



結尾的斜線,會讓 chmod 改變 ``foo'' 指向的 ``bar'' 目錄的權限。

Q: 為甚麼帳號 仍然 限制為八個字元?

A: 你會認為修改 UT_NAMESIZE然後重建系統是很簡單的事情,而且每件事都可以運作地很好。不幸的是, 有許多的程式和工具(包含系統工具)把數字寫死在程式裡(並非總是 8 或 9,有時是古怪的 15、20等等)。 這不只會把你的記錄檔弄壞(來自於變動長度和固定長度記錄的差異),也會破壞 Sun 的 NIS 客戶端的運作,和其它 UNIX 系統的交互作用也可能有潛在的問題。

在 FreeBSD 3.0 以及之後的版本,帳號的最大長度增加到 16 個字元, 而那些寫死長度的程式也找出來修正。正因為影響系統的範圍很廣,所以直到 3.0 才算大致修改完成。

如果你有自信在出問題的時後能自行解決,你可以用下面的方法讓較早的 版本支援較長的帳號。修改 /usr/include/utmp.h 中的 UT_NAMESIZE。你也 必須把 /usr/include/sys/param.h 中的 MAXLOGNAME 改成跟 UT_NAMESIZE 相符。最後,如果你是從原始程式建立系統,別忘了 /usr/include 每次都 會更新!修改 /usr/src/.. 中適當的檔案。

Q: 我能在 FreeBSD 下跑 DOS 程式嗎?

A: 是的,從 3.0 版開始可以使用已經整合並加強的 BSDI rundos DOS 模擬器。如果你對這個東西有興趣,送封信到 The FreeBSD emulation 討論區

對 3.0 之前的系統,在 port 中有一個極佳的工具程式 pcemu 可以模擬 8088 和足夠的 BIOS 服務以執行 DOS 文字模式程式。它須要 X Window System(由 XFree86 提供)。

Q: 甚麼是 ``sup'',如何使用?

A: SUP 意思是 Software Update Protocol,由 CMU 發展以維持發展的同步, 我們利用他來保持遠端的站台和原始站台同步。

SUP 對頻寬的使用不友善,而且已經不使用了。目前建議維持原始碼更新的方法是 使用手冊中的 CVSup

Q: How cool is FreeBSD?

A: 問:有人做過 FreeBSD 執行時的溫度測試嗎?我知道 Linux 比 DOS 涼, 但沒聽人提過 FreeBSD,似乎很熱。

答:沒有,但是在味覺上有做過無數次測試。我們矇上自願受試者的 眼睛,事先再給他們服用 250 毫克的 LSD-25 迷幻藥。35% 的受試者說 FreeBSD 嘗起來像橘子,而 Linux 則是紫色的榛樹果實。據我所知,沒 有一組提到溫度上特別的差異。後來發現,有太多受試者在測試時夢遊走 出房間影響到數據,最後只得放棄整個調查。我想大部份的受試者現在在 Apple 工作,繼 Drag and Drop 之後,研究全新的 Scratch and Sniff 圖形界面。It's a funny old business we're in!

不開玩笑了,FreeBSD 和 Linux 都使用 ``HLT'' (halt) 指令 以在系統閒置時降低電力的使用也減少了熱的產生。如果有設定 APM (automatic power management),FreeBSD 也可以讓 CPU 進入低電力 模式。

Q: 誰在我的記憶體插槽中沙沙作響??

A: 問:FreeBSD 編譯核心時有做甚麼 "奇特" 的事讓記憶體沙沙作響嗎? 當編譯時(還有開機時確認軟碟後的短暫時間),也種似乎來自記憶體插槽 的奇怪聲音。

答:是的!在 BSD 的文件中你會常常看到 ``背後靈'',大部份的人 都不知道那是一種實際存在的精神體 --- 掌控著你的電腦。你聽到的聲音 是這些背後靈以高音口哨在溝通怎樣做許多的系統管理工作。

如果這些聲音很困擾你,來自 DOS 的 ``fdisk /mbr'' 就 能擺脫,但如果有相反的效果也不要驚訝。事實上,如果在儀式中聽到 Bill Gates 恐怖的聲音從內建的喇叭傳來,馬上逃而且不要回頭! 從 BSD 背後靈不平衡的影響中解放,DOS 和 Windows 背後靈通常都能 重新控制整台機器並對你的靈魂詛咒。如果有選擇,我想我寧願習慣奇 怪的聲音。

Q: MFC 是甚麼意思?

A: MFC 是 'Merged From -CURRENT' 的縮寫。使用在 CVS 記錄中以 表示從 CURRENT 中整合進 STABLE 分支的改變。

Q: 'BSD' 是什麼意思?

A: 在只有會員知道的秘密語言中,它用來表示某種東西。我們無法作文字上直接的翻譯, 只能說它的意思大概在 '一級方程式賽車'、'企鵝是好吃的小點心'、和 '我們比 Linux 來得有幽默感' 這三者之間。:-)

正經點,BSD 是 'Berkeley Software Distribution' 的縮寫,由當時的 Berkeley CSRG(Computer Systems Research Group)選來當作他們所發行 Unix 版本的名稱。

Q: 要幾個 FreeBSD hacker 才能換掉一個電燈泡?

A: 一千一百七十二個:

二十三個在 -current 上抱怨看不到光了;

四個宣稱這是設定上的問題,所以像這樣的 email 應該放在 -questions;

三個 submit PR,其中一個送錯到 doc 下,並且內容只有”這裡好暗”;

一個 commit 尚未測試的電燈泡,造成不能 buildworld,五分鐘後他把原來 的燈泡換回來;

八個煽起 flame war,責怪送出 PR 的人沒有包括 patch;

五個埋怨 buildworld 爛掉了;

三十一個說 buildworld 可以用,不能用的人一定是 cvsup 的時機不對;

一個把換成新燈泡的 patch 丟到 -hackers 上;

一個說他三年前就做出了 patch,但送到 -current 後卻被忽略掉,所以他 對整個 PR 系統有很不好的印象。此外,他也認為拿出的新燈泡無法反光;

三十七個咆哮說電燈泡不屬於基本系統的一部份,所以 committer 不能不先 諮詢整個 Community 的意見就這樣做下去。還有,-CORE 到底和這件事有什麼 關係?!

兩百人抱怨換燈泡之後,腳踏車棚的顏色變得好奇怪;

三個指出,用來換燈泡的 patch 不符合 style(9) 的規定;

十七個埋怨拿出來的新燈泡為什麼是用 GPL;

五百八十六人陷入一場 flame war,在 GPL、BSD、MIT、NPL 各個 license 和 FSF 某位不具名創辦人士個人衛生之間,比較彼此的優勢;

七個將這一串討論的不同部份分別移到 -chat 和 -advocacy;

就算提出的新燈泡比舊的暗,還是有一個把它 commit 進來;

兩個換回原先的燈泡,並且留下極為憤怒的 commit 訊息。他們認為與其讓 FreeBSD 用暗燈泡,還不如乾脆待在黑暗中算了;

四十六人對取消不用暗燈泡這件事大聲疾呼,要求 -core 立刻提出澄清;

十一個要求換成小一點的電燈泡,以便未來 FreeBSD 如果移植到電子雞上後 會更為方便;

七十三人抱怨 -hackers 和 -chat 上的 SNR,藉 unsubscribe 來表示抗議;

十三個送出 "unsubscribe"、”我要如何 unsubscribe”或”拜託把我從 list 名單中刪掉”,信的最後面則是一般由 majordomo 加上去的 footer;

當每個人忙於彼此叫罵時,有個傢伙趁沒人注意,把可以用的燈泡偷偷換上 去;

三十一個指出如果用 TenDRA 編譯新的燈泡,會比舊的來得亮 0.364%(雖然 燈泡會被編譯成正六面體),所以 FreeBSD 內定的編譯器應該是 TenDRA,而不 是 EGCS;

有個人說新燈泡缺乏美感;

九個人(包括原先送 PR 的人)問”什麼是 MFC?”;

五十七個抱怨自從換了燈泡後,兩個星期都沒有光出現。

Nik Clayton 補注:

剛看到時,我快笑翻了。

然後想到,”等一下,不是應該還有一個要將這些記在 list 上嗎?”

接著終於了解我的使命 :-)

本節笑話之著作權屬於 Copyright (c) 1999 Dag-Erling Co骾an Sm鷨grav。 為避免喪失原意請勿任意重置上述任一字句。


Chapter 13. 給有心深入研究的 FreeBSD hacker

Q: SNAPs 和 RELEASEs 是什麼?
Q: 我要怎麼作出自己的 release?
Q: 怎樣才能做出自己用的安裝磁片?
Q: ``make world'' 把原來裝的 binary 檔都換掉了。
Q: 在系統開機時,出現 ``(bus speed defaulted)''。
Q: 我的網路連線不快,那可以跟著 current 的發展嗎?
Q: 你是怎麼把發行版本中的檔案切成一個個 240k 的小檔案?
Q: 我在 kernel 裡加了些新功能,要把它寄給誰?
Q: ISA 的 Plug N Play 卡是怎麼偵測和初始化的?
Q: FreeBSD 是否有支援 x86 以外的機器架構?
Q: 我剛剛寫了某個設備的驅動程式,能不能給它一個 major number?
Q: 關於放置目錄和檔案 inode 作法上的相異
Q: 如何從 kernel panic 得到最多資訊?
Q: dlsym() 對 ELF 執行檔不能用!
Q: 增加或減少 kernel 能定址的空間

Q: SNAPs 和 RELEASEs 是什麼?

A: 目前有三個活躍/半活躍的分支在 FreeBSD 的 CVS Repository:

  • RELENG_2_22.2-stable"2.2 branch"

  • RELENG_33.x-stable"3.0 branch"

  • HEAD-current4.0-current



如同其他兩個,HEAD 並不是真正的 branch tag,它只是一個符號 常數,指向 "current:尚未分支的發展中版本" ,簡記為 -current

以現在來說,-current 朝向 4.0 發展,而 3.0-stable 這 個分支,也就是 RELENG_3,在 1999 年 1 月從 -current 分出 來。

2.2-stable 這個分支,也就是 RELENG_2_2,是在 1996 年 11 月從 -current 分出來。

2.1-stable 這個分支,也就是 RELENG_2_1_0,則是在 1994 年 9 月從 -current 分支出來,這個分支已經完全退休了。

Q: 我要怎麼作出自己的 release?

A: 做 release 包括下面這三個步驟:首先,做出有 vn 這個驅動程 式的可用 kernel。把下面這一行加到 kernel 設定檔,然後做出新的 kernel 重新開機:

        pseudo-device vn         #Vnode driver (turns a file into a device)
      



接著,你手上要有整個 CVS repository。可以參考 CVSUP 這篇文章,但在 supfile 中把 release 名稱設成 cvs,再刪掉所有 tag 或 date 的欄位,如 下:

        *default prefix=/home/ncvs
        *default base=/a
        *default host=cvsup.FreeBSD.org
        *default release=cvs
        *default delete compress use-rel-suffix

        ## Main Source Tree
        src-all
        src-eBones
        src-secure

        # Other stuff
        ports-all
        www
        doc-all
      



然後執行 cvsup -g supfile 把所有東西都抓下來...

最後,硬碟要有相當大的空間來做 release。假設你想把它放在 /some/big/filesystem 這裡,上面這個例子也把 CVS repository 放在 /home/ncvs 了,接著:

        setenv CVSROOT /home/ncvs        # or export CVSROOT=/home/ncvs
        cd /usr/src/release
        make release BUILDNAME=3.0-MY-SNAP CHROOTDIR=/some/big/filesystem/release
      



整個 release 會做在 /some/big/filesystem/release。結束 時 /some/big/filesystem/release/R/ftp 這個目錄可以直接用 來做為 FTP 安裝方式的來源。如果想做出 -current 以外分支的 SNAP, 在上面 make release 這一行加 RELEASETAG=SOMETAG。舉例來說, RELEASETAG=RELENG_2_2 這個參數會做個即時的 2.2-STABLE snapshot。

Q: 怎樣才能做出自己用的安裝磁片?

A: 建立安裝磁片、還有做出 source/binary archive,都是由 /usr/src/release/Makefile 裡面的各種 target 自動產生,這 個檔案裡的資訊應該足以開始。但是這個過程牽涉到 make world,所以會 用到相當多的時間和硬碟空間。

Q: ``make world'' 把原來裝的 binary 檔都換掉了。

A: 沒錯,就是這樣子。如名字所示,``make world'' 會重新編譯系統內建 的每個 binary 檔,這樣在結束時就可確定有個一致且乾淨的環境(所以要 花上好一段時間)。

在執行 ``make world'' 或 ``make install'' 時,如果有 設 DESTDIR 這個環境變數,新產生的 binary 將會裝在 ${DESTDIR} 下的同樣目錄樹中。但在某些修 改 shared library 和重建 binary 的無特定情況下,這樣做可能會使 ``make world'' 失敗。

Q: 在系統開機時,出現 ``(bus speed defaulted)''。

A: Adaptec 1542 SCSI 卡允許使用者用軟體調整匯流排的存取速度。早 期的 1542 驅動程式試圖將它設成可用的最快速度,但後來發現在一些 機器上不能用,所以現在要在 kernel 設定中加 ``TUNE_1542'' 這個選項來啟動這個功能。在支援的機器上用這個選項會使硬碟存取更 快,但在不支援的機器上有可能會毀掉資料。

Q: 我的網路連線不快,那可以跟著 current 的發展嗎?

A: 可以,藉著 CTM 就 可以不用下傳所有的原始碼目錄樹。

Q: 你是怎麼把發行版本中的檔案切成一個個 240k 的小檔案?

A: 在以 BSD 為主的較新系統中,split 有個 ``-b'' 選項,是用來 把檔案以任意數目 byte 切開。

這裡是 /usr/src/Makefile 中的一個例子:

        bin-tarball:
        (cd ${DISTDIR}; \
        tar cf - . \
        gzip --no-name -9 -c | \
        split -b 240640 - \
        ${RELEASEDIR}/tarballs/bindist/bin_tgz.)
      



Q: 我在 kernel 裡加了些新功能,要把它寄給誰?

A: 請看一下 Handbook 中加入程式碼的部份

同時也感謝你的費心!

Q: ISA 的 Plug N Play 卡是怎麼偵測和初始化的?

A: Frank Durda IV 所寫:

簡單的說,當主機發出是否有 PnP 卡的詢問訊號時,所有的 PnP 會在幾個固定的 I/O port 作回應。所以當偵測 PnP 的程式開始時,它 會先問有沒有 PnP 卡在,接著所有 PnP 卡會在它所讀的 port 以自己 的型號 # 作回答,這樣偵測程式就會得到一個 wired-OR ``yes'' 的數字,其中至少會有一個 bit 是打開的。然後偵測程式會要求型號 (由 Microsoft/Intel指定)小於 X 的卡``離線'',再去看是否還有卡回 答同樣的詢問,如果得到 ``0'',就表示沒有型號大於 X 的卡。 現在程式會問是否有型號小於 X 的卡,如果有的話,程式再要型號大於 X-(limit/4) 的卡離線,然後重覆上面的動作。用這種類似 binary search 的方法,在某範圍內找個幾次後,偵測程式最後會在機器中區分 出所有的 PnP 卡,搜尋次數也遠低於一個個找的 2^64 次。

一張卡的 ID 由兩個 32-bit(所以上面是 264) + 8bit 偵錯 碼組成,第一個 32 bits 是用來區分各家廠商的。這些廠商沒有出來澄 清過,但看來應假設同一家出的不同種類的卡的廠商 ID 有可能不同。 用 32 bits 只來表示不同廠商的想法實在有點過頭了。

第二個 32 bits 則是型號 #、乙太網路位址、或一些使這張卡獨 特的資料。除非第一個 32 bits 不同,否則廠商不可能作出第二個 32 bit 相同的兩張卡。所以在一台機器中可以有同樣的好幾張卡,然而他們 整個 64 bits 還是會都不一樣。

這兩個 32 bit 永遠都不可能為零,這使得最開始 binary search 中 的 wired-OR 會得到一個非零數字。

一旦系統區分出所有卡的 ID,接著會經由同樣的 port 一個個重新啟 動每張卡,接著找出已知介面卡所需的資源、有哪些可以選的 interrupt 等等。所有卡都會被掃描一次,來收集這些資料。

這些資訊接著和硬碟上的 ECU 檔案、或 MLB BIOS 裡的資料結合在一 起,通常是綜合 ECU 和 MLB 裡的 BIOS PnP 資料,這些週邊並不支援真 正的 PnP,然而偵測程式在檢查 BIOS 和 ECU 資料後,它可以避免 PnP 週邊和那些偵測不到的相衝突。

接著再度拜訪這些 PnP 週邊,這次會把可用的 I/O、DMA、IRQ 和記 憶體映射的位址都指定給它們。這些週邊就會出現在所指定的地方,直到 下一次重新開機為止,不過也沒有人說不能把它們隨時移來移去。

上面有相當多的簡化,但你應該已經了解大致的過程。

Microsoft 把表示印表機狀態的幾個主要 port 拿來作 PnP,他們的 邏輯是沒有一張卡會在這些地方解碼作相反的 I/O cycles。但是我找到 一款早期仍在評估 PnP 提案時的 IBM 原廠 printer board,它的確去解 對這些狀態 port 的寫入資料,但是 MS ``說了就算''。所以它們的確有 對印表機狀態 port 寫入,還有讀取該位址 + 0x800、和另一個在 0x2000x3ff 之間的 port。

Q: FreeBSD 是否有支援 x86 以外的機器架構?

A: 有幾群人士已經表示對發展多平台 FreeBSD 的興趣,其中 FreeBSD/AXP (ALPHA) 即是其中相當成功的例子,可以在 ftp://ftp.FreeBSD.org/pub/FreeBSD/alpha 這裡取得它的 3.0 SNAPshot 版本。ALPHA 版的 FreeBSD 在越來越多的 ALPHA 機器上 使用,其中包括了 AlphaStation、AXPpci、PC164、Miata 和 Multia 這幾種。要等到系統安裝工具完全、能用光碟安裝、以及有足夠能用的 port/package 之後,我們才打算把它當作完整的版本,所以現在應該把 FreeBSD/AXP 當作 BETA 品質的軟體。若要相關狀況的消息,請加入 mailing list

也有人表示過將 FreeBSD SPARC 版本的興趣,如果你想參加這個計畫, 請加入 mailing list。如果想要知道關於 新平台的討論,請加入 mailing list

Q: 我剛剛寫了某個設備的驅動程式,能不能給它一個 major number?

A: 這要看你是否打算將這個驅動程式公開使用,如果是的話,請把它的原始 碼送一份給我們,還有 files.i386 修改的部份、kernel 設定 檔樣本、以及用來產生設備檔的 MAKEDEV。 如果你不打算、或因為版權問題而不能公開的話,我們有特地保留 character major number 32 和 block major number 8 給這方面的使用, 直接用這兩個就好了。不論如何,我們都會很感激你能在 發表驅動程式的消息。

Q: 關於放置目錄和檔案 inode 作法上的相異

A: 在回答有關目錄放置方式不同的問題上,我在 1983 年寫好目前的作法 後就沒有再改變過,這種方式是針對原先的 FFS 檔案系統,後來也沒 有對它作任何更動。它在避免 cylinder group 被填滿這方面做得相當 成功,但是就像有些人已經注意到,它和 `find' 就配合得不大好。大 部份的檔案系統是由那些用 depth first search(aka ftw) 產生的 archive 製造出來,解出來的目錄 inode 會橫跨好幾個 cylinder group,如果以後要做 depth first search 的話,這是最糟糕的情況之 一。如果我們知道總共會產生多少目錄的話,解法是在做任何存取/寫 入動作之前,在每個 cylinder group 上先造出(所有目錄數/cylinder greoup 的數目)這麼多的目錄。很明顯的,我們必須要有根據地去猜這 個數字,就算一個像 10 的很小固定數目也會使效率以級數成長。區分 restore (即解開上述的 archive) 和一般檔案操作的方法可以是(現在 用的演算法可能要更敏感):如果一些目錄(最多 10 個)都在 10 秒內產 生的話,那麼就把這些目錄聚集在同一個 cylinder group。不管怎樣, 我的經驗指出這是一個已經充份實驗過的部份。

Kirk McKusick, September 1998

Q: 如何從 kernel panic 得到最多資訊?

A: [這節是從 Bill Paul 在 freebsd-current mailing list 上發表 的信中節錄,Dag-Erling Co骾an Sm鷨grav 修正了打字錯誤、再加上括弧裡的注解。]

From: Bill Paul <wpaul@skynet.ctr.columbia.edu>
Subject: Re: the fs fun never stops
To: ben@rosengart.com
Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT)
Cc: current@FreeBSD.org
      



[<ben@rosengart.com> 發表了下面的 panic 訊息]

> Fatal trap 12: page fault while in kernel mode
> fault virtual address   = 0x40
> fault code              = supervisor read, page not present
> instruction pointer     = 0x8:0xf014a7e5
                                ^^^^^^^^^^
> stack pointer           = 0x10:0xf4ed6f24
> frame pointer           = 0x10:0xf4ed6f28
> code segment            = base 0x0, limit 0xfffff, type 0x1b
>                         = DPL 0, pres 1, def32 1, gran 1
> processor eflags        = interrupt enabled, resume, IOPL = 0
> current process         = 80 (mount)
> interrupt mask          =
> trap number             = 12
> panic: page fault
      



當你看到像這樣的訊息時,只把它拷一份送上來是不夠的。我在上 面特地標明的 instruction pointer 值相當重要,不幸的是它會因設 定而不同。換句話說,這個值會跟你用的 kernel image 檔而變動。如 果是用某個 snapshot 版本的 GENERIC kernel,也許其他人可以追蹤 到出問題的函式,但如果你是用自訂的 kernel,那麼只有才能 告訴我們問題出在那裡。

要做的事包括這些:

  • 把 instruction pointer 的值記下來。注意在前面的 0x8: 在這個情況中並不重要,我們要的是 0xf0xxxxxx

  • 當系統重新開機後,執行這道命令:

    % nm /(造成 panic 的 kernel 檔案) | grep f0xxxxxx
              

    其中 f0xxxxxx 就是記下來的 instruction pointer 值。有可能 不會剛好找到完整的這個字串,這是因為 kernel symbol table 裡的各 個 symbol 只是函式的進入點,但 instruction pointer 所指的位址有 可能是在函式內的某一處,而不一定在開頭。所以如果找不到整個字串, 那麼把 instruction pointer 值的最後一個數字拿掉,再試一次:

    % nm /kernel.that.caused.the.panic | grep f0xxxxx
      

    如果這樣也找不到,那就把另一個數字去掉再找,一直重複到找到為止, 結果是一串可能造成 panic 的函式列表。這樣比直接找到出問題的函式 來得差,但至少好過什麼都沒有。



我常常看到人們顯示一大片 panic 訊息,但很少看到有人花一點時間 把 instruction pointer 和 kernel symbol table 中的函式比較一下。

要追蹤出造成 panic 原因的最好方法是先做出 crash dump,然後用 gdb(1) 在上面做 stack trace。當然,這要靠 -current 中的 gdb(1) 能運作正常,然而我無法保證這一點。(記得有人說 ELF 的 gdb(1) 在 kernel 的 crash dump 上不能正常操作,在 3.0 脫離 BETA 階段時最好有人先檢查這方面的狀況,免得很多人在收到 3.0 光碟 後脹紅了臉。)

不管是那一種,我通常是用這個方法:

  • 寫好 kernel 設定檔。如果你需要用 kernel debugger,在設定 檔中加上 `options DDB' 這個選項。(當我懷疑有出現無窮迴圈時,通 常會用這個來設定中斷點。)

  • config -g KERNELCONFIG 做出用來編譯的目錄

  • cd /sys/compile/KERNELCONFIG; make

  • 等 kernel 編譯出來

  • cp kernel kernel.debug

  • strip -d kernel

  • mv kernel /kernel.orig/

  • cp kernel /

  • 重新開機



[注意:現在 FreeBSD 3.x kernel 內定是 ELF 格式,所以應該 用 strip -g 而不是 strip -d。如果你的 kernel 因某種原 因仍是 a.out 格式的話,則用 strip -aout -d。]

注意你不會真的用包括所有 debug symbol 的 kernel 來開機, 用 -g 編譯出來的 kernel 大小很容易就超過 10MB。不需要用這麼 大的 kernel 開機,晚一點 gdb(1) 才會需要它(gdb(1) 會用 到裡面的 symbol table)。所以我們才會把完整的 kernel 複製一份,接 著用 strip -d 刪掉 debug symbol,做出第二個 kernel,這個才真 正拿來開機。

要確定能抓到 crash dump,先編輯 /etc/rc.conf,將 dumpdev 指到 swap 分割區。這樣 rc(8) 會用 dumpon(8) 來啟動 crash dump,你也可以手動用 dumpon(8)。在 panic 之後, crash dump 可以用 savecore(8) 存起來;如果 /etc/rc.conf 裡有設 dumpdev,那麼重新開機後 rc(8) 會自動執行 savecore(8) 把 crash dump 存在 /var/crash

注意:FreeBSD 的 crash dump 通常和機器裡的實際記憶體一樣大, 就像如果有 64MB 記憶體,crash dump 大小就是 64MB。所以要確定 /var/crash 下有足夠的空間,或是可以手動執行 savecore(8) 把 crash dump 放到另一個空間較夠的目錄下。另一種也許可以限制 crash dump 的方法,是在 kernel 設定檔中用 options MAXMEM=(foo), 將 kernel 可用的記憶體限制在合理的大小。舉例來說,如果你有 128MB 的記憶體,但是可以限制 kernel 只能用 16MB 的記憶體,這樣 crash dump 就是 16MB 而不是 128MB 了。

一旦發現有了 crash dump,就可以用 gdb(1) 來做 stack trace ,如下所示:

% gdb -k /sys/compile/KERNELCONFIG/kernel.debug /var/crash/vmcore.0
(gdb) where
      



要注意可能會出現好幾個螢幕的可用資訊,你可以用 script(1) 把所有輸出都存起來。用包括所有 debug symbol 的 kernel 來除錯, 這樣應該可以直接顯示 panic 是發生在那一行。通常是由下往上讀 stack strace,這樣才能一個個追蹤出有哪些動作引到 crash。也可以用 gdb(1) 把各種變數或結構的內容印出來,以檢查系統 crash 時的 實際狀態。

好啦,如果你有第二台電腦而且有夠瘋狂,可以將 gdb(1) 設定 成遠端除錯。這樣你可以在一台機器中用 gdb(1) 去除錯另一台裡的 kernel,可以執行的包括設定中斷點、在 kernel 原始碼中一步步執行等 等,就像在一般使用者程式上除錯一樣。由於沒有什麼機會為除錯而設置 兩台並鄰電腦,所以我還沒有這樣玩過。

[Bill 附注:我忘了提到一點:如果你有啟動 DDB 而 kernel 也 已經進入除錯器,可以在 DDB 命令列下打 `panic',強迫產生 panic(還 有 crash dump)。也有可能在 panic 階段時再進入除錯器,如果這樣的話 ,輸入 `continue',接著它就會完成 crash dump。 -ed]

Q: dlsym() 對 ELF 執行檔不能用!

A: 在 ELF 一系列的工具中,內定是不會讓 dynamic linker 看到執行檔 裡定義了哪些 symbol。所以 dlsym() 沒有辦法用藉由呼叫 dlopen(NULL, flags) 取得的 handle,用它去搜尋有那些 symbol 一定會失敗。

如果你想要用 dlsym() 找出某個 process 的主執行檔中 有哪些 symbol,則要在 link 時對 ELF linker 加上 -export-dynamic 這個參數。

Q: 增加或減少 kernel 能定址的空間

A: 系統的內定是,FreeBSD 3.x kernel 能定址到 256 MB,4.x 則是 1 GB。如果是網路負荷相當重的伺服器(就像大型 FTP 或 HTTP 伺服器), 256 MB 可能會不大夠。

要怎麼增加定址空間呢? 要從兩方面著手。首先告訴 kernel 本身要 保留較大空間; 其次,既然是在定址空間的最上面載入 kernel,所以還 要調低載入的位址,否則就會超過定址範圍。

增加 src/sys/i386/include/pmap.h 裡的 NKPDE 值 便可達成第一個目標。1 GB 的定址空間會像這樣:

#ifndef NKPDE
#ifdef SMP
#define NKPDE                   254     /* addressable number of page tables/pde's */
#else
#define NKPDE                   255     /* addressable number of page tables/pde's */
#endif  /* SMP */
#endif
      



要算出 NKPDE 的正確值,將想要的空間大小(以 megabyte 為單 位)除以 4,接著單 CPU 機器減 1,雙 CPU 則是減 2。

要解決第二個問題,必須自行算出 kernel 被載入的位址:求出 0x100100000 減掉定址空間大小的值(以 byte 為單位),如 1 GB 大小就 是 0xc0100000。把 src/sys/i386/conf/Makefile.i386 裡的 LOAD_ADDRESS 設成這個值,接著在 src/sys/i386/conf/kernel.script 中,將 section 列表最前面的 location counter 設成相同的值,如下:

OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(btext)
SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-freebsdelf/lib);
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  . = 0xc0100000 + SIZEOF_HEADERS;
  .interp     : { *(.interp)    }
      



然後重新 config 和做出新的 kernel。在執行像 ps(1) top(1) 這類程式時可能會碰到問題,做一次 make world 應該就可以解決(或把改過的 pmap.h 拷到 /usr/include/vm/ 下,再手動編譯 libkvmpstop)。

注意:kernel 所能定址的空間大小必須是 4 megabytes 的倍數。

[David Greenman 加上 這一段:我認為 kernel 定址空間大小應該是 2 的乘冪,但不大確 定這一點。舊的啟動程式會動到 high order address bits,記得它假設 至少有 256 MB。]


Chapter 14. 感謝

      假如您在這份 FAQ 中找到錯誤的地方,或是您想增加些甚麼,
      請寫封信到 <FAQ@FreeBSD.org>。我們非常感謝您的建議,
      因為您的建議讓這份文件變得更好!


                                          FreeBSD Core Team
    



Jordan Hubbard

不停的更新過時的 FAQ

Doug White

經常在 freebsd-questions 上回答問題

Joerg Wunsch

經常在 Usenet 上回答問題

Garrett Wollman

Networking and formatting

Jim Lowe

Multicast information

Peter da Silva

FreeBSD FAQ 這份文件的打字苦工

The FreeBSD Team

Kvetching,moaning,submitting data



對於那些曾經對這份 FAQ 提供幫助,而我們沒提到的人們,我們由衷的感謝您!