第10章  系统管理

10.1. 系统启动的设置文件在哪里?
10.2. 怎样简单的增加一个用户?
10.3. 为什么我编辑完 crontab 文件之后总是收到类似 “root: not found” 这样的错误信息?
10.4. 为什么在我尝试 suroot 的时候会收到 “you are not in the correct group to su root” 的错误提示?
10.5. 我在 rc.conf 文件内犯了个错误 , 或其他的系统启动文件,然后 我不能编辑这些文件因为文件系统是只读的 . 我该怎么办?
10.6. 为什么我在设置打印机时遇上了麻烦?
10.7. 我怎样才能更正我的系统的键盘映射?
10.8. 为什么我在启动时会得到这样的消息: “unknown: <PNP0303> can't assign resources” ?
10.9. 为什么我不能让用户配额正确工作?
10.10. FreeBSD 是否支持 System V IPC?
10.11. 除了 sendmail 之外还有其它可用的邮件服务器软件吗?
10.12. 我把 root 密码忘记了! 我要怎么做?
10.13. 我怎样让 Control+Alt+Delete 组合键不重启系统?
10.14. 我怎样将DOS格式的文本文件格式化成 UNIX® 格式的?
10.15. 我怎样使用一个进程的名字来杀死它?
10.16. 为什么 su(1) 总是给出关于不在 root 的 ACL 的烦人提示?
10.17. 如何卸载 Kerberos
10.18. /dev/MAKEDEV 作什么?
10.19. 我怎样在系统中增加虚拟中端?
10.20. 我怎样重读 /etc/rc.conf 并且 重启 /etc/rc 而不重启系统?
10.21. 我尝试将系统升级到最新的 -STABLE, 但得到的却是 -BETAx-RC-PRERELEASE! 怎么回事?
10.22. 在尝试安装内核的时候, chflags(1) 失败了。 我应该怎么做?
10.23. 我不能更改我系统的时间. 我应该怎么做?
10.24. 为什么 rpc.statd 会使用 256 MB 的内存?
10.25. 为什么我不能取消文件的 schg 标志?
10.26. 为什么新版本的 FreeBSD 中 SSH 默认不能通过 .shosts 来进行验证了?
10.27. vnlru 是什么?
10.28. top 显示的内存类型都是什么意思?
10.29. 还有多少空闲的内存?
10.30. /var/empty 是什么? 我不能删除他 !

10.1. 系统启动的设置文件在哪里?

最主要的设置文件是 /etc/defaults/rc.conf (见 rc.conf(5)) 系统启动的脚本文件 /etc/rc/etc/rc.d (见 rc(8)) 只是包含这个文件。不要编辑 它! 然而, 如果在 /etc/defaults/rc.conf 里面有一个配制选项你要修改, 你应该把那一行复制到 /etc/rc.conf 里面,并且 在那里修改。

例如,如果你想开机启动内建的域名服务器 named(8), 你要做的就像下面那样:

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

要启动一个本地服务,把 shell 脚本放在 /usr/local/etc/rc.d 目录里面。这些 shell 脚本应该被设置成可执行的, 默认的文件模式是 555

10.2. 怎样简单的增加一个用户?

使用 adduser(8) 命令,或者 pw(8) 命令,如果你需要更复杂的解法 .

要删除一个用户,使用命令 rmuser(8) 或者, 如果必须, 使用命令 pw(8).

10.3. 为什么我编辑完 crontab 文件之后总是收到类似 “root: not found” 这样的错误信息?

这通常是由于编辑系统 crontab 文件 (/etc/crontab) 然后使用 crontab(1) 安装它造成的:

# crontab /etc/crontab

这不是作这件事的正确方法。 系统 crontab 文件拥有与每用户 crontabs 不同的格式 而 crontab(1) 只更新每用户 crontabs ( crontab(5) 手册 详细解释了二者的不同).

如果你这么作了,现在的 crontab 只是 /etc/crontab 的一个格式错误的拷贝 。 用下面的命令删除它:

# crontab -r

下次,当你编辑 /etc/crontab 时,你除了通知 cron(8) 这些改变外不用作其他事情,既然 它自己会自动的通知他们 .

如果你希望什么事每天每周或者 每月运行,可能更好的选择是增加脚本 /usr/local/etc/periodic, 然后让 periodic(8) 命令从 系统 cron 调度器 那里象其他的系统任务 那样进行调度 .

