2.3.6 YUM 套件管理
在 Linux 中,管理軟體的安裝或移除可以使用 RPM (Red Hat/Fedora/CentOS) 或 DPKG (Debian/Ubuntu),很方便但有一個缺點,就是因為軟體相依性的關係,原本你只想安裝 A 軟體,但是由於它相依其他 B、C、D 等等軟體,而必須先安裝 B、C、D,而 B、C、D 當中也可能相依其他軟體,造成安裝軟體的行為變得很繁鎖。
YUM (Red Hat/Fedora/CentOS) 或 APT (Debian/Ubuntu) 是一個套件管理程式,它可以幫你解決軟體安裝時相依性的問題,每個軟體都有自己的相依軟體清單,套件管理指令可以藉由這個清單,自動幫你完成軟體的安裝,包含升級及移除等功能。YUM 也可以更新 Linux 系統的核心。
YUM 指令是怎麼取得軟體的呢?首先會有一台 YUM 伺服器,當軟體釋出的時候,會將其放到 YUM 伺服器上,這樣當你搜尋的時候才找得到。某些軟體會放在 EPEL (Extra Packages for Enterprise Linux) 額外套件庫中,此 EPEL 由 Fedora 群組建立、維護及管理,可以提供 Fedora、RHEL (Red Hat Enterprise Linux) 及 CentOS 等作業系統使用,有時候你必須安裝 EPEL 才能找到你想安裝的軟體。
搜尋套件
yum search 關鍵字
# 關鍵字可以是概略的名稱,yum 會找出所有相關的套件,例如
yum search php70w
# 或是套件的描述
yum search PHP scripting language
查詢套件資訊
yum info 完整套件名稱
# 必須輸入完整套件名稱,否則會找不到,例如
yum info php70w
# 列出所有可以更新的套件資訊
yum info updates
# 列出所有已安裝的套件資訊
yum info installed
套件清單
# 列出伺服器上所有可以安裝的套件
yum list
# 通常不會這麼用,因為套件太多了,可以用關鍵字加上萬用字元來過濾
yum list php7*
# 只列出本機上已安裝,但是可以升級的套件
yum list updates
# 和 yum info updates 不同的是,它不會顯示詳細資料
# 只列出本機上已安裝的套件
yum list installed
# 一樣不會顯示詳細資料,只有套件名稱
安裝套件
yum install 完整套件名稱
# 套件名稱後的 .x86_64 可省略,它是表示此套件為 64 位元版本
# .i386 是 32 位元版本
# .noarch 表示沒有硬體上的限制
更新套件
yum update 完整套件名稱
# 如果不輸入完整套件名稱,表示要更新所有可以更新的套件
升級套件
yum upgrade 完整套件名稱
# 如果不輸入完整套件名稱,表示要升級所有可以升級的套件
yum upgrade
# 等同於
yum update --obsoletes
升級套件和更新套件的功能差不多,唯一的差別在於 upgrade
會將過時的套件移除並且安裝新版本,而 update
不會,過時的版本通常指主版本號的版次,例如從第 1.x 版換到第 2.x 版。有時候新版本可能無法正常在你目前的工作環境中執行,這時候就要考慮使用 update
來保留舊版本的套件,而不要強制升級到最新版本。
移除套件
yum remove 套件完整名稱
自動回答詢問
在安裝、更新或移除套件時,yum 可能會詢問你 yes/no,如果你不想浪費這些停頓的時間,你可以透過 -y 選項來預設以 yes 回答,例如:
yum install -y php70w
yum update -y php70w
yum remove -y php70w
檢查有哪些套件可以更新
yum check-update
# 等同於
yum list updates
清除快取檔案
# 清除快取資料
yum clean
# 清除全部的快取,包含以下全部
yum clean all
# 只清除套件快取
yum clean packages
# 只清除 header 快取
yum clean headers
# 只清除 oldheader 快取
yum claen oldheaders
在你安裝套件時,yum 會暫存該套件相關的資料 (可能在 /var/cache/yum
目錄),你可以選擇性地清除它們來釋放磁碟空間。
2.3.7 服務的啟動及停止
早期的服務啟動指令是直接呼叫該服務然後帶入參數,例如:
/etc/init.d/httpd start
但是這樣要記住每個服務的位置並輸入其路徑頗為麻煩,後來改用 service 指令:
service httpd start
現在最新的方式是使用 systmectl 指令,把服務名稱放在最後面:
systemctl start httpd # 啟動
systemctl stop httpd # 停止
systemctl restart httpd # 重新啟動
systemctl status httpd # 狀態
之後我們會用這個方式來控制服務的啟動等動作。
2.3.8 其他指令
which 指令
尋找執行檔 (指令) 所在位置,它只會尋找 $PATH
這個變數中所設定的目錄下的指令。
which php
# 顯示結果 /usr/bin/php
echo 指令
用來輸出字串或變數。
echo "Hello"
# 輸出 Hello
echo $HOME
# 輸出 /home/vagrant
# 單引號和雙引號的差別在於變數是否視為字串
echo "My name is $USER"
# 輸出 My name is vagrant
echo 'My name is $USER'
# 輸出 My name is $USER
你如果會寫 PHP,概念是一樣的。
資料流重導向
在 Linux 中,有標準輸入、輸出及錯誤輸出三種資料流向:
- 標準輸入 (stdin):代號 0 ,符號 < 或 <<
- 標準輸出 (stdout):代號 1 ,符號 > 或 >>
- 標準錯誤輸出 (stderr):代號 2 ,符號 2> 或 2>>
# 列出目錄中的檔案清單,並「輸出」到螢幕
ls
# 列出目錄中的檔案清單,並「重導向輸出」到檔案
ls > filelist.txt
# 執行後,會多出一個 filelist.txt 檔案,
# 但是螢幕不會顯示任何內容
# 一般使用者無法讀取 secure 檔
cat /var/log/secure
# 所以會出現以下錯誤
cat: /var/log/secure: Permission denied
# 我們可以「重導向這個錯誤」到檔案中
cat /var/log/secure 2> err.txt
# 現在多出一個 err.txt 的檔案,內容和原本出現在螢幕中的訊息一樣
# 原本由鍵盤輸入改由檔案輸入
cat > bashrc.txt < ~/.bashrc
# 將會得到一個 bashrc.txt 檔案,內容和 .bashrc 一模一樣
# cat > bashrc.txt 這段指令可以讓我們從鍵盤輸入文字,
# 但是我們藉由「輸入重導向」將檔案內容導入
# > 和 >> 的差別是一個會從頭輸出(即覆蓋原內容),一個是接在原內容後面
ls -l > filelist.txt
ls -m > filelist.txt
# 最後只有 ls -m 的內容存在
ls -l > filelist.txt
ls -m >> filelist.txt
# ls -m 的結果會接在 ls -l 後面
Linux 有個特殊的檔案 /dev/null
可以把它視為黑洞,任何丟給它的資料都會消失:
# 把權限不足的錯誤訊息丟到黑洞
cat /var/log/secure 2> /dev/null
你也可以把原本的標準輸出導向標準錯誤輸出:
# 「標準輸出」導向「標準錯誤輸出」
echo "Hello" 1>&2
# 反過來也可以
echo "Hello" 2>&1
管線指令 (pipe)
管線指令可以讓你將多組指令串接在一起一次執行,每一組指令的結果 (輸出) 會是下一組指令的資料來源 (輸入);只有可以接收 standard input (STDIN) 的指令才可用於管線指令中,例如 less
, more
, head
, tail
等。
yum list php* | less
# 列出 php 開頭的套件太多了,可以輸出給 less 來翻頁查
grep 指令
以行為單位找出需要的資料,搜尋字串可以使用正規表示式 (Regular Expression) 來表示。
# 找出無效的登入使用者名稱
sudo cat /var/log/secure | grep -i 'Invalid user'
可以使用選項:
-i
:忽略大小寫-n
:輸出行號-v
:反向選擇
last 指令
查詢誰登入過主機。
# 預設會顯示當月的全部資料,如果太多可以加上數量限制
last
last -5
lastlog 指令
顯示系統中所有帳號「最後一次」登入主機的時間;這個指令其實只是去讀取 /var/log/lastlog
的內容而已。
lastlog
# 只列出 tony 這個使用者
lastlog | grep tony
uname 指令
查詢系統與核心相關資訊。
uname
uname -a # 所有系統相關的資訊
# 結果 Linux localhost.localdomain 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
uname -s # 系統核心名稱
uname -r # 核心的版本
uname -m # 系統的硬體名稱,例如 i386 (32位元) 或 x86_64 (64位元)
free 指令
查詢記憶體使用情況。
free
# 依選擇的單位顯示,請擇一使用
# -b (bytes) -k (Kbytes,預設值) -m (Mbytes) -g (Gbytes)
free -m
# 依人類容易閱讀的方式顯示
free -h
# 每隔幾秒自動輸出, ctrl + c 結束
free -s 5
top 指令
持續顯示程序的運作狀態。
top
# 進入畫面後按 u 再輸入使用者名稱,例如 nginx
# 就能觀察 nginx 使用者的使用硬體資源的情況
# q 離開
ps 指令
將目前這個時間點程序運作狀態顯示出來。相對於 top 是靜態的。
# 顯示系統所有的程序的資料
ps aux
# 通常會搭配管線指令及 grep 來過濾內容
ps aux | grep nginx
crontab 指令
這是排程指令,例如你希望每天晚上 12 點執行某支程式,就可以透過它來設定。
# 確認 crond 這個排程服務是否已啟動
systemctl status crond
crontab -e # 編輯排程,自動開啟 vi
crontab -l # 查看排程
crontab -r # 刪除排程
排程的格式為
分 時 日 月 週 指令
0~59 0~23 1~31 1~12 0~7 注意指令的路徑
註:週的 0 和 7 均指星期日。
一行一個排程,全部以空白間隔,可以使用 4 個符號來指定時間:
*
星號:表示任何時刻,例如放在分這欄表示任何分鐘都符合。,
逗號:多個時間,例如在時這欄寫9,17
表示早上 9 點及下午 5 點兩個時間。-
減號:一段連續時間,例如時寫8-12
表示早上 8 點一直到中午 12 點。/
斜線:間隔時間,例如分寫*/10
表示每 10 分鐘一次。
使用範例:
# 每隔 5 分鐘,把 error.log 最後的內容輸出到家目錄下
*/5 * * * * tail /var/log/nginx/error.log > ~/error.log
# 每天早上 9 點,把最後登入的資訊輸出到家目錄下
* 9 * * * * last > ~/lastlogin.txt
# 每月 1 日凌晨 1 點,更新憑證
* 1 1 * * /usr/local/bin/certbot-auto renew
ip 指令
# 列出所有網路裝置
ip a
# 只列出 ipv4 的 ip
ip -4 a
# -6 則只顯示 ipv6 的 ip
# 我們要查的裝置為 eth1,只顯示它的資料即可
ip -4 a show eth1
# 可以串接管線指令 grep 搜尋來過濾結果
ip -4 a show eth1 | grep inet
# 得到的結果 inet 192.168.8.8/24 brd 192.168.8.255 scope global noprefixroute eth1
繼續閱讀:動手學 VPS 架站:使用 CentOS 7 + Nginx + PHP-FPM + MariaDB (5) - SSH 登入安全
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。