8.9. 其他配置:时间同步、记录、共享近用…

本节列出的细目对希望精通 GNU/Linux 系统配置极有帮助。这里只列出简要的内容,详情仍需参阅文档。

8.9.1. 时区

基本 符号链接

符号链接是一种指向另个文件的指针。近用时,被指向的文件就被打开。移除链接不会删除指向的文件。同样的,没有自的授权,而是使用目标本身的授权。最后,可以用于任何类型的文件:文件夹、特殊文件 (网络插座、具名管道、设备文件等)、甚至另个符号链接。

ln -s *target* *link-name* 命令添加一个符号链接,命名为 link-name,指向 target

若目标不存在,则链接算是 “破损” 且其近用送回错误消息指示目标文件不存在。若链接指向另个链接,该链接又指向其前任链接,则该等链接的 “链” 形成 “循环”。在这种情况下,近用循环内的任一链接也会得到特定的错误 (“过多层的符号链接”);经过若干循环后核心放弃它。

初始安装时经由 tzdata 软件包配置时区。dpkg-reconfigure tzdata 命令以交互方式修改时区。其配置内容保存在 /etc/timezone 文件。在 /usr/share/zoneinfo 文件夹内映射的文件复制在 /etc/localtime 文件内;此文件包括使用日光节约时间的国家。

暂时变更时区,可使用 TZ 环境变量,它的优先次序在缺省的配置档之前:

  1. $

说明 系统时钟,硬件时钟

电脑内有两个时间来源。主板有个硬件时钟,称为 “CMOS 时钟”。这个时钟不准,近用的速度慢。操作系统核心有自己的系统时钟,以自己的方式 (可能由时间服务器协助,见 第 8.9.2 节 “时间同步”) 保持时间的正确。此系统时钟较为准确,尤其是不需经由硬件变量就能近用。然而,系统时钟只存在于内存,开机就归零,不像 CMOS 时间钟,有电池支持,不受重新开机或暂停下仍能 “存活”。因此,开机时,由 CMOS 时钟设置系统时钟,关机时更新 CMOS 时钟 (若被不当调整就能修正它)。

实务上有个问题,因为 CMOS 时钟只是个计数器,未含时区信息。有几个方式选择其解释方式:系统以世界标准时间 (UTC,旧称 GMT),或当地时间看待。虽然可以简单切换,但却颇为复杂:它的偏移值不是常数。系统无法判断偏移值的正确性,尤其在时区交接。总是在世界标准时间与时区信息之间重组本地时间,建议使用 CMOS 时间为世界标准时间。

不幸的是,窗口系统缺省的配置忽视此建议;仍以 CMOS 时钟为本地时间,启动时猜测时区的变动。只要运行单一的窗口系统,就没有问题。可是,电脑经常安装多个系统 (“双重开机” 配置或在虚拟机运行其他系统),混乱就免不了,无法决定正确的时间。必须保留窗口系统的前提下,应把 CMOS 时钟配置成 UTC (把机码 HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal 设置为 “1” 做为 DWORD),或使用 Debian 系统的 hwclock --localtime --set 设置硬件时钟并标记追踪其为本地时间 (并且在春秋两季手段检查时钟的正确性)。

8.9.2. 时间同步

时间同步,在单机时代是多余,但在网络时代却很重要。用户无权修改日期与时间,所以需要精准的时间以免混乱。尤有甚者,网络上的电脑时间同步后,有助于安排社区工作者透过网络全球串联。受到攻击时,容易依序恢复原来的运作。由多部机器收集来的统计数据,必须有同步的时间,才能发挥作用。

基本 NTP

网络时间协议 (Network Time Protocol, NTP) 可以让机器间相当精准的同步,甚至把网络延迟及其他偏移值列入考量。

互联网上很多 NTP 服务器可用,受欢迎的其工作量可能负荷过重。所以建议使用 pool.ntp.org NTP 服务器,它是一组公开的 NTP 服务器。也可使用针对特定地区的次群组服务器,如 us.pool.ntp.org 系供美国使用、ca.pool.ntp.org 供加拿大使用。

然而,管理大型网络时,还是应安装与公共服务器同步的自己 NTP 服务器。同个网络上自己的机器,就能使用内部的 NTP 服务器不必增加外部公共服务器的负担。以自己的时钟增加网络内机器的同质化,同步截取与共用资源,使用共同的网络交换时间。