导致这个错误的实际原因是系统的 crontab 中有一个额外的字段用于指定执行命令的用户。 在随 FreeBSD 提供的默认系统 crontab 中, 所有条目中这个字段均为 root。 因而, 当这个 crontab 作为 root 用户的个人 crontab 使用时 (它与系统 crontab 不同), cron(8) 假定字符串 root 是所希望执行命令的第一个单词, 然而系统并没有提供这个命令。

10.4. 为什么在我尝试 suroot 的时候会收到 “you are not in the correct group to su root” 的错误提示?

这是一项安全特性。 想要 suroot (或其他任何有超级用户权限的用户), 就必须是 wheel 组的成员。 如果没有这个特性, 那么任何拥有系统用户帐号, 并且知道 root 的口令的用户, 便可以获得系统的超级用户权限。 有了这个特性, 这种操作就不会成功了; su(1) 会阻止没有在 wheel 组中的用户, 哪怕只是试试口令。

要允许用户 suroot, 将其加入 wheel 组就可以了。

10.5. 我在 rc.conf 文件内犯了个错误 , 或其他的系统启动文件,然后 我不能编辑这些文件因为文件系统是只读的 . 我该怎么办?

在引导加载器提示符处输入 boot -s 进入单用户模式。 当系统提示输入 shell 路径名时, 按下 Enter, 接着执行 mount -urw / 来以读写模式重新挂接根文件系统。 如果需要使用其他编辑器, 您可能还需要使用 mount -a -t ufs 来挂接其他文件系统。 如果您习惯使用的编辑器在网络文件系统上, 您就需要手工配置网络, 或使用本地文件系统中的编辑器, 如 ed(1).

如果您希望使用类似 vi(1) emacs(1) 这样的全屏幕编辑器, 可能还需要执行 export TERM=cons25 以便让这些编辑器从 termcap(5) 数据库中加载正确的终端信息数据。

一旦完成了上述步骤, 就可以像平时那样编辑 /etc/rc.conf 并修正其中的语法错误了。 在内核启动信息之后紧接着显示的错误信息应该能够告诉您发生错误的文件和行号。

10.6. 为什么我在设置打印机时遇上了麻烦?

请参阅 使用手册中关于打印的部分。 这能够解决您大部分的问题。

某些打印机需要主机驱动才能够打印。 这种 “WinPrinters” 打印机无法被 FreeBSD 直接支持。 如果您的打印机在 DOS 或 Windows® 下不能正常工作, 它很可能是个 WinPrinter。 您让这种打印机工作唯一的希望是看看 print/pnm2ppa port 是否支持它。

10.7. 我怎样才能更正我的系统的键盘映射?

请看手册中关于 using localization 的章节,特别是关于 console setup 的章节 .

10.8. 为什么我在启动时会得到这样的消息: “unknown: <PNP0303> can't assign resources” ?

下面的内容摘自 FreeBSD-CURRENT 邮件列表 邮件列表中的一封邮件。

 

那个 “can't assign resources” 消息 指出这个设备是一个 legacy ISA 设备,需要一个 non-PnP-aware 驱动被编译进内核。 这些设备包括键盘控制器,可编程中断控制器, 还有一些其他的 标准下层构件。 资源不能被分配 是因为已经有其他的驱动使用了这些地址 .

 
--Garrett Wollman , 24 April 2001  

10.9. 为什么我不能让用户配额正确工作?

  • 您的内核可能没有配置使用配额功能。 如果是这种情况, 则需要将下述选项加入内核配置, 并重新编译和安装内核:

    options QUOTA
    

    请参阅 使用手册中关于配额的章节 以了解更具体的细节。

  • 不要在 / 上启用配额。

  • 把配额文件放到那些被强制实行配额的文件系统上 ,象:

    Filesystem Quota file
    /usr /usr/admin/quotas
    /home /home/admin/quotas
    ... ...

10.10. FreeBSD 是否支持 System V IPC?

是的,在 GENERIC 内核中 FreeBSD 支持 System V-style IPC, 包括 shared memory (共享内存), messages (消息) and semaphores (信号). 在一个自定义内核中, 向内核配置文件中添加下面这些行来提供 相应的支持 .

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

重新编译并安装你的内核 .

10.11. 除了 sendmail 之外还有其它可用的邮件服务器软件吗?

sendmail 是 FreeBSD 默认的邮件服务器软件, 但您可以很容易地使用其它 MTA (例如, 通过 ports 安装的 MTA) 来替换它。

