電腦網路與作業系統 電腦網路與作業系統

電腦網路與作業系統上課教材

電腦網路與作業系統 > 課程內容 > 第 14 章 - Linux 作業系統 - 系統探索與基礎系統管理

第 14 章 - Linux 作業系統 - 系統探索與基礎系統管理

上次更新日期 2020/06/07

前半學期都在學基礎計算機概論,還包含網路概論等等,要記憶的東西一大堆。後半學期都在玩 Linux 系統,有很多的指令需要記憶, 這些指令需要完成的任務也都要記憶!能不能在 Linux 底下進行硬體探索?以及在 Linux 環境下處理系統設定值? 還有壓縮與打包的任務等等,都需要了解與學習一下才好。

學習目標

  1. 了解 Linux 底下,硬體如何觀察
  2. 理解時區、語系的設定行為
  3. 了解如何處理例行工作排程
  4. 學會使用 rsync

14.1: 系統硬體探索

關於主機硬體的探索,期中考之前我們是直接拆卸主機硬體來查看,順便了解整體主機板的配置與主機的許多元件連結。 那如果是雲裡面的系統,或者是機房裡面的系統,或者是準系統,或者是名片型主機系統這樣的元件,其實你可能無法接觸到實際的硬體, 這時候,可能就需要軟體或者是工具程式的輔助了。在 Windows 系統,可以透過 cpu-z 或者其他工具軟體來了解硬體, 那 Linux 可以如何了解呢?

  • 關於 CPU: /proc/cpuinfo, cpupower monitor...

如果想要知道 CPU 的資訊,可以透過觀察 /proc/cpuinfo 來了解喔!例如虛擬機器裡面的 CPU 就是長這樣:

[student@station200 ~]$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
stepping        : 2
microcode       : 0x1
cpu MHz         : 2299.996
cache size      : 4096 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat 
                  pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb lm constant_tsc 
                  arch_perfmon nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid 
                  sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c 
                  rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase bmi1 avx2 smep 
                  bmi2 invpcid xsaveopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips        : 4599.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
....

上面是有經過排版的結果,否則,在 flags 的部份,應該是長長的一大串!輸出的訊息中, processor 就是 CPU 的 ID 號碼, 從 0 號開始編,所以如果有 4 核 8 緒的話,那麼這個 processor 應該就會有 0~7 號。你也可以很清楚的看到 CPU 的名稱為 Intel Xeon E5-2650 v3 這個版本,核心基礎時脈為 2.3GHz。至於 flags 指的就是 CPU 指令集,例如 aes 這個 AES 硬體加速器! 另外,你也可以看到 hypervisor,那就是虛擬機器常見的 flags 喔!

除了直接查閱 /proc/cpuinfo 之外,你也可以透過 lspci 來查看 CPU 資訊:

[student@station200 ~]$ lscpu
架構:               x86_64
CPU 作業模式:       32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2
On-line CPU(s) list: 0,1
每核心執行緒數:     1
每通訊端核心數:     2
Socket(s):           1
NUMA 節點:          1
供應商識別號:       GenuineIntel
CPU 家族:           6
型號:               63
Model name:          Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
製程:               2
CPU MHz:            2299.996
BogoMIPS:            4599.99
Hypervisor 供應商:  KVM
虛擬型態:           全部
L1d 快取:           32K
L1i 快取:           32K
L2 快取:            4096K
NUMA node0 CPU(s):  0,1
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat 
                     pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb lm constant_tsc 
                     arch_perfmon nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid 
                     sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c 
                     rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase bmi1 avx2 smep 
                     bmi2 invpcid xsaveopt

CPU 的時脈其實是會改變的!而且,你也可以調整 CPU 的頻率使用狀態!使用的方式就透過 cpupower 這個指令即可。 只是,虛擬機器的 CPU 核心時脈是由實體機掌控的,因此,我們的練習中,無法查閱到實際的 CPU 時脈就是了。

[root@station200 ~]# cpupower monitor
    | SandyBridge
 CPU| C7   | PC2  | PC7
   0|******|******|******
   1|******|******|******

因為是虛擬機器,所以看不到的東西太多了!鳥哥回到實體機器去查閱,則可以看到類似的情境:

