Linux伺服器 Linux伺服器

伺服器建置實務上課教材

伺服器建置實務 > 課程內容 > 第 3 堂課 - 程序觀察、軟體安裝、服務啟動、登錄檔查詢

第 3 堂課 - 程序觀察、軟體安裝、服務啟動、登錄檔查詢

上次更新日期 2018/10/11

大致摸了 Linux Server 的相關檔案資訊、權限資料以及基礎的指令操作行為後,接下來讓我們來管理一下伺服器本身的許多重要資源。 包括程序的觀察、軟體的安裝與移除、網路服務的啟動與關閉還有觀察、發生錯誤時在登錄檔的紀錄資料觀察等等, 這都是進行伺服器管理的時候,很重要的工作喔!

  • 3.1: 程序的觀察與基本管理
  • 3.2: 軟體的安裝與移除
  • 3.3: 服務的啟動與關閉
  • 3.4: 登錄檔的簡易查詢
  • 3.5: 檔案的打包、壓縮與解壓縮
  • 3.6: 本日練習
  • 3.7: 課後練習

3.1: 程序的觀察與基本管理

我們在第 0 堂課談到的那個 Server 的圖示當中,講到要有 (1)硬體的支援然後 (2)作業系統驅動與操作硬體 (3)伺服器程式的啟動, 這樣才能夠讓你的 Server 真的是網路伺服器。因此,伺服器程式就得要『被啟用』才行。而一隻程式 (就是一個或一組執行檔) 其實是一個 (或一組) 檔案。

  • 程式 (program) 與程序 (process) 的差別

這個檔案被觸發執行 (不論是滑鼠點擊執行,還是用指令敲擊執行,都算觸發執行),程式碼與相關的權限就被載入到主記憶體當中, 在主記憶體當中被視為一個連續的單位,並且讓作業系統掌控她。這個在記憶體內可以運作的單位,那就是『程序 (process)』!

簡單的說,程序 (process) 與程式 (program) 的差別:

  • 程式:放在儲存媒體上,以檔案的型態存在的資料。
  • 程序:當程式被執行後,會在記憶體裡面產生一個區塊,存放這些可以運作的程式碼與資料,就是所謂的程序。

所以,程式是在硬碟中,程序是在記憶體當中!兩者差很多!另外,我們想要知道程式放在哪裡,或者是相關的功能,可以透過觀察檔名, 以及檔名的相關權限屬性來理解,說穿了,就是透過 ll 或者是 file 來認識檔案的內容與格式。那麼程序 (process) 該如何運作與控制呢?

程序在被觸發而載入到記憶體中的時候,作業系統為了要控制它,於是就給予該程序一個識別碼,稱為程序識別碼 (Process ID, PID)。 該 PID 能做的事情就與該 PID 內的程式碼、資料與啟用者的權限有關囉!也就是說,作業系統執行時,其實是認識 PID 啦! 透過 PID 來操作與控制系統啦!

  • 全系統程序樹的靜態觀察:使用 pstree

就跟檔案系統在 Linux 底下一定是從根目錄 (/) 開始堆疊起來,在 windows 則是『本機:\』開始堆疊起來相同的道理,程序不能獨立存在, 程序也是被上層程序 (父程序) 觸發所啟動的,因此就有所謂的程序樹 (process tree)。簡單的執行方法可以使用 pstree 來觀察即可:

[student@localhost ~]$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
.....
        ├─gdm─┬─Xorg───8*[{Xorg}]
        │     ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───2*[{abrt-applet}]
        │     │                 │               ├─gnome-settings-───4*[{gnome-settings-}]
        │     │                 │               ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │     │                 │               │             │             ├─ibus-engine-sim───2*[{ibus-engine-sim}]
        │     │                 │               │             │             └─2*[{ibus-daemon}]
        │     │                 │               │             └─22*[{gnome-shell}]
...
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        └─wpa_supplicant

鳥哥中間做了許多的截圖,節省空間。不過,這樣的觀察並沒有找到 PID 與使用者資訊,在觀察上有點不足!所以,請進行如下的練習:

讓你的 pstree 輸出更好觀察:
  1. 請使用 pstree --help 找出 (1)如何列出PID (2)跟使用者身份相關 的參數;
  2. 請使用上面找到的參數,直接輸入系統,去查看 (1)是否有 PID (2)是否身份可能有任何切換(ps. 系統預設所有的資源都是 root 的)
  3. 搭配 grep 擷取指令,找出『 bash 』這個關鍵字的 PID 有哪些?
  • 全系統詳細程序資訊的靜態觀察:使用 ps aux

