第 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 --help 找出 (1)如何列出PID (2)跟使用者身份相關 的參數;
- 請使用上面找到的參數,直接輸入系統,去查看 (1)是否有 PID (2)是否身份可能有任何切換(ps. 系統預設所有的資源都是 root 的)
- 搭配 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 與記憶體資源等資訊。
- 使用『 man ps 』找到『 EXAMPLE 』的項目,看看能不能查詢到兩種方式,一種是『 ps -eF 』,一種是『 ps -eo...』, 查詢完畢之後,可以使用『 q 』離開 man (manual) 的查詢畫面
- 嘗試使用 ps -eF 觀察輸出的結果
- 如果想要客製化輸出,可以使用『 ps -eo pid,ni,pri,ppid,pcpu,args 』等方法實做
- 透過 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 秒鐘會更新一次~執行結果如下:
基本上,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 刪除該程序,會造成什麼後果?測試看看。
父程序不見了,子程序可能會不見,也可能變殭屍,反正,你都不能控制了!
- 使用程序樹觀察方式,查出 PID 1 號是哪隻程式達成的?
- 承上,找出 rsyslog 的 PID 是幾號呢?
- 使用『 ps -l 』你有看到你的程序是由哪隻程式執行所達成的呢?
- 找出啟動 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
- 有一個名為 rpcb??? 的軟體,我忘記該軟體全名了,只知道前面為 rpcb,可以幫我找出可能的檔名嘛?
- 我們經常使用的 /etc/crontab 這個檔案,請問這個檔案是哪個軟體提供的?
- 承上,該軟體的功能是什麼?
- 使用 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 』,就會看到如下的狀態:
- 服務的關閉與永不開啟
服務的啟動分兩階段,一個是立刻啟動,一個是下次開機啟動。關閉一樣,立刻關閉 (stop) 與下次開機不會啟動 (disable), 也一樣是透過 systemctl 來管理的!
# 關閉 vsftpd 吧 [root@localhost ~]# systemctl stop vsftpd # 立刻關閉 [root@localhost ~]# systemctl disable vsftpd # 下次開機也不會啟動這個服務
- 請觀察系統的網路埠口啟動狀態,並且找出以 avahi 為開頭的網路服務
- 使用『 systemctl list-units | grep '關鍵字' 』的方式,將上一題找到的關鍵字帶入
- 將上述找到的服務關閉,並且下次開機也不會被啟動。
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
- 透過 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
- 使用『 echo 'hello world' | mail -s 'check' root 』這個指令進行郵件轉寄
- 以 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 就是解壓縮!去找一下吧!
- 透過 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
- 將 /etc 整個打包成為 /dev/shm/unit03/etc.tar.bz2
- 將 /dev/shm/unit03/etc.tar.gz 在 student 家目錄底下解開
3.6: 本日練習
現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!
- 完成底下的實做與查詢,並將查詢到的結果寫入 /home/student/ans03.txt 文字檔內:
- 第一行請寫下你的姓名與學號 (姓名簡單用英文寫即可)
- PID 為 1 的程序名稱為何?
- crond 這隻程序的 PID 為何?
- 找出 port 69 (或 port 68) 這個 port 啟動的程式名稱是甚麼
- 系統有沒有名為 irqbalance 的程序正在執行?寫下他的 PID
- 承上,將上述的 PID 使用 kill 刪除!
- 系統經常用來紀錄『登入』時的登錄檔檔名為何?
- 進行底下的實做:
- 將剛剛找到的 crond 的程序,將他的 NI 值改設定成為 7
- 將剛剛安裝的 vsftpd 移除
- 服務的啟動與關閉
- 安裝名為 squid 的軟體
- 立刻啟動該軟體
- 下次重新開機後,該軟體也會持續啟動。
- 資料檢查:
- 請按右上角的設定,去啟動網路
- 使用 ifconfig 這個指令,找出你的 IP 後,告訴老師你的 IP 號碼 (例如 172.16.8.8),老師會線上檢查你是否完成作業了!
3.7: 課後練習
請撰寫一個 word 檔案,檔名為:『 unit03-A050cxxx-你的名字.docx 』,內容回答下列問題,然後每週作業上傳到對應的 EP 上面去:
- 回答下列問題:
- 程式(program) 與程序(process) 有什麼差別?
- 終端機界面下,查詢整個程序樹的指令,同時輸出 PID ,可以使用什麼指令搭配什麼選項?
- 承上,透過該程序樹指令,同時要找到 bash 關鍵字的那一行資料,可以如何下達指令? (可以搭配 grep 喔!)
- 全系統詳細程序資訊的靜態觀察,可以使用 ps 搭配什麼選項
- 如果要動態觀察程序,且每 2 秒鐘更新一次螢幕,可以如何下達指令?
- 如何觀察目前系統已經啟用的網路服務監聽埠口?亦即,指令如何下達?
- 假設有個 PID 號碼為 1000,你想要刪除這個程序,可以如何下達指令?
- 假設你要將 PID 號碼為 2000 程序的 NI 值調整成為 10 ,應該如何下達指令?
- 有個指令名稱為『 sleep 1h 』,你想讓這個指令以 NI 值為 7 去操作,該如何下達指令?
- 你想安裝一個名為 vsftpd 的軟體,該如何下達指令?
- 你想知道 /usr/sbin/ifconfig 是哪個軟體提供的,該如何下達指令?
- 服務的啟動與關閉:假設你想要啟用一個名為 httpd 的軟體時,該如何處理?依序寫下應該要進行的動作,
然後將該動作直接在你的系統上面實做。
- 安裝:
- 啟動:
- 開機啟動:
- 最終,請執行『 systemctl status httpd 』並將執行的結果貼上來。
- 檔案的打包處理:
- 上課談到的壓縮指令,常見的有哪些指令?
- 請將你系統的 /home 整個打包成為 /root/myhome.tar.gz 這樣的格式
- 最終請執行『 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 天,你的打字就會嚇嚇叫了!