Chapter 5 常見問題解決

William Liao
5.1. 為什麼 FreeBSD 抓到錯誤的記憶體容量?
5.2. 硬碟有壞軌時該怎麼辦?
5.3. 為什麼 FreeBSD 抓不到 HP Netserver 的 SCSI 控制卡?
5.4. 一直看到類似 “ed1: timeout” 的訊息。它們是什麼意思呢?
5.5. 3Com® 3C509 網路卡莫名其妙罷工?
5.6. 平行埠印表速度破天荒的慢,該怎麼辦?
5.7. 程式有時會因 “Signal 11” 錯誤而停止?
5.8. 當機時出現:“Fatal trap 12: page fault in kernel mode” ,或是 “panic:” 以及一堆錯誤訊息,該怎麼辦?
5.9. 為什麼當我開機時,螢幕變黑,且不停閃動?
5.10. 為什麼我的系統裝有 128 MB 的 RAM,而 FreeBSD 只用了其中的 64MB?
5.11. 機器上的 RAM 有 1GB 以上,可是為何卻收到 “kmem_map too small” 的 panic 錯誤訊息?
5.12. 機器上 RAM 不到 1GB ,但仍會出現 “kmem_map too small!” 的 panic 錯誤訊息
5.13. 為什麼我一直看到 “/kernel: proc: table is full” 這個錯誤訊息?
5.14. 為什麼用新 kernel 開機時,出現 “CMAP busy” 這個錯誤訊息?
5.15. 請問這個訊息:“ahc0: brkadrint, Illegal Host Access at seqaddr 0x0” 是什麼意思?
5.16. 開機時,看到這個錯誤訊息 “ahc0: illegal cable configuration”。 我的排線確定有接對。 是出了什麼問題呢?
5.17. 為什麼 Sendmail 一直出現 ““mail loops back to myself”” 這個錯誤訊息?
5.18. 為什麼執行遠端機器(remote machine)的全螢幕的軟體時, 有不正常的情形?
5.19. 為什麼我的機器一直顯示 “calcru: negative time...”?
5.20. 出現 “pcm0 not found” 這個訊息,或者是 我的音效卡變成了 pcm1,但在 kernel 設定 檔�我是設 device pcm0 啊。這是怎麼回事呢?
5.21. 為什麼在更新到 FreeBSD 4.X 後會抓不到我的 PnP 卡 (或者是抓成 unknown)?
5.22. 為什麼我常常在跑一些程式(例如 topsystat)的時候出現 “nlist failed” 這個錯誤訊息?
5.23. 為什麼我用 sshtelnet 連到我的電腦時,會等待很長的一段時間才能連上?
5.24. stray IRQ” 這個錯誤訊息是什麼意思?
5.25. 為什麼 “file: table is full” 這個訊息 一直在 dmesg �重複出現?
5.26. 為什麼我筆記型電腦上的時鐘一直顯示錯誤的時間?
5.27. 為什麼我的筆記型電腦無法正確的偵測到 PC card ?
5.28. 為什麼在 BIOS 畫面之後,FreeBSD 的 boot loader 顯示 “Read error” 然後就停止不動了?
5.29. 另一個作業系統摧毀了我的 Boot Manager。我要怎麼樣才能把它還 原回來?
5.30. 這個錯誤訊息:“swap_pager: indefinite wait buffer:” 是什麼意思呢?
5.31. 為何在 buildworld/installworld 時,會趴在 “touch: not found” 的錯誤訊息?

5.1. 為什麼 FreeBSD 抓到錯誤的記憶體容量?

抓到錯誤的記憶體容量是因為物理位址跟虛擬位址兩者是不同的。

The convention for most PC hardware is to use the memory area between 3.5G and 4G for a special purpose (usually for PCI). This address space is used to access PCI hardware. As a result real, physical memory can not appear in that address space.

What happens to the memory that should appear in that location is dependent on your hardware. Unfortunately, some hardware does nothing and the ability to use that last 500M of RAM is entirely lost.