在 ports 套件中已经提供了多种不同的 MTA 供您选择, 其中 mail/eximmail/postfixmail/qmail, 以及 mail/zmailer 是最流行的选择。

更多选择, 更多欢笑。 多样化的邮件服务器选择是一件好事; 因此, 您应避免在邮件列表中提出类似 “sendmail 是否比 qmail 更好?” 这样的问题。 如果实在想要问, 请首先查阅一下邮件列表的历史存档。 每一种 MTA 的优缺点都已经被讨论过了。

10.12. 我把 root 密码忘记了! 我要怎么做?

别慌! 重启系统, 在 Boot: 提示符处输入 boot -s 进入单用户模式。 在系统询问使用哪个 shell 时, 按下 Enter。 这样您就会进入 # 提示符。 输入 mount -urw / 将根文件系统以可读写模式重新挂接, 接着, 执行 mount -a 来挂接其他文件系统。 运行 passwd root 即可修改 root 的密码, 然后输入 exit(1) 来继续引导过程。

注意: 如果系统在进入单用户模式时仍然向您询问 root 密码, 说明 /etc/ttys 中把控制台标记成了 insecure (不安全的)。 这种情况就必须从 FreeBSD 安装盘启动了, 在 sysinstall(8) 中选择 Fixit shell, 然后按前面的操作进行就可以了。

注意: 如果您在单用户模式无法挂载根分区, 说明根分区可能是加密的, 此时没有访问密钥就不能挂接它了。 您恢复系统的机会取决于加密磁盘采用的技术实现。 如欲了解关于加密磁盘的更多信息, 请参考 FreeBSD 使用手册

10.13. 我怎样让 Control+Alt+Delete 组合键不重启系统?

如果您使用的是 syscons(4) (默认的控制台驱动), 用包含下面这行的配置文件重新联编并安装内核:

options SC_DISABLE_REBOOT

如果不希望重启系统, 也可以通过设置 sysctl(8) 来修改相关配置:

# sysctl hw.syscons.kbd_reboot=0

如果您使用的是 pcvt(4) 控制台驱动, 则应使用下面的内核配置行, 并同样需要重新联编和安装内核:

options PCVT_CTRL_ALT_DEL

10.14. 我怎样将DOS格式的文本文件格式化成 UNIX® 格式的?

用下面的 perl(1) 命令:

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

其中 file(s) 是需要处理的一个或若干个文件。 全部修改是在原文件上进行的, 而原始的文件将增加一个 .bak 保存为备份。

可选择的,你可以使用命令 tr(1)

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

dos-text-file 是包含 DOS 文本的文件, 而 unix-file 则是转换输出文件。 这会比使用 perl 快得多。

除此之外, 还有一个对 DOS 文本文件格式进行重整的方法是使用 Ports 套件中的 converters/dosunix port。 具体用法请参阅其文档。

10.15. 我怎样使用一个进程的名字来杀死它?

使用 killall(1).

10.16. 为什么 su(1) 总是给出关于不在 root 的 ACL 的烦人提示?

这个错误来自于 Kerberos 分布式认证系统。 问题虽不致命但是很烦人。 您可以用带 -K 参数的 su, 或按照下一个问题中描述的那样卸载 Kerberos

10.17. 如何卸载 Kerberos

想要从系统中删除 Kerberos, 需要重新安装您运行的发行版本中的 base 软件包。 如果您使用 CDROM, 可以将其挂载 (我们假定是在 /cdrom) 并执行:

# cd /cdrom/base
# ./install.sh

另外, 也可以通过在 /etc/make.conf 中配置 NO_KERBEROS 选项, 并重新联编 world 来达到目的。

10.18. /dev/MAKEDEV 作什么?

FreeBSD 5.X 和更高版本采用了按需生成设备的 devfs(8)。 设备驱动程序会在需要时自动创建新的设备节点, 这使得 /dev/MAKEDEV 过时了。

10.19. 我怎样在系统中增加虚拟中端?

如果您的 telnetssh、 X 或 screen 用户很多, 可能会用完虚拟终端。 下面是如何增加更多的虚拟终端:

  1. 在内核配置中加入下面的配置, 并重新联编:

    device pty N
    

    此处 N 是希望的虚拟终端数量。

  2. 编辑 /etc/ttys 并为 N 终端增加对应的配置。 这些配置应该与现有的配置项相同, 类似这样:

    ttyqc none network
    

    这里的名字应符合正则表达式 tty[pqrsPQRSlmnoLMNO][0123456789abcdefghijklmnopqrstuv]

  3. 用新内核重新引导系统, 就可以正常使用了。

