第 11 章特别的系统功能组件

目录

11.1. 特殊软件包的相关信息
11.2. 虚拟控制台
11.3. 键盘映射
11.4. 语言和国家/地区特定的设置

摘要

本章首先提供有关各种软件包、虚拟控制台和键盘布局的信息。讨论诸如 bashcronlogrotate 等软件组件,因为在最后的发行周期中已对这些组件进行了更改或增强。即使这些组件很小或者被认为不太重要,但是用户可能希望更改它们的默认行为,因为这些组件通常是与系统紧密结合的。本章的最后是有关语言和国家/地区特定设置(I18N 和 L10N)的内容。

11.1. 特殊软件包的相关信息

程序 bashcronlogrotatelocateulimitfree 对于系统管理员和许多用户是非常重要的。手册页和信息页是命令相关信息的两个有用来源,但是它们并不是始终可用的。GNU Emacs 是一种流行的并且非常容易配置的文本编辑器。

11.1.1. bash 包和 /etc/profile

Bash 是默认的系统外壳。在用作登录外壳时,它将读取几个初始化文件。Bash 按照这些文件在列表中出现的顺序处理它们:

  1. /etc/profile

  2. ~/.profile

  3. /etc/bash.bashrc

  4. ~/.bashrc

~/.profile~/.bashrc 中进行自定义设置。要确保正确处理这些文件,需要将基本设置从 /etc/skel/.profile/etc/skel/.bashrc 复制到用户的主目录中。建议在更新后从 /etc/skel 复制这些设置。执行以下外壳命令可防止个人调整的损失:

mv ~/.bashrc ~/.bashrc.old
cp /etc/skel/.bashrc ~/.bashrc
mv ~/.profile ~/.profile.old
cp /etc/skel/.profile ~/.profile

然后从 *.old 文件将个人调整复制过来。

11.1.2. cron 包

如果要在预定义的时间在后台定期自动运行命令,请使用 cron 工具。cron 是由特殊格式的时间表驱动的。这些表有一部分是系统附带的,但如有需要,用户可以自行编写表。

cron 表位于 /var/spool/cron/tabs 中。/etc/crontab 用作系统范围的 cron 表。输入在时间表之后且在此命令之前运行此命令的用户名。在例 11.1 “/etc/crontab 中的项” 中,输入的是 root。位于 /etc/cron.d 中的包特定的表具有相同的格式。请参见 cron 手册页 (man cron)。

例 11.1. /etc/crontab 中的项

1-59/5 * * * *   root   test -x /usr/sbin/atrun && /usr/sbin/atrun

不能通过调用命令 crontab -e 来编辑 /etc/crontab。必须直接将此文件装载到编辑器中,然后对其进行修改并保存。

许多包将外壳脚本安装到目录 /etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly,它们的执行是由 /usr/lib/cron/run-crons 控制的。/usr/lib/cron/run-crons 每隔 15 分钟在主表 (/etc/crontab) 中运行一次。这样可以确保在适当的时间运行可能被忽略的进程。

要运行 hourlydaily 或在自定义时间运行其他周期性维护脚本,请删除通常使用 /etc/crontab 项的时戳文件(请参见例 11.2 “/etc/crontab:删除时戳文件”,它删除了每个整点之前的 hourly 和每天凌晨 2:14 的 daily 等)。

例 11.2. /etc/crontab:删除时戳文件

59 *  * * *     root  rm -f /var/spool/cron/lastrun/cron.hourly
14 2  * * *     root  rm -f /var/spool/cron/lastrun/cron.daily
29 2  * * 6     root  rm -f /var/spool/cron/lastrun/cron.weekly
44 2  1 * *     root  rm -f /var/spool/cron/lastrun/cron.monthly

或者,在 /etc/sysconfig/cron 中将 DAILY_TIME设置为应启动 cron.daily 的时间。MAX_NOT_RUN 的设置确保日常任务被触发运行,即使用户在很长时间里没有在指定的 DAILY_TIME 打开计算机。MAX_NOT_RUN 的最大值为 14 天。

为了清楚起见,将日常系统维护任务分布在多个脚本中。这些脚本包含在包 aaa_base 中。例如,/etc/cron.daily 包含组件 suse.de-backup-rpmdbsuse.de-clean-tmpsuse.de-cron-local

11.1.3. 日志文件:包 logrotate

有许多系统服务(守护程序)以及内核本身定期将系统状态和特定事件记录到日志文件中。这样,管理员可以定期检查系统在某一时刻的状态,识别错误或故障功能,并精确诊断它们。这些日志文件通常储存在 FHS 指定的 /var/log 中,文件大小每天都会增长。logrotate 包可以帮助控制这些文件的增长。