Luckily, most hardware remaps the memory to a higher location so that it can still be used. However, this can cause some confusion if you watch the boot messages.

On a 32 bit version of FreeBSD, the memory appears lost, since it will be remapped above 4G, which a 32 bit kernel is unable to access. In this case, the solution is to build a PAE enabled kernel. See this FAQ entry for more information.

On a 64 bit version of FreeBSD, or when running a PAE-enabled kernel, FreeBSD will correctly detect and remap the memory so it is usable. During boot, however, it may seem as if FreeBSD is detecting more memory than the system really has. This is normal and the available memory will be corrected as the boot process completes.

5.2. 硬碟有壞軌時該怎麼辦?

若是 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 這個磁碟驅動程式上(這 個代表了 FreeBSD 4.0 並不支援它),它也無法用在 SCSI 硬碟上。 bad144的工作方法是將所有找到的壞軌資料存到一個特別的檔案�。

使用 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 的功能已經啟動了,而您依然一直看到壞軌產生, 那麼考慮換一台硬碟吧。壞軌的情形只會隨時間增加而更為嚴重。

5.3. 為什麼 FreeBSD 抓不到 HP Netserver 的 SCSI 控制卡?

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

因此,現在你能做的最好事情就是在 kernel �設定 EISA_SLOTS 這個選項為 12 ,然後當作沒有這個 問題 :)。請依照 Handbook 中有關 kernel 的設定 �所說的方法來設定與編譯 您的 kernel。

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

eisa 12
quit

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

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

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

5.4. 一直看到類似 “ed1: timeout” 的訊息。它們是什麼意思呢?

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

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

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

5.5. 3Com® 3C509 網路卡莫名其妙罷工?

這塊卡有個不好的地方在於它常常會遺失本身的設定資料。請使用該 卡的 DOS 工具 3c5x9.exe 來更新卡上設定。

5.6. 平行埠印表速度破天荒的慢,該怎麼辦?

如果唯一的問題就是速度很慢的話,試著改變您的 印表機連接埠設定 這個在手冊中的 印表機設定 這個章節有加以討論。

5.7. 程式有時會因 “Signal 11” 錯誤而停止?

Signal 11 這個錯誤是因為你的 process 嘗試要存取一塊記憶體, 而你的作業系統並不允許它做這個動作而發生的。如果這種情形常常不 定時發生,那麼你應該要開始看看是不是哪裡出問題了。

這些問題可能是與下列情形有關:

  1. 如果這個問題只在某一個您自己寫的某個特定程式發生,那 麼很有可能是您的程式碼有問題。

  2. 如果這個問題是在 FreeBSD 的某些系統檔案發生,有可能是 因為程式有問題,但通常在我們這群讀 FAQ 的使用者去跑這些有 問題的程式碼前,它們早就就已經被解決了(這是 -current 在做 的事)。

尤其如果你在編譯一個程式,但是每次編譯器跑出來的結果都不一樣 的話,這是一個無解的問題,而不是 FreeBSD 臭蟲。

舉例來說,假設您正在跑 “make buildworld”, 而 compiler 在將 ls.c 編譯成 ls.o 時發生錯誤,這時請再跑一次 “make buildworld”,如果 compiler 依然在同樣的地方發 生問題,那麼就是程式碼有問題--請更新原始碼然後再試試看。而如果 compiler 是在其他的地方發生錯誤,那麼幾乎可以確定是硬體的問題了。

您這時應該做什麼:

如果是第一種情形,可以使用一些 debugger,如:gdb,來找出程式 是在那兒會去嘗試存取錯誤的記憶體位址,然後再修正它。

如果是第二種情形,就需要檢查看看是不是硬體的問題了。

