LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3649|回复: 4

[FreeBSD深入学习系列]Sysctl 和 bootloader

[复制链接]
发表于 2003-12-31 20:59:44 | 显示全部楼层 |阅读模式
注:本文由Freebird翻译,任何转载均需注明出处与作者.
发表时间:2003年12月31日


FreeBSD提供两种方法来配置一个已经存在的内核:sysctl和boot loader

sysctl允许你查看内核所用的所有参数,甚至去设置那些参数(通常又叫sysctls).sysctl有着非常强大的作用,你可以使用它解决很多问题,而不用重新编译内核或者重新配置应用程序。但它有时也是应该让用户头痛的家伙:p

所有的操作都有sysctl 命令完成,但在进行操作前,你必须明白有那些可用的sysctls及其具体含义。你可以用下面的命令查看系统中所有可用的sysctls:
....................................................................................................
#sysctl -A >sysctl.out
....................................................................................................
这个命令运行后,sysctl.out文件中就会出现许多sysctls及其参数,许多东西很难理解,但也有一些很容易看懂的。
....................................................................................................
kern.hostname:bigbox.blackhelicopters.org
....................................................................................................
这个特殊的sysctl名叫kern.hostname,其值为 bigbox.blackhelicopters.org 我运行此命令的机子叫bigbox.blackhelicopters.org. 从sysctl的名字,可以很容易就猜到这是运行这台计算机上的内核的名字。真的那么容易理解吗?不!有一些却非常古怪:
..............................................................................................
p1003_1b.memory_protection: 0
.....................................................................................