上面的 pstree 是個很簡單的觀察模式,只是, pstree 並沒有列出每個指令的詳細執行參數!有些時候我們需要查詢程序下達指令時的參數, 這時可能就得要使用 ps 這個萬用指令來處理了。ps 的參數非常多!其中我們管理員最常用的大概就是底下的參數了 (背下來這個參數使用方式!)

[student@localhost ~]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3 128232  6932 ?        Ss   10:25   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    10:25   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    10:25   0:00 [ksoftirqd/0]
....
postfix   1372  0.0  0.1  91236  3992 ?        S    10:25   0:00 qmgr -l -t unix -u
root      1374  0.0  1.6 292544 34420 tty1     Ssl+ 10:25   0:01 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-vv1bEo/database -seat seat0 -nol
ro
....

第一行比較重要的項目意義如下:

  • USER: 代表這個程序的擁有者身份
  • PID: 就是 PID 號碼
  • %CPU: 這個 PID 消耗 CPU 運算資源的百分比
  • %MEM: 這個 PID 使用 RAM 的百分比
  • VSZ, RSS: 都是記憶體容量相關
  • TTY: 是否使用了終端機界面
  • START: 啟動這個程序的時間
  • TIME: 這個程序實際花費掉的 CPU 時間
  • COMMAND: 就是啟動這個程序的完整指令

這樣你就可以看到一堆指令外帶的參數了,比較好了解啦!

完成底下的實做:
  • 透過 ps aux 的方式,配合 grep ,抓出關鍵字為 bash 的 PID、指令、耗用的 CPU 與記憶體資源等資訊。
進階實做技巧:
  1. 使用『 man ps 』找到『 EXAMPLE 』的項目,看看能不能查詢到兩種方式,一種是『 ps -eF 』,一種是『 ps -eo...』, 查詢完畢之後,可以使用『 q 』離開 man (manual) 的查詢畫面
  2. 嘗試使用 ps -eF 觀察輸出的結果
  3. 如果想要客製化輸出,可以使用『 ps -eo pid,ni,pri,ppid,pcpu,args 』等方法實做
  4. 透過 grep 的功能,以及上述 ps -eo 的方式,找出 bash 的 PID 以及 NI 還有 PRI 的數值
  • 進階觀察: NI 與 PRI

我們的系統有這麼多的程序,那麼哪一個程序比較重要?意思是說,當我的系統非常忙碌的時候,那麼主要的資源 (CPU, RAM) 要給哪一個程序來優先執行的意思。 這就牽涉到系統的設計了~在 Linux 的系統中,觀察程序的重要性,就是透過核心主動給予的優先序 (priority) 數值來處理。 例如剛剛上面的進階實做技巧中,透過 ps -eo ... 來找到的那個 pri 數值,就是優先序。

優先序 (PRI) 數值越低,代表該程序越重要!越高,代表該程序會比較慢執行完畢 (系統資源不足的時候)。但是 PRI 是系統主動提供的, 因此你不能動它。那如果你想要讓某程序變得重要,該如何處理?可以透過 NI (nice) 數值來改變。基本上的設計方式為:

  • PRI(new) = PRI(old) + NI

所以, nice 值小於 0 時,可以降低 PRI,因此會讓該程序變得重要。而 nice 大於 0 時,則會將 PRI 提昇,結果將使得程序的重要性變低了。 那該如何改變 NI 呢?基本上有兩種方式:

  • 新的指令:『 nice -n [數值] 指令 』
  • 已存在的程序:『 renice -n [數值] PID 』

另外, nice 值為 -20 ~ 19 之間 (nice --help 或 renice --help),但是一般帳號只能給正值,負值只有 root 可以設定喔! 也就是說,只有 root 可以隨意調配系統資源,一般帳號只能讓自己的程序變得更不重要...

# 1. 使用 su - 切換身份成為 root,並且給予 NI 值為 5
[student@localhost ~]$ nice -n 5 su -

# 2. 觀察 NI 與 PRI 的變化
[root@localhost ~]# ps -eo pid,user,,ni,pri,args
  PID USER      NI PRI COMMAND
....
 2782 student    0  19 bash
....
 4760 root       5  14 su -
 4766 root       5  14 -bash             (需要這個 PID 的數值!)
 4814 root       0  19 [kworker/3:1]
 4860 root       0  19 sleep 60
 4862 root       5  14 ps -eo pid,user,ni,pri,args

# 3. 更改 root 自己的 bash 成為 nice 為 -10
[root@localhost ~]# renice -n -10 4766
4766 (process ID) old priority 5, new priority -10

