FreeBSD China Community FAQ --New

时间:2007-08-13 04:25:36   来源:freebsdchina.org  作者:  点击:次  出处:技术无忧
关键字:faq freebsd


Q:1.11. 我要如何取得 FreeBSD?
A:每个 FreeBSD 的重要版本都可以经由匿名 ftp 从 FreeBSD FTP site 取得:

*

如果要的是 3.X-STABLE 的最新版,也就是 3.5.1-RELEASE,请到 3.5.1-RELEASE 这个目录。
*

如果要的是 4-STABLE 的最新版,也就是 5.0-RELEASE ,请到 5.0-RELEASE 这个目录
*

4.X snapshots 通常每天都会做一份。
*

5.0 Snapshot 通常也是每天都会做一份,这是从 -CURRENT 分支做出来的,主要是为了服 务那些热心的测试者和开发人员所提供的。

FreeBSD 的 CD,DVD,还有一些其他的东西的取得法可以在 使用手册中找到解答。

Q: 我要如何报告BUG呢?
A:所有使用者的变更要求都可以经由我们网页介面的 PR submission 及 query 来查询 (或是回报) 我们的错误回报资料库。也可以利用 send-pr(1) 这个指令透过电子邮件来回报错误或是要求变更。

在回报错误之前,请先读过 如何撰写 FreeBSD 的错误回报单,这是一篇告诉你怎样才能写出一篇有用的 错误回报单。

1.13. 要怎样才能成为 FreeBSD 的网页映射站台?

有很多方法可以映射我们的网页。

*

您可以利用 net/cvsup 从 cvsup.FreeBSD.org 取得格式化过的档案。 /usr/share/examples/cvsup/www-supfile就 是一个教你怎样做网页映射的 CVSup 设定范例。
*

您可以利用您喜欢的 ftp mirror 工具从 FreeBSD 的 FTP 站台 中取得网页的原始码。但是要注意的是在你打算提供公开服务之前, 记得要先利用这些原始码把网页重建起来。请从 ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/www 开始抓取。

Q:1.14.有其他的资讯来源吗?
A:详见 FreeBSD http://www.freebsd.org/ 网站上的 http://www.freebsd.org/docs.html 列表。

-----------------------------------------------------------------------
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 <tedm@toybox.placo.com>所提供:
若为 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 的功能已经启动了,而您依然一直看到坏道产生, 那么考虑换一台硬盘吧。坏道的情形只会随时间增加而更为严重。

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。


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 的设定 里所说的方法来设定与编译 您的 kernel。
当然,在安装 FreeBSD 到这种机器上时,这是一个鸡生蛋蛋生鸡的 问题。为了解决这个问题,在 UserConfig 中有 一个特别的方法,安装时不要进入 ``visual'' 介面,相反 的,在命令列模式中,键入
eisa 12
quit
然后就如以往一样安装您的系统。不过我们建议您编译与安装一个 属於自己的 kernel,但
希望在未来的版本中能对这个问题有一个好的解决方法。
Note: 您无法在 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:为什么我的 3COM 3C509 这块网路卡在没有任何明显原因下停止工作 了呢?
A: 这块卡有个不好的地方在於它常常会遗失本身的设定资料。请使用该 卡的 DOS 工具 3c5x9.exe 来更新卡上设定。

Q:我的平行印表速度破天荒的慢。我该怎么做?
A:如果唯一的问题就是速度很慢的话,试著改变您的 印表机连接埠设定 这个在手册中的 印表机设定 这个章节有加以讨论。

Q: 我的程序有时会因 ``Signal 11'' 这个错误而停止?
A: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 - [url]http://www.bitwizard.nl/sig11/ [/url]

Q:我的系统当机时出现:``Fatal trap 12: page fault in kernel mode'',或是 ``panic:'',再加上一堆错误讯息, 我该怎么办?
A: FreeBSD 的开发者对於这些错误讯息相当的有兴趣,但是他们需要 更详细的一些细节。请把您的当机的讯息全部复制下来,接著查阅 FAQ 里 kernel panics 这节,依说明编译一个含除错码的 kernel,以取得函式 呼叫顺序(backtrace)。这个听起来很难,但实际上并不需要任何程序 设计的能力,您只需要依照指示做即可。

