鳥哥的 Linux 私房菜
<<

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

最近更新日期: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以來統計人數
計數器
>>
HOME
PrePage
NextPage
   http://linux.vbird.org is designed by VBird during 2001-2017.