做为一个用户,我无法理解这个参数的意思。当然,如果我有问题并且想从软件商那或者邮件列表上获得帮助,我可以在请求帮助时顺便也把它附上。他们也许会告诉我去调整那个参数,以更好地支持该软件。所有的 sysctls被组织在一个树(叫管理信息库MIB--Management Information Base )的格式中 (MIB 也用于系统管理的其他方面,我们会在本书中看到其他的例子.)。这棵树由几个主要的目录,比如 net, vm, and kern. 每个目录又进一步细分,比如 net 包括所有的与网络有关的sysctls,它又被细分为 IP, ICMP, TCP, 和UDP. sysctl MIB 和sysctl 经常交替使用 。 MIB有很多种—在第19章我们会看到一些SNMP MIBs的例子,但这里我们仅仅讨论 sysctl MIBs 。我们在前面已经知道了kern.hostname MIB,如果你看了你机子上那些可用的sysctls的话,你会发现,有很多的sysctls以"kern."开头.这些都是基本的内核参数项。假如你再细心一点,你会发现有一大串以 "kern.ipc."开头,比如这些:
....................................................................................................
kern.ipc.maxsockbuf: 262144
kern.ipc.sockbuf_waste_factor: 8
kern.ipc.somaxconn: 128
. . .
....................................................................................................
这些sysctls描述了内核的IPC 行为.这个sysctl的分支可以分几层继续下去 。最终将会以单独的MIBs结束,比如net.inet.raw.recv---space. 每个MIB都有一个参数代表内核所用的buffer,setting或者characteristic.通过改变这些参数值,可以改变内核的操作。比如 一些sysctls控制每个网络连接使用的内存数 。假如你的网络比较差,就可以增加系统为网络连接保留的内存数。一些 sysctl MIB数的跟目录列与下表.
-------------------------------------------------------------------------------------------------
Some roots of the sysctl MIB tree
Sysctl  |   Functions
------------------------------------------------------------------------------------------------
kern  | 系统核心
vm    |  虚拟内存
vfs    | 文件系统
net    | 网络
debug  | 调试信息
hw     |硬件信息
machdep |系统平台;依赖性变量(比如Alpha,i386, 等
user     |用户岛接口信息
p1003_1b   | POSIX behavior

------------------------------------------------------------------------------------------------------
每个sysctl参数值可以是一个string, integer, binary value,或者 opaque. Strings 是自由格式的任意长度的文本; integers 是一般的全数字; binary values 是 0 (off) 或 1 (on);
opaques 在机器码中并且只有特殊才程序才能解释。
不幸的是,sysctls 没有好的文档说明有什么可用的sysctls以及他们的作用。MIB的文档一般都出现在man pages中。比如MIB kern.securelevel最原始的文档在 init(8)里.很多sysctls并没有文档。 附录
A 列出了一些常用的 sysctls 以及他们的作用.
幸运的是,很多是十分明了的. 比如,假如你scan哪个保存MIBs的文件,在靠近最顶端初你可以看到
....................................................................................................
kern.bootfile: /kernel
....................................................................................................
这是一个很重要的MIB,假如你有规律的启动不同的内核。 (怎么交替启动不同的内核将在后面讨论).假如你调试一个问题并且需要以不同的内核连续reboot。通过MIB,你就可以很容易的确定你所用的是哪个内核. 我不止一次的启动测试内核去测试某个问题并寻找解决方法,我发现我忘记了我使用的是哪个内核 。要看MIBs 的某个特殊的可用树,比如kern,可以用下面的命令:
....................................................................................................
# sysctl kern
kern.ostype: FreeBSD
kern.osrelease: 5.0−CURRENT
kern.osrevision: 199506
...
....................................................................................................
要想得到sysctl的某个确切的参数值,你需要将完整的MIB作为以上命令的参数,如:
....................................................................................................
# sysctl kern.securelevel
kern.securelevel: -1
#
....................................................................................................
在此例中, kern.securelevel有integer 参数值 –1.


修改Sysctls
一些sysctl的值是只读的。比如,看看 MIB  树hw (hardware) 和machdep
(machine dependencies)。
....................................................................................................
hw.machine: i386
....................................................................................................
因为FreeBSD project已经开发出通过软件设置把Intel-based硬件变成PowerPC硬件的技术,这个设置项是只读的。象这样修改MIB只会破坏你的系统,FreeBSD为这种MIBs标记只读来防止你任意修改。试着修改它,不会破坏任何东西,但是你会得到一个MIB不能被修改的警告 。另外,看看下面的MIB:
....................................................................................................
MIBvfs.usermount: 0
....................................................................................................
此项控制用户是否可以mount诸如CD-ROM和floppy之类的介质,是可以被修改的。他默认被设置为0或者off,为了打开它,用sysctl的-w参数把它设为1即可。By default it is set to 0, or off. To turn it on, use use sysctl's −w flag to set it to 1.[
....................................................................................................
# sysctl  -w vfs.usermount=1
vfs.usermount: 0 −> 1
#.................................................................................................
Sysctl 返回一些信息,显示原来的值和修改后的值。


在启动时设定Sysctl
想要在系统启动时即设定的Sysctls需要写入文件 /etc/sysctl.conf. 把你要设置的sysctl项及欲设值列在 sysctl.conf文件中.
举个例子:
通过设置sysctl:vfs.usermount 来让用户可以mount文件系统,在 sysctl.conf文件中加入如下行:
....................................................................................................
vfs.usermount=1
..............................................................................................……

通过 Loader.conf配置内核


一些内核的配置必须发生在在系统启动前。比如当内核初始化检测IDE硬盘时,设备驱程决定要不要使用写缓存。这个决定必须在该设备首次侦测时。在系统启动时或者启动之后你都不可以改变你的决定! 类似的,你可能有一块新的网卡并且想在系统启动前载入内核模块作为它的驱程 .这就是system loader 的目的了。
loader 有很多作用: 它寻找硬件驱程包括内核,将内核载入到内存,启动boot进程、把信息传给内核。loader给内核的信息中最重要的部分是在启动时即设置的sysctl MIBs 。
配置系统laoder最普通的方法是编辑它的配置文件,虽然你可以在loader 的ok>提示符下手工输入命令载入内核modules.但对于长的设置项来说,最好的方法还是将其写入/boot/loader.conf中.FreeBSD中有两个重要的 loader.conf文件:/boot/loader.conf 和/boot/defaults/loader.conf. 后者我们将在Chaper 8讨论,在这里我们只修改/boot/loader.conf.在/boot/defaults/loader.conf 中的设置项都是系统的默认设置项,在/boot/loader.conf中的设置会覆盖系统的默认设置。
Loader.conf 有两个主要作用:载如内核模块和提供设备驱程的hints。Device driver是普通的只在启动时设定的 sysctl MIBs .看看/boot/defaults/loader.conf,你会发现很多在各种环境下的有用的选项,比如可以指定一个非系统默认的内核 ,可以指定系统启动时的详细信息。作为参考,下面是/boot/defaults/loader.conf.的一点摘录:
....................................................................................................
kernel="/kernel"
kernel_options=""
userconfig_script_load="NO"
userconfig_script_name="/boot/kernel.conf"
userconfig_script_type="userconfig_script"
. . .
....................................................................................................
要改变启动的某项设置,你可以将其中相应行复制到/boot/loader.conf, 并在那修改它。
举个例子,上面的列表的第一项是设置内核名字的(这个我们在sysctl的例子中已经见过)。假如你工作在一台远程计算机上,你想在下次重起时使用不同的内核,但你又不想cp内核到/kernel.你就可以修改该行来改变你的系统所使用的内核。这是一个只可以在boot时设置的 sysctl。
让我们来看两个特别的例子:传递 hints给设备驱程并自动载入内核模块

传递 hints给设备驱程
Loader.conf'的首要目的是传递 hints给设备驱程. (一个hints能否被某设备驱程利用,
在man page中有说明)。
如前所述,IDE硬盘的设备驱程在系统启动前就要决定是否使用写缓存
为了起用写缓存在 loader.conf文件中写入::
....................................................................................................
hw.ata.wc="1"
....................................................................................................
就可以了,这种类型的flag看起来就会怀疑是不是sysctl MIB。事实上,系统启动时,首先看看它到底是不是一个sysctl:
....................................................................................................
# sysctl hw.ata.wc
hw.ata.wc: 1
#
....................................................................................................
我们知道,它确实是!