一些造成硬體不穩的原因包括:

  1. 可能是硬碟過熱:請檢查機殼內的風扇是否運作正常,因為您 的硬碟(或者還有其他的硬體裝置)過熱了。

  2. 處理器過熱:這個有可能是因為超頻,或者是處理器的風扇掛了。 不論是哪種原因,您都需要將所有的元件回復到它們原先設定的工作狀 態,這樣才能解決這個問題。舉個例子來說:將處理器調回原先的工作 頻率。

    如果您還是堅持要超頻的話,請謹記,與其燒壞而需要換新的一台 主機,不如將速度調慢一點!除此之外,不管你覺得它安不安全,一般 人對於您因為超頻而發生的問題,是不會有什麼同情心的。

  3. 不穩定的記憶體:如果主機上有安裝數根 SIMM/DIMM 記憶體, 試著把它們全拆下來,然後一根一根插上去做測試,藉此縮小範圍, 以便找出有問題的某根記憶體或是某種記憶體組合。

  4. 最佳化過頭的主機板設定:在 BIOS �或是有些主機板的 jumper 上,有時可以更改一些 timing,但在大多數的情形�,使用預設值就 已經足夠了。況且有時候把 RAM 的 wait states 設太小,或是在 BIOS �,把 “RAM Speed: Turbo” 這個或是其他類似 的選項打開都有可能會造成一些不正常的現象。一個解決的方法是把 BIOS 設回預設值,不過在這之前記得先記下目前的設定!

  5. 供給主機板的電力不乾淨或是不足。試著把系統內沒有用到的 I/O 卡.硬碟或是 CDROM 暫時拆掉或是拔掉電源線,看看你的電源 供應器是不是能夠在小一點的負荷下正常工作。不然就是換上另一 個新的電源供應器,最好是瓦數高一點的(打個比方來說,如果原 先的電源供應器是 250 瓦的,那麼就換上 300 瓦的試試)。

請順便參閱 SIG11 FAQ(連結在下面),雖然它是站在 Linux 的角 度寫的,可是裡面對這些問題有許多很棒的解說。它裡面也有討論為什麼 有問題的記憶體能通過軟體或硬體的測試的原因。

最後,如果上面這些原因都排除了,那麼有可能是遇到了 FreeBSD �的一隻臭蟲,請參閱指示做一個問題回報。

這兒有一個更詳細的 FAQ - the SIG11 problem FAQ

5.8. 當機時出現:“Fatal trap 12: page fault in kernel mode” ,或是 “panic:” 以及一堆錯誤訊息,該怎麼辦?

FreeBSD 的開發者對於這些錯誤訊息相當的有興趣,但是他們需要 更詳細的一些細節。請把您的當機的訊息全部複製下來,接著查閱 FAQ � kernel panics 這節,依說明編譯一個含除錯碼的 kernel,以取得函式 呼叫順序(backtrace)。這個聽起來很難,但實際上並不需要任何程式 設計的能力,您只需要依照指示做即可。

5.9. 為什麼當我開機時,螢幕變黑,且不停閃動?

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

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

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

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

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

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

就算使用了上面這些方法,X Window 仍然有可能無法順利執行。 如果發生了這種情形,請確定你用的 XFree86 的版本是最新的 XFree86 3.3.3 或是其後的版本。它們有內建支援 Mach 64 這張卡,甚至為了這 些卡還附有一個特別的 X Server

5.10. 為什麼我的系統裝有 128 MB 的 RAM,而 FreeBSD 只用了其中的 64MB?

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

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

options "MAXMEM=n"

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

5.11. 機器上的 RAM 有 1GB 以上,可是為何卻收到 “kmem_map too small” 的 panic 錯誤訊息?

通常 FreeBSD 會依據機器狀況來自動調整 kernel 相關參數設定,比如: 根據機器所裝的 RAM 大小來決定同時可開啟的檔案數量多寡。 然而,在 1GB RAM(含以上) 的機器上,這個『自動調整』的機制可能有時會高估: 比方說..開機時,kernel 會先配置各種不同用途的表格及其他架構放到記憶體上, 然後,當整個作業系統都開始運作之後,kernel 就會開始不夠空間來做記憶體配置的動態調整, 於是就 panic 掛了。