[root@localhost ~]# ps -eo pid,user,ni,pri,args | grep bash
  811 root       0  19 /bin/bash /usr/sbin/ksmtuned
 1925 student    0  19 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
 2585 student    0  19 -bash
 2782 student    0  19 bash
 4766 root     -10  29 -bash   (這傢伙的 NI 與 PRI 都會改變)
 4903 root     -10  29 grep --color=auto bash
  • 全系統程序的動態觀察:使用 top

那如果想要如同 Windows 的工作管理員,程序會動態的變動,而不像 pstree 及 ps 只有靜態的顯示,該如何處理?可以使用 top 這個指令喔! top 預計每 5 秒鐘會更新一次~執行結果如下:

linux top

基本上,top 的資料非常多!最上方有 5 行資訊,每一行資訊的內容大致如下:

top - 14:15:03 up  3:49,  3 users,  load average: 0.00, 0.01, 0.05

指的是目前的時間 (14:15:03),開機多久了 (up 3:49),共有幾個用戶在系統上 (3 users), 系統的負載在 1, 5, 15 分鐘內的平均 (load average)。這個 load average 比較有趣!它指的是 CPU 切換工作的頻率。 舉例來說,如果有一個 job 被一直執行, load 就會是 1,不論這個 job 是否很消耗 CPU 運算資源。因此,如果你有 4 個 CPU 核心, 這個 load average 最好在 4 以下,效能會比較好。

Tasks: 217 total,   1 running, 216 sleeping,   0 stopped,   0 zombie

第 2 行指的是共有幾個工作 (Tasks: 217 total),共有幾個程序正在運作 (1 running),共有幾個程序是在昏睡的狀態 ( 216 sleeping), 幾個被暫停 ( 0 stopped),幾個變殭屍了 (0 zombie)。所謂的殭屍程序,指的是該程序應該終止了,但是卻無法被移除,仍持續保存在記憶體內活動, 這時就便殭屍程序。如果系統無法順利移除該殭屍程序,你可能得要重新開機才好。

%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

這個第 3 行才是 CPU 的運算功能消耗。那個 id (idle, 閒置) 當然是越高越好!那個 wa (I/O wait) 則是越低越好!若反過來呢? 代表你的硬體資源要升級了!

KiB Mem :  2047788 total,  1058148 free,   500524 used,   489116 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1327312 avail Mem

代表記憶體的資訊,上面列代表實體記憶體,下面列代表記憶體置換。free 越大以及第二列的 avail Mem 越大,代表你的記憶體才足夠! 如果觀察完畢要離開,請按下『 q 』即可!

完成底下的實做:
  • 使用 top --help 看看能不能改變更新的秒數 (sec)
  • 請每兩秒鐘更新一次畫面來啟用 top 指令。

鳥哥的系統非常忙碌的時候,會使用 top 去抓出 CPU 使用率最高的項目,然後再來分析可能的問題!

  • 觀察啟動網路埠口的程序:使用 netstat -tlunp

網路的埠口不會隨便自己啟用,一定是執行觸發某支程式之後,生成的程序來啟用埠口的。因此,如果你想要了解目前網路正在監聽的埠口, 可以使用 netstat,也能夠順道了解哪些程序會造成哪些埠口的啟用喔!相關的指令如下:(因為某些程序要有 root 權限才能觀察,因此,請使用 root 來觀察底下的資料!)

[root@localhost ~]# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Address      State       PID/Program name
tcp        0      0 0.0.0.0:111        0.0.0.0:*            LISTEN      1/systemd
tcp        0      0 0.0.0.0:22         0.0.0.0:*            LISTEN      1270/sshd
tcp        0      0 127.0.0.1:631      0.0.0.0:*            LISTEN      1251/cupsd
tcp        0      0 127.0.0.1:25       0.0.0.0:*            LISTEN      1370/master
tcp6       0      0 :::111             :::*                 LISTEN      1/systemd
tcp6       0      0 :::22              :::*                 LISTEN      1270/sshd
tcp6       0      0 ::1:631            :::*                 LISTEN      1251/cupsd
tcp6       0      0 ::1:25             :::*                 LISTEN      1370/master
udp        0      0 0.0.0.0:5353       0.0.0.0:*                        756/avahi-daemon: r
udp        0      0 0.0.0.0:46440      0.0.0.0:*                        756/avahi-daemon: r
[root@localhost ~]#

上面的 netstat 指令的選項內容可以這樣看:

  • -t :監測 tcp 封包
  • -u :監測 udp 封包
  • -l :查看監聽中的埠口
  • -n :用 IP 與埠口號碼顯示,而不是用主機名稱與服務名稱來顯示,速度較快
  • -p :同時顯示 PID 與達成的程式功能!