8.9.2.1. 给工作站

工作经常需要重新开机 (虽然只是节省能源),开机时以 NTP 同步就够了。安装 ntpdate 软件包就可以。需要更换 NTP 服务器时,再修改 /etc/default/ntpdate 文件即可。

8.9.2.2. 供服务器

服务器很少重开机,系统时间必须绝对精准。为了永久维持时间的正确性,必须安装由 ntp 软件包提供的 NPT 服务器。缺省的配置方式系与 pool.ntp.org 同步,且回应本地网络的请求。可以编辑 /etc/ntp.conf 文件改变原来的配置,NTP 服务器依照该文件的内容而变更。若有多个服务器,最好有一个本地时间服务器与公共的服务器同步,并做为本地网络其他服务器的同步的依据。

进一步 GPS 模块与其他时间来源

如果网络对时间同步极为敏感,最好在服务器安装 GPS 模块 (which will use the time from GPS satellites) 或 DCF-77 模块 (which will sync time with the atomic clock near Frankfurt, Germany)。在这种情况下,NTP 服务器的配置就有点复杂,必须参照文档办理。

8.9.3. 轮转日志档

日志档成长的速度很快,需要典藏它。最常的做法是循环典藏:只保留最新的 X 部分。logrotate 是负责循环的程序,根据 /etc/logrotate.conf 文件内的配置,把日志档保存在 /etc/logrotate.d/ 文件夹内。管理者可以修改该等文件,修改 Debian 缺省的循环政策。logrotate(1) 手册页面描述该配置可用的选项。可以在循环的过程中,增加典藏的文件数,或把文件移至指定的文件夹而不是删除它们。也可以电子邮件方式寄到别的地方。

logrotate 程序每日运行 cron 调度的要求 (详情见 第 9.7 节 “使用 cronatd运行计划任务”)。

8.9.4. 共享管理员权限

数个管理者共同在同个服务器工作。共用同个根用户密码不是好主意,匿名引发的误用很麻烦。解决方案是使用 sudo 程序,允许用户对特定命令拥有专门的权力。在多数情况下,sudo 允许受信任的用户以根的权限运行命令。用户只需运行 sudo *command* 并以个人的密码通过认证。

安装的时候,sudo 软件包把完整的 root 权限授权给 sudo Unix 群组。管理者必须使用 visudo 命令授予其他权利,该命令允许用户修改 /etc/sudoers 配置档 (当然,必须启用 vi 编辑器,或在 EDITOR 环境变量指定的编辑器)。添加一列 *username* ALL=(ALL) ALL 就能允许该用户以 root 的授权运行命令。

还有较复杂的配置,只允许特定用户运行部分命令。详情在 sudoers(5) 手册页面。

8.9.5. 挂载点清单

基本 挂载与卸载

在 Debian 这类的 Unix-like 系统里,文件以树状的文件夹阶层组织。/ 文件夹称为 “根文件夹”;其他的文件夹都是此根文件夹的次文件夹。“挂载” 是把周边设备 (通常是磁盘) 纳入系统文件树的作业。如果以其他磁盘保存用户个人的数据,将 “挂载” 于 /home/ 文件夹。根文件系统由核心永远挂载于根;其他设备则稍后再透过启动顺序或以 mount 命令挂载进来。

Some removable devices are automatically mounted when connected, especially when using the GNOME, Plasma or other graphical desktop environments. Others have to be mounted manually by the user. Likewise, they must be unmounted (removed from the file tree). Normal users do not usually have permission to execute the mount and umount commands. The administrator can, however, authorize these operations (independently for each mount point) by including the user option in the /etc/fstab file.

The mount command can be used without arguments to list all mounted filesystems; you can execute findmnt --fstab to show only the filesystems from /etc/fstab. The following parameters are required to mount or unmount a device. For the complete list, please refer to the corresponding man pages, mount(8) and umount(8). For simple cases, the syntax is simple too: for example, to mount the /dev/sdc1 partition, which has an ext3 filesystem, into the /mnt/tmp/ directory, you would simply run mount -t ext3 /dev/sdc1 /mnt/tmp/.

