Linux 基础学习训练教材 - RockyLinux 9.x

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

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

最近更新时间: 2023/05/24

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

11.1:Linux 系统基本设置

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

11.1.1:网络设置

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

RockyLinux 9 使用 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 group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:ba:0b:fc brd ff:ff:ff:ff:ff:ff
    altname enp0s3

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

[root@localhost ~]# nmcli connection show
NAME  UUID                                  TYPE      DEVICE
ens3  6d7acc4f-a409-38ee-a913-76a66ce86e32  ethernet  ens3

读者们应该要注意的是:

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

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

[root@localhost ~]# nmcli connection delete ens3
[root@localhost ~]# nmcli connection add con-name ens3 ifname ens3 type ethernet
Connection 'ens3' (36573e26-dfd6-4d83-9a79-8b5b15f1e4b3) successfully added.

[root@localhost ~]# nmcli connection show
NAME  UUID                                  TYPE      DEVICE
ens3  36573e26-dfd6-4d83-9a79-8b5b15f1e4b3  ethernet  ens3

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

目前大部分的系统在网络卡的命名上面已经不再使用过去的 eth0, eth1... 之类的命名方式,而是使用该适配器的总线作为代号来命名。 因此,未来大家可能会常见到不同的名称喔!

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

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

[root@localhost ~]# nmcli connection show 连接名称(con-name)
[root@localhost ~]# nmcli connection show ens3
connection.id:                          ens3
connection.uuid:                        36573e26-dfd6-4d83-9a79-8b5b15f1e4b3
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              ens3
connection.autoconnect:                 是
.......
ipv4.method:                            auto
ipv4.dns:                               --
ipv4.dns-search:                        --
ipv4.dns-options:                       --
ipv4.dns-priority:                      0
ipv4.addresses:                         --
ipv4.gateway:                           --
ipv4.routes:                            --
.......
ipv6.method:                            auto
ipv6.dns:                               --
ipv6.dns-search:                        --
ipv6.dns-options:                       --
ipv6.dns-priority:                      0
ipv6.addresses:                         --
ipv6.gateway:                           --
ipv6.routes:                            --
.......
IP4.ADDRESS[1]:                         172.16.2.253/16
IP4.GATEWAY:                            172.16.200.254
IP4.ROUTE[1]:                           dst = 0.0.0.0/0, nh = 172.16.200.254, mt = 100
IP4.ROUTE[2]:                           dst = 172.16.0.0/16, nh = 0.0.0.0, mt = 100
IP4.DNS[1]:                             172.16.200.254
IP4.DOMAIN[1]:                          gocloud.vm
DHCP4.OPTION[1]:                        dhcp_lease_time = 259200
DHCP4.OPTION[2]:                        dhcp_rebinding_time = 226800
.......
IP6.ADDRESS[1]:                         fe80::d9bf:d115:c5dc:248f/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 100
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255

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

  • 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 ens3 ipv4.method auto
[root@localhost ~]# nmcli connection up ens3
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

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

  • 手动设置 IP 参数

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

  • IP/Netmask: 172.16.50.NN/16
  • Gateway: 172.16.200.254
  • DNS: 172.16.200.254

上述 NN 为你的学号 (介于 1~254 之间的数值皆可),底下假设为 1 号时的情况, 读者可以通过底下的方式来处理手动设置 IP 的方式:

[root@localhost ~]# nmcli connection modify ens3  \
> 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 ens3
.......
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 ens3

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

[root@localhost ~]# nmcli connection show ens3
.......
IP4.ADDRESS[1]:                         172.16.50.1/16
IP4.GATEWAY:                            172.16.200.254
IP4.ROUTE[1]:                           dst = 172.16.0.0/16, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 172.16.200.254, mt = 100
IP4.DNS[1]:                             172.16.200.254
.......
  • 主机名称设置

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

[root@localhost ~]# hostnamectl hostname www.rockylinux
[root@localhost ~]# hostnamectl
 Static hostname: www.rockylinux
       Icon name: computer-vm
         Chassis: vm
      Machine ID: d587a2c04fbb458e8015aef30df28fec
         Boot ID: d47cd3298e1c4e919003299b9cf413be
  Virtualization: kvm
Operating System: Rocky Linux 9.1 (Blue Onyx)
     CPE OS Name: cpe:/o:rocky:rocky:9::baseos
          Kernel: Linux 5.14.0-162.12.1.el9_1.0.2.x86_64
    Architecture: x86-64
 Hardware Vendor: Red Hat
  Hardware Model: KVM

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

