Linux 基礎學習訓練教材 - CentOS 8.x

第 11 堂課:基礎設定、備份、檔案壓縮打包與工作排程

Linux 基礎網路設定、工作排程、基礎的檔案壓縮與打包 (tar) 等等的應用!

最近更新時間: 2020/05/17

帳號與權限的部份瞭解告一段落之後,讀者應該可以針對系統進行一些基礎的設定了,包括網路、日期時間等等。 同時,最好也能理解一下系統的備份工作,同時為了減少備份的容量,理解一下檔案的壓縮與打包也是重要的工作。 最終,當事情通通要交給系統獨自運作時,讀者對於工作排程的理解也不能少。

11.1:Linux 系統基本設定

在更進一步管理系統前,先來整理一下系統的網路建置、日期與時間的修改、語系等相關的設定,讓系統更符合你的操作行為與環境。

11.1.1:網路設定

網路設定是系統管理員主要負責的項目。一般來說,以伺服器的角度觀之,通常伺服器的網路都是固定的,大多使用手動的方式來設定好網路。 如果是以桌機的角度來看,則大多使用自動取得網路參數,亦即所謂的『 dhcp 』協定來自動處理。如果是台灣地區的一般民眾, 可能會有兩個主要的網路參數取得方式,一個是與電話線路結合,例如中華電信的 ADSL 或者光世代的撥接方式,一種則是透過與第四台的纜線結合。

CentOS 8 使用 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:85:b1:54 brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:b0:2f:5d brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:b0:2f:5d brd ff:ff:ff:ff:ff:ff

上述的 lo, ens3, virbr0, virbr0-nic 等等就是網路介面卡!系統實際上就是透過這些介面卡來連線到網路的。讀者應該要知道, 一張介面卡可以同時提供多個網路位址 (IP address),而利用這些介面卡來達成連線的方式就稱為網路連線代號。查詢網路連線代號的方式如下:

[root@localhost ~]# nmcli connection show
NAME    UUID                                  TYPE      DEVICE
ens3    1eff13ae-e436-407c-bf67-ac0932bd1ed2  ethernet  ens3
virbr0  efe9b94d-5d0c-4f93-b55c-4c4156c7aa9f  bridge    virbr0

讀者們應該要注意的是:

  • 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' (167e8cf0-05b5-4ea9-8685-7775441d5d04) successfully added.

[root@localhost ~]# nmcli connection show
NAME    UUID                                  TYPE      DEVICE
ens3    167e8cf0-05b5-4ea9-8685-7775441d5d04  ethernet  ens3
virbr0  efe9b94d-5d0c-4f93-b55c-4c4156c7aa9f  bridge    virbr0

讀者會發現到 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:                        167e8cf0-05b5-4ea9-8685-7775441d5d04
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.5.237/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
連線已成功啟用(D-Bus 啟用路徑:/org/freedesktop/NetworkManager/ActiveConnection/5)

上表『 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 set-hostname www.centos
[root@localhost ~]# hostnamectl
   Static hostname: www.centos
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 502dbaaf2a074134909a59ef9ab651c1
           Boot ID: b2952f724af0470cafc231c72afbcf9e
    Virtualization: kvm
  Operating System: CentOS Linux 8 (Core)
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-147.el8.x86_64
      Architecture: x86-64

這樣立刻設定好主機名稱,且可以不用重新開機。

例題 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.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 到不同時區的地點時,可能得要修訂自己的電腦時間才行。 修訂的方式可以使用 CentOS8 提供的 timedatectl 指令。

[root@localhost ~]# timedatectl
               Local time: 日 2020-05-17 15:01:30 CST
           Universal time: 日 2020-05-17 07:01:30 UTC
                 RTC time: 日 2020-05-17 07:01:31
                Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no
例題 11.1.2-1: 使用 timedatectl 指令管理系統的時區、時間等任務
  1. 透過 man timedatectl 之後,找到列出目前系統支援的所有時區的參數,並查出有沒有日本、UTC 等時區
  2. 透過 find 到 /usr/share/zoneinfo 找找看有沒有 Japan 這個關鍵字?
  3. 先檢查目前的時間,將時區改為日本時區後,查詢時間變化差異多久
  4. 再將時區改為 UTC 時間,再次檢查時間變化差異多久?
  5. 改回目前的時區,然後根據你的手錶,設定好正確的時間!
  • 透過持續網路校時功能 (用戶端功能)