解法是:把 VM_KMEM_SIZE_MAX 加到 kernel 設定檔內, 並重新編譯 kernel,比如:

options VM_KMEM_SIZE_MAX=419430400

這樣會設定 400 MB 來給 kernel 使用,而且採用 400 MB 的話, 目前在 6GB RAM 的機器上都可被有效運用。

5.12. 機器上 RAM 不到 1GB ,但仍會出現 “kmem_map too small!” 的 panic 錯誤訊息

之所以 panic 的原因在於系統用光了給 network buffer 用途的 virtual memory (尤其是 mbuf clusters)。解法是增加給 mbuf clusters 用的 virtual memory 數量,這步驟請參閱 FreeBSD 使用手冊的 網路限制篇

5.13. 為什麼我一直看到 “/kernel: proc: table is full” 這個錯誤訊息?

FreeBSD kernel 只允許一定數量的 process 在同一時間裡同 時運作。而這個數目是根據 kernel 設定檔裡面的 MAXUSERS 值來決定的。MAXUSERS 這個值也會影響其他的 kernel 內定值,比如說 network buffer (請參閱這個之前討 論過的問題)。如果機器負荷(load)很重,您可能需要增加 MAXUSERS 這個值。這麼作會一併提高系統的其他內 定值,包括最大可擁有的 process 數等。

若要調整 MAXUSERS,請參閱 FreeBSD 使用手冊中的 檔案/Process的限制 章節。 (雖然該處指的是『檔案的開啟數量限制』,但也適用於 process部分。)

在 FreeBSD 4.4 之後,MAXUSERS 已經變成可 以靠著更改 /boot/loader.conf �的 kern.maxusers 這個值而調整的變數了。而在之前 的 FreeBSD 版本中,這個值只能在 kernel 設定檔�調整。

如果機器負荷並不重,而您只是需要同時跑很多很多 process, 那麼也可以直接用 sysctl 調整 kern.maxproc 值。 假如這些 process 都是屬於某個使用者的,那麼您還需要另 外調整 kern.maxprocperuid 這個值,使它比新 的 kern.maxproc 這個值少 1 (一定要少 1 , 因為 init(8) 這個系統程式絕對要保持在運作狀態)。

如果想在每次開機都要更改 sysctl 的值,而且您的 FreeBSD 是 最近的版本的話,請在 /etc/sysctl.conf 這 個檔中設定,而如果是舊的版本,可以在 /etc/rc.local 中作設定。

5.14. 為什麼用新 kernel 開機時,出現 “CMAP busy” 這個錯誤訊息?

用來偵測 /var/db/kvm_*.db 過時檔案的機制偶爾會發生問題,而使用到了一個不協調 (mismatch)的檔案有時就會導致 panic。

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

# rm /var/db/kvm_*.db

5.15. 請問這個訊息:“ahc0: brkadrint, Illegal Host Access at seqaddr 0x0” 是什麼意思?

這是一個和 Ultrastor SCSI 控制卡有關的衝突(conflict)。

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

5.16. 開機時,看到這個錯誤訊息 “ahc0: illegal cable configuration”。 我的排線確定有接對。 是出了什麼問題呢?

您的主機板可能不支援自動終端電阻設定。請進到 SCSI 的 BIOS 裡面手動指定正確的終端電阻順序,而不要使用自動設定。 AIC7XXX 的驅動程式並無法知道有沒有這些排線偵測(以及自動終端電阻設定)的電路(external logic) 存在。如果 EEPROM 裡面的設定是 "automatic termination" 時,它只會單純假定這些電路當然是存在的。 若缺少了這個電路,驅動程式在設定終端電阻時就常常出問題。 而這種問題將導致 SCSI 匯流排的可靠性降低。

5.17. 為什麼 Sendmail 一直出現 ““mail loops back to myself”” 這個錯誤訊息?

