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 天。
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 时处理的配置文件。有关详细信息,请参见 https://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 Desktop 中,emacs
软件包会在目录 /usr/share/emacs/site-lisp
中安装 site-start.el
文件。文件 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 Desktop 会从 /etc/sysconfig/language
、/etc/sysconfig/keyboard
和 /etc/sysconfig/console
读取区域设置。从 SUSE Linux Enterprise Desktop
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
:#
localectl
set-locale LANG=de_DE.UTF-8同样,您也可以在
localectl set-locale
命令后面指定更多的变量。
在更新 systemd 软件包期间为了与旧系统保持向后兼容,上述所有变量都将从 sysconfig 迁移到其最终目标(如果尚未在这些目标中定义这些变量)。
30.4.2 一些示例 #
语言和国家/地区代码始终应该一起设置。语言设置遵循 ISO 639 标准(可从 https://www.evertype.com/standards/iso639/iso639-en.html 和 https://www.loc.gov/standards/iso639-2/ 上获取)。国家/地区代码在 ISO 3166(参见 https://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。