常见问题常见问题   搜索搜索   会员列表会员列表   团队团队   注册注册    个人资料个人资料   登录查看您的站内信件登录查看您的站内信件   登录登录 

FreeBSD China Community FAQ --New ! ! 新增"高级进阶"主题

 
发表新文章   这个论题已经被锁定,您不能发表、回复或者编辑文章。    FreeBSD China -> 技术交流
阅读上一个主题 :: 阅读下一个主题  
作者 留言
kinki
精神病


注册时间: 2002-06-10
文章: 682

文章发表于: Mon 2003-05-26 13:50:59    发表主题: FreeBSD China Community FAQ --New ! ! 新增"高级进阶"主题 引用并回复

FreeBSD China Community 开始建立整理FAQ
欢迎大家共同参与,共同出力!

--FAQ定义
用简单问答的形式解决一些FreeBSD系统安装,配置,应用等方面的典型问题.

--需要协助的方面
1) 欢迎翻译国外类似FAQ 并在本贴提交, 我会及时的更新到FAQ中;
2) 欢迎会员在解决问题后,整理成FAQ,并在本贴提交.


注: 当提交的FAQ被正式接纳后,将会把跟贴删除,所以请注意提交的方式.如下:
Q:
A:
提交人:
来源: [翻译, 转贴自, 原创]

注2: 若发现FAQ中有不足之处或者错误的地方,请及时指出. 谢谢!
---------------------------------------------------------------------
来源:FreeBSDChina论坛
由Jerry整理



Q: checksum.md5是干什么用的?
A: md5的校验码, 一般用于检测下载文件是否受到损坏, 可以使用md5 filename来检验

Q: 安装ports时想查找相关ports
A: make search key=

Q: 查看系统版本信息
A: 使用uname命令

Q: 发现FreeBSD的交换空间被耗尽
A: 不追加分区, 可以通过增加交换文件的方式实现

Example 6-1. Creating a Swapfile on FreeBSD 4.X
1. Be certain that your kernel configuration includes the vnode
driver. It is not in recent versions of GENERIC.
pseudo-device vn 1 #Vnode driver (turns a file into a device)
2. create a vn-device:
# cd /dev
# sh MAKEDEV vn0
3. create a swapfile (/usr/swap0):
# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
4. set proper permissions on (/usr/swap0):
# chmod 0600 /usr/swap0
5. enable the swap file in /etc/rc.conf:
swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.
6. Reboot the machine or to enable the swap file immediately, type:
# vnconfig -e /dev/vn0b /usr/swap0 swap

Example 6-2. Creating a Swapfile on FreeBSD 5.X
1. Be certain that your kernel configuration includes the memory
disk driver ( md(4)). It is default in GENERIC kernel.
device md # Memory "disks"
2. create a swapfile (/usr/swap0):
# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
3. set proper permissions on (/usr/swap0):
# chmod 0600 /usr/swap0
4. enable the swap file in /etc/rc.conf:
swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.
5. Reboot the machine or to enable the swap file immediately, type:
# mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0

Q: 如何将系统迁移到新的大硬盘
A: 建议重装系统,然后将数据迁移到新硬盘, 如果真的要直接将系统迁移到新硬盘一定要使用dump和restore,不要使用tar,cpio等, 它们对根目录的操作可能会出现问题, 步骤如下

1.使用newfs新建一个分区.

2.mount上该分区.

3.cd到装载点.

4.使用dump备份旧的分区, 通过管道输出到新分区

例如, 假设要将根文件系统移动到/dev/ad1s1a, 使用/mnt作为临时装载点, 命令如下
# newfs /dev/ad1s1a
# mount /dev/ad1s1a /mnt
# cd /mnt
# dump 0af - / | restore xf -

要在新硬盘上重新安排分区稍微有点麻烦, 例如要把/var文件系统放在新硬盘分区的
根文件系统下, 首先按照上面的步骤移动根文件系统, 然后在移动/var文件系统,
命令如下
# newfs /dev/ad1s1a
# mount /dev/ad1s1a /mnt
# cd /mnt
# dump 0af - / | restore xf -
# cd var
# dump 0af - /var | restore xf -

Q: 如何升级ports安装的软件
A: 使用cvsup, 步骤如下

1.安装cvsup 以root用户到/usr/ports/net/cvsup下make all install clean

2.新建cvsup升级配置文件可以到/usr/share/example/cvsup/ports-supfile拷贝一份,修改 default host=cvsup.FreeBSDchina.org 然后使用 cvsup -gL 2 ports-supfile 升级ports

3.安装portupgrade 到/usr/ports/sysutils/portupgrade目录下 make all install clean

4.最后执行rehash 使用portupgrade -a更新所有ports安装的软件


Q: FreeBSD sshd/telnet禁止root登录的问题
A: ssh修改/etc/ssh/sshd_config更改PermitRootLogin no为PermitRootLogin yes telnet修改/etc/login.access加入+:wheel:ALL

Q: FreeBSD sshd/telnet禁止root登录的问题
A: ssh修改/etc/ssh/sshd_config更改PermitRootLogin no为PermitRootLogin yes telnet修改/etc/login.access加入+:wheel:ALL

Q: root用户收到大量系统邮件, 想让信件发送到其他地址
A: 修改/etc/mail/aliases root: me@someserver 或在/root/.forward加入me@someserver

Q: 制作FreeBSD启动画面
A: 确定你的kernel配置中有

pseudo-device splash
options VESA # support for zhcon

然后在/etc/loader.conf中加入

splash_bmp_load="YES" # For Windows .bmp files or
splash_pcx_load="YES" # For ZSoft .PCX files (one or the other)
vesa_load="YES" # If the image is greater than 320x200
bitmap_load="YES"
bitmap_name="/boot/splash.bmp" # Name of the splash image file
#bitmap_name="/boot/splash.pcx"

等到重启后, 看到

Loading /boot/defaults/loader.conf
/kernel text=0x161db8 data=0x218ac+0x223fc syms=[0x4+0x23040+0x4+0x243e4]
/modules/splash_bmp.ko text=0x10f9 data=0xc8+0x66c syms=[0x4+0x420+0x4+0x230]
/modules/vesa.ko text=0x2330 data=0xea0+ox23c syms=[0x4+0x7a0+0x4+0x585]
...
Hit [Enter] to boot immediately, or any other key for command prompt.

按下回车就可以看到画面了. 假如出现以下错误