Q:为什么当我开机时,萤幕变黑,且不停闪动?
A: 这个问题,已知是由 ATI Mach 64 显示卡所引起的。因为这块卡 使用到 2e8 这个位址,而这与第四个序列埠 (serial port)所使用的位址相同。而在 sio(4) 这个驱动 程式里,不知道是 bug 或是功能(feature),就算您没有第四个序 列埠,或是已经将 sio3(第四个序列埠)取消了,它 依然会去尝试驱动它。

直到这个问题被解决以前,您可以使用这个方法:

1.

在看到开机提示时输入 -c (这会让 kernel 进入设定模式)。
2.

取消 sio0 , sio1 , sio2 和 sio3(全部)。 这可以让 sio 驱动程式不动作 -> 於是问题解决。
3.

输入 exit 以继续启动程序。

如果您想要使用您的序列埠,您需要修改 /usr/src/sys/i386/isa/sio.c,在该档中找出 0x2e8 这个字串,移除这个字串及它前面的逗号 (保留後面的),然後重新编译一个新的 kernel。

就算使用了上面这些方法,X Window 仍然有可能无法顺利执行。 如果发生了这种情形,请确定你用的 XFree86 的版本是最新的 XFree86 3.3.3 或是其後的版本。它们有内建支援 Mach 64 这张卡,甚至为了这 些卡还附有一个特别的 X Server

Q:为什么我的系统装有 128 MB 的 RAM,而 FreeBSD 只用了其中的 64MB?
A: 因为 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这个数字。

Q:为什么 FreeBSD 2.0 因为 ``kmem_map too small!''这个原因而发生 panic ?
A:Note: 这个讯息也有可能是 mb_map too small!


这个 panic 的原因是表示系统用光了给网路缓冲区的所有的虚 拟记忆体(特别是 mbuf clusters)。您可以增加给 mbuf clusters 的 VM 的数量,只要加入:

options "NMBCLUSTERS=n"

在您的 kernel 设定档中,n 是一个在 512-4096 间的数字,依您想提供多少同时的 TCP 连接数目 多寡而定。我会建议试试 2048 - 这数字应该可以完全避免这个 panic 了。您可以执行: netstat -m (see netstat(1))来监看有多少 mbuf clusters 在系统上正被 配置/使用。NMBCLUSTERS 的数值内定为 512 + MAXUSERS *
16

Q:5.13. 为什么我一直看到 ``/kernel: proc: table is full'' 这个错误讯息?
A:

FreeBSD 的 kernel 只会允许一定数量的 process 在同一时间里同 时运作。而这个数目是根据 kernel 设定档里面的 MAXUSERS 值来决定的。MAXUSERS 这个值也会影响其他的 kernel 内定值,比如说网路缓冲区 (请参阅这个之前讨 论过的问题)。如果机器负荷(load)很重,您可能需要增加 MAXUSERS 这个值。这么作会一并提高系统的其他内 定值,包括最大可拥有的 process 数等。

在 FreeBSD 4.4 之後,MAXUSERS 已经变成可 以靠著更改 /boot/loader.conf 里的 kern.maxusers 这个值而调整的变数了。而在之前 的 FreeBSD 版本中,这个值只能在 kernel 设定档里调整。

如果机器负荷并不重,而您只是需要同时跑很多很多 process, 那么也可以直接用 sysctl 调整 kern.maxproc 这个值。假如这些 process 都是属於某个使用者的,那么您还需要另 外调整 kern.maxprocperuid 这个值,使它比新 的 kern.maxproc 这个值少一(一定要少一, 因为 init(8) 这个系统程式绝对要保持在运作状态)。

