[索引] [第一章 - OpenBSD介绍] [第三章 - 开始OpenBSD之旅]
http://www.OpenBSD.org OpenBSD项目官方网站, 官方网站上有一系列有价值的资料、涉及OpenBSD项目的方方面面。
OpenBSD Journal 一个发布OpenBSD重要消息和建议的网站。
OpenBSDsupport.org 一个收集各种性质的用户维护文档的网站, 经常讨论一些官方FAQ或者其它文档不包含的内容。
许多用户建立了关于OpenBSD的网站或网页, 因为所有信息全分布在Internet上, 所以一个好的搜索引擎可以使您的生活更加轻松, 最后永远记住一点:千万不要在您的计算机上输入您不知道含义的命令。
OpenBSD项目维护着几个热门的邮件列表, 用户应该订阅并关注它们, 订阅邮件列表很简单, 给majordomo@OpenBSD.org发一封邮件, 这个电子邮件地址提供自动的订阅服务。在邮件信息中您应该用单独的一行给出订阅命令, 以便让服务器明白您要订阅那些内容, 例如:
subscribe announce
邮件列表处理器会回复您一封邮件让您确认, 确认方式有几种, 并且包含了一个邮件列表服务器的list server主页信息, 这样可以确认是您可以得到您所订阅的内容, 也能避免您收到垃圾邮件, 您仅需要确认订阅或者发一封邮件给majordomo@OpenBSD.org, 无论哪种方法订阅全很方便。您会看见有时限的三组身份识别号码, 就像这样 A56D-70D4-52C3, 目的是再一次确认是的确是您订阅了我们的邮件列表。
一旦您确认了您的订阅, 您会被马上加入邮件列表, 并且邮件列表服务器会通知您:您已经被成功的加入了。
取消订阅邮件列表您也仅仅需要再次给majordomo@OpenBSD.org发一封信, 内容看起来像这样:
unsubscribe announce
如果您订阅邮件列表时还有什么困难请封一封信给majordomo@OpenBSD.org 在邮件中写明"help", 这样您会得到一封回信, 仔细阅读里面的内容会对您的邮件列表设置有帮助。
您也可以通过http://lists.openbsd.org网站进行邮件列表的订阅维护。
OpenBSD 一些受欢迎的邮件列表清单:
在misc或其它邮件列表上提出一个问题之前,请您先请查阅一下以往的文章, 有些问题对您来说可能是第一次碰到, 但是它可能在这里已经被问过很多次了, 也许上周就在版面上出现过几次, 您可以试想一下再次在同样的地方提同样的老问题可能会使回答者不愉快, 所以请先仔细浏览以往的文章, 也许您马上就找到答案了。如果包含硬件方面的问题, 一定不要忘记提供一份您的dmesg(8)!
其它邮件列表指南及更多的信息, 请参阅mailing lists page。
一个非官方的邮件列表或许更能引起Unix或者OpenBSD新手的兴趣OpenBSD Newbies。
OpenBSD用户手册包含了大量的文档及对具体程序足够详尽的描述。为使用户手册更新及时并准确无误, OpenBSD团队一直付出大量的努力, OpenBSD用户手册上的文件在任何时候都具有权威性。
您需要先安装man48.tgz和misc48.Tgz才能在本地阅览用户手册和其它文档, 如何安装请详见系统组件。
这里有一份对新手来说很有用的部分用户手册清单:
初级用户
您可以在http://www.openbsd.org/cgi-bin/man.cgi找到所有的 OpenBSD用户手册, 同样, 如果您安装了man48.tgz这个文件您在本地计算机上也可以浏览。
一般来讲, 如果知道命令的名称您可以通过运行"man command"查询到此命令的用户手册。例如"man vi"将显示关于vi编辑器的用户手册。如果您不清楚确切的命令名称, 或者您使用"man command"在用户手册上“找”不到您需要的命令, 您可以通过运行"apropos something" 或者 " man -k something", 这里的"something"就是一个接近您要找的命令的意思的词, 也许用户手册会给出您想要的命令, 例如:
# apropos "time zone" tzfile (5) - time zone information zdump (8) - time zone dumper zic (8) - time zone compiler
附加的数字指出了用户手册所在的章节数, 有时您会发现同一个命令的不同解释内容在不同的章节上, 例如:假如您想知道"cron"命令的具体用法, 如果您知道了您所需要的"cron"命 令的具体章节数, 您可以用命令 "man n cron"直接去那个章节阅读您所需要的内容。
# man -k cron cron (8) - clock daemon crontab (1) - maintain crontab files for individual users crontab (5) - tables for driving cron # man 5 crontab
除了UNIX用户手册外, 还有面对不同用户的文档包(包含在misc48.tgz组件内),它位于/usr/share/doc目录. 您可以在适当的子目录内通过"make"命令生成各类文档。psd子目录是程序员辅助文档。smm子目录里面是系统管理者用户手册。usd子目录是Unix用户辅助文档。 您可以在上面的三个子目录中运行"make"命令, 或者您也可以"make"某一章节或一部分段落。
一些子目录内是空的,默认情况下的输出的是适于打印的PostScript格式, PostScript 输出格式会很大——您会发现文件体积增大了250-300%。如果您不打算打印或显示这种格式, 您完全可以将文档输出成在终端上的显示格式。每个文档目录内的文档全可以用 make(1)命令输出为ASCII码 的纯文本格式(被称为'paper.txt"), 例如:
# cd /usr/share/doc/usd/04.csh # make paper.txt # more paper.txt
注意在这些子目录中创建文档时系统可能要求您具有超级用户权限, 而且您在输入make clean命令后 您以前"make"生成的文档会被删除。具体请参看/usr/share/doc/README文档, 更多关于创建文档的说明在/usr/share/doc/目录中可以找到。
用户手册(manual pages )通常情况下比可打印文档的内容更新更可靠, 但是有时可打印文档对相关应用程序的解释更详尽。
对多数人来讲自己拥有一份硬拷贝的用户手册是十分有益的。在这里我们介绍一下怎样打印一份用户手册的拷贝。
这些文档可以在src tree上找到。在src tree中的用户手册是无格式的原始文档, 通过使用 CVS, 它们会被更新。如果您想看这些页面, 很简单:
# nroff -Tascii -mandoc <file> | more
下面的命令会帮您直接获得一份简单的无格式及无打印控制符的文档:
# man <command> | col -b
注意下面命令行中所指的<file>必须是用户手册原始文档(很可能是以数字结尾的文件名, 如:tcpdump.8)。PostScript版的用户手册看起来很漂亮, 它们可以被打印出来, 或者用某些程序, 如gv(GhostView)在屏幕上浏览。GhostView 可以在packages collection中找到。在OpenBSD系统中用下面的 nroff(1)命令可以得到PostScript格式的用户手册:
# nroff -Tps -mandoc <file> > outfile.ps
对那些通过编译系统源码构建自己系统的人来讲, 有一系列选项可以创建用户手册, 这些选项可以在您构建系统时放到/etc/mk.conf这个文件中(也许你需要创建这个文件), 一个特别的选项可以帮助您生成压缩格式的用户手册文档以便节省磁盘空间, 而且这种压缩格式的文档可以通过man命令正常显示出来。在文件mk.conf里加入一个选项:
MANZ=yes
除了可以生成纯文本ASCII码格式的用户手册文档外, 另一个有用的选项可以让系统产生 PostScript格式的用户手册文档, 您仅需在/etc/mk.conf里加入一个选项:
MANPS=yes
请参看mk.conf(5)以获得更多的信息。
OpenBSD的一些文档是由info文档构成的, 典型的就是在/usr/share/info下的文件, 它们GNU 提供文档的替代品, 这里的多数GNU的说明文档比OpenBSD用户手册上的以前GNU提供的说明文档更新, 您可以通过 info(1)命令查看 这些GNU提供的文档, 例如, 您想了解GNU提供的编译器 gcc(1)的说明文档, 输入命令:
您用过info命令后, 您将会更加喜爱我们的用户手册!# info gcc
xterm(1)终端默认的 配置文件并不能显示彩色的用户手册, 如果想要得到彩色输出您必须把/etc/X11/app-defaults/XTerm-color 拷贝到您的根目录, 并把它的名字改成.Xdefaults。仔细点,您不要随便修改这个".Xdefaults"文件的当前设定, 您的XTerm终端可以彩色显示的所有设定选项全在这个文件里,但您要确保去掉下面这三个选项的注释符:
!*VT100*colorULMode: on !*VT100*underLine: off !*VT100*colorBDMode: on
您可以通过设定这个文件的其它部分的选择不同的颜色, 有关用户手册的彩色显示选项是:
设置成这种的颜色搭配的用户手册可能有些不美观, 所以如果您想个性化一下用户手册的显示也许可以将colorUL设置成red(红), 把colorBD设置成magenta(洋红)?两一个选择是xman(1), 它可以在X11下浏览用户手册。您可以在用户手册上找到更多的关于xterm和xman的知识。*VT100*colorUL: yellow *VT100*colorBD: white
如果您想为自己所编写的程序写自己的用户手册, 可以看mdoc.samples(7)和mdoc(7)。
最后递交任何错误报告前请先认真浏览http://www.openbsd.org/report.html页面。
提交真正的bug是最终用户一个最重要的责任, 诊断多数严重的程序错误需要您提供尽量详细的情况。OpenBSD开发人员经常通过email收到这样的错误报告, 就像:
From: joeuser@example.com To: bugs@openbsd.org Subject: HELP!!! I have a PC and it won't boot!!!!! It's a 486!!!!!
幸好大多数人理解为什么这类邮件会被立刻删除。所有的提交的bug必须包含详尽的信息, 上面例子中如果Joe User真的希望别人帮助来解决这个"问题", 那应该提供更多的情况......, 像这样:
From: smartuser@example.com To: bugs@openbsd.org Subject: 3.3-beta panics on a SPARCStation2 OpenBSD 3.2 installed from an official CD-ROM installed and ran fine on this machine. After doing a clean install of 3.3-beta from an FTP mirror, I find the system randomly panics after a period of use, and predictably and quickly when starting X. This is the dmesg output: OpenBSD 3.3-beta (GENERIC) #9: Mon Mar 17 12:37:18 MST 2003 deraadt@sparc.openbsd.org:/usr/src/sys/arch/sparc/compile/GENERIC real mem = 67002368 avail mem = 59125760 using 200 buffers containing 3346432 bytes of memory bootpath: /sbus@1, f8000000/esp@0, 800000/sd@1, 0 mainbus0 (root): SUNW, Sun 4/75 cpu0 at mainbus0: CY7C601 @ 40 MHz, TMS390C602A FPU; cache chip bug - trap page uncached cpu0: 64K byte write-through, 32 bytes/line, hw flush cache enabled memreg0 at mainbus0 ioaddr 0xf4000000 clock0 at mainbus0 ioaddr 0xf2000000: mk48t02 (eeprom) timer0 at mainbus0 ioaddr 0xf3000000 delay constant 17 auxreg0 at mainbus0 ioaddr 0xf7400003 zs0 at mainbus0 ioaddr 0xf1000000 pri 12, softpri 6 zstty0 at zs0 channel 0 (console i/o) zstty1 at zs0 channel 1 zs1 at mainbus0 ioaddr 0xf0000000 pri 12, softpri 6 zskbd0 at zs1 channel 0: reset timeout zskbd0: no keyboard zstty2 at zs1 channel 1: mouse audioamd0 at mainbus0 ioaddr 0xf7201000 pri 13, softpri 4 audio0 at audioamd0 sbus0 at mainbus0 ioaddr 0xf8000000: clock = 20 MHz dma0 at sbus0 slot 0 offset 0x400000: rev 1+ esp0 at sbus0 slot 0 offset 0x800000 pri 3: ESP100A, 25MHz, SCSI ID 7 scsibus0 at esp0: 8 targets sd0 at scsibus0 targ 1 lun 0: <SEAGATE, ST1480 SUN0424, 8628> SCSI2 0/direct fixed sd0: 411MB, 1476 cyl, 9 head, 63 sec, 512 bytes/sec, 843284 sec total sd1 at scsibus0 targ 3 lun 0: <COMPAQPC, DCAS-32160, S65A> SCSI2 0/direct fixed sd1: 2006MB, 8188 cyl, 3 head, 167 sec, 512 bytes/sec, 4110000 sec total le0 at sbus0 slot 0 offset 0xc00000 pri 5: address 08:00:20:13:10:b9 le0: 16 receive buffers, 4 transmit buffers cgsix0 at sbus0 slot 1 offset 0x0: SUNW, 501-2325, 1152x900, rev 11 wsdisplay0 at cgsix0 wsdisplay0: screen 0 added (std, sun emulation) fdc0 at mainbus0 ioaddr 0xf7200000 pri 11, softpri 4: chip 82072 fd0 at fdc0 drive 0: 1.44MB 80 cyl, 2 head, 18 sec root on sd0a rootdev=0x700 rrootdev=0x1100 rawdev=0x1102 This is the panic I got when attempting to start X: panic: pool_get(mclpl): free list modified: magic=78746572; page 0xfaa93000; item addr 0xfaa93000 Stopped at Debugger+0x4: jmpl [%o7 + 0x8], %g0 RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb> trace pool_get(0xfaa93000, 0x22, 0x0, 0x1000, 0x102, 0x0) at pool_get+0x2c0 sosend(0x16, 0xf828d800, 0x0, 0xf83b0900, 0x0, 0x0) at sosend+0x608 soo_write(0xfac0bf50, 0xfac0bf70, 0xfac9be28, 0xfab93190, 0xf8078f24, 0x0) at soo_write+0x18 dofilewritev(0x0, 0xc, 0xfac0bf50, 0xf7fff198, 0x1, 0xfac0bf70) at dofilewritev+0x12c sys_writev(0xfac87508, 0xfac9bf28, 0xfac9bf20, 0xf80765c8, 0x1000, 0xfac0bf70) at sys_writev+0x50 syscall(0x79, 0xfac9bfb0, 0x0, 0x154, 0xfcffffff, 0xf829dea0) at syscall+0x220 slowtrap(0xc, 0xf7fff198, 0x1, 0x154, 0x1, 0xfac87508) at slowtrap+0x1d8 ddb> ps PID PPID PGRP UID S FLAGS WAIT COMMAND 27765 8819 29550 0 3 0x86 netio xconsole 1668 29550 29550 0 3 0x4086 poll fvwm 15447 29550 29550 0 3 0x44186 poll xterm 8819 29550 29550 35 3 0x4186 poll xconsole 1238 29550 29550 0 3 0x4086 poll xclock 29550 25616 29550 0 3 0x4086 pause sh 1024 25523 25523 0 3 0x40184 netio XFree86 *25523 25616 25523 35 2 0x44104 XFree86 25616 30876 30876 0 3 0x4086 wait xinit 30876 16977 30876 0 3 0x4086 pause sh 16977 1 16977 0 3 0x4086 ttyin csh 5360 1 5360 0 3 0x84 select cron 14701 1 14701 0 3 0x40184 select sendmail 12617 1 12617 0 3 0x84 select sshd 27515 1 27515 0 3 0x184 select inetd 1904 1 1904 0 2 0x84 syslogd 9125 1 9125 0 3 0x84 poll dhclient 7 0 0 0 3 0x100204 crypto_wa crypto 6 0 0 0 3 0x100204 aiodoned aiodoned 5 0 0 0 3 0x100204 syncer update 4 0 0 0 3 0x100204 cleaner cleaner 3 0 0 0 3 0x100204 reaper reaper 2 0 0 0 3 0x100204 pgdaemon pagedaemon 1 0 1 0 3 0x4084 wait init 0 -1 0 0 3 0x80204 scheduler swapper Thank you!
关于如何描述和提交bug的更多内容请参阅report.html。如果您认为这个bug可能与您的硬件或硬件配置有关(哪怕仅有一点点可能), 您就应该提供您硬件的详尽信息, dmesg(8)提供了对硬件的详细描述, 通常情况下这些描述已经足够开发者判断问题所在了。对出现问题时情况的详尽描述也是必须的。 您会注意到上面dmesg(8)提供了对硬件的详细描述, 这些文字解释了为什么聪明的用户知道他们的硬件并没有问题, (译者注:根据上面第二封电子的内容, 因为运行OpenBSD3.2一切正常, 情况仅出现在安装3.3beta后运行X时), 什么导致了程序的崩溃(启动X), 并且输入调试命令"ps"和"trace"。在这种情况下聪明的用户会将这些信息通过串口控制台输出到文件中;如果您不知道如何操作, 那您只有用纸和笔把这些信息记录下来了。(这是一个真实的案例, 上面的第二封邮件中详尽的bug描述, 帮助OpenBSD开发者修正了OpenBSD3.3beta版在Sun4c系统中的一个bug。)
如果你想用运行的OpenBSD系统提交一个bug的话, 那么就会使用sendbug(1)发送bug给GNATS问题跟踪系统。不过如果您的系统无法启动您就不能用sendbug(1)工作,但是您可以使用时您应该尽量用它, 另外发生问题时详细的情况说明, 您的OpenBSD系统的详细配置、错误在哪种情况下重复发生等等这些信息也是必不可少的。使用sendbug(1)命令要求您的系统可以在因特网上发送电子邮件。注意错误报告服务器启用了spamd(8)(反垃圾邮件技术), 所以可能邮件可能会半小时后才可能被服务器接收到, 所以请您保持耐心。
当您使用sendbug提交了bug后, 您会收到一封关于此报告目前状态的通知。开发人员也许会与您联系, 并让您提供更多的情况, 或者给您提供一个补丁程序进行测试。您也可以自己访问OpenBSD的邮件列表bugs@OpenBSD.org, 查询这个错误修补的进展情况, 如何订阅邮件列表请参阅mailing list page或在Bug Tracking System错误跟踪系统)的数据库中查询它的状况。
遗失了"Panic message"?
有时您可能没有记录下系统出问题时的第一手系统信息及出问题的原因, 这个系统信息十分重要, 您又想要提交它, 这时您可以在ddb>状态下用"show panic"命令像这样:
ddb> show panic 0: kernel: page fault trap, code=0 ddb>
在这个案列中, 崩溃信息是"Kernel: page fault trap, code=0"
多处理器系统的特别说明:
您应该"trace"您的每一个处理器并将结果全写在报告里:
ddb{0}> trace pool_get(d05e7c20, 0, dab19ef8, d0169414, 80) at pool_get+0x226 fxp_add_rfabuf(d0a62000, d3c12b00, dab19f10, dab19f10) at fxp_add_rfabuf+0xa5 fxp_intr(d0a62000) at fxp_intr+0x1e7 Xintr_ioapic0() at Xintr_ioapic0+0x6d --- interrupt --- idle_loop+0x21: ddb{0}> machine ddb 1 Stopped at Debugger+0x4: leave ddb{1}> trace Debugger(d0319e28, d05ff5a0, dab1bee8, d031cc6e, d0a61800) at Debugger+0x4 i386_ipi_db(d0a61800, d05ff5a0, dab1bef8, d01eb997) at i386_ipi_db+0xb i386_ipi_handler(b0, d05f0058, dab10010, d01d0010, dab10010) at i386_ipi_handler+0x 4a Xintripi() at Xintripi+0x47 --- interrupt --- i386_softintlock(0, 58, dab10010, dab10010, d01e0010) at i386_softintlock+0x37 Xintrltimer() at Xintrltimer+0x47 --- interrupt --- idle_loop+0x21: ddb{1}>
对机器的每一个处理器, 在每个"machine ddb x"后重复使用trace命令。
A typical kernel crash on OpenBSD might look like this: (things to watch for are marked with bold font)
The first command to run from the ddb> prompt is "trace" (see ddb(4) for details):kernel: page fault trap, code=0 Stopped at _pf_route+0x263: mov 0x40(%edi),%edx ddb>
This tells us what function calls lead to the crash.ddb> trace _pf_route(e28cb7e4,e28bc978,2,1fad,d0b8b120) at _pf_route+0x263 _pf_test(2,1f4ad,e28cb7e4,b4c1) at _pf_test+0x706 _pf_route(e28cbb00,e28bc978,2,d0a65440,d0b8b120) at _pf_route+0x207 _pf_test(2,d0a65440,e28cbb00,d023c282) at _pf_test+0x706 _ip_output(d0b6a200,0,0,0,0) at _ip_output+0xb67 _icmp_send(d0b6a200,0,1,a012) at _icmp_send+0x57 _icmp_reflect(d0b6a200,0,1,0,3) at _icmp_reflect+0x26b _icmp_input(d0b6a200,14,0,0,d0b6a200) at _icmp_input+0x42c _ipv4_input(d0b6a200,e289f140,d0a489e0,e289f140) at _ipv4_input+0x6eb _ipintr(10,10,e289f140,e289f140,e28cbd38) at _ipintr+0x8d Bad frame pointer: 0xe28cbcac ddb>
To find out the particular line of C code that caused the crash, you can do the following:
Find the source file where the crashing function is defined in.
In this example, that would be pf_route() in sys/net/pf.c.
Recompile that source file with debug information:
Then use objdump(1) to get the disassembly:# cd /usr/src/sys/arch/$(uname -m)/compile/GENERIC/ # rm pf.o # DEBUG=-g make pf.o
In the output, grep for the function name (pf_route in our example):# objdump --line --disassemble --reloc pf.o >pf.dis
Take this first hex number and add the offset from the 'Stopped at' line: 0x7d88 + 0x263 == 0x7feb.# grep "<_pf_route>:" pf.dis 00007d88 <_pf_route>:
So, it's precisely line 3872 of pf.c that crashes:# more pf.dis /usr/src/sys/arch/i386/compile/GENERIC/../../../../net/pf.c:3872 7fe7: 0f b7 43 02 movzwl 0x2(%ebx),%eax 7feb: 8b 57 40 mov 0x40(%edi),%edx 7fee: 39 d0 cmp %edx,%eax 7ff0: 0f 87 92 00 00 00 ja 8088 <_pf_route+0x300>
Note that the kernel that produced the crash output and the object file for objdump must be compiled from the exact same source file, otherwise the offsets won't match.# cat -n pf.c | head -n 3872 | tail -n 1 3872 if ((u_int16_t)ip->ip_len <= ifp->if_mtu) {
If you provide both the ddb> trace output and the relevant objdump section, that's very helpful.
[索引] [第一章 - OpenBSD介绍] [第三章 - 开始OpenBSD之旅]