這個問題在 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.sendmailcomp.mail.misccomp.mail.smailcomp.answers,和 news.answers. 您也可以寄一封 Email 到 ,然後在信件內文 中寫上 send usenet/news.answers/mail/sendmail-faq 以取得這份 FAQ 文件。

5.18. 為什麼執行遠端機器(remote machine)的全螢幕的軟體時, 有不正常的情形?

或許遠端機器並非將您的終端機模式設為 FreeBSD console 所用的 cons25,而是設為其它模式。

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

  • 在 logging 進遠端機器後,更改您的 shell 變數 TERM 為 ansi 或是 sco ﹙如果遠端機器支援這些模式的話)。

  • 使用支援 VT100 的模擬軟體,如 FreeBSD console 下的 screen 軟體。 screen 提供您在一個 terminal �同時跑好幾個 session 的能力,而且它本身也是一個相當好 的軟體。每個 screen 都像是一個 VT100 的終端機,所以遠端機器的 TERM 變數應該設為 vt100

  • 在遠端機器的終端機資料庫(terminal database)中加入 cons25 的資料。加入的方法視遠端機器的 作業系統不同而有所差異。請參閱遠端機器給系統管理員的說明 書,應該會有所幫助。

  • 啟動 FreeBSD 的 X 伺服器,然後使用一些 X Window 下的 終端機模擬器來登入遠端機器,例如 xtermrxvt。而遠端機器的 TERM 變數應該要 設為 xtermvt100

5.19. 為什麼我的機器一直顯示 “calcru: negative time...”?

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

這個問題的邊際效應是會造成有些 process 出現 “SIGXCPU exceeded cpu time limit” 的訊息,而不正常 停止。

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

# sysctl -w kern.timecounter.method=1

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

5.20. 出現 “pcm0 not found” 這個訊息,或者是 我的音效卡變成了 pcm1,但在 kernel 設定 檔�我是設 device pcm0 啊。這是怎麼回事呢?

如果您在 FreeBSD 3.x 上使用 PCI 音效卡就會發生這種問題。 因為pcm0 這個 device 是內定保留給 ISA 的音效卡的,所以如果您有一張 PCI 的音效卡,您就會遇到這個問題, 而您的卡會變成 pcm1

Note: 如果您只把 kernel 設定檔中的設定改成 device pcm1 是無法除去這個警告訊息的, 這樣會造成 pcm1 被保留給 ISA 音效卡, 而 PCI 音效卡則會變成 pcm2 (外加 “pcm1 not found” 的警告訊息)。

如果您有一張 PCI 的音效卡,您需要 make snd1 這個 device,而不是 snd0

# cd /dev
# ./MAKEDEV snd1

這個問題在 FreeBSD 4.x 上並不會發生,因為很多人投下了許多心 力讓它更PnP 導向,而且 pcm0 這個 device 也不再是只保留給 ISA 的音效卡了。

5.21. 為什麼在更新到 FreeBSD 4.X 後會抓不到我的 PnP 卡 (或者是抓成 unknown)?

FreeBSD 4.X 現在已經更 PnP 導向了, 而邊際效應就是會發生有些在 FreeBSD 3.X 可以用的 PnP 裝置 (如音效卡或是內插式數據機)變成無法使用。

這個原因可以用一封由 Peter Wemm 發到 freebsd-questions 這個 mailing list 上的信來解釋,它原本是解釋為什麼有一個內 插式數據機,在系統升級到 FreeBSD 4.x 後,就沒法被抓到了 (在 [] �的是另外加的註解,讓內容更易懂)。

The PNP bios preconfigured it [the modem] and left it laying around in port space,so [in 3.x] the old-style ISA probes “found” it there.

Under 4.0,the ISA code is much more PnP-centric. It was possible [in 3.x] for an ISA probe to find a “stray” device and then for the PNP device id to match and then fail due to resource conflicts. So,it disables the programmable cards first so this double probing cannot happen. It also means that it needs to know the PnP id's for supported PnP hardware. Making this more user tweakable is on the TODO list.