讀者應該會發現到現今的作業系統大多可以保持正確的時間,再也無須進行手動校時。CentOS 8 預設提供了 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 Sun 2020-05-17 15:38:04 CST; 51s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 17512 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 17508 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 17510 (chronyd)
    Tasks: 1 (limit: 11476)
   Memory: 1.9M
   CGroup: /system.slice/chronyd.service
           └─17510 /usr/sbin/chronyd

 5月 17 15:38:04 station200 systemd[1]: Starting NTP client/server...
 5月 17 15:38:04 station200 chronyd[17510]: chronyd version 3.5 starting (+CMDMON +NTP +.......
 5月 17 15:38:04 station200 chronyd[17510]: Using right/UTC timezone to obtain leap second data
 5月 17 15:38:04 station200 systemd[1]: Started NTP client/server.
 5月 17 15:38:08 station200 chronyd[17510]: Selected source 120.114.100.1
 5月 17 15:38:08 station200 chronyd[17510]: System clock TAI offset set to 37 seconds
 5月 17 15:38:08 station200 chronyd[17510]: System clock wrong by -2.258910 seconds, adjustment started
 5月 17 15:38:06 station200 chronyd[17510]: System clock was stepped by -2.258910 seconds

若有需要了解到目前的 NTP 時間狀況,可以使用追蹤 (tracking) 來處理看看:

[root@localhost ~]# chronyc tracking
Reference ID    : 78726401 (dns3.ksu.edu.tw)
Stratum         : 4
Ref time (UTC)  : Sun May 17 07:40:16 2020
System time     : 0.000008519 seconds slow of NTP time
Last offset     : -0.000019847 seconds
RMS offset      : 0.000019847 seconds
Frequency       : 22.813 ppm slow
Residual freq   : -0.005 ppm
Skew            : 3.124 ppm
Root delay      : 0.008961411 seconds
Root dispersion : 0.058238860 seconds
Update interval : 64.4 seconds
Leap status     : Normal

[root@station200 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp.ksu.edu.tw                3   6   177    28     +9ns[ -339ns] +/-   64ms

如此一來,如果有網路,則此 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

若想要讓圖形界面的畫面以台灣中文為主,可以使用如下的方式來處置:

[root@localhost ~]# localectl list-locales | grep -i tw
zh_TW
zh_TW.euctw
zh_TW.utf8

[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 提供一個名為 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 才行。

例題 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 3726192  5月 17 20:15 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 - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-05-16 21:37:02 CST; 23h ago
 Main PID: 1137 (atd)
    Tasks: 1 (limit: 11476)
   Memory: 568.0K
   CGroup: /system.slice/atd.service
           └─1137 /usr/sbin/atd -f

 5月 16 21:37:02 localhost.localdomain systemd[1]: Started Job spooling tools.

確定有在運作即可。

例題 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 18 11:00:00 2020

上表的案例中,我們僅輸入一行指令 (ip addr... 那行),底下那行不要輸入任何字元,直接按下 [ctrl]+d 的組合按鈕即可出現 <EOT> 字樣, 然後就結束 at 的輸入。接下來我們可以查閱 at 的工作佇列狀態:

[student@localhost ~]$ atq
1       Mon May 18 11:00:00 2020 a root

上表即表示第一項工作為 student 在 5 月 18 日 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 Sat 2020-05-16 21:37:02 CST; 24h ago
 Main PID: 1138 (crond)
    Tasks: 1 (limit: 11476)
   Memory: 6.2M
   CGroup: /system.slice/crond.service
           └─1138 /usr/sbin/crond -n

 5月 17 12:01:01 www.centos CROND[14959]: (root) CMD (run-parts /etc/cron.hourly)
 5月 17 13:01:01 www.centos CROND[15482]: (root) CMD (run-parts /etc/cron.hourly)

基本上,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 的檔案,這個檔案原本是備份系統的資料(打包檔),但副檔名不小心寫錯了! 請將這個檔案修訂成為比較正確的副檔名 (例如 /root/mybackup.txt 之類的模樣),並且將該檔案在 /srv/testing/ 目錄中解開這個檔案的內容。
    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) 作為伺服器,主動更新你的系統時間。(若貴校並無 NTP 伺服器,則以 time.stdtime.gov.tw 作為來源)
  6. (15%)例行工作排程的設定:
    1. 你的系統將在下個月的 20 號 08:00 進行關機的歲修工作,請以『單次』工作排程來設計關機的動作 (poweroff)
    2. 讓系統每天 3:00am 時,全系統更新一次!相關設定請寫入 /etc/crontab 內 (可以先查詢下一堂課的指令)
    3. 請使用 gooduser 這個帳號身份,在每天的 15:30 時,下達『 /bin/echo 'It is tea time' 』的例行任務。 若有需要使用 gooduser 登入時,該帳號的密碼為 mypassword
  7. 重新開機後,請在 10 分鐘內上傳你的成績,若開機後 10 分鐘才上傳,則會失敗。只需要重新開機,在 10 分鐘內執行上傳程式, 就可以繼續上傳成績結果。

作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit

修改歷史:
  • 2016/05/12:終於認真的研究了一下 firewall-cmd 這個指令!
  • 2017/04/02:終於將這一章的習題搞定了!趁著連續假期處理處理~
  • 2018/08/16:在 11.1.1 的第一個例題上方『讀者會發現到 eth0 ...同時 DEICE 會...』,應該是『讀者會發現到 eth0 ...同時 DEVICE 會...』才對!
  • 2020/05/17:加入比較多的 xz 說明而已,取消了 ntpdate,現在校時真的要啟動 chronyd 了!
  • 2020/05/25:將作業修改一下,可以進行作業了!
2020/05/17 以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計