30 特殊系统功能 #
本章首先提供有关各种软件包、虚拟控制台和键盘布局的信息。我们将讨论 bash、cron 和 logrotate 等软件组件,因为它们在上一个发布周期中已进行了更改或增强。即使这些组件很小或者被认为不太重要,用户也应该更改它们的默认行为,因为这些组件往往与系统密切相关。本章的最后是有关语言和国家/地区特定设置(I18N 和 L10N)的内容。
30.1 特殊软件包的相关信息 #
后续章节提供了有关以下工具的基本信息:bash、cron、logrotate、locate、ulimit 和 free。
30.1.1 bash 软件包和 /etc/profile #
Bash 是默认的系统外壳。在用作登录外壳时,它将读取几个初始化文件。Bash 按照这些文件在列表中出现的顺序处理它们:
/etc/profile~/.profile/etc/bash.bashrc~/.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 文件复制回去。
30.1.2 cron 软件包 #
使用 cron 可在预定义的时间自动在后台运行命令。cron 使用格式经过特别设置的时间表,并且该工具随附了几个默认的时间表。用户也可以根据需要指定自定义的表。
cron 表位于 /var/spool/cron/tabs 中。/etc/crontab 作为整个系统的 cron 表。输入在时间表之后且在此命令之前运行此命令的用户名。在例 30.1 “/etc/crontab 中的项”中,输入的是 root。位于 /etc/cron.d 中的软件包特定的表具有相同的格式。请参见 cron 手册页 (man cron)。
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) 中运行一次。这样可以确保在适当的时间运行可能被忽略的进程。
要按自定义时间运行 hourly、daily 或其他定期维护脚本,请使用 /etc/crontab 项目定期去除时戳文件(请参见 例 30.2 “/etc/crontab:去除时戳文件”,它会在每个整点之前去除 hourly 时戳文件,在每天的早上 2:14 去除 daily 时戳文件,等等)。
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-rpmdb、suse.de-clean-tmp 或 suse.de-cron-local。
30.1.3 停止 Cron 状态消息 #
要避免 Cron 状态消息导致的邮件泛滥,在新安装的 /etc/sysconfig/cron 中,SEND_MAIL_ON_NO_ERROR 的默认值设为“no”。即使将此设置设为“no”,cron 数据输出仍然会发送到 MAILTO 地址,如 cron 手册页中所述。
在更新时,建议根据需要设置这些值。
30.1.4 日志文件:软件包 logrotate #
多个系统服务(守护程序)以及内核本身会定期将系统状态和特定事件记录到日志文件中。这样,管理员可以定期检查系统在某一时刻的状态,识别错误或故障功能,并精确诊断它们。这些日志文件通常存储 /var/log 中(如 FHS 所指定),文件大小每天都会增长。logrotate 软件包可以帮助控制这些文件的增长。有关详细信息,请参见第 3.3 节 “使用 logrotate 管理日志文件”。
30.1.5 locate 命令 #
locate 是一个用于查找文件的命令,它不包括在已安装软件的标准范围内。如果需要,请安装 mlocate 软件包,它是 findutils-locate 软件包的后继者。updatedb 进程将在每天晚上或引导系统约 15 分钟后自动启动。
30.1.6 ulimit 命令 #
利用 ulimit(用户限制)命令,您可以限制系统资源的使用并显示这些限制。ulimit 对于限制应用程序的可用内存尤其有用。设置可用内存限制后,可以防止应用程序占用过多系统资源,而导致操作系统变慢甚至挂起。
ulimit可以对 使用多个选项。要限制使用内存,请使用表 30.1 “ulimit:为用户设置资源” 中列出的选项。
ulimit:为用户设置资源 #|
|
最大驻留集大小 |
|
|
外壳可用虚拟内存的最大量 |
|
|
堆栈的最大大小 |
|
|
创建的核心文件的最大大小 |
|
|
所有当前限制均已报告 |
系统范围的默认项在 /etc/profile 中设置。建议不要直接编辑此文件,因为系统升级期间会覆盖所做的更改。要自定义系统范围的配置文件设置,请使用 /etc/profile.local。各用户的设置应该在 ~USER/.profile 中配置。
ulimit:~/.bashrc 中的设置 ## Limits maximum resident set size (physical memory): ulimit -m 98304 # Limits of virtual memory: ulimit -v 98304
必须以 KB 为单位指定内存分配。有关详细信息,请参见man bash。
ulimit 支持
并非所有外壳都支持 ulimit 指令。PAM(例如 pam_limits)作为 ulimit 的替代方法,提供了全面的调整功能。
30.1.7 free 命令 #
free 命令显示系统中总的可用内存、已用物理内存和交换空间,以及内核占用的缓冲区和缓存。可用 RAM 的概念可追溯到统一内存管理之前。可用内存不是好的内存这种说法非常适用于 Linux。因此,Linux 一直在平衡缓存方面下功夫,不允许有剩余或未使用的内存。
内核对任何应用程序或用户数据都没有直接的了解。而是在一个页缓存中管理应用程序和用户数据。如果内存不足,它的某些部分会被写入交换分区或文件中,这样,使用 mmap 命令便可一开始就从这些交换分区或文件中读取这些部分(请参见 man mmap)。
此外,内核中还包含其他缓存,如 slab 缓存,其中存储着用于网络访问的缓存。这也许能够解释 /proc/meminfo 中计数器之间的差异。通过 /proc/slabinfo 可以访问大多数(但并非全部)缓存。
但是如果您的目的是要确定当前所用的 RAM 量,请在 /proc/meminfo 中查找此信息。
30.1.8 手册页和信息页 #
对于某些 GNU 应用程序(如 tar),已不再保留手册页。对于这些命令,可使用 --help 选项快速查看信息页,这些页面中提供了更深入的说明。Info 是 GNU 的超文本系统。通过输入 info info 可以看到此系统的介绍。您可以输入 emacs -f info 使用 Emacs 查看信息页,也可以直接在控制台中使用 info 来查看。还可以使用 tkinfo、xinfo 或帮助系统来查看信息页。
30.1.9 使用 man 命令选择手册页 #
要阅读手册页,请输入 man
MAN_PAGE。如果不同章节存在同名手册页,所有手册页都会带相应部分编号列出。选择要显示的一个手册页。如果在数秒内未输入部分编号,将显示第一个手册页。
要将此行为更改为默认系统行为,请在外壳初始化文件(如 ~/.bashrc)中设置 MAN_POSIXLY_CORRECT=1。
30.1.10 GNU Emacs 的设置 #
GNU Emacs 是一个复杂的工作环境。下面几节介绍当启动 GNU Emacs 时处理的配置文件。有关详细信息,请参见 http://www.gnu.org/software/emacs/。
启动时,Emacs 会读取包含用户、系统管理员和经销商的设置的多个文件以进行自定义或预配置。初始化文件 ~/.emacs 会从 /etc/skel 中安装到各个用户的主目录中。而 .emacs 会读取文件 /etc/skel/.gnu-emacs。要自定义程序,请将 .gnu-emacs 复制到主目录(通过 cp
/etc/skel/.gnu-emacs ~/.gnu-emacs)并根据您的需求设置。
.gnu-emacs 会将文件 ~/.gnu-emacs-custom 定义为 custom-file。如果用户通过 Emacs 中的 customize 选项进行设置,这些设置会保存到 ~/.gnu-emacs-custom 中。
通过 SUSE Linux Enterprise Server,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(客户端和服务器操作)等。
30.2 虚拟控制台 #
Linux 是一个多用户和多任务的系统。即使是在独立计算机系统上也可以感受到这些功能的好处。在文本方式下,提供了 6 个虚拟控制台。可以使用 Alt–F1 到 Alt–F6 在这些控制台间切换。第 7 个控制台是为 X 保留的,而第 10 个控制台显示内核消息。
要从 x 切换到控制台而不将其关闭,请使用 Ctrl–Alt–F1 到 Ctrl–Alt–F6。要返回到 X,请按 Alt–F7。
30.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 项的应用程序或其配置文件被直接更改的应用程序(vi、emacs 等)。不是系统附带的应用程序应该根据这些默认设置进行调整。
在 X 下,可以按照 /etc/X11/Xmodmap 中的说明启用组合键(多键)。
可以通过“X 键盘扩展”(XKB) 进行进一步的设置。
有关 XKB 的信息,请参见 /usr/share/doc/packages/xkeyboard-config(xkeyboard-config 软件包的一部分)中所列的文档。
30.4 语言和国家/地区特定的设置 #
该系统在很大程度上实现了国际化,可修改以满足本地需要。国际化 (I18N) 允许特定的本地化 (L10N)。I18N 和 L10N 这两个缩写词使用原单词的第一个和最后一个字母,中间的数字表示省略的字母数。
通过文件 /etc/sysconfig/language 中定义的 LC_ 变量来进行这些设置。这不仅指本地语言支持,还指消息(语言)、字符集、排序顺序、时间和日期、数字和货币等类别。这些类别中的每一种都可以使用自己的变量直接定义,或使用 language 文件中的主变量间接定义(请参见 locale 手册页)。
RC_LC_MESSAGES,RC_LC_CTYPE,RC_LC_COLLATE,RC_LC_TIME,RC_LC_NUMERIC,RC_LC_MONETARY这些变量将不带
RC_前缀传递到外壳,代表所列的类别。下面列出了相关外壳配置文件。可以使用命令locale显示当前设置。RC_LC_ALL此变量(如果设置)将覆盖上述变量的值。
RC_LANG如果未设置上述的任何变量,则这是后备变量。默认只会设置
RC_LANG。这便于用户输入他们自己的值。ROOT_USES_LANG此变量可设置为
yes或ctype(默认值)。如果设置为yes,root将使用特定于语言和国家/地区的设置,否则系统管理员将始终在 POSIX 环境中操作。
这些变量可通过 YaST sysconfig 编辑器进行设置。此类变量的值包含语言代码、国家/地区代码、编码和修饰符。各个组成部分之间通过特殊字符联接:
LANG=<language>[[_<COUNTRY>].<Encoding>[@<Modifier>]]
30.4.1 系统范围的区域设置 #
systemd 会在引导初期读取 /etc/locale.conf。除非存在单独的设置,否则此文件中配置的区域设置将由每个服务或用户继承。
早期版本的 SUSE Linux Enterprise Server 会从 /etc/sysconfig/language、/etc/sysconfig/keyboard 和 /etc/sysconfig/console 读取区域设置。从 SUSE Linux Enterprise Server
15 GA 开始,这些文件被视为已过时。systemd 不再从这些文件读取设置。systemd 改为从 /etc/locale.conf 读取设置,
但仍会使用 /etc/sysconfig/language 中定义的变量。这些变量会覆盖系统范围的区域设置,并可用于定义用户外壳的不同区域设置(请参见第 30.4.2 节 “一些示例”)。
要设置系统范围的区域设置,您可以采用以下其中一种方式:
在
/etc/locale.conf中写入您的设置。每行指派一个环境类变量(有关变量列表,请参见man 5 locale.conf):LANG=de_DE.UTF-8
要微调设置,可以添加更多的变量(每行一个变量)。
使用命令
localectl:#localectlset-locale LANG=de_DE.UTF-8同样,您也可以在
localectl set-locale命令后面指定更多的变量。
在更新 systemd 软件包期间为了与旧系统保持向后兼容,上述所有变量都将从 sysconfig 迁移到其最终目标(如果尚未在这些目标中定义这些变量)。
30.4.2 一些示例 #
语言和国家/地区代码始终应该一起设置。语言设置遵循 ISO 639 标准(可从 http://www.evertype.com/standards/iso639/iso639-en.html 和 http://www.loc.gov/standards/iso639-2/ 上获取)。国家/地区代码在 ISO 3166(参见 http://en.wikipedia.org/wiki/ISO_3166)中列出。
仅当 /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 所做的更改将通过以下过程链来激活:
对于 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 所做的任何更改在下次登录到相应外壳时即会生效,而无需手动将其激活。
用户可以编辑他们的 ~/.bashrc 来覆盖系统默认值。例如,如果不想对程序消息使用系统范围的 en_US,请加入 LC_MESSAGES=es_ES,这样消息将以西班牙语显示。
30.4.3 ~/.i18n 中的区域设置 #
如果您对系统默认的区域设置不满意,请根据 Bash 脚本编写语法更改 ~/.i18n 中的设置。~/.i18n 中的项会覆盖来自 /etc/sysconfig/language 中的系统默认值。使用相同的变量名称,但不要包含 RC_ 名称空间前缀。例如,使用 LANG 而非 RC_LANG:
LANG=cs_CZ.UTF-8 LC_COLLATE=C
30.4.4 语言支持的设置 #
消息类别中的文件通常只存储在对应的语言目录(例如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 以使系统能够识别出分隔符定义。
30.4.5 更多信息 #
《GNU C 库参考手册》中的“区域设置和国际化”一章。它包含在软件包 glibc-info.
Markus Kuhn 编写的 Unix/Linux 的 UTF-8 和 Unicode 常见问题解答,当前位于 https://www.cl.cam.ac.uk/~mgk25/unicode.html。