而輸出的資訊當中,你要注意的兩個欄位大概是『 Local Address 』以及『 PID/Program name 』這兩個欄位了!舉例來說,在輸出的第 4 列,亦即是如下這列:

tcp        0      0 0.0.0.0:22         0.0.0.0:*            LISTEN      1270/sshd

意思是,本機所有界面 (0.0.0.0) 都針對 22 號埠口啟動服務。而且,此埠口目前是由 PID 號碼為 1270 的 sshd 這隻程式所啟動的!

完成底下的問題:
  • 那麼本機埠口 631 是由 (1)哪一號 PID ,以及 (2)哪一隻程式所造成的埠口?
  • 本機埠口 111 號碼,又是由 (1)哪一號 PID ,以及 (2)哪一隻程式所造成的埠口?
  • 使用 kill -9 PID 或 killall -9 cmdname 刪除記憶體內的程序

如果想要管理某些程序,可以使用 kill 這個指令來處理即可。這個 kill 是比較可怕的指令,可以直接從記憶體將某些程序刪除! 使用時要特別注意!不要亂砍。

# 1. 找到 port 631 啟動的埠口號碼
[root@localhost ~]# netstat -tlunp | grep 631
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1251/cupsd
tcp6       0      0 ::1:631                 :::*                    LISTEN      1251/cupsd

# 2. 刪除該程序
[root@localhost ~]# kill -9 1251   (每個人的 PID 號碼不同!所以,不要輸入 1251 !請看自己的螢幕)

[root@localhost ~]# netstat -tlunp | grep 631
(再次執行,你會發現 631 埠口不見了!)
完成底下的實做:
  • 依據 pstree 的功能,找到 bash 的父程序,亦即是 gnoem-terminal 這個程序名稱的 PID 號碼。
  • 直接以 kill 刪除該程序,會造成什麼後果?測試看看。

父程序不見了,子程序可能會不見,也可能變殭屍,反正,你都不能控制了!

完成底下的練習:
  1. 使用程序樹觀察方式,查出 PID 1 號是哪隻程式達成的?
  2. 承上,找出 rsyslog 的 PID 是幾號呢?
  3. 使用『 ps -l 』你有看到你的程序是由哪隻程式執行所達成的呢?
  4. 找出啟動 port 為 22 的是那一隻程式所達成的呢?

3.2: 軟體的安裝與移除

我們的 Linux server (CentOS) 使用的是 RPM 的管理機制,這個管理機制使用的是 rpm 這個指令作為後台的管理!但是, rpm 目前大概只是用來進行查詢軟體而已, 並沒有直接拿來進行軟體管理了!雖然後台確實都是用 rpm 的。前台大概使用的都是 yum 指令!這個指令只要有網路存在的情況下, yum 就可以進行線上的升級、安裝、移除了!因此,你的 rpm 指令指需要記得, rpm 是用來查詢的,yum 才是用來軟體管理的!

  • 用 rpm 查詢系統上面的軟體

如果想要知道目前系統上面已經安裝了多少軟體,可以使用底下的指令來查詢:

[student@localhost ~]$ rpm -qa
....
rpm-4.11.3-21.el7.x86_64
geocode-glib-3.14.0-2.el7.x86_64
libxklavier-5.4-7.el7.x86_64

# 如果想要知道有沒有安裝名為 cups 的軟體,可以這樣做:
[root@localhost ~]# rpm -qa | grep cups
cups-filters-1.0.35-21.el7.x86_64
cups-pk-helper-0.2.4-5.el7.x86_64
cups-client-1.6.3-26.el7.x86_64
cups-filters-libs-1.0.35-21.el7.x86_64
cups-1.6.3-26.el7.x86_64              (來看他!)
cups-libs-1.6.3-26.el7.x86_64
python-cups-1.9.63-6.el7.x86_64
ghostscript-cups-9.07-20.el7.x86_64
gutenprint-cups-5.2.9-18.el7.x86_64
cups-filesystem-1.6.3-26.el7.noarch

假設我們要找的是那個『 cups-1.6.3-26.el7.x86_64 』軟體,這個軟體的檔名可以這樣看:

  • 軟體名稱: cups
  • 軟體版本: 1.6.3-26.el7
  • 軟體適用的系統等級: x86_64 ,亦即 64 位元的系統

找到軟體之後,想要知道這個軟體的功能與意義,可以這樣查:

[student@localhost ~]$ rpm -qi cups
Name        : cups
Epoch       : 1
Version     : 1.6.3
Release     : 26.el7
Architecture: x86_64
Install Date: 西元2017年01月03日 (週二) 22時24分17秒
Group       : System Environment/Daemons
Size        : 4835016
License     : GPLv2
Signature   : RSA/SHA256, 西元2016年11月21日 (週一) 01時28分38秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : cups-1.6.3-26.el7.src.rpm
Build Date  : 西元2016年11月06日 (週日) 03時09分13秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.cups.org/
Summary     : CUPS printing system
Description :
CUPS printing system provides a portable printing layer for
UNIX® operating systems. It has been developed by Apple Inc.
to promote a standard printing solution for all UNIX vendors and users.
CUPS provides the System V and Berkeley command-line interfaces.

最底下那幾列就是在說明 cups 的功能!那麼 cups 軟體提供哪些檔案呢?可以這樣查:

[student@localhost ~]$ rpm -ql cups
/etc/cups
/etc/cups/classes.conf
/etc/cups/client.conf
.....
/var/run/cups/certs
/var/spool/cups
/var/spool/cups/tmp

最後,如果你的 /etc/cups/client.conf 這個檔案被刪除了,你想要知道這個檔案所屬的軟體名稱,可以這樣做:

# 很特別!從檔名去找到附屬的軟體喔!
[student@localhost ~]$ rpm -qf /etc/cups/client.conf
cups-1.6.3-26.el7.x86_64
完成底下的實做:
  1. 有一個名為 rpcb??? 的軟體,我忘記該軟體全名了,只知道前面為 rpcb,可以幫我找出可能的檔名嘛?
  2. 我們經常使用的 /etc/crontab 這個檔案,請問這個檔案是哪個軟體提供的?
  3. 承上,該軟體的功能是什麼?
  • 使用 yum 搜尋軟體

yum 可以幫我們找到相關的軟體名稱,並進一步來進行安裝!底下是一個簡單的範本!我想要安裝簡單的動畫眼睛,我知道軟體名稱應該是 xorg-x11-app, 但全名忘記了!該如何查詢、安裝呢?

# 1. 一定要用 root 的身份才能夠在系統上面安裝軟體!
[student@localhost ~]$ su -

# 2. 一定要有網路才能操作 yum 喔!
[root@localhost ~]# ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:85:b1:54 brd ff:ff:ff:ff:ff:ff
    inet 172.16.233.1/16 brd 172.16.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7898:7783:fb1f:1e0f/64 scope link
       valid_lft forever preferred_lft forever
# 如果沒有啟動網路,請按下右上角的倒三角形去自己處理處理!

# 3. 透過 yum 指令,查詢有沒有存在 xorg-x11-app 為名的軟體存在?
[root@localhost ~]# yum search xorg-x11-app
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
 * base: ftp.ksu.edu.tw
 * epel: ftp.yzu.edu.tw
 * extras: ftp.ksu.edu.tw
 * updates: ftp.ksu.edu.tw
=========================== N/S matched: xorg-x11-app =====================
xorg-x11-apps.x86_64 : X.Org X11 applications

  Name and summary matches only, use "search all" for everything.

# 4. 開始安裝這個軟體囉!
[root@localhost ~]# yum install xorg-x11-apps.x86_64
# 期間會按下幾次 y 吧!然後就可以自己安裝嚕!

# 5. 在本機上面用 rpm 檢查這個軟體的附屬檔案有哪些?
[root@localhost ~]# rpm -ql xorg-x11-apps.x86_64
/usr/bin/luit
/usr/bin/oclock
/usr/bin/x11perf
/usr/bin/x11perfcomp
/usr/bin/xbiff
/usr/bin/xclipboard
/usr/bin/xclock
/usr/bin/xconsole
/usr/bin/xcursorgen
/usr/bin/xcutsel
/usr/bin/xdpr
/usr/bin/xeyes
/usr/bin/xfd

# 6. 在圖形界面的環境下,輸入底下的指令來看看:
[root@localhost ~]# xeyes
  • 使用 yum 進行全系統升級

要進行全系統升級也很簡單,升級的英文有點像『 update 』,因此,全系統升級有點像這樣 (會花很多時間!注意一下!)

[root@localhost ~]# yum update
  • 軟體的移除

軟體的移除就使用『 yum remove 軟體名稱 』即可。

回答下列問題:
  • 系統升級完畢需要重新開機嘛?
  • 安裝完畢重新開機時,會有一個多層選單,請問那是什麼?
  • 承上,核心的驅動程式大部分是放在哪個目錄下? (/lib/modules 底下去看看)
  • 承上,目前系統啟動的核心版本是那一版? (uname --help)

3.3: 服務的啟動與關閉