注意: 使用超过 256 (最多 512) 个 pty(4) 设备需要使用 FreeBSD 6.3 或更高版本。

10.20. 我怎样重读 /etc/rc.conf 并且 重启 /etc/rc 而不重启系统?

进入单用户系统,然后回到多用户模式.

在控制台下:

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

# return
# exit

10.21. 我尝试将系统升级到最新的 -STABLE, 但得到的却是 -BETAx-RC-PRERELEASE! 怎么回事?

简短的回答: 这些只是名字。 RC 的意思是 “Release Candidate” (候选发行版本), 表示新的发行版本即将产生。 在 FreeBSD 中, -PRERELEASE 通常是正式发布新的发行版之前代码冻结的同义词。 (对某些发行版而言, -BETA 标签与 -PRERELEASE 的含义相同。)

具体的回答: FreeBSD 的发行版本是从两个地方中的一个派生出来的。 主要的、 次版本号为零的版本, 例如 6.0-RELEASE 和 7.0-RELEASE, 是从通常称作 -CURRENT 的开发分支的最新版本中切分出来的。 其后的次要发行版, 例如 6.3-RELEASE 或 5.2-RELEASE, 则是其对应的活跃 -STABLE 分支上的快照。 从 4.3-RELEASE 开始, 每个发行版本也拥有了其对应的分支, 以便供需要非常保守的开发节奏的人们更新使用 (通常这些分支中只提供安全更新)。

在准备发布新的发行版时, 派生出这一发行版的分支需要进行一系列开发过程。 这一过程中的一个重要部分便是代码冻结。 一旦代码冻结开始, 便会将分支的名称改为反映其将成为新的发行版的名字。 例如, 如果某个分支过去的名字叫 6.2-STABLE, 那么在进行代码冻结的时候, 便会将其更名为 6.3-PRERELEASE, 表示正在进行发行版发布之前的测试。 这个过程中, 对问题的修正仍能提交并成为最终发行版本的一部分。 当源代码已经基本成形时, 对应的名字就是 6.3-RC 这样的形式, 表示正式的发行版即将从这个分支发布。 一旦进入 RC 阶段, 就只有新发现的最严重的 bug 才会被修正了。 一旦发行版本 (这个例子中是 6.3-RELEASE) 和发行版分支均完成之后, 前述分支便会更名为 6.3-STABLE。

如欲了解关于版本号, 以及 CVS 分支的细节, 请参见 发布工程

10.22. 在尝试安装内核的时候, chflags(1) 失败了。 我应该怎么做?

简短的回答: 您的安全级别可能设置成了大于 0 的数字。 重启并进入单用户模式就可以安装内核了。

冗长的回答: FreeBSD 在安全级别高于0是不容许更改系统标志( system flags ) 。 你可以使用用下面的命令检查你的安全级别:

# sysctl kern.securelevel

安全级别是不能降低的; 您必须重新启动进入单用户模式, 或修改 /etc/rc.conf 中的设置并重启系统才能安装内核。 请参阅联机手册 init(8)securelevel 更进一步的介绍、 /etc/defaults/rc.conf 以及联机手册 rc.conf(5) 以了解关于配置 rc.conf 更进一步的信息。

10.23. 我不能更改我系统的时间. 我应该怎么做?

简短的回答: 您的安全级别可能设置成了大于 0 的数字。 重启并进入单用户模式就可以修改系统日期了。

冗长的回答: FreeBSD 在安全级别高于0是不容许更改系统时间的 。 你可以使用用下面的命令检查你的安全级别:

# sysctl kern.securelevel

安全级别是不能降低的; 您必须重新启动进入单用户模式, 或修改 /etc/rc.conf 中的设置并重启系统才能安装内核。 请参阅联机手册 init(8)securelevel 更进一步的介绍、 /etc/defaults/rc.conf 以及联机手册 rc.conf(5) 以了解关于配置 rc.conf 更进一步的信息。

10.24. 为什么 rpc.statd 会使用 256 MB 的内存?

不, 这不是内存泄露, 并且它也没有真的用到 256 MB 内存。 为了方便, rpc.statd 会将可怕的数量的内存映射到其地址空间。 从技术角度说, 这样作并没什么错; 它只是影响了类似 top(1)ps(1) 这样程序的显示输出。

