FreeBSD China Community FAQ --New
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
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鴕grav <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。]
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
来源: [翻译]












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