例题 11.1.1-2: 设置网络连接 (此网络连接会使用到学期末,所以请设置妥当喔!)
  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.rockylinux (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 到不同时区的地点时,可能得要修订自己的电脑时间才行。 修订的方式可以使用 RockyLinux 9 提供的 timedatectl 指令。

[root@localhost ~]# timedatectl
               Local time: Mon 2023-05-01 21:36:27 CST
           Universal time: Mon 2023-05-01 13:36:27 UTC
                 RTC time: Mon 2023-05-01 13:36:27
                Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
例题 11.1.2-1: 使用 timedatectl 指令管理系统的时区、时间等任务
  1. 通过 man timedatectl 之后,找到列出目前系统支持的所有时区的参数,并查出有没有日本、UTC 等时区
  2. 通过 find 到 /usr/share/zoneinfo 找找看有没有 Japan 这个关键字?
  3. 先检查目前的时间,将时区改为日本时区后,查找时间变化差异多久
  4. 再将时区改为 UTC 时间,再次检查时间变化差异多久?
  5. 改回目前的时区,并且关闭 set-ntp 这个设置值,然后根据你的手表,设置好正确的时间!
  6. 将 set-ntp 改回 true 让系统自动网络更新时间!
  • 通过持续网络校时功能 (用户端功能)

读者应该会发现到现今的操作系统大多可以保持正确的时间,再也无须进行手动校时。RockyLinux 9 缺省提供了 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).
#pool 2.centos.pool.ntp.org iburst
server ntp.ksu.edu.tw iburst  <==加入所需要的服务器
.....

[root@localhost ~]# systemctl enable  chronyd
[root@localhost ~]# systemctl restart chronyd
# 大概间隔个 10~30 秒,等待系统连上 server 后,再进行底下的动作!

[root@localhost ~]# systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-05-01 21:51:49 CST; 6s ago
       Docs: man:chronyd(8)
             man:chrony.conf(5)
    Process: 7645 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 7647 (chronyd)
      Tasks: 1 (limit: 10940)
     Memory: 896.0K
        CPU: 37ms
     CGroup: /system.slice/chronyd.service
             └─7647 /usr/sbin/chronyd -F 2