rpc.statd(8) 会将其状态文件 (位于 /var) 映射到其地址空间; 为了避免在需求增长时重新进行映射, 它会使用一个较大的尺寸。 您可以从源代码中发现这一点, 传给 mmap(2) 的长度参数是 0x10000000, 也就是 IA32 地址空间的十六分之一, 或 256 MB。

10.25. 为什么我不能取消文件的 schg 标志?

当你运行在较高的安全级别(也就是高于0) 。 降低安全级别试试。 要得到更多的 信息,查看 the FAQ entry on securelevelinit(8) 手册 .

10.26. 为什么新版本的 FreeBSD 中 SSH 默认不能通过 .shosts 来进行验证了?

在较新版本的 FreeBSD 中默认 .shosts 不再能够使用的原因是 ssh(1) 不再以 suid root 来安装了。 如果希望 “修正” 这个问题, 您需要做下列几种操作之一:

  • 永久性修正, 方法是在 /etc/make.conf 中将 ENABLE_SUID_SSH 设为 true 并重新联编和安装 ssh(1) (也可以执行 make world)。

  • 临时性修正, 方法是以 root 执行 chmod 4555 /usr/bin/ssh 来将 /usr/bin/ssh 的属性模式改为 4555。 接下来, 您还应在 /etc/make.conf 中加入 ENABLE_SUID_SSH= true 以便让下次执行 make world 时自动完成这些操作。

10.27. vnlru 是什么?

vnlru 释放 vnodes 当 系统达到 kern.maxvnodes 限制的时候。 内核线程通常是空闲的,只有 只有当你有很大的内存并且访问了数以万计的小文件时才被激活.

10.28. top 显示的内存类型都是什么意思?

  • Active: 最近使用的页面.

  • Inactive: 最近没有使用的页面.

  • Cache: (大部分通常) 从inactive 到自己要求更改他们自己的数据, 然而经常立刻 就被重用 (或者是他们的就的关联, 或者使用一个新的关联 .) 如果页面被清理(未更改), 可能立刻从 active 改变到 cache 状态 ,若非更改大概只是一种策略,依赖于VM系统维护人员的算法选择.

  • Free: 没有数据内容的页面 , 在cache页面不合格的情况下可以被立即使用. Free 页面在中断或进程状态下可以使用.

  • Wired: 内存中固定的页面 ,经常是为了内核的目的,偶尔 在进程中为了特定的使用.

  • 页面处于非活跃 (inactive) 状态时, 通常会回写至磁盘 (相当于 VM 同步), 但活跃 (active) 的页面有时也会被同步。 这取决于 CPU 是否有能力追踪修改位, 因为有些时候将 VM 页面成批回写而无论它们是或否是活跃状态是有好处的。 多数情况下, 可以将非活跃页面队列理解为近期使用较少的页面, 它们有可能会进行回写, 也可能不进行回写。 缓存 (cached) 页面是已经同步、 但已经不再有映射关系的页面, 这些页面可以在进程需要时立即以之前, 或新的关联方式使用。 空闲 (free) 页面在中断一级可以使用, 而缓存和空闲页在进程状态下都可以随时重新使用。 中断模式下, 由于缓存页没有进行充分的上锁, 因而无法直接加以利用。

    一些其他的标志 (例如, 忙标志或忙计数) 可能会改变前面所说的一些规则。

10.29. 还有多少空闲的内存?

有几个种类的 “空闲 内存”. 一类是不需要换出任何页面的立即可用的内存总量. 这个大约是 cache 队列的大小 + free 队列的大小 (含有一个降阶因子,这依赖于系统调整 .) 另外一类 “空闲内存” 是 VM 空间的总量。 这个 复杂些,但它依赖于交换空间的大小和内存 。 其他类型的 “ 空闲内存 ” 描述也是可能的, 但是定义这些基本没有用 ,除了对确定页面调度率保持很低和确保不用完交换分区很重要外.

10.30. /var/empty 是什么? 我不能删除他 !

/var/empty 是一个 sshd(8) 程序在进行特权分离时使用的目录. /var/empty 目录是空的,拥有者是 root ,还被设置了 schg 标志 .

虽然不建议删除这个目录 ,但如果需要,你要先除去 schg 标志 。查看 chflags(1) 手册,关于它更多的信息 ( 并且记住答案 the question on unsetting the schg flag).

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.