如果要讓裝置能再度運作,我們需要找出它的 PnP id,然後再將它 加入一份在偵測 ISA 裝置時會使用的表中。可以執行 pnpinfo(8) 來偵測這個裝置,舉例來說,下面是 pnpinfo(8) 抓到的一個內插 式數據機的資料:

# pnpinfo
Checking for Plug-n-Play devices...

Card assigned CSN #1
Vendor ID PMC2430 (0x3024a341),Serial Number 0xffffffff
PnP Version 1.0,Vendor Version 0
Device Description: Pace 56 Voice Internal Plug & Play Modem

Logical Device ID: PMC2430 0x3024a341 #0
        Device supports I/O Range Check
TAG Start DF
    I/O Range 0x3f8 .. 0x3f8,alignment 0x8,len 0x8
        [16-bit addr]
    IRQ: 4  - only one type (true/edge)

[more TAG lines elided]

TAG End DF
End Tag

Successfully got 31 resources,1 logical fdevs
-- card select # 0x0001

CSN PMC2430 (0x3024a341),Serial Number 0xffffffff

Logical device #0
IO:  0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8
IRQ 5 0
DMA 4 0
IO range check 0x00 activate 0x01

您所需要的資訊是一開始看到的 “Vendor ID” 這一行。括號中的十六位元碼(這個例子中是 0x3024a341)就是 PnP id,而在這之前的字串(PMC2430)則是一個獨一無二的 ASCII id。 而這些資料需要被加到 /usr/src/sys/isa/sio.c 這個檔案�。

為了防止任何東西出錯,您應該要先備份目前的 sio.c。而且您要 submit PR 時也需要這個 原始檔案來做出 patch(您應該會將它 submit PR 吧..:)..)。 接著就編輯 sio.c 找尋下面這行

static struct isa_pnp_id sio_ids[] = {

接著往下捲動,找個正確的位置來插入您的裝置資訊。您看到的就 下面這個樣子,它們是照右邊註解裡面的 ASCII 這個 Vender ID 做排 序的,或是 pnpinfo(8) 所找到的一部分 裝置描述

{0x0f804f3f,NULL},    /* OZO800f - Zoom 2812 (56k Modem) */
{0x39804f3f,NULL},    /* OZO8039 - Zoom 56k flex */
{0x3024a341,NULL},    /* PMC2430 - Pace 56 Voice Internal Modem */
{0x1000eb49,NULL},    /* ROK0010 - Rockwell ? */
{0x5002734a,NULL},    /* RSS0250 - 5614Jx3(G) Internal Modem */

把您這個裝置的十六進位的 Vender ID 加到正確的地方,存檔, 然後重新編一個 kernel,再重開機。之後這個裝置應該就會像在 FreeBSD 3.X 下,被偵測為 sio 裝置了。

5.22. 為什麼我常常在跑一些程式(例如 topsystat)的時候出現 “nlist failed” 這個錯誤訊息?

這個問題是因為您跑的程式需要一個特別的 kernel symbol,可是 不知道什麼原因而找不到﹔而會發生這個問題可能是因為下面兩個原因:

  • 您的 kernel 和 userland 的檔案版本並不一致(例如說,您 編了一個新的 kernel,但是並沒有執行對應的 installworld,或是其他類似情形), 因此 symbol table 的內容就和應用程式編譯時的不太一樣了。如 果是這種情形,請執行完整的升級步驟(請參閱 /usr/src/UPDATING 以得知正確的流 程)。