当系统在运行时,你不可以改变sysctl. (你可以试试,并无大碍)。你可以在启动时修改一个只读sysctl. 但这个并不能让你把老的Pentium 调整到一个Alpha,它仅仅给你额外的灵活性(flexibility)。

自动载入内核模块
如前所述,内核模块也是内核的一部分,在需要的时候可以启动(或者说载入),没用的时候又可以卸载。这样可以节省系统内存并且增强系统的灵活性。
在系统启动时自动载入内核模块是非常简单的。默认的 loader.conf给出可很多例子。
将模块名cp到loader.conf, 去掉后面的".ko", 并且加入类似的语句string _load="YES". 比如,要在系统启动时自动载入 /module/procfs.ko ,只需在loader.conf中加入:
....................................................................................................
procfs_load="YES"
....................................................................................................
当然,最难的是知道该载入哪个模块。简单是是设备驱程,假如你添加了新的网卡或者SCSI卡,你就应该在boot系统启动时载入相应的内核模块,而不是重建内核。你 可以通过程序的文档或者别人的建议来得知能不能通过载入modules来解决你的问题。怎么知道该载入哪个模块完全凭经验、看文档并且知道你到底想让你的系统做什么。
发表于 2004-1-1 23:29:08 | 显示全部楼层
Good ^_^
发表于 2004-1-2 10:59:33 | 显示全部楼层
强...
学习中ING
发表于 2004-1-4 10:14:22 | 显示全部楼层
来点更高级的
发表于 2004-3-17 10:58:40 | 显示全部楼层
这个已经够高级了!对我们这些小菜鸟来说!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表