系統有很多的服務,有的是網路服務,有的是本機提供登入的服務等等。這些服務的程式被啟動成為程序後,就會常駐在記憶體當中持續提供服務! 簡單的說,當啟動一組程式,這組程式會在背景底下持續工作,並且提供某些特別的服務 (例如網路服務、登入服務、圖形提供驗證服務等等), 這就被稱為『系統服務』。系統服務裡面有針對網路的功能,這就被稱為網路服務!我們得要啟動網路服務,你的 Linux 作業系統才會變成伺服器喔!

  • 服務的啟動與關閉

服務的啟動與關閉都是透過 systemd 統一管理的,而我們只能透過 systemctl 進行服務的啟動關閉與觀察等任務。 底下,我們讓你的系統變成一個 FTP 伺服器,來做個簡單的測試:

# 安裝一隻名為 vsftpd 的軟體
[root@localhost ~]# yum search  vsftpd   (你要能看到輸出的軟體名稱)
[root@localhost ~]# yum install vsftpd   (之後才能夠順利安裝的!)

# 啟動這個 vsftpd 的服務
[root@localhost ~]# systemctl start  vsftpd  # 立刻啟動
[root@localhost ~]# systemctl enable vsftpd  # 下次開機時,這個服務 "預設" 會啟動
[root@localhost ~]# systemctl status vsftpd  # 觀察服務 (注意 running 與 enabled)
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2018-10-08 15:32:40 CST; 9s ago
 Main PID: 8325 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─8325 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Oct 08 15:32:40 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
Oct 08 15:32:40 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.

# 觀察 vsftpd 這個 "網路服務" 所啟動的 port
[root@localhost ~]# netstat -tlunp
[root@localhost ~]# netstat -tlunp | grep vsftpd
tcp6       0      0 :::21                   :::*                    LISTEN      8325/vsftpd
  • 網路服務的檢查

剛剛我們已經啟用了 FTP 服務~那麼我們如何確認網路服務是正常的呢?就透過相關的用戶端軟體啊!以 FTP 來說, 常用的用戶端軟體其實是瀏覽器!因此,請打開瀏覽器,在網址列輸入『 ftp://localhost 』,就會看到如下的狀態:

linux FTP
  • 服務的關閉與永不開啟

服務的啟動分兩階段,一個是立刻啟動,一個是下次開機啟動。關閉一樣,立刻關閉 (stop) 與下次開機不會啟動 (disable), 也一樣是透過 systemctl 來管理的!

# 關閉 vsftpd 吧
[root@localhost ~]# systemctl stop    vsftpd  # 立刻關閉
[root@localhost ~]# systemctl disable vsftpd  # 下次開機也不會啟動這個服務
完成底下的實做:
  1. 請觀察系統的網路埠口啟動狀態,並且找出以 avahi 為開頭的網路服務
  2. 使用『 systemctl list-units | grep '關鍵字' 』的方式,將上一題找到的關鍵字帶入
  3. 將上述找到的服務關閉,並且下次開機也不會被啟動。

3.4: 登錄檔的簡易查詢

一般來說,你在系統上面所作的任何重大措施,系統都會主動的幫你記載下來!舉例來說,如果你想要知道在你的系統中, 誰瘋狂使用 su 這個切換身份的重要指令時,可以這樣做:

[root@localhost ~]# grep student /var/log/secure
Oct  8 15:06:01 localhost su: pam_unix(su-l:auth): authentication failure; logname=student uid=1000 euid=0 tty=pts/1 ruser=student rhost=  user=root
Oct  8 15:06:07 localhost su: pam_unix(su-l:session): session opened for user root by student(uid=1000)
|--日期時間---| |-主機--| |指令|                      |--訊息說明---

上面的第一列,是因為鳥哥輸入錯誤的密碼,導致認證失敗而被紀錄下來!至於第二次就成功了!不過,無論成功或失敗,因為 su 是很重要的一個指令, 所以,這些重要參數都會被記載下來的。上面的訊息語法大概紀錄的資訊是:

在什麼時候  哪一部主機產生的  哪一個服務的訊息  實際的訊息內容為何

那麼常見的登錄檔有哪些呢?大概底下就是比較重要的登錄資訊:

/var/log/secure    跟登入系統有關的資料 (輸入帳號密碼成功與否)
/var/log/maillog   跟郵件有關的訊息
/var/log/messages  幾乎所有的訊息都記錄在這邊

如果想要查詢使用者的登入資訊,也可以使用 last 這個指令來檢查:

[root@localhost ~]# last
student  pts/1        :0               Mon Oct  8 14:10   still logged in
student  pts/1        :0               Mon Oct  8 10:39 - 14:10  (03:30)
student  :0           :0               Mon Oct  8 10:25   still logged in