  • 您沒有用 /boot/loader 來載入您的 kernel,而是直接由 boot2 開機(請參閱 boot(8))。 雖然說跳過 /boot/loader 並沒有什麼錯, 但是它在 kernel symbols 跟應用程式的溝通方面佔了很重的份量。

5.23. 為什麼我用 sshtelnet 連到我的電腦時,會等待很長的一段時間才能連上?

症狀:TCP 連線建立之後和詢問密碼之前(如果是在說 telnet(1) 的話,則是 login 提示符號跳出來之前),要等待很長的一段時 間。

問題所在:這種延遲情形常常是因為伺服軟體(server software) 嘗試要將客戶端(client)的 IP 位址轉換成主機名稱。因為很多伺服 軟體,包括 FreeBSD 內建的 Telnet 和 SSH,為了將主機名稱寫入紀 錄檔中以供管理者作參考,而會做這項動作。

解決方法:如果這個問題在您連接不同的伺服器時都會發生,那麼 問題是在您客戶端這一方﹔同樣的,如果別人只有在連到您的伺服器上 才會發生這個情形,那麼問題就是在伺服器這邊了。

如果是客戶端這方有問題,唯一的方法就是將 DNS 伺服器修好, 這樣對方伺服器才能正確的轉換名稱。如果問題是在內部區域網路發 生的,這應該是伺服器有問題,請詳細檢查一下﹔相反的,如果是您 在上 Internet 時發生的,那麼您需要跟您的 ISP 聯絡,請他們解決 這個問題。

如果是伺服器這邊的問題,而且是發生在內部區域網路,那麼您需 要設定這個伺服器,使它能正確將內部網路的 IP 位址轉換為主機名稱。 請參閱 hosts(5)named(8) 的說明以獲得更多資訊。如 果是在 Internet 上的伺服器發生這個問題,那麼有可能是您伺服器的 轉換功能出問題。您可以試試查詢另一個主機名稱,比如: www.yahoo.com。如果查不到,那麼可以確定是您這 邊出問題了。

5.24.stray IRQ” 這個錯誤訊息是什麼意思?

Stray IRQs 是硬體 IRQ 有點小問題的現象,大多是因為硬體本身 在發出中斷需求後,又取消了它自己的中斷要求。

有三個方法可以應付這個問題:

  • 不理會這個警告。反正一個 irq 出現五次警告後系統就不會 再顯示了。

  • isa_strayintr() �的值,由 5 改成 0,這樣所有的警告訊息都不會出現。