用文件 /etc/logrotate.conf 配置 logrotate。特别地,include 规范主要配置了其他要读取的文件。在 /etc/logrotate.d 中产生日志文件、安装的各个配置文件的程序。例如,这些文件附于包 apache2 (/etc/logrotate.d/apache2) 和 syslogd (/etc/logrotate.d/syslog) 中。

例 11.3. /etc/logrotate.conf 的示例

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp - we'll rotate them here
#/var/log/wtmp {
#    monthly
#    create 0664 root utmp
#    rotate 1
#}

# system-specific logs may be also be configured here.

通过 cron 控制 logrotate,并通过 /etc/cron.daily/logrotate 每天对其进行调用。

[Important]

使用 create 选项可以读取管理员在 /etc/permissions* 中进行的所有设置。确保没有因个人修改而引起的冲突。

11.1.4. locate 命令

locate 是一个用于查找文件的命令,它不包括在已安装软件的标准范围内。如果需要,请安装包 findutils-locate。updatedb 进程将在每天晚上或引导系统约 15 分钟后自动启动。

11.1.5. ulimit 命令

使用 ulimit用户限制)命令可以为系统资源的使用设置限制并使其显示出来。ulimit 对于限制应用程序的可用内存尤其有用。设置可用内存限制后,可以防止应用程序占用过多系统资源,而导致操作系统变慢甚至挂起。

可以对 ulimit 使用多个选项。要限制使用内存,请使用表 11.1 “ulimit:为用户设置资源” 中列出的选项。

表 11.1. ulimit:为用户设置资源

-m

最大驻留集大小

-v

壳层可用虚拟内存的最大量

-s

堆栈的最大大小

-c

创建的核心文件的最大大小

-a

所有当前限制均已报告


可以在 /etc/profile 中创建系统范围的项。在这里可以创建核心文件(编程人员调试时需要使用)。普通用户不能增加系统管理员在 /etc/profile 中指定的值,但可以在 ~/.bashrc 中进行特殊输入。

例 11.4. ulimit:~/.bashrc 中的设置

# Limits maximum resident set size (physical memory):
ulimit -m 98304
 
# Limits of virtual memory:
ulimit -v 98304

必须以 KB 为单位指定内存分配。有关详细信息,请参见 man bash

[Important]

并非所有外壳都支持 ulimit 指令。如果您依赖于这些限制的内含设置,则 PAM(例如 pam_limits)提供了全面的调整功能。

11.1.6. free 命令

free 命令显示系统中的可用内存总量、已用物理内存和交换空间,以及内核占用的缓冲区和缓存。可用 RAM 的概念可追溯到统一内存管理之前。可用内存不是好的内存这种说法非常适用于 Linux。 因此,Linux 一直在平衡缓存方面下功夫,不允许实际上存在可用或未使用的内存。

内核基本上不直接管理任何应用程序或用户数据。而是在一个页缓存中管理应用程序和用户数据。如果内存不足,它的某些部分会被写入交换分区或文件中,借助于 mmap 命令,可以最先从这些交换分区或文件中读取这些部分(请参见 man mmap)。

此外,内核中还包含其他缓存,如 slab 缓存,其中储存着用于网络访问的缓存。这也许能够解释 /proc/meminfo 中计数器之间的差异。通过 /proc/slabinfo 可以访问大多数(但并非全部)上述缓存。

但是如果您的目的是找出当前所用的 RAM 量,则在 /proc/meminfo 中查找此信息。

11.1.7. 手册页和信息页

对于某些 GNU 应用程序(如 tar),已不再保留手册页。对于这些命令,可使用 --help 选项快速查看信息页,其中提供更多深入的描述。info 是 GNU 的超文本系统。通过输入 infoinfo 可以看到此系统的介绍。通过输入 emacs -f Info 可使用 Emacs 查看信息页,也可以在控制台中使用 info 直接查看信息页。还可以使用 tkinfo、xinfo 或帮助系统来查看信息页。

11.1.8. 使用 man 命令选择手册页

要阅读手册页,请输入 man 手册页。如果不同章节存在同名手册页,所有手册页都会带相应部分编号列出。选择要显示的一个手册页。如果在数秒内未输入部分编号,将显示第一个手册页。

如果要将此更改为默认系统行为,请在外壳初始化文件(如 ~/.bashrc)中设置 MAN_POSIXLY_CORRECT=1

11.1.9. GNU Emacs 的设置

GNU Emacs 是一个复杂的工作环境。下面几节介绍当启动 GNU Emacs 时处理的配置文件。有关详细信息,请参见 http://www.gnu.org/software/emacs/

启动时,Emacs 会读取包含用户、系统管理员和经销商的设置的多个文件以进行自定义或预配置。初始化文件 ~/.emacs 被安装到 /etc/skel 中各个用户的主目录中。.emacs 又会读取文件 /etc/skel/.gnu-emacs。要自定义程序,请(通过 cp /etc/skel/.gnu-emacs ~/.gnu-emacs)将 .gnu-emacs 复制到用户主目录并在那里进行所需的设置。