如果想要知道最近安裝的軟體,也可以這樣做:

[root@localhost ~]# tail /var/log/yum.log
檢查一下 /var/log/cron 的內容,看看裡面可能的訊息是什麼?
  • 透過 root 帳號收信

另外,系統如果出任何差錯,大概都會將訊息轉一份給 root 這個用戶的 email 信箱!因此,有時透過 root 去檢查一下信箱, 還是有需要的!請使用 root 的身份來執行底下的指令看看 (你不一定會有信件!)

[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 3 messages 3 new
>N  1 student@station10-10  Fri Sep 28 23:44  16/710   "*** SECURITY information for station10-101.gocloud.vm ***"
 N  2 student@localhost.lo  Tue Oct  2 22:59  16/686   "*** SECURITY information for localhost.localdomain ***"
 N  3 student@localhost.lo  Tue Oct  2 23:18  16/686   "*** SECURITY information for localhost.localdomain ***"
& 3
Message  3:
From root@localhost.localdomain  Tue Oct  2 23:18:45 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
To: root@localhost.localdomain
From: student@localhost.localdomain
Auto-Submitted: auto-generated
Subject: *** SECURITY information for localhost.localdomain ***
Date: Tue,  2 Oct 2018 23:18:45 +0800 (CST)
Status: R

localhost.localdomain : Oct  2 23:18:45 : student : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/student ; USER=root ; COMMAND=/bin/su -

& h  (重新再列一次信件標題)
 N  1 student@station10-10  Fri Sep 28 23:44  16/710   "*** SECURITY information for station10-101.gocloud.vm ***"
 N  2 student@localhost.lo  Tue Oct  2 22:59  16/686   "*** SECURITY information for localhost.localdomain ***"
>   3 student@localhost.lo  Tue Oct  2 23:18  16/686   "*** SECURITY information for localhost.localdomain ***"

& exit
完成底下的實做:
  1. 使用『 echo 'hello world' | mail -s 'check' root 』這個指令進行郵件轉寄
  2. 以 root 的身份進行 mail 指令操作,有沒有發現這封新信件?

3.5: 檔案的打包、壓縮與解壓縮

有時候我們要傳遞資料,得要透過壓縮指令來處理。在 windows 上面,你可能聽過 zip, 7z, rar 等等,而在 Linux 上面,我們最常使用 tar 這個指令。 而這個指令可以搭配 gzip, bzip2, xz 來進行壓縮!

  • gzip, bzip2, xz 壓縮

直接進行壓縮與解壓縮的動作:

# 1. 先以 student 身份,進行如下的動作,來將預先環境製作妥當:
[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ mkdir unit03
[student@localhost shm]$ cd unit03
[student@localhost unit03]$ cp /etc/services file1
[student@localhost unit03]$ cp /etc/services file2
[student@localhost unit03]$ cp /etc/services file3
[student@localhost unit03]$ ll
-rw-r--r--. 1 student student 670293 10月  8 16:06 file1
-rw-r--r--. 1 student student 670293 10月  8 16:06 file2
-rw-r--r--. 1 student student 670293 10月  8 16:06 file3

# 開始進行壓縮
[student@localhost unit03]$ gzip  file1
[student@localhost unit03]$ bzip2 file2
[student@localhost unit03]$ xz    file3
[student@localhost unit03]$ ll
-rw-r--r--. 1 student student 136085 10月  8 16:06 file1.gz
-rw-r--r--. 1 student student 123932 10月  8 16:06 file2.bz2
-rw-r--r--. 1 student student  99608 10月  8 16:06 file3.xz

你會發現到幾件事情:

  • 預設情況下, gzip, bzip2, xz 壓縮後,原有的檔案會消失,以副檔名 gz, bz2, xz 取代
  • 壓縮比 xz 最佳,時間以 gzip 花費最短。

至於解壓縮,你使用 gzip --help 就可以找到!注意, compress 是壓縮,而 decompress 就是解壓縮!去找一下吧!

請將上述的 file1.gz, file2.bz2, file3.xz 進行解壓縮吧!
  • 透過 tar 進行打包並壓縮

使用 gzip, bzip2, xz 只能進行單一檔案壓縮、解壓縮,無法將許多檔案包成一個檔案。此時只能使用 tar! tar 指令簡單的記憶方式如下:

  • 打包: tar -[zjJ]cv -f file.tar.[gz,bz2,xz] filenames...
  • 解包: tar -[zjJ]xv -f file.tar.[gz,bz2,xz] [-C dirname]
  • 查看: tar -[zjJ]tv -f file.tar.[gz,bz2,xz]
# 將 /etc/ 整個打包成為 /dev/shm/unit03/etc.tar.gz
[student@localhost ~]$ tar -zcv -f /dev/shm/unit03/etc.tar.gz /etc
[student@localhost ~]$ ll /dev/shm/unit03/etc*
-rw-rw-r--. 1 student student 4568520 10月  8 16:27 etc.tar.gz
完成底下的實做:
  1. 將 /etc 整個打包成為 /dev/shm/unit03/etc.tar.bz2
  2. 將 /dev/shm/unit03/etc.tar.gz 在 student 家目錄底下解開

3.6: 本日練習

現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!

  1. 完成底下的實做與查詢,並將查詢到的結果寫入 /home/student/ans03.txt 文字檔內:
    1. 第一行請寫下你的姓名與學號 (姓名簡單用英文寫即可)
    2. PID 為 1 的程序名稱為何?
    3. crond 這隻程序的 PID 為何?
    4. 找出 port 69 (或 port 68) 這個 port 啟動的程式名稱是甚麼
    5. 系統有沒有名為 irqbalance 的程序正在執行?寫下他的 PID
    6. 承上,將上述的 PID 使用 kill 刪除!
    7. 系統經常用來紀錄『登入』時的登錄檔檔名為何?
  2. 進行底下的實做:
    1. 將剛剛找到的 crond 的程序,將他的 NI 值改設定成為 7
    2. 將剛剛安裝的 vsftpd 移除
  3. 服務的啟動與關閉
    1. 安裝名為 squid 的軟體
    2. 立刻啟動該軟體
    3. 下次重新開機後,該軟體也會持續啟動。
  4. 資料檢查:
    1. 請按右上角的設定,去啟動網路
    2. 使用 ifconfig 這個指令,找出你的 IP 後,告訴老師你的 IP 號碼 (例如 172.16.8.8),老師會線上檢查你是否完成作業了!

3.7: 課後練習

請撰寫一個 word 檔案,檔名為:『 unit03-A050cxxx-你的名字.docx 』,內容回答下列問題,然後每週作業上傳到對應的 EP 上面去:

  1. 回答下列問題:
    1. 程式(program) 與程序(process) 有什麼差別?
    2. 終端機界面下,查詢整個程序樹的指令,同時輸出 PID ,可以使用什麼指令搭配什麼選項?
    3. 承上,透過該程序樹指令,同時要找到 bash 關鍵字的那一行資料,可以如何下達指令? (可以搭配 grep 喔!)
    4. 全系統詳細程序資訊的靜態觀察,可以使用 ps 搭配什麼選項
    5. 如果要動態觀察程序,且每 2 秒鐘更新一次螢幕,可以如何下達指令?
    6. 如何觀察目前系統已經啟用的網路服務監聽埠口?亦即,指令如何下達?
    7. 假設有個 PID 號碼為 1000,你想要刪除這個程序,可以如何下達指令?
    8. 假設你要將 PID 號碼為 2000 程序的 NI 值調整成為 10 ,應該如何下達指令?
    9. 有個指令名稱為『 sleep 1h 』,你想讓這個指令以 NI 值為 7 去操作,該如何下達指令?
    10. 你想安裝一個名為 vsftpd 的軟體,該如何下達指令?
    11. 你想知道 /usr/sbin/ifconfig 是哪個軟體提供的,該如何下達指令?
  2. 服務的啟動與關閉:假設你想要啟用一個名為 httpd 的軟體時,該如何處理?依序寫下應該要進行的動作, 然後將該動作直接在你的系統上面實做。
    1. 安裝:
    2. 啟動:
    3. 開機啟動:
    4. 最終,請執行『 systemctl status httpd 』並將執行的結果貼上來。
  3. 檔案的打包處理:
    1. 上課談到的壓縮指令,常見的有哪些指令?
    2. 請將你系統的 /home 整個打包成為 /root/myhome.tar.gz 這樣的格式
    3. 最終請執行『 ll /root/myhome.tar.gz; file /root/myhome.tar.gz 』,並將結果貼上來。

同場加映:不用上傳的資料,請 google 一下打字時,手指與鍵盤指法的對應,然後自由練習底下的資訊:

  • 小寫的 a~z (abcdefg...xyz) ,共打 10 次
  • 小寫的 0~9,a~z (012..89abcdefg...xyz) ,共打 10 次
  • 不要啟動大寫燈,用組合按鍵輸入 A-Z (ABCD...XYZ),共 10 次

每天上課各練一次,最慢 10 天,你的打字就會嚇嚇叫了!