[root@node8 ~]# cpupower monitor
              | Nehalem                   || SandyBridge        || Mperf              
 PKG|CORE| CPU| C3   | C6   | PC3  | PC6  || C7   | PC2  | PC7  || C0   | Cx   | Freq 
   0|   0|   0|  0.00|  0.00|  0.00|  0.00||  0.00|  0.00|  0.00||  0.60| 99.40|  2398
   0|   0|  16|  0.00|  0.00|  0.00|  0.00||  0.00|  0.00|  0.00||  0.49| 99.51|  2398
   0|   1|   1|  0.00|  0.00|  0.00|  0.00||  0.00|  0.00|  0.00||  0.47| 99.53|  2398

從這裡就可以約略了解相關的 CPU 時脈運作!如果想要知道 CPU 時脈運作的機制,也能這樣查詢:

[root@node8 ~]# cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 1.20 GHz - 2.80 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 1.20 GHz and 2.80 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 2.40 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
    2500 MHz max turbo 4 active cores
    2700 MHz max turbo 3 active cores
    2800 MHz max turbo 2 active cores
    2800 MHz max turbo 1 active cores

上述伺服器中,預設使用的 CPU 機制為 performance,如果想要省電的話,就改成 powersave 即可!例如:

[root@node8 ~]# cpupower frequency-set -g powersave
Setting cpu: 0
....

事實上,performance 與 powersave 差異不大,只是 performance 隨時都是讓 CPU 在比較高的時脈,稍微耗電一點, powersave 可以讓 CPU 時脈降低,不過需要用到運算能力時,還是會提昇時脈來加速!並不會讓系統一直維持在低耗電,而導致效能降低。 因此,一般系統確實建議可以使用 powersave。

  • 關於主機

主機的配備很多,包括 CPU, 記憶體, 主機板, 主機板晶片組等等。如果需要了解到所有的晶片組,可以使用 lspci 這個指令來查詢。 舉例來說,我們的虛擬機器就有這些配備:

[root@station200 ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Red Hat, Inc. QXL paravirtual graphic card (rev 04)
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc. Virtio block device
00:05.0 RAM memory: Red Hat, Inc. Virtio memory balloon
00:06.0 Audio device: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition ...
00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03)
00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03)
00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)
00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)

第一個欄位是匯流排的相關排序,例如 00:03.0 就是我們網路卡的匯流排,也是網路卡 ens3 那個 3 的原因。 更詳細的資料可以使用 lspci -vv 去查詢,例如,如果想查詢網路卡的其他資訊,可以這樣做:

[student@station200 ~]$ lspci -vv -s 00:03.0
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
        Subsystem: Red Hat, Inc. Device 0001
        Physical Slot: 3
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- ...
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <M....
        Latency: 0
        Interrupt: pin A routed to IRQ 10
        Region 0: I/O ports at c060 [size=32]
        Region 1: Memory at f6020000 (32-bit, non-prefetchable) [size=4K]
        Expansion ROM at f6030000 [disabled] [size=64K]
        Capabilities: <access denied>
        Kernel driver in use: virtio-pci

如果覺得 lspci 的匯流排輸出不夠直覺,也能使用 dmidecode 去查詢喔:

[root@station200 ~]# dmidecode -t
dmidecode: option requires an argument -- 't'
Type number or keyword expected
Valid type keywords are:  # 可以加的參數有底下這些喔!
  bios
  system
  baseboard
  chassis
  processor
  memory
  cache
  connector
  slot

[root@station200 ~]# dmidecode -t memory
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.4 present.

Handle 0x1000, DMI type 16, 15 bytes
Physical Memory Array
        Location: Other
        Use: System Memory
        Error Correction Type: Multi-bit ECC
        Maximum Capacity: 2 GB
        Error Information Handle: Not Provided
        Number Of Devices: 1

Handle 0x1100, DMI type 17, 21 bytes
Memory Device
        Array Handle: 0x1000
        Error Information Handle: 0x0000
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 2048 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM 0
        Bank Locator: Not Specified
        Type: RAM
        Type Detail: None

你也可以 man dmidecode 去找到 -t 可以使用的類型來查詢即可。由於我們是虛擬機器,所以查詢到的東西很多都怪怪的。 如果是實體機器,就會看到主機板製造商、晶片組型號等等資料囉。

  • IPMI Tool 與 lm_sensors