/etc/fstab 文件列出所有开机自动挂载或手动挂载的移动保存设备。每个挂载点由一列文本描述,包括若干空格区隔的字段:

  • file system: this indicates where the filesystem to be mounted can be found, it can be a local device (hard drive partition, CD-ROM) or a remote filesystem (such as NFS).

    此字段通常以文件系统的 ID 取代 (可以用 blkid **`device`**) 前置及 UUID=。此种方式可以应付添加或移除磁盘设备名称的情况,或者以其他顺序侦测到的磁盘。

  • 挂载点:这是把设备、远程系统,或分区挂载于本地文件系统的位置。

  • 类型:这个字段定义挂载设备使用的文件系统。ext4ext3vfatntfsbtrfsxfs 等。

    基本 NFS,网络文件系统

    NFS 是一种 Linux 环境下的网络文件系统,把远程的文件以透明方式纳入本地的文件系统内。

    知名的文件系统清单在 mount(8) 手册页面。特殊值 swap 系供交换分区使用;特殊值 auto 告诉mount 程序自动侦测文件系统 (对读卡机与 USB 磁盘机特别有用,因为它们可能使用不同的文件系统);

  • 选项:依文件系统的不同,而有多种选项,详情见 mount 手册页面。最常用的是

    • rwro,表示该设备挂载后可以读/写,或只有读取的权限。

    • noauto 开机时关闭自动挂载。

    • nofail 允许在启动时处理设备,即使该设备不存在。确认启动时,该外置磁盘机可能未插入,因为 systemd 将确认所有挂载点在启动完成前必须自动挂载。可将此与 x-systemd.device-timeout=5s 并用,告诉 systemd 不必等 5 秒以上的时间,直接进入下个作业阶段 (见 systemd.mount(5))。

    • user 授权所有的用户均可挂载此文件系统 (若无此选项,则只有根用户才有此权限)。

    • defaults 表示缺省的选项群组为:rwsuiddevexecautonouserasync,使用了 defaults 之后,还可以用 nosuid 命令、nodev 及其他类似的命令,中止 suiddev 等作用。加入 user 选项可再启用它,因为 defaults 包括 nouser

  • dump: this field is almost always set to 0. When it is 1, it tells the dump tool that the partition contains data that is to be backed up.

  • pass: this last field indicates whether the integrity of the filesystem should be checked on boot, and in which order this check should be executed. If it is 0, no check is conducted. The root filesystem should have the value 1, while other permanent filesystems get the value 2.

例 8.5. 范例 /etc/fstab 文件

  1. # /etc/fstab: static file system information.
  2. #
  3. # <file system> <mount point> <type> <options> <dump> <pass>
  4. proc /proc proc defaults 0 0
  5. # / was on /dev/sda1 during installation
  6. UUID=c964222e-6af1-4985-be04-19d7c764d0a7 / ext3 errors=remount-ro 0 1
  7. # swap was on /dev/sda5 during installation
  8. UUID=ee880013-0f63-4251-b5c6-b771f53bd90e none swap sw 0 0
  9. /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
  10. /dev/fd0 /media/floppy auto rw,user,noauto 0 0
  11. arrakis:/shared /shared nfs defaults 0 0

此例的最后一个条目对应于网络文件系统 (NFS):/shared/ 文件夹位于 arrakis 服务器挂载于本地机器的 /shared//etc/fstab 文件格式位于 fstab(5) 手册页面。

下一步 自动挂载

systemd is able to manage automount points: those are filesystems that are mounted on-demand when a user attempts to access their target mount points. It can also unmount these filesystems when no process is accessing them any longer.

Like most concepts in systemd, automount points are managed with dedicated units (using the .automount suffix). See systemd.automount(5) for their precise syntax.

Other auto-mounting utilities exist, such as automount in the autofs package or amd in the am-utils.

Note also that GNOME, Plasma, and other graphical desktop environments work together with udisks, and can automatically mount removable media when they are connected.

8.9.6. locate 与 updatedb

可以用 locate 命令找寻已知名称的文件。几乎即时送回结果,因为它搜索的数据库保存系统内所有文件的位置;此数据库由 updatedb 命令每日更新。locate 命令还有其他用途,Debian 选择 mlocate 做为其标准系统。

mlocate 很聪明,只送回该命令用户能够近用的文件,不会显示系统内其他符合条件的文件 (因为它以根权限运行 updatedb 命令)。为了提供额外的安全保护,管理者可以使用 PRUNEDPATHS 位于 /etc/updatedb.conf,排除已经索引的其他文件夹。