如果想在每次开机都要更改 sysctl 的值,而且您的 FreeBSD 是 最近的版本的话,请在 /etc/sysctl.conf 这 个档中设定,而如果是旧的版本,可以在 /etc/rc.local 中作设定。


Q: 5.14. 为什么用新 kernel 开机时,出现 ``CMAP busy'' 这个错误讯息?
A:用来侦测过时 /var/db/kvm_*.db 档案的机制偶尔会 发生问题,而使用到了一个不协调(mismatch)的档案有时就会导致 panic。

如果发生了这个问题,请重新开机,进入单使用者模式,然後执 行:

# rm /var/db/kvm_*.db


Q: 5.15. 请问这个讯息:``ahc0: brkadrint, Illegal Host Access at seqaddr 0x0'' 是什么意思?
A:这是一个和 Ultrastor SCSI 控制卡有关的冲突(conflict)。

在开机时,进入 kernel 设定选单取消 uha0,它是造成这个问题的原因。

Q: 5.16. 在开机时,我看到这个错误讯息 ``ahc0: illegal cable configuration''。 我的排线确定有接对。 是出了什么问题呢?
A:您的主机板可能不支援自动终端电阻设定。请进到 SCSI 的 BIOS 里面手动指定正确的终端电阻顺序,而不要使用自动设定。AIC7XXX 的 驱动程式并无法知道有没有这些排线侦测(以及自动终端电阻设定)的 电路(external logic)存在。如果 EEPROM 里面的设定是 "automatic termination" 时,它只会单纯假定这些电路当然是存在的。 若缺少了这个电路,驱动程式在设定终端电阻时就常常出问题。 而这种问题将导致 SCSI 汇流排的可靠性降低。

Q:5.18. 为什么执行远端机器(remote machine)的全萤幕的软体时, 有不正常的情形?
A:或许远端机器并非将您的终端机模式设为 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 下的 终端机模拟器来登入远端机器,例如 xterm 或 rxvt。而远端机器的 TERM 变数应该要 设为 xterm 或 vt100。


Q:5.19. 为什么我的机器一直显示 ``calcru: negative time...''?