許多的伺服器硬體上面會涵蓋一個 ipmi 智慧平台管理界面,這個 IPMI 界面很有趣,他其實就是一個主機上面的小系統, 還能在系統沒有開機的情況下,提供這個 ipmi 的管理界面,讓管理員可以在遠端開機管理耶!相當神奇! 如果你的伺服器具有 ipmi 界面的話,可以安裝 ipmitool 軟體來進行管理:

[root@station200 ~]# yum install ipmitool
[root@station200 ~]# ipmitool sensor
Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory

我們的系統沒有 ipmi,所以就沒有提供相關的裝置資料,否則的話,就可以列出一大堆 sensor 資料!包括 CPU 與晶片組的溫度偵測資訊等, 相當豐富喔!那,如果沒有 ipmi,就不能讀取主機板上面的資訊嘛?其實是可以的!可以透過 lm_sensors 這個軟體來協助喔!

[root@localhost ~]# yum install lm_sensors

[root@localhost ~]# sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +37.0°C  (high = +80.0°C, crit = +98.0°C)
Core 0:        +35.0°C  (high = +80.0°C, crit = +98.0°C)
Core 1:        +36.0°C  (high = +80.0°C, crit = +98.0°C)
Core 2:        +36.0°C  (high = +80.0°C, crit = +98.0°C)
Core 3:        +37.0°C  (high = +80.0°C, crit = +98.0°C)

同樣的,我們的虛擬機器無法偵測,但是實體機器就能夠至少偵測出 CPU 的溫度喔!

14.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
例題 14.2-1: 使用 timedatectl 指令管理系統的時區、時間等任務
  1. 使用 timedatectl 設定時區成為『 America/New_York 』,並且輸出設定後的結果瞧瞧。
  2. 將時區改回台北『 Asia/Taipei 』
  3. 將時間修訂為正確的時間
參考解答:
  1. timedatectl; timedatectl set-timezone America/New_York; timedatectl
  2. timedatectl set-timezone Asia/Taipei; timedatectl
  3. timedatectl set-time "2020-06-05 16:21"; timedatectl
  • 透過持續網路校時功能 (用戶端功能)

讀者應該會發現到現今的作業系統大多可以保持正確的時間,再也無須進行手動校時。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 時間狀況,可以查詢來源 (sources) 看看:

[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 系統就能夠持續的更新時間了。未來我們上課時,時間應該就會是正常的囉!

14.3: 語系安裝/設定 (langpack)

要查詢語系資料,可以使用之前稍微提過的 localectl list-locales 查詢,不過,由於系統安裝時,我們只有選擇英文與中文語系, 所以目前並沒有其他國家的語系資料可以切換。如果以亞洲人來說,你想要有日文與韓文界面的話,就得要安裝語文包, 先來查詢語文包吧!

[root@station200 ~]# yum search langpack | grep -i korea
Last metadata expiration check: -1 day, 16:24:35 ago on Sat 06 Jun 2020 12:02:39 AM CST.
langpacks-ko.noarch : Korean langpacks meta-package
libreoffice-langpack-ko.x86_64 : Korean language pack for LibreOffice

[root@station200 ~]# yum search langpack | grep -i japan
Last metadata expiration check: -1 day, 16:24:44 ago on Sat 06 Jun 2020 12:02:39 AM CST.
langpacks-ja.noarch : Japanese langpacks meta-package
libreoffice-langpack-ja.x86_64 : Japanese language pack for LibreOffice

[root@station200 ~]# yum install langpacks-ko.noarch langpacks-ja.noarch \
> glibc-langpack-ja.x86_64 glibc-langpack-ko.x86_64

安裝完畢之後,就可以開始使用 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

這個是整體設定值,如果需要個別的桌面環境,就得要自行於圖形界面裡面切換了!

14.4: 例行工作排程

Linux 系統的工作非常的多,管理員總是希望系統可以自行管理自己,這樣維護系統會比較輕鬆。而自動排程的方式有兩種,分別是:

  • 單一執行一次,執行完畢後該工作則被捨棄;
  • 一直循環不停的工作

在預設的情況下,Linux 系統提供的上述兩種工作排程,最小的時間解析度為分鐘,最大的時間解析度為一年內。

  • 單次工作排程: at

單次循環工作可使用『 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 輸出的最前面字元的數字。

例題 14.4-1:假設你的系統因為所在環境的電力維護問題,因此需要在今年底的 12 月 31 日 17:30 關機,該如何進行?
  1. 由於在前 30 分鐘要通知,因此建議在 20XX-12-31 17:00 就執行 at
  2. 最後再使用 poweroff 的方式來關機即可。

那如果與當前時間有關系的設定,可以這樣做:

例題 14.4-2: 假設上課啟動系統之後,你預計 4 個小時候就進行關機,這樣假如忘記關電腦就離開教室也就沒關係了,該如何處理?
  • 循環工作排程: crontab

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

例題 14.4-3: 用戶執行 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/* 當中。 舉例來說,如果每天都需要進行自動升級的行為,意即是 yum -y update 時,可以這樣設定:

[root@localhost ~]# vim /etc/crontab
0 2 * * 0 root /usr/bin/yum -y update

與一般用戶的 crontab -e 指令不同,管理員還需要指定『執行該指令的用戶身份』為何較佳。讀者也可以將上述的設定寫入成為一個檔名, 然後將該檔案放入 /etc/cron.d 目錄中即可。此外,系統也已經指定了一些特定時間會執行的目錄,使用者也能夠自己撰寫腳本後, 將該腳本寫入下列的目錄中即可。

  • /etc/cron.hourly/:內容為每小時進行一次的工作
  • /etc/cron.daily/:內容為每天進行一次的工作
  • /etc/cron.weekly/:內容為每周進行一次的工作
  • /etc/cron.monthly/:內容為每月進行一次的工作

14.5: 副檔名、檔案的壓縮與打包

  • 關於副檔名的功能

在 windows 作業系統中,以小數點隔開成前半段與後半段的檔名中,後半段的檔名被稱為副檔名。在 windows 環境下,每個副檔名是有其用途的。 常見的副檔名與搭配的軟體之間的關係是這樣的:

  • .doc, docx, .ppt, .pptx, .xls, .xlsx :Microsoft Office 相關軟體的資料檔
  • .odt, .ods, .odg :開放文檔格式 (Open document format, odf),為 libreoffice 常用的文檔格式
  • .rar, .zip, .z7 :windows 底下常見的壓縮檔案
  • .jpg, .bmp, .png, .svg :圖片檔案格式
  • .mp4, .avi, .wmv, .rmvb :多媒體影片格式
  • .htm, .html :網頁檔案格式
  • .exe, .com. .dll, .bat :常見的執行檔

在 windows 底下,一個檔案用滑鼠雙擊之後,他會以什麼軟體打開或是否能夠自行執行都與副檔名有關系!另外,你也可以對檔名額外加上某些權限, 讓該檔案具有比較特別的執行權等。不過,基本上,檔案的使用是以副檔名作為最明顯的判斷。某些副檔名你沒有辦法使用, 最可能的原因就是你的系統並沒有安裝該檔案的執行軟體之故。

與 Windows 不同,Linux (Unix like) 的檔名與能否執行或能不能被某些軟體所啟動是沒有關係的!檔名就只是檔名, 能不能執行完全與檔案的權限有關,跟檔名本身關係不大。不過,為了判斷某些檔案的資料內容,因此副檔名還是有其存在的必要性。 例如某些程式編輯器,主要就是透過副檔名來理解程式的語法!而事實上,Linux 上面的副檔名經常是為了要讓人們知道該檔名內可能含有的資料內容為何而已。 因此,如果需要知道該檔案的詳細資料,最好還是透過『 file 』這個指令來查詢較好。

  • 壓縮指令的應用

許多時刻讀者應該會進行檔案系統的壓縮與打包,讓系統的備份資料或者是減少資料的使用空間。同時,程式設計師在網路提供資料時, 為了降低頻寬使用率,更好的壓縮比會是資料壓縮的考量選項之一。

在 Linux 環境下,常見的壓縮指令有:gzip, bzip2, xz 三種,這三個指令主要的目的為壓縮單一檔案而已。但預設的情況下, 被壓縮的檔案會遺失而僅存在被壓縮完成之後的壓縮檔,除非使用 -c 的選項搭配資料流重導向,方可原始檔案與壓縮檔案同時存在。

例題 14.5.-1:測試不同壓縮指令的壓縮比
  1. 進行大型檔案的複製工作:
    • 前往 /dev/shm 建立 zip 目錄,並成為工作目錄
    • 將 /etc/services 這個檔案複製到本目錄下
    • 將工作目錄下的檔案複製成為 filename.1, filename.2, filename.3 三個檔案
  2. 進行大型檔案壓縮的功能:
    • 分別使用 gzip, bzip2, xz 對 filename.1, filename.2, filename.3 進行壓縮
    • 使用 ll 觀察檔案的容量,判斷一下那一個指令的壓縮比最好。
  3. 進行解壓縮
    • 最終再以 gzip, bzip2, xz 搭配 -d 選項,將剛剛的壓縮檔解開
  • 使用 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)。

例題 14.5-2: 使用 tar 的應用方式
  1. 再用 gzip 支援的壓縮功能,將 /etc 壓縮成為 etc.tar.gz
  2. 再用 bzip2 支援的壓縮功能,將 /etc 壓縮成為 etc.tar.bz2
  3. 先使用 file 確認 etc.tar.* 所支援的壓縮指令為何
  4. 分別將 etc.tar.xz 在本目錄與 /tmp 目錄解開。

14.6: rsync 異地備份

使用 rsync 的功能相當簡單!如果想要備份所有的資料,使用『 rsync -av 來源 目標 』這樣的語法就好了!目標必須要是目錄,來源則是你想要備份的資料了。

底下的動作請用 root 的身份來進行,目標是將 /etc, /root, /home, /var/spool/mail 等三個目錄進行備份,備份到 /backups/systems/ 裡面去:
  1. 先建立 /backups/systems/ 這個目錄
  2. 以 rsync 將預計備份的三個目錄完整的複製到剛剛建立的 systems/ 目錄內 (需要注意的是,如果要備份目錄本身,則不可以加上 / 在結尾, 否則會出現錯誤。例如 rsync -av /etc/ /target 與 rsync -av /etc /target 的結果會不一樣喔!)
  3. 重複一次上述的指令,會出現什麼狀況?
  4. 使用 vim 到 /root 底下新建一個名為 readme 的檔案,內容隨便寫。
  5. 再次的 rsync 備份,結果又會出現什麼狀況?
  • 遠端備份的 rsync 搭配 ssh 處理的方式

某些時刻,我們會擔心本機的硬體損毀,造成資料無法儲存的問題,所以,經常會使用第二種裝置來進行複製的行為, 例如,以外接式裝置來到伺服器備份資料。不過,若能透過網路的功能,搭配 rsync 的話,就可以在兩部主機之間備份了。 那如何處理呢?可以透過 ssh 的功能,來達成 rsync 在不同主機間的資料同步行為。

[root@station200 ~]# rsync -av -e ssh student@172.16.160.200:/etc/sysconfig /dev/shm
student@172.16.160.200's password:
請用 root 的身份,將同學的 /backups/systems 的資料備份到本機的 /remote/ 目錄底下去!

14.7: 課後練習

作業上傳時的注意事項:

  1. 伺服器的詳細資料,以及相關傳輸軟體設定,請參考第一章的 1.5 節的內容。
  2. 可以使用 MS office 的 word 或者是 libreoffice 的 writer 等軟體來撰寫你的作業,作業檔名可以使用 .doc, .docx 或者是 .odt 或者是 pdf 等格式,均可接受。
  3. 若作業中有圖檔,請將圖檔降低水平解析度到 800 像素以下再貼到文章中,檔案容量以不超過 2Mbytes 為限。
  4. 檔名請設定為: os_4XXXCYYY_unit14.doc (4XXXCYYY 是你的學號,請填正確,有分大小寫,請確認)
  5. 請上傳到你家目錄底下的 os 目錄中 (若不存在,請自行建立該目錄)

開始本章節題目:

  1. 使用編輯 /etc/crontab 的方式設定例行工作排程,讓系統每隔 5 分鐘就將 cpupower monitor 的結果輸出到 /var/www/html/mycpu.txt 去。 設定完畢後,請利用『 cat /etc/crontab 』將結果截圖貼上。
  2. 將 /etc /root /home /var/log 等目錄打包成為 /exbackups/20XX-MM-DD.tar.bz2,請寫下 (1)執行的指令,並且實際執行後, (2)輸入『 ll /exbackups/20*; file /exbackups/20* 』,將結果截圖貼上