module_register_init: MOD_LOAD (splash_bmp, c02ee62c, 0> error 19

一般来说是kernel中没有配置options VESA, 或者是图象大小不符合, 请使用8位的bmp或pcx, 图象大小只能是vidcontrol所支持的分辨率的大小.
_________________

----------------------------------------------
来源: 本论坛, statue


Q: Mozilla字体发虚,如何解决?
A: 关键修改/usr/X11R6/etc/fonts/fonts.conf
加入
<match target="pattern">
<test qual="any" name="size" compare="l
<int>13</int>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>


最后进行编辑的是 kinki on Fri 2003-06-20 09:30:57, 总计第 11 次编辑
返回页首
阅览会员资料 发送站内信件 发送电子邮件 MSN Messenger
kinki
精神病


注册时间: 2002-06-10
文章: 682

文章发表于: Tue 2003-06-03 14:21:38    发表主题: FreeBSD.org FAQ 简体中文版 引用并回复



最后进行编辑的是 kinki on Tue 2003-06-03 14:26:19, 总计第 1 次编辑
返回页首
阅览会员资料 发送站内信件 发送电子邮件 MSN Messenger
kinki
精神病


注册时间: 2002-06-10
文章: 682

文章发表于: Tue 2003-06-03 14:24:09    发表主题: FreeBSD.org FAQ --系统管理部分 引用并回复

Q: 10.1. 系统起始设定在哪?
A:从 2.0.5R 到 2.2.1R,主要的设定档是 /etc/sysconfig。所有的选项都被指定在这个档, 而其他像 /etc/rc (参见 rc(8)) 和 /etc/netstart 只是引用它。

观察 /etc/sysconfig 这个档并修正其值以 适合你的系统。这个档用注解填满以表示何处该放置什么设定。

在 post-2.2.1 以後及 3.0,/etc/sysconfig 亦更名为一个更容易描述的档名叫 rc.conf(5) ,并且语法简化了些。 /etc/netstart 亦更名为 /etc/rc.network 因此所有的档案都可以用 cp /usr/src/etc/rc* /etc 来拷贝。

在 3.1 以及,/etc/rc.conf 被移到 /etc/defaults/rc.conf。 千万不要编辑这个档! 如果 /etc/defaults/rc.conf 内有想要更动的项目, 你应该将那一行的内容拷贝到 /etc/rc.conf, 然後再修改它。

例如 FreeBSD 3.1 及以後的版本内,有一个 DNS 伺服器 named, 而你想要启动它。你所需要作的事就是:

# echo named_enable="YES" >> /etc/rc.conf

想要在 FreeBSD 3.1 及以後的版本中,启动本地端服务的话,将 shell script 置於 /usr/local/etc/rc.d 目录 下。这些 shell script 应该设定成可执行,并且档名以 .sh 结束。 在 FreeBSD 3.0 及更早的版本中,你应该直接编辑 /etc/rc.local 档。

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

/etc/rc.i386 是 Intel 专用设定, 像是 iBCS2 模拟或是 PC 系统主控台设定。

Q:10.2. 我该如何简单地加入USER?
A:使用 adduser(8) 指令。如果需要更复杂的使用方式, 请用 pw(8) 这个指令。

要再次移除使用者,使用 rmuser(8) 指令。还有, pw(8) 也可以使用。

Q:10.3. 在我编辑 crontab 档案之後,为什么我老是收到这样的讯息: ``root: not found''?
A:通常都是因为编辑了系统的 crontab (/etc/crontab) 然後就用 crontab(1) 去安装它:

# crontab /etc/crontab

这样作是不对的。系统的 crontab 和 crontab(1) 所更新的使用者的 crontab 格式并不一样 ( crontab(5) 说明文件针对差异处有详细的说明)。

如果你已经用这种方法,额外多出的 crontab 只就是 /etc/crontab 的拷贝,只是格式是错误的。 可用以下的命令删除:

# crontab -r

下次你编辑 /etc/crontab 档案的时候, 你不用作任何动作去通知 cron(8) ,它自动会去侦测是否有更动。

如果你想要每天、每周、或是每月固定执行某些动作一次,也许加个 shell script 在 /usr/local/etc/periodic 目录下会更好,系统的 cron 会固定执行 periodic(8) 命令, 它可将你的程式和其它的系统周期性工作一起执行。

这个错误的真正原因,是因为系统的 crontab 有一个额外的栏位, 说明该命令要以什么使用者身份执行。在 FreeBSD 的预设系统 crontab 中,所有的项目都是 root。 当这个 crontab 被当作是 root 的使用者 crontab (它和系统的 crontab 是 不 一样的), cron(8) 会以为 root 字串是欲执行的命令的第一个字,但是实际上 并没有这样的命令存在。

Q: 10.4. 为什么我想要用 su 成为 root 时,会得到 ``you are not in the correct group to su root'' 的错误讯息?
A:这是一个安全特性。想要利用 su 成为 root (或其它有 superuser 权限的帐号),你一定要在 wheel 群组内。如果没有这个特性的话, 任何人只要在系统里有帐号,并且恰巧知道 root 的密码,就可以取得 superuser 等级的权限以存取系统。有了这个特性, 这样的情况就不会发生;如果使用者不在 wheel 群组内的话, su(1) 会让他们连试著键入密码的机会都没有。

要让某人可以利用 su 成为 root 的话, 只要把他们放入 wheel 群组内即可。

Q:10.5. 我在 rc.conf 还是某个起动档案里犯了错误, 因为档案系统变成唯读的,我无法去编辑它。我该怎么办?
A:当电脑问你 shell 完整路径名时,只要按 ENTER ,然後执行 mount / 以读写模式 重新挂载根档案系统。你也许需要执行 mount -a -t ufs ,将你惯用的文字编辑器所在的档案系统挂载上来。如果 你惯用的文字编辑器在网路档案系统上的话,你必须先手动将网路设定 起来,以便将网路档案系统挂载上来,或是使用本地端档案系统上的 编辑器,例如 ed(1)。

如果你想要使用像 vi(1) 或是 emacs(1) 等的全萤幕 文字编辑器的话,你也需要执行 export TERM=cons25 ,以便让这些编辑器能够从 termcap(5) 资料库里读取正确的资料。

当你已经完成了这些步骤後,你可以照你平常修改文法错误的方式 去编辑 /etc/rc.conf 档案。在核心 (kernel) 启动时所显示的错误讯息,能够告诉你档案中哪一行有错误。

Q: 10.6. 为什么我没办法设定我的印表机?
A:请参考一下 Handbook 中,有关列印的部份。它应该能够解决 你大部份的问题。请参考 Handbook 中的列印部份。

有些印表机需要主机支援的驱动程式 (host-based driver) 才能 执行任何列印功能。FreeBSD 本身并不支援这些所谓的 ``WinPrinters''。 如果你的印表机无法在 DOS 或 Windows NT 4.0 下执行,那它大概就是一台 WinPrinter。你唯一能使用 这样的印表机的希望,就是试试 print/pnm2ppa 支不支援它了。

Q: 10.7. 我要怎么样修正我的系统所使用的键盘对映 (keyboard mapping)?
A:请参考 Handbook 中的 using localization 章节,尤其是 console setup 章节。

Q:10.8. 为什么我在系统启动时,得到 ``unknown: <PNP0303> can't assign resources'' 的讯息?
A:以下是从 freebsd-current 通信论坛的一篇文章中节录出来的。


``无法指派资源 (can't assign resources)'' 讯息表示 那些装置是传统的 ISA 装置,而核心中已经编入不认得 PNP 的驱动程 式。这些装置包括键盘控制器,可程式化岔断控制晶片,还有几个标准 设备。资源无法指派给这些装置,是因为早已有驱动程式使用那些位址 了。

--Garrett Wollman <wollman@FreeBSD.org>, 2001 年四月 24 日

Q: 10.9. 为什么我无法让 user quotas 正常工作?


A:#

不要在 / 打开 quotas,
#

把 quotas 档放在它必须强迫置入的档案系统内,举例:
档案系统 Quota 档
/usr /usr/admin/quotas
/home /home/admin/quotas
... ...

Q: 10.10. FreeBSD 支持 System V IPC 格式指令集?
A:是的,FreeBSD 支援 System V-style IPC。这包括共享记忆体, 讯息跟信号。你需要在你的核心设定档内加入下列几行以启动它们。

options SYSVSHM # enable shared memory
options SYSVSEM # enable for semaphores
options SYSVMSG # enable for messaging

Note: 在 FreeBSD 3.2 以及之後的版本,这些选项已经是 GENERIC 核心的一部份,也就是说它们已 经编进了你的系统中。

重新编译并安装。
Q: 10.11. 我该如何让 sendmail 透过 UUCP 来递送邮件?
A:跟随 FreeBSD 套装而来的 sendmail 设定是适合那些直接连上网际网路 的站台。想透过 UUCP 交换邮件的站台必须另外安装 sendmail 的设定档案。

手动修改 /etc/sendmail.cf 是绝对必要的。 第 8 版的 sendmail 提供一个全新的入口以透过一些像 m4(1) 的处理就能产生设定档,这事实上是一个高层概念等级的技巧性设定。 你应该可以在 /usr/src/usr.sbin/sendmail/cf 以下里使用它:

假如你不是用 full sources 方式安装系统,那么 sendmail 设定项目可能已经分散成好几个来源分布档在等著你,假设你已经 mount 光碟机,做以下动作:

# cd /cdrom/src
# cat scontrib.?? | tar xzf - -C /usr/src contrib/sendmail

别惊慌,这只有数十万个位元组的大小。在 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/mail/sendmail.cf

一个典型的 .mc 档看起来可能像这样:

VERSIONID(`Your version number')
OSTYPE(bsd4.4)

FEATURE(accept_unresolvable_domains)
FEATURE(nocanonify)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')

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

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

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

accept_unresolvable_domains, nocanonify, 和 confDONT_PROBE_INTERFACES 特性将避免任何在 递送邮件时会用到 DNS 的机会。UUCP_RELAY 项目的出现理由很奇怪,就不要问为何了。简单的放入一个网际网路 上可以处理 .UUCP 虚拟网域位址的主机名称;通常,你只需要在这 里填入你 ISP 的信件回覆处 (mail replay)。

你已经做到这里了,你还需要这个叫 /etc/mail/mailertable。如果你只有一个用 来传递所有邮件的对外通道的话,以下的档案就足够了:

#
# makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable
uucp-dom:your.uucp.relay

另一个更复杂的例子看起来像这样:

#
# makemap hash /etc/mail/mailertable.db < /etc/mail/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:

如你所见,这是某个真实档案里的一部份。首三行处理网域定址信件 不应该被送出到内定路径,而由某些 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。

% sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 foo@example.com
canonify input: foo @ example . com
..
parse returns: $# uucp-dom $@ your.uucp.relay $: foo < @ example . com . >
> ^D


Q: 10.12. 当我用拨接连上网路时该怎么设定信件递送?
A:如果你已经有一个固定的 IP 数字,你不需要调整任何内定值。设好 你要指定的网路名称,其他的 sendmail 都会帮你做完。

如果你拿到的是动态配置的 IP 数字而使用拨接 ppp 连接到网际网 路,你可能已经在你的 ISP 信件主机上有一个信箱。假设你的 ISP 网域 是 example.net,你的使用者名 称是 user。亦假设你称自己的主机名称是 bsd.home 而你的 ISP 告诉你可以使用 relay.example.net 当作信件回覆处。

为了从你的信箱接收信件,你将需要安装取信程式以便从信箱取回信件。 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 example.net protocol pop3 fetchall pass MySecret

无须赘言,这个档除了 user 外不应该被任 何人读取,因为它包含 MySecret 这个密码。

为了在寄信时有正确的抬头 from:,你必须告诉 sendmail 使用 user@example.net 而非 user@bsd.home。你可能会希望告诉 sendmail 从 relay.example.net 送出所有信件, 加快信件传送。

以下的 .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(`example.net')dnl
FEATURE(allmasquerade)dnl
FEATURE(masquerade_envelope)dnl
FEATURE(nocanonify)dnl
FEATURE(nodns)dnl
define(`SMART_HOST', `relay.example.net')
Dmbsd.home
define(`confDOMAIN_NAME',`bsd.home')dnl
define(`confDELIVERY_MODE',`deferred')dnl

如何转换这个 .mc 档案到 sendmail.cf 档的详细细节,请参考上一节。 另外,在更新 sendmail.cf 以後不要忘记重新启动 sendmail。

Q: 10.13. 除了 Sendmail 外,还有哪些邮件伺服器可以使用呢?
A:

Sendmail 是 FreeBSD 预设使用的邮件伺服器,但是你还是可以很容易地以其它 邮件伺服器 (例如,从 port 安装的邮件伺服器) 取代之。

port 里有很多可供选择的邮件伺服器,像 mail/exim、 mail/postfix、 mail/qmail、 mail/zmailer 等, 就是几个很受欢迎的选择。

多样选择是好事,而且大家有许多邮件伺服器可以使用也被认为是 好事;所以请避免在通信论坛里问像 ``Sendmail 有比 Qmail 好吗?'' 这样的问题。如果你真的很想问的话,请先到通信论坛 archive 里找一下。每一个邮件伺服器的优点与缺点,以前大概就已经 讨论好几次了。


Q: 10.14. 我忘了 root 密码了!怎么办?


A:不要惊慌!只要重新启动系统,在看到 Boot: 时输入 boot -s 即可进入单使用者模式 (在 3.2-RELEASE 之前的版本请改用 -s)。 在问要使用哪个 shell 时,按下 ENTER。你会看到一个 # 的提示号,输入 mount -u / 以重新挂上(mount) 你的根档案系统可供读/写。执行 passwd root 以更换 root 密码,然後执行 exit(1) 继续启动程序。

Q: 10.15. 我该怎么让 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: 10.16. 我该怎么把 DOS 文字档案重新格式化成 UNIX 的?
A:只要使用这个 perl 命令:

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

file 就是要处理的档案。这个修改是在内部完成,原始的档案会储存成 副档名为 .bak 的档案。

或者你可以使用 tr(1) 这个命令:

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

dos-text-file 是包含 DOS 文字的 档案,而 unix-text-file 则是包含转换 的输出结果。这比使用 perl 还要快上一点点。

Q: 10.17. 我该怎么用名称砍掉 process?
A:使用 killall(1)

Q: 10.18. 为何在 su 一直说我不在 root 的 ACL 里?
A:这个错误是因为 Kerberos 分散认证系统。这个问题并不是很严重 但是令人厌烦。你可以用 -K 选项去执行 su,或是像下个问题所描述的 移除 Kerberos。

Q: 10.19. 我该怎么移除 Kerberos?
A:要从系统里移除 Kerberos,重装你正在执行的 release 版本的 bin distribution。如果你有 CDROM,你可以 mount cd(假设在 /cdrom) 并执行:

# cd /cdrom/bin
# ./install.sh

或者你也可以将 /etc/make.conf 里的 "MAKE_KERBEROS" 选项全都拿掉,然後再 build world.

Q: 10.20. 我该怎么增加系统的虚拟终端机?
A:如果你有许多 telnet,ssh,X 或是 screen 使用者,你或许会用完 虚拟终端机,这能教你怎么加更多:

1.

建立并安装一个新的核心程式并且把这一行

pseudo-device pty 256

加入到设定档里。
2.

执行这个命令:

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

会造出 256 个虚拟终端机的装置节点。
3.

编辑 /etc/ttys 并加入符合 256 个终端机的行数。它们应该符合已经存在单项的格式,举例来说, 它们看起来像:

ttyqc none network

字母设计的顺序是 tty[pqrsPQRS][0-9a-v],使用正规表示式。
4.

用新的核心程式重新启动电脑就可以了。



Q: 10.21. /dev/snd0 这个装置做不出来!
A:并没 snd 这个装置的存在。这个名字 是用来当作各个组成 FreeBSD 声音驱动程式组,诸如 mixer, sequencer,以及 dsp 的简称。

可以用以下的命令作出这些装置:

# cd /dev
# sh MAKEDEV snd0


Q: 10.22. 可以不用开机,重新读取 /etc/rc.conf、 再次启动 /etc/rc 吗?
A:先进入单人使用者模式,然後再回到多使用者模式。

在主控台执行:

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

# return
# exit


Q: 10.23. 什么是 sandbox?
A:``Sandbox'' 是系统安全用的术语,有两个意义:

*

放在某些虚拟防护墙里的执行程序,这些防护墙是用来阻止 某些人侵入这道程序,进而出入於更大的系统中。

这道程序可以完全在防护墙里 ``动作''。也就 是说,它所执行的任何程式不可能会渗透到墙的外面。所以如果 您对它有安全上的顾虑,并不需要特别去监听它的一举一动,反 正它只能在墙内活动。

举例来说,可以用 userid 来做这道防护墙,这正是 security 和 named 说明文件中的定义。

现在就用 ntalk 这个服务作说明(见 /etc/inetd.conf)。这个服务以前的 userid 是 root,现在执行时则是用 tty。tty 这个使用者就是一个 sandbox,如果有人能够顺利用 ntalk 侵入系统,现在他就算进得来也只能用这个 userid。
*

放在某个模拟机器里的程式,这比上述来得更严密。基本上 这表示能侵入该程式的人相信他能再进入所属的机器,但事实上 只会进入模拟出来的机器,无法进一步修改任何真实的资料。

达到这个目的最常用的方法,就是在某个子目录下做出模拟的 环境,然後用 chroot 执行该程式,这样该程式的根目录便是这个 子目录,而非系统真正的根目录。

另一个常见作法是将某个档案系统 mount 成唯读,但在它 上面另外制造出程式以为可以写入的档案系统。这个程式会相信 它可以对其他档案读写,但只有它看不到这个唯读效应 - 系统 执行的一般程式都看得到。

我们试图将这类 sandbox 尽量透明化,让使用者或侵入者 无法看到他是否在某个 sandbox 里面。

UNIX 实作两种 sandbox,一个在程式层面,另一个则是由 userid 来达成。

每个 UNIX 执行程序会用防火墙将它和所有其他程序隔开,某个程序 不可以随意修改其他程序位址的资料。这和 Windows 中,程式可以轻易 修改其他位址资料,结果导致当机的情形大不相同。

每个 UNIX 程序都属於某个特定的 userid。如果该 userid 不是 root,就会将它和其他使用者的程序隔开。 Userid 同时也用於硬碟资料的存取权上。

Q: 10.24. 什么是 securelevel?
A:securelevel 是核心中所实作的一个安全机制。基本上当 securelevel 是正值时,核心会限制某些工作;即使是 superuser (也就是 root) 也无法完成那些工作。在撰写 本文时,securelevel 机制在一般的限制外,还能够限制以下的功能:

*

清除某些特定的档案旗标,例如 schg (系统唯读标旗, the system immutable flag)
*

经由 /dev/mem 与 /dev/kmem, 将资料写入至核心记忆体中
*

载入核心模组
*

更动 ipfirewall(4) 规则。

想要检查在某个运作中的系统的 securelevel 状态,只要执行以下 命令即可:

# sysctl kern.securelevel

输出的结果会包含一个 sysctl(8) 变数名称 (在这个例子中, 它是 kern.securelevel) 以及一个数字。後者即是 目前的 securelevel 值。如果它是一个正值 (也就是大於 0),表示至少 有一些 securelevel 的保护机制已经开启了。

你没有办法降低一个运作中的系统的 securelevel;如果可以的话, 就失去了这个机制的意义了。如果你要作一些需要 securelevel 为 非正值才可以的动作的话 (例如 installworld 或更动日期),你需要修改 /etc/rc.conf 内的 securelevel 设定 (找找 kern_securelevel 和 kern_securelevel_enable 变数),然後重新开机。

想要知道更多有关於 securelevel 与各个不同等级影响的细节, 请参考 init(8) 说明文件。

Warning: securelevel 可不是万灵丹;它有许多已知的缺陷,往往造成 一种安全的假象。

它一个最大的问题,就是要让这个功能完全有效的话,在 securelevel 发挥作用前的启动过程中,所有使用到的档案都 必须被保护起来。如果一个攻击者在 securelevel 有效前 (由於 有些系统在启动中所作的事情,无法在较高的 securelevel 中 正常运作,所以这会在启动过程中後期才会运作),能让他们的程式 被执行的话,securelevel 的保护就完全无效了。保护启动程序 中所有的档案在技术上是可行的,但是如果真的这样作的话,系统 维护将会变成一场梦魇。即使只是修改一个设定档,也必须将整个 系统关闭,至少也得到单人模式。

除了这点,还有许多其它的东西都在通信论坛上讨论,尤其是 freebsd-security。请到 这里 搜寻以前的 讨论。有些人希望 securelevel 能够尽快消失,由另一个更优秀的 机制取代,不过机会有点渺茫。

风险自行承担。




Q: 10.25. 我想要把我的系统升级到最新的 -STABLE,但是得到的是 -RC 或 -PRERELEASE!怎么了?
A:简单地说:那只是名字而已。RC 的意思是 ``Release Candiate, 发行候选版本'',它表示新版本快要发行了。在 FreeBSD 中, -PRERELEASE 通常是发行前的程式码冻结的代名词。(有些发行版本中, -BETA 标签跟 -PRERELEASE 是相同意思的。)

详细地说:FreeBSD 从两个地方分支出它的发行版本。主版号、 点零、release (例如 3.0-RELEASE 及 4.0-RELEASE) 的,是从发展过程 开始时分支出来的,通常称为 -CURRENT 。有副版号的版本 (例如 3.1-RELEASE 或 4.2-RELEASE),是 活跃的 -STABLE 分支中的发行版本 快照。从 4.3-RELEASE 开始,每一个发行版本有它自己的分支,可为 偏好极度保守的发展速度 (通常只会作安全方面的更新) 的人所用。

准备要制作发行版本时,其所在的分支会经过一定的程序。有一个是 程式码冻结。当程式码冻结开始时,分支名称会更名,以反映它快要成为 一个发行版本了。举个例子,如果原来的分支叫 4.5-STABLE,它的名字 会变成 4.6-PRERELEASE 以表示程式码已冻结,并且额外的发行前测试 将要开始了。臭虫更正仍可回报,以成为发行版本的一部份。当程式码 有了可成为发行版本的雏形时,它的名字就会变成 4.6-RC,以表示发行 版本快好了。进入 RC 阶段後,只有找到的最有影响的臭虫才会被修正。 当发行版本 (本例中为 4.6-RELEASE) 产生後,发行版本会有自己的分支, 原分支会被更名为 4.6-STABLE。

想要得知更多有关版本号码与各 CVS 分支的资讯,请参考 Release Engineering 一文。


Q: 10.26. 我试著要安装一个新的核心,但是无法 chflags。我该怎么解决?
A:简单地说:你的 securelevel 可能大於零。直接重新开机到 单人模式,再安装核心。

详细地说:FreeBSD 在 securelevel 大於零情况下,不允许 变更系统旗标 (system flags)。你可以用这个指令检查你的 securelevel:

# sysctl kern.securelevel

你没有办法降低 securelevel;你必须启动系统到单人模式以 安装核心,或是修改 /etc/rc.conf 内的 securelevel 再重新开机。请参考 init(8) 说明文件,以取得 更多有关 securelevel 的资讯,还有 /etc/defaults/rc.conf 和 rc.conf(5) 说明文件,以取得更多有关 rc.conf 的资讯。


Q: 10.27. 在我的系统上,我无法变更时间超过一秒以上的范围! 我该怎么办?
A:简单地讲:你系统的 securelevel 也许大於 1。直接重新开机至 单人模式,然後再修改时间。

详细地说:在 securelevel 大於 1 的情况下,FreeBSD 不允许时间 变动大於一秒。你可以用以下的命令来检查目前的 securelevel:

# sysctl kern.securelevel

你无法降低 securelevel;你必须启动电脑至单人模式下以修改时间, 或是修改 /etc/rc.conf 再重新开机。请参考 init(8) 说明文件,以取得更多有关 securelevel 的资讯,还有 /etc/defaults/rc.conf 和 rc.conf(5) 说明文件,以取得更多有关 rc.conf 的资讯。

Q: 10.28. 为什么 rpc.statd 用了 256 megabytes 的记忆体?


A:不,那不是 memory leak,而且它也不是真的用了 256 Mbyte 的记忆体。它只是喜欢 (意思就是总会这样作) 将一狗票的记忆体 映谢到它自己的位址空间,以方便作事。就技术而言,这样并没有 什么不对;这样只是会让 top(1) 和 ps(1) 吓一大跳而已。

rpc.statd(8) 会将它的状态档案 (位於 /var ) 映射至它的位址空间里;为了防止需要的时候再增大所 导致的重新映射,它一次会使用相当大的大小。从程式码来看的话就 更明显了,可以看到 mmap(2) 的长度参数为 0x10000000 ,它是 IA32 架构上的十六分之一的定址空间,也就是 256MB。

Q: 10.29. 为什么我没办法取消 schg 档案旗标?
A:你正在一个提高了 securelevel (也就是大於 0) 的系统运作。 降低 securelevel 再试试看。请参考 FAQ 中对 securelevel 的说明 和 init(8) 说明文件。

Q: 10.30. 为什么近来的新版 FreeBSD 预设无法利用 .shosts 完成 SSH 认证?
A:为什么近来新版 FreeBSD .shosts 认证预设 为取消的原因,是因为 ssh(1) 预设不安装为 suid 成 root。要 ``修正'' 这点,你可以作下列的 任何一件事:

*

要一劳永逸解决,请将 /etc/make.conf 里的 ENABLE_SUID_SSH 设成 true ,然後再重新 build ssh (或是执行 make world)。
*

只作一时的修正的话,可以 root 身份 执行 chmod 4755 /usr/bin/ssh 将 /usr/bin/ssh 设成 4555 。然後将 ENABLE_SUID_SSH= true 加入 /etc/make.conf 里,这样下次 make world 执行就会生效了。


Q: 10.31. 什么是 vnlru?
A:当系统达到上限 kern.maxvnodes 时, vnlru 会清除并释放 vnode。这个核心 执行绪大部份的时间都没事作,只有当你有很大的记忆体,而且 正在存取上万个小档案时,才会被启动。

Q:
A:
返回页首
阅览会员资料 发送站内信件 发送电子邮件 MSN Messenger
kinki
精神病


注册时间: 2002-06-10
文章: 682

文章发表于: Thu 2003-06-05 14:31:18    发表主题: FreeBSD.org FAQ --其它主题 引用并回复

Q: 16.1. 为甚么 FreeBSD 用的置换(swap)空间比 Linux 多?
A:FreeBSD仅是看起来置换空间(swap)用的比Linux多而已。在事实上, 并不然。主要的差异是在於,FreeBSD积极的将闲置无用的主记忆体内容 推入置换空间(swap)中,以使得主记忆体可以更为有效率的被使用。而 Linux的策略是将置换空间(swap)用来作为解决记忆体问题的最终手段。 较频繁的使用置换空间(swap)。是一种更有效率的使用主记忆体的手段。

注:当一方面FreeBSD积极的使用置换空间(swap)的同时,你必需注 意到,FreeBSD并不会任意的将所有的东西都推入置换空间(swap)中。如此, 你才不会在一夜宿醉起床後发现,整个系统都被倒进了置换空间(swap)之中。


Q: 16.2. 即使我只有运行少数程序,为什么 top 显示出 来的剩余记忆体还是很少?
A:简单的答案是,所有未使用到的闲置记忆体都是被浪费的记忆体, 任何未被你的程式所利用到的记忆体将被核心(kernel)用来当 作磁碟快取(disk cache)。而这种记忆体被 top(1) 标记为 闲置的(Inact),快取(Cache), 以及 缓冲区(Buf),并负责在各个不同的位置负责 暂存资料。被暂存(cached)的资料代表系统不需要去存取较慢的磁碟装置 就可以得到资料,如此,可以提升系统的效能。总而言之, top(1) 显示出较少的 闲置(Free) 记忆体是好的,只要显示 出来的值不是 非常 的低。


Q: 16.3. 为甚么要用(甚么是) a.out 和 ELF 执行档格式?
A:要了解为什么Freebsd使用 ELF 格式,你有必 要先认识一下三种在目前 Unix 系统中最被广泛应用到的执行档格式:

Note: 在 FreeBSD 3.x 之前,FreeBSD 使用 a.out 格式。

*

a.out(5)

这是最早,同是也是 ``最典型'' 的Unix目的档 格式。这种格式的档案使用一种短且紧密的档头,同时,伴随著一 个魔术数字用来辨识格式。(参考 a.out(5) 有更多详细的说 明)。它包含有三个节区: .text .data 及 .bss 加上一个符号表 及字串表。
*

COFF

SVR3目的档格式。档头包含了一个节区表,所以可以具备比 .text .data .bss 还多的节区。
*

ELF

ELF为 COFF 格式的後继者,主要的特徵为 可以具有复数节区段,并可以使用32-bits或是64-bits的数值。 主要的缺点为: ELF 格式是在每个系统中只 会有一种 ABI 的假设为前题被设计出来的。但是,在事实上,这个 假设错的离谱。因为,纵使在商用的 SYSV 世界里,也至少有 SVR4, Solaris 和 SCO 三种 ABI。

译注:ABI(Application Binary Interface)。如果一定要翻译, 就叫它 应用程式二进位介面 好了。 ABI被发 展出来的用意,是为了促使在相同CPU所发展出来的应用程式,能够 在不同的系统上,作到二元档(Binary Code)相容。比方说, Sun 所提出的 Solaris ABI ,保证执行档能够在相同 CPU 的 Solaris 系统上执行,另一个例子是 Windows 系统。同属於 Intel x86 版本的执行档能够自由的在Windows 9x/me及Windows NT/2k/XP之间执行。

FreeBSD提供一个公用程式将程式所需的ABI资讯烙上,藉此试著 去解决这个问题。请参考 brandelf(1) 以取得更多资讯。i

FreeBSD 来自 ``传统'' 的阵营。在传统上,FreeBSD都 使用 a.out(5) 格式,这样的技术在好几代的 BSD 都被证明是可靠的。 虽然,在FreeBSD上可以建立以及正确的执行原生 ELF 格式档案(包含核心)。然而, FreeBSD在一开始反对将预设格式转换为 ELF, 为什么呢?当Linux开始痛苦的转换至 ELF 格式时, 并非是为了要逃离 a.out 格式。相反的,这是因 为之前 Linux的共享函式库(shared libraries)采用以跳跃表格 (jump-table)为基础的技术去设计。这是一种让发展者感到困扰,且非常 难以使用,不具足够弹性的方法。既然,已经存在的 ELF 工具提供了共享函式库(shared libraries)的解 决方案,而且,那看起来是个 ``前卫的方法'',因此,所需 的转换代价就可接受因而转换。

在FreeBSD的状况中,我们的共享函式库(shared libraries)机制和 SunOS 的型式非常相近,且易於使用。然而, 从 3.0 开始,FreeBSD 正式将 ELF 改为预设格式。 虽然,a.out 格式依旧如以往般的好,但是,我们 编译工具的撰写者,GNU 的成员,他们中止了对 a.out 格式的支援与维护。在这种状况下,迫使 我们必须自行维护另一份版本的 compiler 和 linker,也使得我们无法 从最新的 GNU 发展成果中获得好处。此外,对 ISO-C++ 的需求,尤其是 建构子(constructors)和解构子(destructors),也带动未来版本中对 ELF 的原生支援。


Q: 16.4. 是的, 但是, 为什么会有这么多不同格式的执行档存在呢?
A:在黑暗而遥远的过去,仅有简陋的硬体存在。而因为硬体简陋,当然也 只能执行小而简单的系统。a.out 格式是基於那个时代所需要,而被创造 出来的(例如像PDP-11)。在这之後,许多人试著将 Unix 移植到其他平台 时,他们也保留了 a.out 格式的执行档。因为,这对早期的 Motorola 68k, VAXen 之类的系统已经足够使用了。

然而,人并不会满足於现状。一些聪明的硬体工程师想到了,如果能 让软体多处理一些事,那 CPU 的电晶体数就能少一点,并且跑得更快。要 在这种新式的硬体上工作(现在称为RISC),a.out 这种格式就不合适了。基於这样的现实所需,更多的执行档格式被发展出 来,以提供比简单且受到许多限制的 a.out 格式 更好的效能。比方像是 COFF, ECOFF,已及一些较不为人所周知的格式纷纷被创造 出来。但是,这些格式都已达到各自的极限,直到有一天 ELF 的出现。

此外,当程式的体积越来越大,而磁碟空间和主记忆体相对来说都较 小时,共享函式库(shared libraries)的观念被发展出来了。在这同时, 虚拟记忆体系统(VM System)也变得越来越精巧。当每一种进步都在 a.out格式上被发展出来时,它的可用性也同时变 得越来越低。另外,人们还希望程式能在执行期间动态载入,或是将已经 执行过且没有用的初始化程式码丢弃,藉以节省更多的记忆。程式语言在 这个时期也便得更精巧,人们也希望在 main 之前自动的执行更多的东西。 因此,许多繁杂且另人叹为观止的技巧被用在 a.out 格式上去解决这些问题。但是,由於 a.out 格式 先天的限制,要解决这些问题必需付出更多的代价及时间成本,并让程式 的复杂度大为提升。而 ELF 格式可以一举解决这一 切问题。但是,要将整个系统从根本转换过去,将会有不短的阵痛期,因 此, ELF格式将会有一阵子与 a.out 并存。

然而,随著时间的过去,FreeBSD的 build tools 演化成平行的两个 支线(尤其是组译器和载入器)。FreeBSD这条路加进了共享函式库 (shared libraries)并修正了一些错误。而原来发展这些程式的 GNU 成员 则为了因应现况,重写了这些程式,以更简单的方式对跨平台编译 (building cross compilers),以及多种格式 (plugging in different formats) 作出了支援。许多人想作出以 FreeBSD 为目的平台的跨平台编译器。但不幸的是,FreeBSD 的 as 和 ld 不能作 这项工作。新的 GNU 工具程式加入了跨平台编译 (Cross Compiler), ELF格式支援,共享函式库(shared libraries), C++ 的扩充... 等等。此外,许多厂商以 ELF 格式 发行其产品,如果这些东西能在 FreeBSD 上执行的话当然是最好的。既然, 能够执行 ELF 格式的执行档了,为什么还须要 a.out 呢?它已经是一匹垂垂老矣的马了,在竭力 尽忠的奉献这么多年之後,该是让它在牧场肥沃的草地上好好休息的时候 了。

ELF 格式比 a.out 具有更良好的展现能力,并 且在底层系统中具有更多的可扩展性。ELF 工具程式 更容易被维护,且提供跨平台编译的支援,这一点对很多人来说是很重要 的。ELF 格式可能比 a.out 慢一点,但是其差异非 常难测量出来。这两者间还有许多细节上的不同,比方说分页对应的方式, 程式码初始化的方法...等等。这些并不是很重要,但是,两者就是不同。 以後,GENERIC 核心(kernel)将会移除对 a.out 格式。当不在有执行传统 a.out 程式的须要时, 将会从核心(kernel)中移除。


Q: 16.5. 为甚么chmod不会改变符号连结(symlink)的存取权限?
A:Symlinks 本身并没有存取权限,同时,在预设的状况下, chmod(1) 将不会跟随著 symlinks 去改便目标档案的存取权限。因此, 如果你有一个档案 foo,同时,有一个 symlink bar 指向这个档案,以下这个命令将永远会成功 的被执行。

% chmod g-w bar

然而,在 foo 上的存取权限将不会被改 变。

你必需使用 -H 或是将 -L 与 -R 选项一起使用,参考 chmod(1) 以及 symlink(7) 以取得更多的资讯。

Warning: 使用选项 -R 会让 chmod(1) 以 递回(RECURSIVE) 的方式工作。当你把 chmod(1) 用在目录或是连结到目录的符号连结时更要小心。 如果你要改变一个符号连结参考到的目录之存取权限 chmod(1) , 且注意不要加上任何选项,并且在 symlink 的结尾加上斜线 (/)。举例来说,如果 foo 连结到目录 bar, 而你要更改 foo (实际上是 bar),那就使用:

% chmod 555 foo/

结尾的斜线会使得 chmod(1) 改变 foo 所指向的目录 bar 的权限。




Q: 16.6. 为什么在 FreeBSD 2.2.x 及更早的版本中,登入名称(login names) 被限制在八个字元以下呢?
A:你可能认为修改 UT_NAMESIZE 後在重新编译整个 系统是很容易的事。而且在这之後,每件事都可以运作的很好。不幸的是, 有许多的程式和工具(包含系统工具)把数字写死在程式里头(并非总是 8 或 9,有时可能是古怪的 15 或 20)。这不仅仅是会将 你的系统记录档弄坏而已(来自於变动长度和固定长度记录的差异),同时 也会破坏 Sun 的 NIS Client 的运作。同时,和其他的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: 16.7. 我能在FreeBSD下执行DOS程序吗?
A:是的,自3.0版起你可以使用BSDI的 doscmd DOS 模拟器,如果你对这个东西 有兴趣,或是想加入发展行列,请寄一封电子邮件到 FreeBSD-emulation mailing list <freebsd-emulation@FreeBSD.org> 。

对於3.0之前的系统,在 ports 中有一套软体可以模_ 8088,并提 供足够的BIOS中断服务以执行DOS文字模式的程式,这套软体叫做 pcemu,同时,运行它须要 X Windows(由XFree86提供)。


Q: 16.8. 如果要把FreeBSD文件翻译成我的母语,我需要作什么?
A:参阅FreeBSD文件中的 翻译常见问答。


Q: 16.9. 为什么我寄到 FreeBSD.org 相关地址的电子邮件都被退回了呢?
A:FreeBSD.org 的邮件系统对於进来的邮件采取严格的检查,并且退回 所有设定不正确,或是潜在的垃圾邮件。你的邮件被退回可能是因为下列 原因所引起:

*

这封电子邮件来自已知的垃圾邮件区域或是IP中。

FreeBSD邮件伺服器将拒绝接收已知的垃圾邮件来源的电子邮件。 如果提供你网路服务的公司或是网域中有产生过垃圾邮件或是有垃圾 邮件转播站,请你换一个服务提供者,或是乾脆放弃。
*

电子邮件的本文仅有HTML。

邮件应该已纯文字格式发送,请设定你的电子邮件软体送出纯文 字格式。
*

FreeBSD的邮件处理程式无法由IP反查送件主机的IP。

设置 DNS 反查是接受一台主机邮件的一个标准要求,请为您的邮件 主机设置 DNS 反查。许多提供家庭网路服务 (DSL,cable,dialup 等) 的公司并不提供这样的服务。在这种情况下,请透过网路服务提供者的 邮件伺服器送出您的电子邮件。
*

在 SMTP 使用 EHLO/HELO 命令时所给予的 hostname 无法被解析到 一个 IP 位置。

在邮件被接受以前,一个充分合格,且可被解析的主机名称在 SMTP 协定的对谈中是必要的。如果你没有在 DNS 伺服器中登记你 的主机名称,请透过网路服务提供者的邮件伺服器送出您的电子邮 件。
*

你的讯息中夹带著一个 message ID 以 ``localhost'' 字串结束。

某些邮件软体产生某些不正确的 message ID,这将不被接受。 你必需更改设定让你的邮件软体产生正确的 message ID,如果这无 法解决,考虑说服你的邮件软体作者更新程式以处理这个问题。




Q: 16.10. 我可以在哪里找到一个免费的FreeBSD帐号?
A:FreeBSD的伺服器本身不提供任何对外的服务,其他的单位中, 有人提供开放的 Unix 系统服务。其中有些可能要收取些许费用。

Arbornet, Inc, 也被称为 M-Net,自 1983 年起就开始提供 Unix 系统服务。一开始, 他们使用 Altos 并执行 System III。他们在 1991 年转换系统成为 BSD/OS。在 2000 年六月,他们再度更换成为 FreeBSD。M-Net 能让使 用者透过 SSH 及 telnet 连线到主机,并提供完整的 FreeBSD 软体以 供使用。然而,M-Net 作为一个非盈利组织运行,存取权只限於成员和 赞助者,M-Net 也提供 BBS 系统和网路聊天服务。

Grex 提供了非常 类似 M-Net 的服务,包括了 BBS 系统和网路聊天。然而,机器是使用 Sun 4M,并执行 SunOS。


Q: 16.11. 什么是 sup,我该如何使用它?
A:

SUP 的意思是 Software Update Protocol,由 CMU 发展, 用来维持整个发展的同步。我们利用它保持远端的站台和原始站台之间 的同步工作。

然而,SUP 在频宽的使用上并不太友善,同时,目前也不再使用了。 目前建议维持原始码同步更新的方法是 CVSup。



Q: 16.12. 这个可爱的小红人的名字是什么?
A:似乎,他并没有一个正式的名字,姑且就称其为 ``BSD 小恶魔'' 吧。如果你执意要使用一个名字。那就叫他 ``小动物(beastie)'' 吧。注:``beastie'' 在读音上跟 ``BSD'' 很接近。

你可以在BSD小恶魔的 主页 上取得更多的资讯。


Q: 16.13. 我能使用BSD的小恶魔图案吗?
A:

也许吧,我也不确定。BSD小恶魔图案的版权是属於马歇尔苏格兰教会 (Marshall Kirk McKusick)所拥有。你可以试著去查看网页叙述关於BSD小恶魔肖像 以取得更详细关於使用他的资讯。

总归的来说,如果你纯粹为了自己想要鉴赏,那么,你可以自由的使 用肖像。如果你是个人使用,只要情况适当,应该都会被许可。如果你想 在商业上使用,则你必需联系苏格兰教会(Kirk McKusick)以取得许可。 如果你需要更进一步详细的资讯,请参考 BSD小恶魔的首页。



Q: 16.14. 你有任何的 BSD 小恶魔图案可以让我使用吗?
A:你可以在 /usr/share/examples/BSD_daemon/ 发现 eps 及 Xfig 两种格式的图档。



Q: 16.15. MFC 代表什么意思?
A:MFC 是一个缩写,它代表了 ``Merged From -CURRENT''。 它被使用在 CVS logs 中,以表示从 CURRENT 中整合进 STABLE 分支 的改变。

Q: 16.16. BSD 究竟代表什么意思?
A:它是一种承传自黑暗时代的古老秘密语言,仅仅在内部成员之中, 以口耳相传的方式悄悄的流传著。它用来代表某些神秘的东西,但是, 我们无法对这些东西以确实的文字加以叙述并具像化,它几乎不作任何 的翻译与解释。如果硬是要以人类现有的语言加以说明,只能说它的意 思大概介於 ``一级方程式赛车(Formula-1 Racing Team)'', ``企鹅是美味的点心(Penguins are tasty snacks)'',以及 ``我们比Linux更具有幽默感(We have a better sense of humor than Linux)'' 这三者之间。:-)

好了,不跟你开玩笑了。正确的说,BSD 是 ``Berkeley Software Distribution'' 的缩写,这是由 Berkeley CSRG (Computer Systems Research Group) 选来当作他们所发行的 Unix 名称。

Q: 16.17. POLA 代表什么意思?
A:最少惊讶原则。这代表了 FreeBSD 的发展过程,任何的改变到了使 用者端应该保持不让使用者感到惊讶。比方说,将 /etc/defaults/rc.conf 中的系统启动顺序任意 的更改将违反这个原则。

Q: 16.18. 什么是 repo-copy?
A:一份 repo-copy (它是 ``repository copy'' 的短表格) 直接参考到CVS仓库中的档案。

没有了一份 repo-copy,如果一个档案须要被复制或是被搬移到仓库 中的其他地方,确认者将会执行 cvs add 以把档案 放到新的地方,同时,对旧档案执行 cvs rm,旧档 案将被移除。

这个方法不利的地方是,历史档案(即在 CVS 记录中)将不会被复制 到新的地点。在 FreeBSD Project 中考虑到,这个历史记录是很有用处的, 一个 repository copy 是经常被用到的。这是 repository meisters 一直使用来将档案复制进仓库的流程,而非使用 cvs(1)。

Q: 16.19. 为什么我该在意脚踏车棚的颜色?
A:一个最短最短的答案是,你不该在意。稍微长一点的答案是,虽然 你有能力自己去建造一座脚踏车棚,但是,这不代表因为你不喜欢现在这 个脚踏车棚的颜色,就中止他的建筑。这个比喻的意思是,你不需要去争论 每一个细项特徵,只因为你有办法去作它。某些人的评论是,杂音的产生度 对变化的复杂性相反地比例。

更长且较完整的答案是,在经过长时间争论关於是否该将 sleep(1) 的秒参数移除,Poul-Henning Kamp <phk@FreeBSD.org>发表了一篇长论 ``一座自行车蓬 (任何颜色的)在青脆的草地上...''。 那则讯息被适当的部分被引用在下面。


``什么是关於这个脚踏车棚?'' 部分的人这样的询 问我。

这是一个非常长远的故事,否则就是一个古老的故事。但是事实上, 这个故事非常的短。C. Northcote Parkinson 在1960年代初期写了一本 书,书名为 ``Parkinson's Law'',在这本书中包含了很多 具有卓见的动态管理学。

[引述一点在这本书上的评论]

在这个被卷入脚踏车棚案的特殊例子,主要的要素是核能发电场, 我想,这足以说明这本书的年龄。

Parkinson 展示了你该如何在董事会中赢得赞同去建造一座数百万 或甚至十亿美元的核能发电场,但是,如果你想要去建造一座脚踏车棚, 你将会被纠缠在无穷无尽的讨论之中。

Parkinson 解释,这是因为一个核能发电场是这样的广阔,这样的 昂贵,并且这样的复杂,以至於人们无法掌握它,而并非尝试,他们急 切的希望有人能够帮他们处理并解决所有琐碎的细项。 Richard P. Feynmann 给了一些有趣,且非常一针见血的论点,在他的 书提到了 Los Alamos 的例子。

另一方面,任何人都能自己在周末组装一座脚踏车棚出来,并且仍 有闲聊可以观赏电视及玩游戏。因此,无论你作了多么完善的准备,也 不管你提出的方案是多么的合宜,某些人仍将抓住机会跑出来告诉你, 他正在作同样的事,正在付出努力,他就在 这里。

在丹麦,我们称这个叫作 ``虎死留皮(setting your fingerprint)''。它关系到你 个人的骄傲和声望,这关系到你是否可以指著某地後对著别人说 ``这里! 这是我作的。'' 这是政治人物很重要的一个特徵。但是,时机是大多数人民所赋与的。 想想那些留在水泥地上的脚印吧。

--Poul-Henning Kamp <phk@FreeBSD.org> on freebsd-hackers, October 2, 1999


最后进行编辑的是 kinki on Tue 2003-06-10 12:29:21, 总计第 1 次编辑
返回页首
阅览会员资料 发送站内信件 发送电子邮件 MSN Messenger
kinki
精神病


注册时间: 2002-06-10
文章: 682

文章发表于: Mon 2003-06-09 14:23:55    发表主题: FreeBSD.org FAQ --高级主题 引用并回复

Q: 18.1. 如何能学习更多有关 FreeBSD 内部的东西?
A:目前市面上还没有探讨作业系统内部的书是专为 FreeBSD 而写 的。然而,许多一般的 UNIX 知识都可以直接应用在 FreeBSD 上。附 加一点,仍然有相关的书是专为 BSD 所写的。

请参考 Handbook 的操作系统内部之参考书目

Q:18.2. 如何能为 FreeBSD 出一份力?
A:请参考这篇文章 Contributing to FreeBSD 来提供您的建议。如果您能帮忙那就更欢迎了!


Q:18.3. SNAP 和 RELEASE 是什么?
A:目前有三个活跃/半活跃的分支在 FreeBSD 的 CVS Repository (RELENG_2 分支一年大概更动两次,正是为何只有三个活跃的发展中分支):

*

RELENG_2_2 即 2.2-STABLE
*

RELENG_3 即 3.X-STABLE
*

RELENG_4 即 4-STABLE
*

HEAD 即 -CURRENT 即 5.0-CURRENT

如同其他两个,HEAD 并不是真正 的 branch tag,它只是一个符号常数,指向 ``current (尚未分支的发展中版本)'' 简记为 ``-CURRENT''。

以现在来说,``-CURRENT'' 朝向 5.0 发展,而 4-STABLE 分支,也就是 RELENG_4,在 2000 年三月从 ``-CURRENT'' 分支出来。


Q:18.4. 要怎么作出自己的 release?
A:请参照 Release 工程 文章说明。


Q:18.5. 为什么 make world 把原来装的 binary 档 都换掉了?
A:

没错,就是这样子。如名字所示,make world 会重新编译系统内建的每个 binary 档,这样在结束时就可确定有个一致 且乾净的环境(所以要花上好一段时间)。

在执行 make world 或 make install 时,如果有设 DESTDIR 这个环境变数,新产生的 binary 将会装在 ${DESTDIR} 下同样的目录树中。但在某些修改 shared library 和重建 binary 的无特定情况下,这样做可能会使 make world 失败。



Q:18.6. 在系统开机时,出现 ``(bus speed defaulted)''。
A:Adaptec 1542 SCSI 卡允许使用者用软体调整汇流排的存取速度。 早期的 1542 驱动程式试图将它设成可用的最快速度,但後来发现在一 些机器上不能用,所以现在要在 kernel 设定中加 TUNE_1542 这个选项来启动这个功能。在支援的机器 上用这个选项会使硬碟存取更快,但在不支援的机器上有可能会毁掉资料。


Q:18.7. 在网路频宽有限的情况下,我也可以跟上 current 的发展吗?
A:是的,藉著 CTM 您就可以不用下载全部的程式码。


Q:18.8. 是怎么把发行版本中的档案切成一个个 240k 的小档案的?
A:以 BSD 为基础的较新系统有个 -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:18.9. 我在 kernel 中加了新功能,我要把它寄给谁?
A:请参考 Contributing to FreeBSD 中的文章,以了解要如何提供您的程式码。

同时也谢谢您的关心!


Q:18.10. ISA 的随插即用卡是如何侦测及初始化的?
A:由 Frank Durda IV 所写: <uhclem@nemesis.lonestar.org>

简单的说,当主机发出是否有 PnP 卡的询问讯号时,所有的 PnP 卡 会在几个固定的 I/O port 作回应。所以当侦测 PnP 的程式开始时,它 会先问有没有 PnP 卡在,接著所有 PnP 卡会在它读的 port 以自己的 型号 # 作回答,这样侦测程式就会得到一个 wired-OR ``yes'' 的数字,其中至少会有一个 bit 是打开的。然後侦测程式会要求型号 (由 Microsoft/Intel指定)小於 X 的卡``离线''。再去看是 否还有卡回答同样的询问,如果得到 0,就表示没 有型号大於 X 的卡。 现在程式会问是否有型号小於 X 的卡,如果有的话,程式再要型号大於 X-(limit/4) 的卡离线,然後重覆 上面的动作。用重复这种类似 semi-binary search 的方法,在某范围内 找个几次後,测程式最後会在机器中区分出所有的 PnP 卡,搜寻次数也 远低於一个个找的 2^64 次。

一张卡的 ID 由两个 32-bit(所以上面是 2?64) + 8bit 侦错码 组成,第一个 32 bits 是用来区分各家厂商的。这些厂商从来没有出来澄 清过,但看来应假设同一家出的不同种类的卡的厂商 ID 有可能不同。用 32 bits 只来表示不同厂商的想法实在有点过头了。

第二个 32 bits 则是型号 #、乙太网路位址、或一些使这张卡独特的 资料。除非第一个 32 bits 不同,否则厂商不可能作出第二个 32 bit 相 同的两张卡。所以在一台机器中可以有同样的好几张卡,然而他们整个 64 bits 还是会都不一样。

这两个 32 bit 绝对不可以全为零,这才能使得最开始 binary search 中的 wired-OR 会得到一个非零数字。

一旦系统区分出所有卡的 ID,接著会经由同样的 I/O port 一个个重 新启动每张卡,接著找出已知介面卡所需的资源、有哪些中断可以使用等 等。所有卡都会被扫描一次,来收集这些资料。

这些资讯接著和硬碟上的 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、和另一个在 0x200 及 0x3ff 之间的 port。

18.11. 我为某设备写了驱动程式,能不能给它一个 major number?

这要看你是否打算将这个驱动程式公开使用,如果是的话,请把它的 原始码送一份给我们,还有 files.i386 修改的 部份、kernel 设定档样本、以及用来产生设备档的 MAKEDEV(8)。 如果你不打算公开、或因为版权问题而不能公开的话,我们有特地保留 character major number 32 和 block major number 8 给这方面的使用, 直接用这两个就好了。不论如何,我们都会很感激你能在 FreeBSD technical discussions mailing list <freebsd-hackers@FreeBSD.org> 发表驱动程式的消息。



Q:18.12. 关於更动目录放置的原则?
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:18.13. 如何在 kernel panics 时得到最多的资讯?
A:[这节是从 Bill Paul <wpaul@FreeBSD.org> 在 freebsd-current mailing list 上发表的信中节录, Dag-Erling C. Sm�rgrav <des@FreeBSD.org> 修正了打字错误、再加上括弧里的注解。]

From: Bill Paul <wpaul@skynet.ctr.columbia.edu>
Subject: Re: the fs fun never stops
To: Ben Rosengart
Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT)
Cc: current@FreeBSD.org

[Ben 发表了下面的 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,那么只有 你才能告诉我们问题出在那里。

要做的事包括这些:

1.

把 instruction pointer 的值记下来。注意在前面的 0x8: 在这个情况中并不重要,我们要的是 0xf0xxxxxx。
2.

当系统重新开机後,执行这道命令:

% nm -n /(造成 panic 的 kernel 档案) | grep f0xxxxxx

其中 f0xxxxxx 就是记下来的 instruction pointer 值。有可能不会刚好找到完整的这个字串, 这是因为 kernel symbol table 里的各个 symbol 只是函式的进 入点,但 instruction pointer 所指的位址有可能是在函式内的 某一处,而不一定在开头。所以如果找不到整个字串,那么把 instruction pointer 值的最後一个数字拿掉,再试一次:

% nm -n /(造成 panic 的 kernel 档案) | grep f0xxxxx

如果这样也找不到,那就把另一个数字去掉再找,一直重复到找到 为止, 结果是一串可能造成 panic 的函式列表。这样比直接找到 出问题的函式来得差,但至少好过什么都没有。

我常常看到人们显示一大片 panic 讯息,但很少看到有人花一点时间 把 instruction pointer 和 kernel symbol table 中的函式比较一下。

要追踪出造成 panic 原因的最好方法是先做出 crash dump,然後用 gdb(1) 在上面做 stack trace。

不管是那一种,我通常是用这个方法:

1.

写好 kernel 设定档。如果你需要用 kernel debugger,在设 定档中加上 options DDB 这个选项。 (当我怀疑有出现无穷回圈时,通常会用这个来设定中断点。)
2.

用 config -g KERNELCONFIG 做出用来编译的目录。
3.

cd /sys/compile/ KERNELCONFIG; make
4.

等待 kernel 编译结束。
5.

make install
6.

重新开机

make(1) 将会制造出两个 kernel。kernel 还有 kernel.debug。 kernel 将会被安装到 /kernel,而 kernel.debug 可用来给 gdb(1) 当作 debugging symbols 的来源。

要确定能抓到 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。

Note: 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: 18.14. 为什么 dlsym() 不能操作 ELF 执行档?
A:在 ELF 一系列的工具中,内定是不会让 dynamic linker 看到执行 档里定义了哪些 symbol。所以 dlsym() 没有办 法用藉由呼叫 dlopen(NULL, flags) 取得的 handle,用它去搜寻有那些 symbol 一定会失败。

如果你想要用 dlsym() 找出某个 process 的主执行档中有哪些 symbol,则要在 link 时对 ELF linker ( ld(1)) 加上 -export-dynamic 这个参数。


Q:18.15. 我要如何增加或减少 kernel 能定址的空间?
A:预设值是,FreeBSD 3.x 的 kernel 可以定址的空间是 256 MB 而 FreeBSD 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) }

然後重新编译您的 kernel。您可能会在执行 ps(1)、 top(1) 这类的程式时碰到问题;make world 应该就可以解决 (或把改过的 pmap.h 复制到 /usr/include/vm/ 下,再手动编译 libkvm, ps(1) 还有 top(1))。

注意:kernel 所能定址的空间大小必须是 4 megabytes 的倍数。

[David Greenman <dg@FreeBSD.org> 补充:我认为 kernel 定址空间大小应该要是 2 的乘幂,但不大确定这一点。旧的启动程式会动到 high order address bits,记得它假设至少有 256 MB。]
返回页首
阅览会员资料 发送站内信件 发送电子邮件 MSN Messenger
loser
道童


注册时间: 2004-04-12
文章: 281

文章发表于: Thu 2005-09-01 10:00:58    发表主题: 建议采用这个系统进行整理 引用并回复

建议采用这个系统进行整理

http://202.108.204.238/faq
返回页首
阅览会员资料 发送站内信件
meteorain
道士


注册时间: 2005-08-12
文章: 816
来自: 上海

文章发表于: Thu 2006-04-06 00:00:31    发表主题: 如何更改控制台默认的黑底儿白字儿的颜色。 引用并回复

Q: 如何更改控制台默认的黑底儿白字儿的颜色?
A:
代码:
     SC_NORM_ATTR=_attribute_
     SC_NORM_REV_ATTR=_attribute_
     SC_KERNEL_CONS_ATTR=_attribute_
     SC_KERNEL_CONS_REV_ATTR=_attribute_

以上这四个内核选项控制默认的颜色,文字可用的颜色定义如下:
FG_BLACK,
FG_BLUE
FG_GREEN
FG_CYAN
FG_RED
FG_MAGENTA
FG_BROWN
FG_LIGHTGREY
FG_DARKGREY
FG_LIGHTBLUE
FG_LIGHTGREEN
FG_LIGHTCYAN
FG_LIGHTRED
FG_LIGHTMAGENTA
FG_YELLOW
FG_WHITE

背景可用的颜色定义如下:
BG_BLACK
BG_BLUE
BG_GREEN
BG_CYAN
BG_RED
BG_MAGENTA
BG_BROWN

例如:

下面的两行将更改普通信息的默认颜色,在黑色背景下显示绿色文字;反白文字将会是黄色,背景是绿色。
代码:
options SC_NORM_ATTR=(FG_GREEN|BG_BLACK)
options SC_NORM_REV_ATTR=(FG_YELLOW|BG_GREEN)

下面的两行会设置内核信息的默认颜色,内核信息会显示成亮红色,背景色是黑色;反白信息文字是黑色,背景是红色。
代码:
options SC_KERNEL_CONS_ATTR=(FG_LIGHTRED|BG_BLACK)
options SC_KERNEL_CONS_REV_ATTR=(FG_BLACK|BG_RED)

当然,这只是一些花瓶似的设置,没什么实用价值,大家开心就好。


提交人: Meteorain
来源: [翻译]

_________________
我想我是金牛座
==============
在南纬六十五°的冰天雪地上......
http://www.liuweinan.com
返回页首
阅览会员资料 发送站内信件 发送电子邮件 浏览发表者的主页 MSN Messenger
从以前的文章开始显示:   
发表新文章   这个论题已经被锁定,您不能发表、回复或者编辑文章。    FreeBSD China -> 技术交流 论坛时间为 北京时间
1页/共1

 
转跳到:  
不能发布新主题
不能在这个论坛回复主题
不能在这个论坛编辑自己的文章
不能在这个论坛删除自己的文章
不能在这个论坛发表投票


Powered by phpBB 2023cc © 2003 Opensource Steps; © 2003-2009 The FreeBSD Simplified Chinese Project
Powered by phpBB © 2001, 2005 phpBB Group
Protected by Project Honey Pot and phpBB.cc
silvery-trainer
The FreeBSD China Project 网站: 中文计划网站 社区网站
The FreeBSD China Project 版权所有 (C) 1999 - 2003 网页设计版权 著作权和商标