  • 安裝使用 irq 7 的平行埠硬體設備,以及它的 PPP 驅動程式 (這個大部分系統都有做),接著安裝 ide 硬碟或是其他會使用 irq 15 的硬體設備以及它的驅動程式。

5.25. 為什麼 “file: table is full” 這個訊息 一直在 dmesg �重複出現?

這個錯誤訊息代表了您系統的 file descriptors 已經使用光了。 請參閱手冊內 Tuning Kernel Limits 裡面的 kern.maxfiles 這個章節,裡面有一些討論及解決方法。

5.26. 為什麼我筆記型電腦上的時鐘一直顯示錯誤的時間?

您的筆記型電腦裡有兩個以上的時鐘,而 FreeBSD 選到了錯的 那個。

執行 dmesg(8),檢查一下有 Timecounter 字串的那幾行。最後一行是 FreeBSD 選用的,通常是 TSC

# dmesg | grep Timecounter
Timecounter "i8254"  frequency 1193182 Hz
Timecounter "TSC"  frequency 595573479 Hz

您可以執行 sysctl(3) 看一下 kern.timecounter.hardware 這個值做確認。

# sysctl kern.timecounter.hardware
kern.timecounter.hardware: TSC

BIOS 可能在一些情形下會更改 TSC 的時脈——有時候是因為 在使用電池工作時會更改處理器的速度,另外也有可能是進入了省電模 式,可是 FreeBSD 並不會察覺到這些調整,而會發生時間增加或是減 少的情形。

在上面的例子當中,我們看到還有 i8254 這個時鐘可以選擇,執行 sysctl(3) 用手動的方式將這個值寫入 kern.timecounter.hardware 中。

# sysctl -w kern.timecounter.hardware=i8254
kern.timecounter.hardware: TSC -> i8254

這樣您的筆記型電腦應該就可以保持正確的時間了。

如果要讓這個更改的動作再每次開機時自動執行,在 /etc/sysctl.conf �加入下面這行。

kern.timecounter.hardware=i8254

5.27. 為什麼我的筆記型電腦無法正確的偵測到 PC card ?

這個問題常常發生在灌了多個作業系統的筆記型電腦上。有些非 BSD 的作業系統會讓 PC card 的硬體裝置處在一個不一致的狀態下 (inconsistent state)。使得 pccardd 在偵 測這片卡時,無法抓到正確的型號,而是 “"(null)""(null)"”。

您需要移除 PC card 插槽的電源以重置這個硬體裝置。一個方法是 將您的筆記型電腦關機(不是休眠模式,也不是待命模式﹔要完全的關 機)。等個幾秒鐘再重開機。這樣您的 PC card 應該就正常了。

有時有些筆記型電腦雖然看起來已經關機了,但實際上並沒有。 如果您發現上面那個方法沒有用,請關機,移除電池,等個幾秒鐘, 把電池裝上去然後重開機。

5.28. 為什麼在 BIOS 畫面之後,FreeBSD 的 boot loader 顯示 “Read error” 然後就停止不動了?

這是因為FreeBSD 的 boot loader 無法正確的找出硬碟的 geometry。這樣的話,就需要在用 fdisk 分割或是修改 FreeBSD 的 slice 時,手動將正確的值輸入進去了。

正確的硬碟 geometry 值在 BIOS 裡面可以查的到。注意該硬碟的 cylinders,heads 以及 sectors 這些數值。

在執行 sysinstall(8)的 fdisk 時,按下 G 以便手動設定硬碟的 geometry。

這時會有一個對話框跳出來,詢問您有關 cylinders,heads 以及 sectors 這些東西的值。請將剛剛在 BIOS 查到的數字,以 / 作分隔輸 入進去。

舉例來說,如果是 5000 cylinders,250 sectors 和 60 sectors 就輸入 5000/250/60

輸入完後請按 enter 鍵確認,最後按下 W 鍵把 新的分割區表寫入硬碟當中。

5.29. 另一個作業系統摧毀了我的 Boot Manager。我要怎麼樣才能把它還 原回來?

執行 sysinstall(8) 接著選 Configure,然後選 Fdisk。 再來用空白鍵選擇原先 Boot Manager 所在的硬碟。 按下 W 鍵來作寫入的動作。這時會跳出一個提示 訊息,詢問您要安裝哪一個 boot loader。請選擇 Boot Manager, 這樣就可以將它還原了。

5.30. 這個錯誤訊息:“swap_pager: indefinite wait buffer:” 是什麼意思呢?

這個訊息是說有一個執行程序正在嘗試將分頁記憶體(page memory) 寫入硬碟中,而這個動作嘗試了 20 秒鐘仍然無法成功。這個有可能是因為 硬碟有壞軌、電路或排線有問題、以及其他跟硬碟讀出寫入有關的硬體設備。 如果真的是硬碟壞軌的問題,您應該會在 /var/log/messages這個檔案中,或是在執行 dmesg這個指令後,看到有關磁碟錯誤的訊息。 如果沒有,那麼請檢查您的排線還有接頭連接是否良好。

5.31. 為何在 buildworld/installworld 時,會趴在 “touch: not found” 的錯誤訊息?

這錯誤訊息並不是指 touch(1) 程式不見了,事實上可能是該檔檔案時間被設為未來的時間。 若機器上的 CMOS-clock 時鐘設定為當地時間 (非格林威治時間,比如台灣時間為 GMT +08:00 ,也就是 CST 中原標準時間), 那麼請在開機時,先選 single user 模式進入,然後打 adjkerntz -i 來調整 kernel clock 與機器上的 CMOS-clock 來同步。

本文及其他文件,可由此下載:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。
關於本文件的問題,請洽詢 <doc@FreeBSD.org>。