.gnu-emacs 将文件 ~/.gnu-emacs-custom 定义为 custom-file。如果用户通过 Emacs 中的 customize 选项进行设置,则这些设置将保存到 ~/.gnu-emacs-custom 中。

通过 SUSE Linux Enterprise Desktop,emacs 包将文件 site-start.el 安装在目录 /usr/share/emacs/site-lisp 中。文件 site-start.el 在初始化文件 ~/.emacs 之前进行装载。除其他作用之外,site-start.el 确保自动装载通过 Emacs 扩充包分发的特殊配置文件(例如 psgml)。此类型的配置文件也位于 /usr/share/emacs/site-lisp 中,总是以 suse-start- 开头。本地系统管理员可以在 default.el 中指定整个系统范围的设置。

初始化文件下的 EMACS 信息文件中提供了有关这些文件的详细信息:info:/emacs/InitFile 此位置还提供了有关如何禁止装载这些文件(如果需要)的信息。

Emacs 的部件被分成多个包:

  • 基础包 emacs

  • emacs-x11(通常已安装):支持 X11 的程序。

  • emacs-nox不支持 X11 的程序。

  • emacs-info:info 格式的联机文档。

  • emacs-el:Emacs Lisp 中未编译的库文件。运行时不需要这些库文件。

  • 如果需要,可安装众多外接式附件包:emacs-auctex (LaTeX)、psgml(SGML 和 XML)、gnuserv(客户端和服务器操作)等。

11.2. 虚拟控制台

Linux 是一个多用户和多任务的系统。即使是在独立计算机系统上也可以感受到这些功能的好处。在文本方式下,提供了 6 个虚拟控制台。可以使用 Alt+F1Alt+F6 在这些控制台间切换。第 7 个控制台是为 X 保留的,而第 10 个控制台显示内核消息。可以通过修改文件 /etc/inittab 指定更多的控制台或减少控制台。

要从 x 切换到控制台而不将其关闭,请使用 Ctrl+Alt+F1Ctrl+Alt+F6。要返回到 X,请按 Alt+F7

11.3. 键盘映射

为了标准化程序的键盘映射,对以下文件进行了更改:

/etc/inputrc
/etc/X11/Xmodmap
/etc/skel/.emacs
/etc/skel/.gnu-emacs
/etc/skel/.vimrc
/etc/csh.cshrc
/etc/termcap
/usr/share/terminfo/x/xterm
/usr/share/X11/app-defaults/XTerm
/usr/share/emacs/VERSION/site-lisp/term/*.el

这些更改只影响使用 terminfo 项的应用程序或其配置文件被直接更改(viless 等)的应用程序。不是系统附带的应用程序应该根据这些默认设置进行调整。

在 X 下,可以如 /etc/X11/Xmodmap 中所说明的启用 Compose 键(多键)。

可以通过“X 键盘扩展”(XKB) 进行进一步的设置。桌面环境 GNOME (gswitchit) 和 KDE (kxkb) 也使用此扩展。

[Tip]更多信息

有关 XKB 的信息可以在 /usr/share/doc/packages/xkeyboard-configxkeyboard-config 包的一部分)所列的文档中找到。

11.4. 语言和国家/地区特定的设置

该系统在很大程度上实现了国际化,可修改以满足本地需要。国际化 (I18N) 允许特定的本地化 (L10N)。I18N 和 L10N 这两个缩写词使用原单词的第一个和最后一个字母,中间的数字表示省略的字母数。

设置是通过文件 /etc/sysconfig/language 中定义的 LC_ 变量进行的。这不仅指本地语言支持,还指消息(语言)、字符集排序顺序时间和日期数字货币等类别。这些类别中的每一种都可以使用其自己的变量直接定义或使用文件 language 中的主变量间接定义(请参见手册页 man locale)。

RC_LC_MESSAGESRC_LC_CTYPERC_LC_COLLATERC_LC_TIMERC_LC_NUMERICRC_LC_MONETARY

这些变量以不带 RC_ 前缀的形式传递到外壳,它们代表所列出的类别。下面列出了相关外壳配置文件。可以使用命令 locale 显示当前设置。

RC_LC_ALL

此变量(如果设置)将覆盖上述变量的值。

RC_LANG

如果未设置上述的任何变量,则这是后备变量。默认情况下,只设置 RC_LANG 。这便于用户输入他们自己的值。

ROOT_USES_LANG

yes no 变量。如果将其设置为 no,则 root 用户始终在 POSIX 环境中工作。

这些变量可通过 YaST sysconfig 编辑器进行设置(请参见第 9.3.1 节 “使用 YaST Sysconfig 编辑器更改系统配置”)。此类变量的值包含语言代码、国家/地区代码、编码和修饰符。各部分之间通过特殊字符连接:

  LANG=<language>[[_<COUNTRY>].<Encoding>[@<Modifier>]]

11.4.1. 一些示例

语言和国家/地区代码始终应该一起设置。语言设置遵循 ISO  639 标准(可从 http://www.evertype.com/standards/iso639/iso639-en.htmlhttp://www.loc.gov/standards/iso639-2/ 上获取)。国家/地区代码在 ISO 3166(可从 http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/en_listp1.html 上获取)中列出。

只有设置可以在 /usr/lib/locale 中找到其可用描述文件的值才有意义。可以使用命令 localedef 基于 /usr/share/i18n 中的文件创建更多描述文件;描述文件是 glibc-i18ndata 包的一部分。可以使用以下命令创建 en_US.UTF-8(用于英国英语和美国英语)的描述文件:

localedef -i en_US -f UTF-8 en_US.UTF-8
LANG=en_US.UTF-8

如果在安装过程中选择的是美国英语,则这是默认设置。如果选择了其他语言,则将支持该语言,但仍使用 UTF-8 作为字符编码。

LANG=en_US.ISO-8859-1

这会将语言设置为英语,将国家/地区设置为美国,将字符集设置为 ISO-8859-1。此字符集不支持欧元符号,但它有时可用于尚未进行更新以支持 UTF-8 的程序。随后,Emacs 等程序将对定义字符集的字符串(在本例中为 ISO-8859-1)进行求值。

LANG=en_IE@euro

上例将欧元符号显式包含在语言设置中。此设置现已过时,因为 UTF-8 也可涵盖欧元符号。仅当应用程序支持 ISO-8859-15 而不是 UTF-8 时,它才有用。

在以前的版本中,在对 /etc/sysconfig/language 执行任何更改后必须运行 SuSEconfig。SuSEconfig 之后将更改写入 /etc/SuSEconfig/profile/etc/SuSEconfig/csh.login。登录时,这些文件由 /etc/profile(对于 Bash)或 /etc/csh.login(对于 tcsh)读取。

在最近的版本中,/etc/SuSEconfig/profile 已替换为 /etc/profile.d/lang.sh/etc/SuSEconfig/csh.login 则替换为 /etc/profile.de/lang.csh。但如果这两个旧文件存在,登录时仍会读取它们。

进程链现在如下所示:

  • 对于 Bash:/etc/profile 读取 /etc/profile.d/lang.sh,后者则分析 /etc/sysconfig/language

  • 对于 tcsh:/etc/csh.login 在登录时读取 /etc/profile.d/lang.csh,后者则分析 /etc/sysconfig/language

这确保了在下次登录到相应外壳时 /etc/sysconfig/language 的任何更改均可用,而无需先运行 SuSEconfig。

用户可以通过相应地编译他们的 ~/.bashrc 覆盖系统默认值。例如,如果不想将整个系统范围的 en_US 用于程序消息,请包括 LC_MESSAGES=es_ES,这样消息将以西班牙语显示。

11.4.2. ~/.i18n 中的语言环境设置

如果您对系统默认的区域设置不满意,请根据 Bash 脚本编写语法更改 ~/.i18n 中的设置。~/.i18n 中的项覆盖来自 /etc/sysconfig/language 中的系统默认值。使用相同的变量名而不使用 RC_ 名称空间前缀。例如,使用 LANG 而不是 RC_LANG

LANG=cs_CZ.UTF-8
LC_COLLATE=C

11.4.3. 语言支持的设置

消息类别中的文件通常只储存在对应的语言目录(例如 en)中以保留后备。如果将 LANG 设置为 en_US 并且 /usr/share/locale/en_US/LC_MESSAGES 中的消息文件不存在,则它将使用 /usr/share/locale/en/LC_MESSAGES

还可以定义后备语言,例如,将布列塔尼语作为法语的后备语言,将加利西亚语作为葡萄牙语的后备语言。

LANGUAGE="br_FR:fr_FR"

LANGUAGE="gl_ES:es_ES:pt_PT"

如果需要,可改用挪威语变体 Nynorsk 和 Bokmal(将其他后备语言设置为 no):

LANG="nn_NO"

LANGUAGE="nn_NO:nb_NO:no"

LANG="nb_NO"

LANGUAGE="nb_NO:nn_NO:no"

请注意,在挪威语中,LC_TIME 的处理方式也有所不同。

可能会出现一个问题,那就是无法正确识别用于分隔成组数位的分隔符。如果 LANG 设置为仅两个字母的语言代码(如 de),但使用的定义文件 glibc 位于 /usr/share/lib/de_DE/LC_NUMERIC,则将出现此问题。因此必须将 LC_NUMERIC 设置为 de_DE 以使系统能够识别出分隔符定义。

11.4.4. 有关详细信息