May 01 21:51:49 station200.rockylinux systemd[1]: Starting NTP client/server...
May 01 21:51:49 station200.rockylinux chronyd[7647]: chronyd version 4.2 starting (+CMDMON +NTP ...
May 01 21:51:49 station200.rockylinux chronyd[7647]: Frequency -22.691 +/- 2.274 ppm read from /var/lib/chrony/drift
May 01 21:51:49 station200.rockylinux chronyd[7647]: Using right/UTC timezone to obtain leap second data
May 01 21:51:49 station200.rockylinux chronyd[7647]: Loaded seccomp filter (level 2)
May 01 21:51:49 station200.rockylinux systemd[1]: Started NTP client/server.
May 01 21:51:54 station200.rockylinux chronyd[7647]: Selected source 120.114.100.1 (ntp.ksu.edu.tw)
May 01 21:51:54 station200.rockylinux chronyd[7647]: System clock TAI offset set to 37 seconds

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

[root@localhost ~]# chronyc tracking
Reference ID    : 78726401 (dns3.ksu.edu.tw)
Stratum         : 5
Ref time (UTC)  : Mon May 01 13:53:00 2023
System time     : 0.000084371 seconds fast of NTP time
Last offset     : +0.000090629 seconds
RMS offset      : 0.000090629 seconds
Frequency       : 22.219 ppm slow
Residual freq   : +0.690 ppm
Skew            : 5.174 ppm
Root delay      : 0.007547141 seconds
Root dispersion : 0.125858709 seconds
Update interval : 64.1 seconds
Leap status     : Normal

[root@station200 ~]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp.ksu.edu.tw                4   6    37    22  +6236ns[  +97us] +/-  130ms

如此一来,如果有网络,则此 Linux 系统就能够持续的更新时间了。未来我们上课时,时间应该就会是正常的啰!

事实上,RockyLinux 9 缺省的 chronyd 已经启动,而且基本上都已经使用了最近的 time server 来进行时间校正了!所以用户实在无须自己调整。 只是,某些单位的资安限制问题, time server 需要使用内部的 NTP 服务器,此时就得要如同上面的方式来设计了!

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

若想要让图形界面的画面以台湾中文为主,可以使用如下的方式来处置。因为底下最后的实做会重新启动图形界面, 因此建议登录到 tty6 之类的文本界面环境进行处理。此外,最好也先注销图形界面喔!

[root@localhost ~]# localectl list-locales | grep -i tw
cmn_TW.UTF-8
hak_TW.UTF-8
lzh_TW.UTF-8
nan_TW.UTF-8
nan_TW.UTF-8@latin
zh_TW.UTF-8

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

上述动作实做完成后,回到 tty1 的登录环境中,你应该就会看到中文显示的图形界面环境了!

11.1.4:简易防火墙管理

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

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

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

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

[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

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

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

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

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

[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client http ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

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

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

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

请自行确认输出的结果含有 http 才行。另外,如果要避免自己忘记这些重要的动作,那么建议直接将规则写入到设置中, 然后直接重新加载 firewalld 的设置值会比较好!至少不会忘记!让我们来测试一下,假设你要添加 https 这个服务, 那可以这样做会更好:

[root@localhost ~]# firewall-cmd --add-service=https --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# firewall-cmd --list-services
cockpit dhcpv6-client http https ssh

这样规则就不用写入两次!记得要重新加载 (--reload) 并观察目前的规则即可!

例题 11.1.4-1:请依据底下的方式处理好你的防火墙,首先理解我们需要达成的防火墙任务有:
  • 我们的 Linux 预计要做成 http, https, ssh, ftp 这三个服务的服务器 (service)
  • 我们的 Linux 预计要让你的惯用系统,也就是 172.16.100.254 这部主机无条件登录
  • 我们的 Linux 预计要让区网 (LAN) ,也就是 172.16.0.0/16 这一整个区段的来源 IP 可以使用 ssh 的连接登录
  1. 先针对服务来说,应该要使用的方法:
    • 先使用 --get-services 查找 firewall-cmd 所认识的所有的服务有哪些
    • 针对永久设置来说,删除原有放行的服务,仅剩下放行 http, https, ssh, ftp 等服务到永久设置的规则中
  2. 针对可以登录我 Linux 系统的来源用户端设置来说,可以这样做:
    • 先查找 man firewalld.richlanguage 相关的规则与 example
    • 只要来自 172.16.100.254 的要求,均予以放行
    • 只要来自 172.16.0.0/16 的 ssh 连接要求,均予以放行
  3. 最终直接将服务重新启动,同时确认现在与未来的设置是否正确

11.2:文件的压缩与打包

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

11.2.1:文件的压缩指令

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

例题 11.2.1-1:测试不同压缩指令的压缩比
  1. 进行大型文件的拷贝工作:
    • 前往 /dev/shm 创建 zip 目录,并成为工作目录
    • 找出 /etc 底下最大容量的文件 (使用 ll --help 找出相对应的选项),并将该文件拷贝到工作目录下
    • 将工作目录下的文件拷贝成为 filename.1, filename.2, filename.3, filename.4 四个文件
  2. 进行大型文件压缩的功能:
    • 分别使用 time 测试 gzip 压缩 filename.1, bzip2 压缩 filename.2, xz 压缩 filename.3 的时间
    • 观察一下哪个压缩指令所花费的时间最长,哪个指令的压缩比最佳。
    • 找到 xz 的 -T 功能搭配 --block-size=128K 的参数,重新使用多线程的方式,看看 xz 的压缩有没有效果?
  3. 进行解压缩
    • 最终再以 time 搭配 gzip, bzip2, xz 将刚刚的压缩档解开,并查阅哪个指令花费的时间最长
  4. 以 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 3267448 May  7 15:35 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        28 2020-02-26 09:10 etc/vconsole.conf
-rw-r--r-- root/root        16 2020-05-17 15:47 etc/locale.conf
-rw-r--r-- root/root        18 2020-05-17 14:40 etc/hostname

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

例题 11.2.2-1: 使用 tar 的应用方式
  1. 进行 tarball 的解压缩功能:
    • 先使用 file 确认 etc.tar.xz 所支持的压缩指令为何
    • 分别将 etc.tar.xz 在本目录与 /tmp 目录解开。
  2. 由于 xz 具有多线程的功能,因此将 tar 通过管线命令后,加入 xz 的压缩方式:
    • 先使用 time tar -Jc -f etc2.tar.xz /etc 确认压缩需要多久时间?
    • 使用 tar -Jc -f - /etc | cat > etc3.tar.xz 确认是否可运行?
    • 使用 tar -c -f - /etc | xz -T 2 --block-size=1M -c > etc4.tar.xz 看看可以运行否?
    • 加上 time 检测时间!

11.2.3:备份功能

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

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

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

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

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

11.3 Linux 工作调度

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

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

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

11.3.1:单次工作调度: at

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

[root@localhost ~]# systemctl status atd
● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-05-07 22:59:44 CST; 7h left
       Docs: man:atd(8)
   Main PID: 1112 (atd)
      Tasks: 1 (limit: 10940)
     Memory: 304.0K
        CPU: 5ms
     CGroup: /system.slice/atd.service
             └─1112 /usr/sbin/atd -f

May 07 22:59:44 station200.rockylinux systemd[1]: Started Deferred execution scheduler.

确定有在运作即可。

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

单次循环工作可使用『 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 Mon May  8 11:00:00 2023

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

[student@localhost ~]$ atq
1       Mon May  8 11:00:00 2023 a student

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

例题 11.3.1-2:假设你的系统因为所在环境的电力维护问题,因此需要在今年底的 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.1-3: 假设上课启动系统之后,你预计 4 个小时候就进行关机,这样假如忘记关电脑就离开教室也就没关系了,该如何处理?

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 Sun 2023-05-07 22:59:44 CST; 7h left
   Main PID: 1115 (crond)
      Tasks: 2 (limit: 10940)
     Memory: 1.5M
        CPU: 57ms
     CGroup: /system.slice/crond.service
             ├─1115 /usr/sbin/crond -n
             └─2089 /usr/sbin/anacron -s

May 07 22:59:44 station200.rockylinux crond[1115]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 67% if used.)
May 07 22:59:44 station200.rockylinux crond[1115]: (CRON) INFO (running with inotify support)
May 07 15:01:01 station200.rockylinux CROND[2078]: (root) CMD (run-parts /etc/cron.hourly)
May 07 15:01:01 station200.rockylinux run-parts[2081]: (/etc/cron.hourly) starting 0anacron

基本上,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 ,相同意思!

例题 11.3.2-1: 用户运行 crontab 指令的方法
  1. 用 sutdent 的身份,让 /usr/sbin/ip addr show 的结果,在每天的 11 点时显示在 /home/student/myipshow.txt 中
  2. 用 sutdent 的身份,每 10 分钟显示一次 ip addr show 的结果到 /dev/shm/myip 文件中。
  • 管理员可以操作的系统设置档

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

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

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

[root@localhost ~]# vim /etc/crontab
0 2 * * 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/:内容为每月进行一次的工作
例题 11.3.2-2:除了每周进行一次系统备份外,该脚本我希望每个月还能够自动运行一次,该如何处理?
  1. 先让该脚本可以具有运行权 (chmod a+x)
  2. 将该脚本拷贝一份到 /etc/cron.monthly 即可!(建议可以使用实体链接处理即可)

11.4:课后练习操作

  • 上课的课后练习,非作业:
  1. 清理刚刚课堂上面实做的许多问题:
    1. 想要知道目前的 at job 在哪里,可以查找一下 /var/spool/at 这个目录。
    2. 将刚刚课堂上面的 at 工作查看一下,因为我们还需要进行某些任务,所以,将所有关机的 at job 全部取消。
    3. 关于一般用户 student 所创建的工作中,想要探查是否有正确运作,可以前往 /var/log/cron 查阅, 如果超过 10 分钟以上,就至少能够看到一笔 student 有关的例行工作调度记载
    4. 想要知道所有用户的 crontab -e 的设置数据,可以查阅一下 /var/spool/cron 这个目录!
    5. 尝试关闭 student 的每十分钟运作的那只设置,且请注解它,不要直接删除掉!
  • 作业 (不提供学生答案,仅提供教师参考答案)

作业硬盘一般操作说明:

  • 打开云端虚拟机前,请务必确认你打开的硬盘是『unit11』,否则就会做错题目
  • 若要使用图形界面,请务必使用 student 身份登录,若需要切换身份,再激活终端机处理。
  • 若有简答题需要使用中文,请自行以第一堂课的动作自行处理输入法安装。
  • 每部虚拟机均有独特的网卡地址,请勿使用他人硬盘上传,否则计分为 0 分。
  • 每位同学均有自己的 IP 尾数,请先向老师询问您的 IP 尾数,才可以进行作业上传。
  • 最终上传作业结果,请务必使用 root 身份上传。
  • 进入作业硬盘后,先用 root 身份运行 vbird_book_setup_ip , 运行流程请参考:vbird_book_setup_ip

作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!

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

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

修改历史:
  • 2023/05/07:进行 RockyLinux9 的基础设置说明
  • 2023/05/24:将硬盘加入了!好疲倦!
2023/05/07 以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

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