A:跟中断(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 依 然无法解决这个问题,那么您机器上的中断已经多到无法让计数器维持在 可靠的状态了。

Q: 5.20. 出现 ``pcm0 not found'' 这个讯息,或者是 我的音效卡变成了 pcm1,但在 kernel 设定 档里我是设 device pcm0 啊。这是怎么回事呢?
A:如果您在 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 的音效卡了。

Q:5.21. 为什么在更新到 FreeBSD 4.X 後会找不到我的 PnP 卡 (或者是找成 unknown)?
A:

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 装置了。


Q: 5.22. 为什么我常常在跑一些程序(例如 top 或 systat)的时候出现 ``nlist failed'' 这个错误讯息?
A:
这个问题是因为您跑的程式需要一个特别的 kernel symbol,可是 不知道什么原因而找不到;而会发生这个问题可能是因为下面两个原因:

*

您的 kernel 和 userland 的档案版本并不一致(例如说,您 编了一个新的 kernel,但是并没有执行对应的 installworld,或是其他类似情形), 因此 symbol table 的内容就和应用程式编译时的不太一样了。如 果是这种情形,请执行完整的升级步骤(请参阅 /usr/src/UPDATING 以得知正确的流 程)。
*

您没有用 /boot/loader 来载入您的 kernel,而是直接由 boot2 开机(请参阅 boot(8))。 虽然说跳过 /boot/loader 并没有什么错, 但是它在 kernel symbols 跟应用程式的沟通方面占了很重的份量。

Q: 5.23. 为什么我用 ssh 或 telnet 连到我的电脑时,会等待很长的一段时间才能连上?
A:症状:TCP 连线建立之後和询问密码之前(如果是在说 telnet(1) 的话,则是 login 提示符号跳出来之前),要等待很长的一段时 间。

问题所在:这种延迟情形常常是因为伺服软体(server software) 尝试要将客户端(client)的 IP 位址转换成主机名称。因为很多伺服 软体,包括 FreeBSD 内建的 Telnet 和 SSH,为了将主机名称写入纪 录档中以供管理者作参考,而会做这项动作。

解决方法:如果这个问题在您连接不同的伺服器时都会发生,那么 问题是在您客户端这一方;同样的,如果别人只有在连到您的伺服器上 才会发生这个情形,那么问题就是在伺服器这边了。

如果是客户端这方有问题,唯一的方法就是将 DNS 伺服器修好, 这样对方伺服器才能正确的转换名称。如果问题是在内部区域网路发 生的,这应该是伺服器有问题,请详细检查一下;相反的,如果是您 在上 Internet 时发生的,那么您需要跟您的 ISP 联络,请他们解决 这个问题。

如果是伺服器这边的问题,而且是发生在内部区域网路,那么您需 要设定这个伺服器,使它能正确将内部网路的 IP 位址转换为主机名称。 请参阅 hosts(5) 和 named(8) 的说明以获得更多资讯。如 果是在 Internet 上的伺服器发生这个问题,那么有可能是您伺服器的 转换功能出问题。您可以试试查询另一个主机名称,比如: www.yahoo.com。如果查不到,那么可以确定是您这 边出问题了。


Q: 5.24. ``stray IRQ'' 这个错误讯息是什么意思?
A:Stray IRQs 是硬体 IRQ 有点小问题的现象,大多是因为硬体本身 在发出中断需求後,又取消了它自己的中断要求。

有三个方法可以应付这个问题:

*

不理会这个警告。反正一个 irq 出现五次警告後系统就不会 再显示了。
*

把 isa_strayintr() 里的值,由 5 改成 0,这样所有的警告讯息都不会出现。
*

安装使用 irq 7 的平行埠硬体设备,以及它的 PPP 驱动程式 (这个大部分系统都有做),接著安装 ide 硬碟或是其他会使用 irq 15 的硬体设备以及它的驱动程式。

Q: 5.25. 为什么 ``file: table is full'' 这个讯息 一直在 dmesg 里重复出现?
A:这个错误讯息代表了您系统的 file descriptors 已经使用光了。 请参阅手册内 Tuning Kernel Limits 里面的 kern.maxfiles 这个章节,里面有一些讨论及解决方法。


Q:5.26. 为什么我笔记型电脑上的时钟一直显示错误的时间?
A:您的笔记型电脑里有两个以上的时钟,而 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

Q:5.27. 为什么我的笔记型电脑无法正确的侦测到 PC card ?
A:这个问题常常发生在灌了多个作业系统的笔记型电脑上。有些非 BSD 的作业系统会让 PC card 的硬体装置处在一个不一致的状态下 (inconsistent state)。使得 pccardd 在侦 测这片卡时,无法抓到正确的型号,而是 ``"(null)""(null)"''。

您需要移除 PC card 插槽的电源以重置这个硬体装置。一个方法是 将您的笔记型电脑关机(不是休眠模式,也不是待命模式;要完全的关 机)。等个几秒钟再重开机。这样您的 PC card 应该就正常了。

有时有些笔记型电脑虽然看起来已经关机了,但实际上并没有。 如果您发现上面那个方法没有用,请关机,移除电池,等个几秒钟, 把电池装上去然後重开机。

Q:5.28. 为什么在 BIOS 画面之後,FreeBSD 的 boot loader 显示 ``Read error'' 然后就停止不动了?
A:这是因为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 键把 新的分割区表写入硬盘当中。

Q:5.29. 另一个作业系统摧毁了我的 Boot Manager。我要怎么样才能把它还 原回来?
A:执行 sysinstall(8) 接著选 Configure,然後选 Fdisk。 再来用空白键选择原先 Boot Manager 所在的硬碟。 按下 W 键来作写入的动作。这时会跳出一个提示 讯息,询问您要安装哪一个 boot loader。请选择 Boot Manager, 这样就可以将它还原了。

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面