Linux 基础学习训练教材 - CentOS 7.x

第 11 堂课:基础设置、备份、文件压缩打包与工作调度

Linux 基础网络设置、工作调度、基础的文件压缩与打包 (tar) 等等的应用!

最近更新时间: 2017/04/02

帐号与权限的部份了解告一段落之后,读者应该可以针对系统进行一些基础的设置了,包括网络、日期时间等等。 同时,最好也能理解一下系统的备份工作,同时为了减少备份的容量,理解一下文件的压缩与打包也是重要的工作。 最终,当事情通通要交给系统独自运作时,读者对于工作调度的理解也不能少。

11.1:Linux 系统基本设置

在更进一步管理系统前,先来整理一下系统的网络建置、日期与时间的修改、语系等相关的设置,让系统更符合你的操作行为与环境。

11.1.1:网络设置

网络设置是系统管理员主要负责的项目。一般来说,以服务器的角度观之,通常服务器的网络都是固定的,大多使用手动的方式来设置好网络。 如果是以桌机的角度来看,则大多使用自动取得网络参数,亦即所谓的『 dhcp 』协定来自动处理。如果是台湾地区的一般民众, 可能会有两个主要的网络参数取得方式,一个是与电话线路结合,例如中华电信的 ADSL 或者光世代的拨接方式,一种则是通过与第四台的缆线结合。

CentOS 7 以后,系统希望读者使用 Network Manager 这个服务来管理网络,同时提供一个名为 nmcli 的简易指令,搭配 bash-completion 软件,可以快速的使用 [tab] 按键配合,完成所有的任务。

  • 观察网络连接界面与网络卡

系统上的所有网络界面都可以通过 ifconfig 这个指令来观察,不过这个指令在某些系统上并不一定会提供。 因此,近来我们建议使用 ip link show 这个指令来查阅!方法如下:

[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
    mode DEFAULT qlen 1000
    link/ether 52:54:00:21:bc:9e brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    mode DEFAULT
    link/ether 52:54:00:2f:74:a6 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state 
    DOWN mode DEFAULT qlen 500
    link/ether 52:54:00:2f:74:a6 brd ff:ff:ff:ff:ff:ff

上述的 lo, eth0, virbr0, virbr0-nic 等等就是网络适配器!系统实际上就是通过这些适配器来连接到网络的。读者应该要知道, 一张适配器可以同时提供多个网络地址 (IP),而利用这些适配器来达成连接的方式就称为网络连接代号。查找网络连接代号的方式如下:

[root@localhost ~]# nmcli connection show
NAME        UUID                                  TYPE            DEVICE
virbr0-nic  94c93abe-6786-444c-9cdd-1f20961473ca  generic         virbr0-nic
virbr0      ac82c547-0c6c-464f-8e38-d4a5efa90788  bridge          virbr0
eth0        ff0b88ed-7cc6-4803-be7d-e77c74fea95b  802-3-ethernet  eth0

读者们应该要注意的是:

  • NAME:即为网络连接代号,接下来我们要处理的任务均是针对此连接代号而来。
  • UUID:Linux 的设备识别码,在系统当中几乎是独一无二的存在。
  • TYPE:网络连接的类型,包括以太网路、无线网络、桥接等等功能
  • DEVICE:即是网络适配器。

由于读者们所操作的系统是本教材提供的拷贝品,对于您的环境来说,可能有些许的差异,因此,建议你应该要删除 eth0 这个连接代号, 然后重建一次 eth0 比较妥当。删除连接与创建连接的方式如下:

[root@localhost ~]# nmcli connection delete eth0
[root@localhost ~]# nmcli connection add con-name eth0 ifname eth0 type ethernet
Connection 'eth0' (ab47810d-2aca-4956-9263-de0952b4eebc) successfully added.

[root@localhost ~]# nmcli connection show
NAME        UUID                                  TYPE            DEVICE
virbr0-nic  94c93abe-6786-444c-9cdd-1f20961473ca  generic         virbr0-nic
virbr0      ac82c547-0c6c-464f-8e38-d4a5efa90788  bridge          virbr0
eth0        ab47810d-2aca-4956-9263-de0952b4eebc  802-3-ethernet  eth0

读者会发现到 eth0 连接代号的 UUID 改变了,同时 DEVICE 会搭配到你的网络界面卡,此时系统就帮你建置好 eth0 这个连接代号。

例题:使用 man nmcli 之后,查找 connection 的关键字,找到 add 的项目,写下底下项目的意义:
  1. con-name
  2. ifname
  3. type
  • 观察网络连接代号的详细设置

详细的网络连接代号内容的观察,可以这样做:

[root@localhost ~]# nmcli connection show eth0
connection.id:                          eth0
connection.uuid:                        ab47810d-2aca-4956-9263-de0952b4eebc
connection.interface-name:              eth0
connection.type:                        802-3-ethernet
connection.autoconnect:                 yes
.......
ipv4.method:                            auto
ipv4.dns:
ipv4.dns-search:
ipv4.addresses:
ipv4.gateway:                           --
ipv4.routes:
.......
ipv6.method:                            auto
ipv6.dns:
ipv6.dns-search:
ipv6.addresses:
ipv6.gateway:                           --
.......
IP4.ADDRESS[1]:                         172.16.0.83/16
IP4.GATEWAY:                            172.16.200.254
IP4.DNS[1]:                             172.16.200.254
IP4.DOMAIN[1]:                          gocloud.vm
DHCP4.OPTION[1]:                        requested_domain_search = 1
DHCP4.OPTION[2]:                        requested_nis_domain = 1
DHCP4.OPTION[3]:                        requested_time_offset = 1
.......
IP6.ADDRESS[1]:                         fe80::5054:ff:fe21:bc9e/64
IP6.GATEWAY:

一般来说,输出的信息有小写字符与大写字符,小写字符大多为『设置值』,大写字符大多为『现在运作中的状态数据』。 上表仅列出较为重要的信息,包括有:

  • connection.autoconnect [yes|no] :是否于开机时启动这个连接,缺省通常是 yes
  • ipv4.method [auto|manual] :自动还是手动设置网络参数
  • ipv4.dns [dns_server_ip] :填写 DNS 服务器的 IP 地址
  • ipv4.addresses [IP/Netmask] :IP 与 netmask 的集合,中间用斜线 / 来隔开
  • ipv4.gateway [gw_ip] : gateway 的 IP 地址!

至于大写字符里头,比较常见的重要项目:

  • IP4.ADDRESS[1]: 目前运作中的 IPv4 的 IP 地址参数
  • IP4.GATEWAY: 目前运作中的 IPv4 的通信闸
  • IP4.DNS[1]: 目前运作中的 DNS 服务器 IP 地址
  • DHCP4.OPTION[XX]: 由 DHCP 服务器所提供的相关参数

基本上,如果看到 DHCP4.OPTION 之类的字样,代表这个网络连接代号主要是通过『自动取得 IP 』的方式来处理的。

  • 自动取得 IP 参数的设置

所谓的自动取得 IP 参数,代表使用 DHCP 服务器来管理网络参数的给予,因此读者的环境中应该具有 IP 分享器或其他提供 DHCP 功能的设备。 由于所有的设置均来自于 DHCP 服务,因此读者仅须提供 ipv4.method 为自动 (auto) 即可。

[root@localhost ~]# nmcli connection modify eth0 ipv4.method auto
[root@localhost ~]# nmcli connection up eth0
Connection successfully activated (D-Bus active path: 
/org/freedesktop/NetworkManager/ActiveConnection/4)

上表『 nmcli connection up eth0 』代表使用设置值来重新启动这个网络连接代号之意。

  • 手动设置 IP 参数

网络环境的设置主要由 ISP 来提供,假设你的系统所在的 ISP 告知你的网络设置如下:

  • IP/Netmask: 172.16.50.1/16
  • Gateway: 172.16.200.254
  • DNS: 172.16.200.254

读者可以通过底下的方式来处理手动设置 IP 的方式:

[root@localhost ~]# nmcli connection modify eth0  \
> connection.autoconnect yes \
> ipv4.method manual \
> ipv4.addresses 172.16.50.1/16 \
> ipv4.gateway 172.16.200.254 \
> ipv4.dns 172.16.200.254

[root@localhost ~]# nmcli connection show eth0
.......
ipv4.method:                            manual
ipv4.dns:                               172.16.200.254
ipv4.dns-search:
ipv4.addresses:                         172.16.50.1/16
ipv4.gateway:                           172.16.200.254
.......
[root@localhost ~]# nmcli connection up eth0

确认启动网络之后,观察一下最下方的大写字样的数据,是否正确显示出跟你设置值相同的信息?

[root@localhost ~]# nmcli connection show eth0
.......
IP4.ADDRESS[1]:                         172.16.50.1/16
IP4.GATEWAY:                            172.16.200.254
IP4.DNS[1]:                             172.16.200.254
IP6.ADDRESS[1]:                         fe80::5054:ff:fe21:bc9e/64
IP6.GATEWAY:
  • 主机名称设置

一般连接到 Internet 的服务器应该都有一个主机名称,主机名称的观察方式可以直接使用 hostname 来观察, 如果是设置,则需要编写 /etc/hostname 这个文件。但如果手动编辑设置档,通常都需要通过重新开机 (reboot) 来让主机名称生效。 为了解决这个 reboot 的问题, centos 提供了名为 hostnamectl 的指令来管理,假设主机名称为 www.centos 时,可以这样设置:

[root@localhost ~]# hostnamectl set-hostname www.centos
[root@localhost ~]# hostnamectl
   Static hostname: www.centos
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 741c73b552ed495d92a024bc7a9768cc
           Boot ID: 2b1132689ed24361b2dec52309174403
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-327.el7.x86_64
      Architecture: x86-64

这样立刻设置好主机名称,且可以不用重新开机。

例题:
  1. 请依据底下提供的数据来设置好你的网络参数 (应该依据您的教师提供的数据为主):
    1. IP/netmask: 172.16.60.XX/16 (XX 为你的学号尾数,以全班不重复为主)
    2. gateway: 172.16.200.254
    3. DNS: 168.95.1.1 (此为中华电信惯用的 DNS 服务器,因此你的环境中须有 Internet)
    4. Hostname: stationXX.centos (XX为你的学号尾数)
  2. 检查网络参数与网络状态的方式:
    1. 通过 nmcli connection show 可以查找到哪些重要的参数?
    2. (1)如何通过 ping 这个指令来检查你的服务器与路由器之间的连接情况?同时,(2)回传的消息中,出现什么关键字才是顺利的连接成功? (3)出现的消息中,time 的单位与意义为何?
    3. 通过 dig www.google.com 来检查 DNS 是否顺利运作中: (1)有哪几个 section 需要注意? (2)出现哪一个 section 才算正确的查找到 IP? (3)哪个项目可以看出查找的 server IP 地址为何?
    4. 哪个指令可以查看目前本主机的主机名称

11.1.2:日期与时间设置

地球上每个地区都有专属于自己的时区,因此当你带着 notebook 到不同时区的地点时,可能得要修订自己的电脑时间才行。 修订的方式可以使用 CentOS7 提供的 timedatectl 指令。

[root@localhost ~]# timedatectl
      Local time: Tue 2016-05-10 19:25:38 CST
  Universal time: Tue 2016-05-10 11:25:38 UTC
        RTC time: Tue 2016-05-10 11:25:52
       Time zone: Asia/Taipei (CST, +0800)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

例题:
查找自己系统目前的正确时间,然后通过 timedatectl 指令来设置好目前的时间。

除了自行设置之外,读者亦可通过网络来进行时间的校正。以昆山科大来说,昆山科大提供了 ntp.ksu.edu.tw 这个 NTP 服务器, 因此网络校时可以简单的进行:

[root@localhost ~]# ntpdate ntp.ksu.edu.tw
10 May 11:28:30 ntpdate[18839]: step time server 120.114.100.1 offset -28784.726606 sec
[root@localhost ~]# hwclock -w

如上表所示,某些特殊的环境下,台湾的时间会快了 8 小时,这是因为虚拟机使用了格林威治时间所致。校正后系统即可正确设置。

  • 通过持续网络校时功能 (用户端功能)

读者应该会发现到现今的操作系统大多可以保持正确的时间,再也无须进行手动校时。CentOS 7 提供两个机制来协助网络校时, 一个是通过 chronyd 服务,一个则是通过 ntpd。CentOS 7 缺省使用 chronyd 这个服务。若以昆山科大为例,昆山科大提供 ntp.ksu.edu.tw 这个时间服务器,若以此时间服务器为主要的更新时间来源,可以这样做:

[root@localhost ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst    <==将缺省的服务器注解
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp.ksu.edu.tw iburst      <==加入所需要的服务器
.....

[root@localhost ~]# systemctl enable  chronyd
[root@localhost ~]# systemctl restart chronyd
[root@localhost ~]# systemctl status  chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
   Active: active (running) since 一 2017-04-03 02:26:43 EDT; 4s ago
  Process: 2086 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 2082 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2084 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─2084 /usr/sbin/chronyd

 4月 03 02:26:43 localhost systemd[1]: Starting NTP client/server...
 4月 03 02:26:43 localhost chronyd[2084]: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC...
 4月 03 02:26:43 localhost chronyd[2084]: Generated key 1
 4月 03 02:26:43 localhost systemd[1]: Started NTP client/server.
 4月 03 02:26:47 localhost chronyd[2084]: Selected source 120.114.100.1
 4月 03 02:26:47 localhost chronyd[2084]: System clock wrong by 2.322333 seconds, adjustment started
Hint: Some lines were ellipsized, use -l to show in full.

若有需要了解到目前的 NTP 时间状况,可以使用追踪 (tracking) 来处理看看:

[root@localhost ~]# chronyc tracking
Reference ID    : 120.114.100.1 (ntp.ksu.edu.tw)
Stratum         : 4
Ref time (UTC)  : Mon Apr  3 06:38:52 2017
System time     : 0.000042931 seconds slow of NTP time
Last offset     : -0.000060345 seconds
RMS offset      : 0.000033498 seconds
Frequency       : 19.614 ppm slow
Residual freq   : -0.102 ppm
Skew            : 0.959 ppm
Root delay      : 0.008587 seconds
Root dispersion : 0.054062 seconds
Update interval : 64.2 seconds
Leap status     : Normal

如此一来,如果有网络,则此 Linux 系统就能够持续的更新时间了。

11.1.3:语系设置

登录系统时,取得 bash 之后,会有缺省的语系数据,缺省读者的环境应该是 zh_TW.utf8 这个语系。但是图形界面登录处缺省为英文语系, 那个环境即为『系统语系』的相关设置。读者可以使用 locale 来查阅目前的语系,而使用 localectl 来查阅系统的缺省语系。

[root@localhost ~]# localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us,cn
     X11 Variant: ,
     X11 Options: grp:ctrl_shift_toggle

若想要让图形界面的画面以台湾中文为主,可以使用如下的方式来处置:

[root@localhost ~]# localectl set-locale LANG=zh_TW.utf8
[root@localhost ~]# systemctl isolate multi-user.target
[root@localhost ~]# systemctl isolate graphical.target

11.1.4:简易防火墙管理

若要作为服务器,那么 Linux 的防火墙管理就显的重要了。CentOS 7 提供一个名为 firewalld 的防火墙服务, 这个防火墙主要通过 firewall-cmd 指令管理,而防火墙的运行分为两种方式:

  • 目前进行中 (acitve) 的环境
  • 永久记录 (permanent) 的设置数据

此外,为了方便管理,防火墙将许多不同的应用定义了多种的领域 (zone),不过,在这里我们只需要知道公开的领域 (public) 即可。

[root@localhost ~]# firewall-cmd --get-default-zone
public

[root@localhost ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

上面表格显示缺省的防火墙使用 public 这个领域的规则设置,而 public 领域内的数据中,主要应用了:

  • 『interfaces: eth0』:主要管理的界面为 eth0 这个适配器
  • 『services: dhcpv6-client ssh』可以通过防火墙进出系统的服务有 dhcp 用户端以及 ssh 这两个服务
  • 『masquerade: no』没有启动 IP 伪装功能

未来如果读者的服务器要加上 httpd 这个 WWW 网页服务器服务的话,就以如下的方式来加入:

[root@localhost ~]# firewall-cmd --add-service=http
success

[root@localhost ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

但是上述指令仅能在这次开机阶段运行,重新开机后,或者是重新加载 firewalld 之后,这条规则就被注销了。因此, 确认规则是正常的之后,应该使用如下的方式增加到设置档当中才对:

[root@localhost ~]# firewall-cmd --add-service=http --permanent
success

[root@localhost ~]# firewall-cmd --list-all --permanent

请自行确认输出的结果含有 http 才行。

例题:请依据底下的方式处理好你的防火墙
  1. 先使用 --get-services 查找 firewall-cmd 所认识的所有的服务有哪些
  2. 删除原有放行的服务,仅剩下放行 http, https, ftp, tftp 等服务到目前的防火墙规则中
  3. 先查找 man firewalld.richlanguage 相关的规则与 example
  4. 只要来自 172.16.100.254 的要求,均予以放行
  5. 只要来自 172.16.0.0/16 的 ssh 连接要求,均予以放行
  6. 将上述结果写入永久设置档中

11.2:文件的压缩与打包

许多时刻读者应该会进行文件系统的压缩与打包,让系统的备份数据或者是减少数据的使用空间。同时,程序员在网络提供数据时, 为了降低带宽使用率,更好的压缩比会是数据压缩的考量选项之一。

11.2.1:文件的压缩指令

在 Linux 环境下,常见的压缩指令有:gzip, bzip2, xz 三种,这三个指令主要的目的为压缩单一文件而已。但缺省的情况下, 被压缩的文件会遗失而仅存在被压缩完成之后的压缩档,除非使用 -c 的选项搭配数据流重导向,方可源文件案与压缩文件同时存在。

例题:测试不同压缩指令的压缩比
  1. 前往 /dev/shm 创建 zip 目录,并成为工作目录
  2. 找出 /etc 底下最大容量的文件 (使用 ll --help 找出相对应的选项),并将该文件拷贝到工作目录下
  3. 将工作目录下的文件拷贝成为 filename.1, filename.2, filename.3 三个文件
  4. 分别使用 time 测试 gzip 压缩 filename.1, bzip2 压缩 filename.2, xz 压缩 filename.3 的时间
  5. 观察一下哪个压缩指令所花费的时间最长,哪个指令的压缩比最佳。
  6. 最终再以 time 搭配 gzip, bzip2, xz 将刚刚的压缩档解开,并查阅哪个指令花费的时间最长
  7. 以 gzip 为例,找出 gzip 的 -c 选项,当 gzip 压缩 filename.1 时,同时保留原文件与创建压缩档

11.2.2:文件的打包指令, tar

因为 gzip, bzip2, xz 主要是针对单一文件来进行压缩,对于类似 windows 提供的 winRAR, zip, 7-zip 等可以将多数文件打包成为一个文件的用法来说, 这些压缩指令是无法达到的。不过,Linux 环境底下有提供名为 tar 的打包指令,这个指令也可以使用 gzip, bzip2, xz 的函数来打包并压缩, 读者可以将 tar 想成 7-zip 就是了。

tar 的基本语法有点像这样:

[root@localhost ~]# tar [-z|j|J] -c|-t|-x [-v] [-f tar 支持的文件名] [filename...]

使用 tar 后续接的选项,你可以这样思考:

  • [-z|j|J] :是否需要压缩支持,三个选项分别是 gzip, bzip2, xz 的支持
  • -c|-t|-x :实际进行的任务,三个选项分别是打包、查阅数据、解打包
  • -v :是否要查阅指令运行过程
  • [-f tar 支持的文件名] :使用 -f 来处理 tar 的文件

我们很常进行将 /etc/ 完整备份的任务,假设我们要将 /etc 使用最大压缩比的 xz 压缩备份,可以这样做:

[root@localhost ~]# cd /dev/shm/zip
[root@localhost zip]# tar -Jcv -f etc.tar.xz /etc
[root@localhost zip]# ll etc*
-rw-r--r--. 1 root root 5635764  5月 11 11:57 etc.tar.xz

一般来说,tar 的扩展名是可以随意取的,亦即上方的 etc.tar.xz 。不过最好搭配 tar 以及压缩指令的扩展名较佳,因此常见的扩展名为:

  • *.tar:单纯的 tar 并没有压缩
  • *.tar.gz:支持 gzip 压缩的 tar 文件
  • *.tar.bz2:支持 bzip2 压缩的 tar 文件
  • *.tar.xz:支持 xz 压缩的 tar 文件

若需要查看 etc.tar.xz 的文件内容,可以使用如下的方式来查看:

[root@localhost zip]# tar -Jtv -f etc.tar.xz 
.......
-rw-r--r-- root/root        11 2016-05-10 19:06 etc/hostname
-rw-r--r-- root/root       163 2016-02-18 02:54 etc/.updated
-rw-r--r-- root/root     12288 2016-02-18 18:42 etc/aliases.db

只要将 -c 改成 -t 即可查阅压缩文件的内容,同时读者也很清楚的看到,文件名的项目『已经移除了根目录』! 因此,解打包 tar 文件时,缺省会在工作目录解开文件名。若需要在不同的目录下解开,就需要搭配 -C 的选项才行 (man tar)。

例题:
  1. 先使用 file 确认 etc.tar.xz 所支持的压缩指令为何
  2. 分别将 etc.tar.xz 在本目录与 /tmp 目录解开。

11.2.3:备份功能

tar 经常被用来作为系统文件备份的工具,如果不考虑容量,一般建议使用 gzip 支持速度较快,如果不考虑时间, 则建议支持 xz 压缩的方式处理,可以有较小的空间使用率。

以 Linux 操作系统的正规目录来说,建议备份的目录应该有底下的这些目录:

  • /etc/ 整个目录
  • /home/ 整个目录
  • /var/spool/mail/
  • /var/spoll/{at|cron}/
  • /root/
  • 如果你自行安装过其他的软件,那么 /usr/local/ 或 /opt 也最好备份一下!

若是针对网络服务方面的数据,那经常备份的有:

  • 软件本身的设置文件,例如:/etc/ 整个目录,/usr/local/ 整个目录
  • 软件服务提供的数据,以 WWW 及 Mariadb 为例:
    WWW 数据:/var/www 整个目录或 /srv/www 整个目录,及系统的用户家目录
    Mariadb : /var/lib/mysql 整个目录
  • 其他在 Linux 主机上面提供的服务之数据库文件!
例题:假设我需要备份的目录有底下这些:
  • /etc
  • /home
  • /root
  • /var/spool/mail/, /var/spool/cron/, /var/spool/at/
  • /var/lib/
请撰写一只名为 /backups/backup_system.sh 的脚本,来进行备份的工作。脚本内容可以是:
  1. 设计一个名为 source 的变量,变量内容以空格隔开所需要备份的目录
  2. 设计一个名为 target 的变量,该变量为 tar 所创建的文件名,文件名命名规则 backup_system_20xx_xx_xx.tar.gz , 其中 20xx_xx_xx 为西元年、月、日的数字,该数字依据你备份当天的日期由 date 自行取得。
  3. 开始利用 tar 来备份

11.3 Linux 工作调度

Linux 系统的工作非常的多,管理员总是希望系统可以自行管理自己,这样维护系统会比较轻松。而自动调度的方式有两种,分别是:

  • 单一运行一次,运行完毕后该工作则被舍弃;
  • 一直循环不停的工作

在缺省的情况下,Linux 系统提供的上述两种工作调度,最小的时间分辨率为分钟,最大的时间分辨率为一年内。

11.3.1:单次工作调度: at

单次调度工作必须要启动 atd 这个『服务』才能够运作,因此读者应该先查看系统的 atd 是否有启动。

[root@localhost ~]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2016-05-03 00:01:14 CST; 1 weeks 2 days ago
 Main PID: 1271 (atd)
   CGroup: /system.slice/atd.service
           └─1271 /usr/sbin/atd -f

 5月 03 00:01:14 localhost systemd[1]: Started Job spooling tools.
 5月 03 00:01:14 localhost systemd[1]: Starting Job spooling tools...

确定有在运作即可。

例题:
若上述的判断结果显示为没有启动,该如何处理?

单次循环工作可使用『 at TIME 』来处理,那个 TIME 为时间格式。最常见的时间格式为:

[student@localhost ~]$ at HH:MM YYYY-MM-DD
[student@localhost ~]$ at now
[student@localhost ~]$ at now + 10 minutes

若 student 希望能在今日 11 点,将 ip addr show 的结果输出到自己家目录的 myipshow.txt 文件中,那应该要这样处理:

[student@localhost ~]$ at 11:00
at> ip addr show &> /home/student/myipshow.txt
at> <EOT>   <==这里按下 [ctrl]+d 结束输入
job 1 at Thu May 12 11:00:00 2016

上表的案例中,我们仅输入一行指令 (ip addr... 那行),底下那行不要输入任何字符,直接按下 [ctrl]+d 的组合按钮即可出现 <EOT> 字样, 然后就结束 at 的输入。接下来我们可以查阅 at 的工作队列状态:

[student@localhost ~]$ atq
1       Thu May 12 11:00:00 2016 a student

上表即表示第一项工作为 student 在 5 月 12 日 11:00 要运行的。但是实际的内容就得要以『 at -c 1 』来查看,那个 1 指的是第一个工作, 亦即是 atq 输出的最前面字符的数字。

例题:假设你的系统因为所在环境的电力维护问题,因此需要在今年底的 12 月 31 日 17:30 关机。而你希望在关机前 30 分钟通知在线用户赶快注销 (可用 wall 处理), 该如何处理这项任务?
  1. 由于在前 30 分钟要通知,因此建议在 20XX-12-31 17:00 就运行 at
  2. 使用 wall 来进行通知任务,但 wall 最好用英文不要写中文 (某些终端机无法顺利显示)
  3. 使用 sleep 的方式来睡眠 30 分钟
  4. 最后再使用 poweroff 的方式来关机即可。

缺省所有人都可以使用 at 这个指令,但如果管理员想要关闭某些用户的 at 使用权,可以将该用户写入 /etc/at.deny 即可。 若要管理的较为严格,则将可以运行 at 的用户写入 /etc/at.allow,则没有写入 at.allow 的用户将无法使用 at。亦即:

  • 仅 at.deny 存在时:写入该文件内的用户无法使用 at,其余用户可以使用
  • 仅 at.allow 存在时:写入该文件内的用户可以使用 at,其余用户不可使用。
  • at.deny 与 at.allow 同时存在:以 at.allow 为主。

11.3.2:循环工作调度: crontab

循环型的工作调度需要启动 crond 这个服务才行,请先确认这个服务的状态。

[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2016-05-03 00:01:14 CST; 1 weeks 2 days ago
 Main PID: 1273 (crond)
   CGroup: /system.slice/crond.service
           └─1273 /usr/sbin/crond -n

 5月 03 00:01:14 localhost systemd[1]: Started Command Scheduler.
 5月 03 00:01:14 localhost systemd[1]: Starting Command Scheduler...
 5月 03 00:01:14 localhost crond[1273]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 67% if used.)
 5月 03 00:01:15 localhost crond[1273]: (CRON) INFO (running with inotify support)

基本上,cron 的设置可以分为两种,一种与 at 很类似,直接让用户操作指令来设置, 一种则是需要修改到系统设置档,第二种方式只能让管理员来设置。

  • 所有用户均可操作的 crontab 指令

所有用户 (包含 root) 缺省都能使用 crontab 这个指令,当运行 corntab -e 之后,系统就会进入到 cron 的设置环境, 该环境其实就是使用 vi 函数。设置方式主要有六个字段,设置口诀为『分 时 日 月 周 指令』,每个字段中间可用空格或 [tab] 按钮隔开。 至于前面五个字段的时间参数限制如下:

代表意义分钟小时 日期月份指令
数字范围0-590-231-311-120-7 指令最好使用绝对路径

周的数字为 0 或 7 时,都代表『星期天』的意思!另外,还有一些辅助的字符,大概有底下这些:

特殊字符代表意义
*(星号)代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表着『不论何月、何日的礼拜几的 12:00 都运行后续指令』的意思!
,(逗号)代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:
0 3,6 * * * command
时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!
-(减号)代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:
20 8-12 * * * command
仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!
/n(斜线)那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:
*/5 * * * * command
用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

例题:
  1. 用 sutdent 的身份,让 /usr/sbin/ip addr show 的结果,在每天的 11 点时显示在 /home/student/myipshow.txt 中
  • 管理员可以操作的系统设置档

除了 crontab 之外,管理员也可以在底下的位置放置系统管理的设置,包括:

  • /etc/crontab
  • /etc/cron.d/*

系统管理的部份,建议写入到 /etc/crontab 文件中,如果是管理员想要开发个别的软件,则建议放置于 /etc/cron.d/* 当中。 举例而言,若前一小节谈到的 /backups/backup_system.sh 想要每周日定期运行一次时,可以这样设置:

[root@localhost ~]# vim /etc/crontab
0 11 * * 0 root sh /backups/backup_system.sh &> /dev/null

与一般用户的 crontab -e 指令不同,管理员还需要指定『运行该指令的用户身份』为何较佳。读者也可以将上述的设置写入成为一个文件名, 然后将该文件放入 /etc/cron.d 目录中即可。此外,系统也已经指定了一些特定时间会运行的目录,用户也能够自己撰写脚本后, 将该脚本写入下列的目录中即可。

  • /etc/cron.hourly/:内容为每小时进行一次的工作
  • /etc/cron.daily/:内容为每天进行一次的工作
  • /etc/cron.weekly/:内容为每周进行一次的工作
  • /etc/cron.monthly/:内容为每月进行一次的工作
例题:除了每周进行一次系统备份外,该脚本我希望每个月还能够自动运行一次,该如何处理?
  1. 先让该脚本可以具有运行权 (chmod a+x)
  2. 将该脚本拷贝一份到 /etc/cron.monthly 即可!

11.4:课后练习操作

前置动作:请使用 unit11 的硬盘进入作业环境,并请先以 root 身分运行 vbird_book_setup_ip 指令设置好你的学号与 IP 之后,再开始底下的作业练习。

请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。

  1. 请回答下列问题,并将答案写在 /root/ans11.txt 文件内:
    1. 一般网络检查是否有通行,会有几个步骤?每个步骤所需要检查的项目是什么?
    2. 一般 Linux 操作系统在 PC 上面会有两个时间纪录,分别是那两个?
    3. 在 Linux 底下,常见的压缩指令,依据压缩比从最好到最差,写出三个常见的指令。
    4. 例行工作调度的 crontab 使用中,对于一般帐号来说,设置时的六个字段的口诀为何?
  2. 系统的基础设置-网络的设置部份:
    1. 由于我们的系统是经过 clone 出来的,因此所有的设备恐怕都怪怪的。所以,请先将系统中的 eth0 这个网络连接删除。
    2. 请依据底下的说明,重新创建 eth0 这个网络连接:
      • 使用的适配器为 eth0 这个适配器
      • 需要开机就自动启动这个连接
      • 网络参数的设置方式为手动设置,不要使用自动取得喔
      • IP address 为: 192.168.251.XXX/24 (XXX 为上课时,老师给予的号码)
      • Gateway 为: 192.168.251.250
      • DNS server IP为:请依据老师课后说明来设置 (若无规定,请以 168.95.1.1 及 8.8.8.8 这两个为准)
      • 主机名称:请设置为 stdXXX.book.vbird (其中 XXX 为上课时,老师给予的号码)
      务必记得设置完毕后,一定要激活这个网络连接,否则成绩无法上传喔!
  3. 系统的基础设置-时间、语系等其他设置值:
    1. 你系统的时间好像怪怪的,时区与时间好像都错乱了!请改回台北的标准时区与时间。
    2. 不知为何,你的语系好像被修改成简体中文了。请将它改回繁体中文语系喔!
    3. 未来这部主机会作为 WWW/FTP/SSH 服务器,因此防火墙规则中,请放行 http, ftp, ssh 这几个服务。请注意,这个规则也需要写入永久设置档中。
  4. 文件的压缩、解压缩等任务
    1. 你的系统中有个文件名 /root/mybackup 的文件,这个文件原本是备份系统的数据,但扩展名不小心写错了! 请将这个文件修订成为比较正确的扩展名 (例如 /root/mybackup.txt 之类的模样),并且将该文件在 /srv/testing/ 目录中解开这个文件的内容。
    2. 我需要备份的目录有:/etc, /home, /var/spool/mail/, /var/spool/cron/, /var/spool/at/, /var/lib/, 请撰写一只名为 /root/backup_system.sh 的脚本,来进行备份的工作。脚本内容应该是:
      • 第一行一定要声明 shell 喔!
      • 自动判断 /backups 目录是否存在,若不存在则 mkdir 创建她,若存在则不进行任何动作
      • 设计一个名为 source 的变量,变量内容以空格隔开所需要备份的目录
      • 设计一个名为 target 的变量,该变量为 tar 所创建的文件名,文件名命名规则 /backups/mysystem_20xx_xx_xx.tar.gz , 其中 20xx_xx_xx 为西元年、月、日的数字,该数字依据你备份当天的日期由 date 自行取得。
      • 开始利用 tar 来备份
      请注意,撰写完毕之后,一定要立刻运行一次该脚本!确认实际有创建 /backups 以及相关的备份数据喔!
  5. 请使用网络校时 (chronyd) 的方式,使用贵校 (以昆山来说,就是 ntp.ksu.edu.tw) 作为服务器,主动更新你的系统时间。(若贵校并无 NTP 服务器,则以 time.stdtime.gov.tw 作为来源)
  6. 例行工作调度的设置:
    1. 你的系统将在下个月的 20 号 08:00 进行关机的岁修工作,请以『单次』工作调度来设计关机的动作 (poweroff)
    2. 让系统每天 3:00am 时,全系统更新一次!相关设置请写入 /etc/crontab 内 (可以先查找下一堂课的指令)
    3. 请使用 gooduser 这个帐号身份,在每天的 15:30 时,下达『 /bin/echo 'It is tea time' 』的例行任务。 若有需要使用 gooduser 登录时,该帐号的密码为 mypassword

作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX;aa:bb:cc:dd:ee:ff;unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用: http://192.168.251.250 检查相对应的课程文件。

修改历史:
  • 2016/05/12:终于认真的研究了一下 firewall-cmd 这个指令!
  • 2017/04/02:终于将这一章的习题搞定了!趁着连续假期处理处理~
  • 2018/08/16:在 11.1.1 的第一个例题上方『读者会发现到 eth0 ...同时 DEICE 会...』,应该是『读者会发现到 eth0 ...同时 DEVICE 会...』才对!
2016/05/12以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计