一、數據備份
1.Linux服務器中需要備份的數據
? ? ? ? (1)Linux系統重要數據:/root/目錄,/home/目錄,/etc/目錄
? ? ? ? (2)安裝服務的數據:Apache(配置文件,網頁主目錄,日志文件)
2.備份策略
? ? ? ? (1)完全備份:把所有需要備份的數據全部備份(整塊硬盤、整個分區或某個具體目錄)
? ? ? ? ? ? ? ? ? ? ? ? 優點:數據恢復方便
? ? ? ? ? ? ? ? ? ? ? ? 缺點:備份數據量大,備份時間長,占據空間較多
? ? ? ? (2)增量備份:先進行一次完全備份,后比較數據差異,只備份差異數據
? ? ? ? ? ? ? ? ? ? ? ? 優點:備份數據較少,耗時較少,占用空間較少
? ? ? ? ? ? ? ? ? ? ? ? 缺點:數據恢復比較繁瑣(先恢復完全備份,后按照第一、第二.....增量備份數據恢復)
? ? ? ? (3)差異備份:先進行一次完全備份,后每次備份都備份和原始完全備份數據不同的數據
? ? ? ? ? ? ? ? ? ? ? ? 優點:不需要備份所有數據,數據恢復也比較方便
? ? ? ? ? ? ? ? ? ? ? ? 缺點:隨時間增加,差異備份也可能變得數據龐大,備份緩慢,占用較大空間
3.備份工具
命令格式:dd if="輸入文件" of="輸出文件"? bs="數據塊"? count="數量"
- if:定義輸入數據的文件,也可以是輸入設備
- of:定義輸出數據的文件,也可以是輸出設備
- bs:指定數據塊大小,默認512字節
- count:指定bs的數量
注:如果想要備份分區,則分區大小不能比原分區小,只能和原分區大小一致或比原分區大;如果需要恢復,只需要把輸入項和輸出項反過來即可
網絡復制工具:rsync和scp
- rsync:可以實現服務器之間的備份數據,也可以增量備份,實現類似鏡像的效果
- scp:在Linux之間傳文件,基于ssh的cp
scp? /root/本地文件? root@192.168.25.16:/root/? ? ? ? #上傳
scp? root@192.168.25.6:/root/本地文件? ?/root/? ? ? ? ?#下載
4.xfs文件系統的備份與恢復
注:xfs文件系統支持備份功能,使用xfsdump命令和xfsrestore可以完成備份與恢復
備份——可進行完全備份、增量備份、差異備份
注意事項
- 不支持對未掛載文件系統進行備份
- 必須使用root身份才有權限執行
- 只能備份xfs文件系統,默認只支持備份文件系統
- 備份數據只能被xfsrestore解析
- 通過UUID來辨別備份文件,不能備份兩個具有相同UUID的文件系統
xfsdump選項
- -L:記錄每次備份的說明標簽
- -M:指定存儲媒介的說明標簽
- -l:指定備份級別(0-9),0是完整備份,1-9是增量備份
- -f:指定轉儲的目的地
- -I:從/var/lib/xfsdump/inventory列出目前備份的信息狀態
(1)備份整個分區:xfsdump? -f? 備份文件路徑? 被備份路徑或設備文件
注:被備份路徑可以寫成/dev/sda1或/disk1,不能寫成/disk1/
(2)指定備份是免交互操作
語法:xfsdump? -f? /opt/dump_2? /disk1? -L? dump_2? -M? sda1
(3)指定只備份分區中的某個目錄(-s? 文件路徑[相對路徑])
語法:xfsdump? -f? /opt/dump_test? -s? test? /disk1? -L? dump_test? -M? sda1
(4)文件系統恢復
語法:xfsrestore? -f? 指定恢復文件的位置? 指定存放恢復后的文件路徑
(5)增量備份
全備:xfsdump? -f? /opt/dump_full? /disk1? -L? dump_full? -M? sda1
第n次:xfsdump? -l? n? -f? /opt/dump_backn? /disk1? -L? dump_backn? -M? sda1
二、進程管理
1.進程概述和PS管理進程
進程的組成部分:已分配內存的地址空間,進程ID(PID),程序代碼,進程狀態
進程管理包括:進程調度、中斷處理、信號、進程優先級、進程切換、進程狀態、進程內存等
進程的生命周期:
- 父進程復制自己的地址空間(fork)創建一個新的子進程結構
- 每個進程分配一個唯一的進程ID(PID),滿足跟蹤安全性之需
- PID和父進程(PPID)是子進程環境的元素,任何進程都可以創建子進程
- 所有進程都是第一個系統進程的后代
- Centos5或6 PID為1的是init,Centos7是systemd
僵尸進程:不執行代碼,占用內存地址空間
- 當一個進程收到終止信號時,它結束之前需要一段時間來結束所有任務
- 在進程執行所有代碼之后,它將相關終止報告發給父進程
- 父進程正常情況下會移除所有子進程的數據結構
- 如果父進程沒能接收到子進程的退出信號,那么子進程就變為了僵尸進程
- 所以通常在某個很短的時間內,子進程是一個僵尸進程
- 使用kill命令不能殺死僵尸進程,因為它已經被認定為死亡
- 可嘗試殺死僵尸進程的父進程,僵尸進程也會隨之消失
- 如果一個進程為僵尸狀態,父進程是init或systemd,那么需要重啟系統來解決問題
2.進程、線程、協程
- 進程:是一個執行環境, 包含指令、用戶數據、部分系統數據,以及運行期內獲取的其他資源
- 線程:較小的輕量級實體,進程中產生的一個執行單位(線程直接可以共享資源,包括內存、地址空間、打開文件等)
- 協程:最小實體,可通過并發方式運行;協程的創建、切換和銷毀開銷非常低,因為它們在用戶態完成,不涉及操作系統的內核切換(與線程相比,需要的系統資源少,能在更小的內存空間中運行)
3.上下文切換
- 在處理器執行期間,運行進程的信息被存儲在處理器的寄存器和高速緩存中。
- 執行的進程被加載到寄存器的數據被稱為上下文。
- 在實際處理器運行過程中,先存儲運行進程的上下文。
- 然后將下一個要運行的進程的上下文恢復到寄存器,這個過程稱之為上下文切換。
- 一般不能有太多上下文切換。
- 因為處理器每次要刷新寄存器和高速緩存,以便釋放空間給新進程,可能導致性能下降。
4.中斷處理
- 中斷是優先級最高的任務之一。
- 通常由 I/O 產生,比如網絡接口、鍵盤、磁盤控制器等。
- 當一個中斷信號到達內核的時候,內核必須從當前執行的進程切換到一個新的進程,以便處理這個中斷。
- 這意味著中斷會導致上下文切換。也就是說大量中斷會導致性能下降。
注:Linux中有硬中斷和軟中斷。硬中斷由硬件產生,需要快速響應(如磁盤I/O中斷,鍵盤中斷,鼠標中斷等);軟中斷被用來處理可以推遲的任務(TCP/IP,SCSI協議操作等)
5.進程的屬性
- 進程 ID(PID):是唯一的數值
- 父進程的 ID(PPID)
- 啟動進程的用戶 ID(UID)和所歸屬的組(GID)
- 進程狀態:狀態分為運行 R、休眠 S、僵尸 Z
- 進程執行的優先級
- 進程所連接的終端名
- 進程資源占用:比如占用資源大小(內存、CPU 占用量)
6.使用PS查看進程工具
常見選項組合:ps? aux |? more
- a:顯示跟當前終端關聯的所有進程
- u:基于用戶的格式顯示
- x:顯示所有進程,不以終端來區分
- USER: 啟動這些進程的用戶
- PID: 進程的 ID
- %CPU 進程占用的 CPU 百分比
- %MEM 占用內存的百分比
- VSZ:進程占用的虛擬內存大小(單位:KB)
- RSS:進程占用的物理內存大小(單位:KB)
- STAT:該程序目前的狀態,Linux 進程有 5 種基本狀態:
R :該程序目前正在運行,或者是可被運行(在運行隊列)
S :該程序目前正在睡眠當中 ,但可被某些信號喚醒
T :該程序目前是停止狀態
Z :該進程應該已經終止,但是其父程序卻沒有正常的終止它
D 不可中斷的睡眠狀態,通常存在于 I/O 情況下
I:空閑的內核進程(Rocky9.X) - START:該進程被觸發啟動的時間
- TIME :該進程實際使用 CPU 運行的時間
- COMMAND:該程序的實際指令
基本狀態后字符:
- <:進程運行在高優先級上
- N:進程運行在低優先級上
- l:進程有頁面鎖定在內存中
- s:進程是控制進程
- I:進程是多線程的
- +:當前進程運行在前臺
- t:進程被調試器跟蹤時會出現(在編程調試期間會出現)
實驗——
步驟一:在一個終端下創建aaa.txt文件,并vim打開,不修改,另開一個終端查看當前狀態
步驟二:在aaa.txt終端按下ctrl +z 停止進程,在另一個終端再次查看當前狀態
步驟三:tar -zcvf usr.gz /usr/,然后在另一個終端不斷查看狀態,由 S+,R+變為 D+
常見選項組合:ps? -ef
- e:顯示所有進程
- f:顯示完整格式輸出
- UID: 啟動這些進程的用戶
- PID: 進程的 ID
- PPID: 父進程的進程號
- C: 進程生命周期中的 CPU 利用率
- STIME: 進程啟動時的系統時間
- TTY: 表明進程在哪個終端設備上運行。如果顯示?表示與終端無關,這種進程一般是內核態進程。另外,tty1-tty6 是本機上面的登入者程序,若為 pts/0 等,則表示運行在虛擬終端上的進程。
- TIME: 運行進程一共累計占用的 CPU 時間
- CMD: 啟動的程序名稱
實驗——
步驟一:終端一:dd if=/dev/zero of=/a.txt count=10 bs=100M;終端二:?ps -axu | grep dd
7.補充:free命令
第一行:total 是總內存量,used 是已經使用的內存量,free 是空閑的內存,shared 是多個進程共
享的內存總數,buffers 是緩沖內存數,cached 是緩存內存數。默認單位是 KB。
第二行開始:
- total 系統中有 1.9Gi?的物理內存,
- used 是已經使用的內存數量。
- free 是空閑的內存數量。
- shared 是多個進程共享的內存數量。
- buff/cache 用來作為緩沖和緩存的空間,內核會在內存將要耗盡時釋放這部分內存給其他進程使用。
- availble:可使用空間,評估有多少內存可用于啟動新應用程序。
注:available 字段考慮了頁緩存,而不是所有可回收的內存。正因為這個原因所以通常
free+buff/cache 的數值要比 available 的數值大。
第三行為 swap 虛擬內存。
- 在上面信息中我們可以看到,其實系統上并沒有運行什么服務。但是有 1.4G 的 cache,這是因為在實驗過程中進行過多次讀寫執行等操作。
- 這些文件會被系統暫時緩存下來,以便下次運行的時候能夠快速的讀取。
- 這種使用都是正常的情況,說明物理內存正在被合理的使用
- 但是如果我們發現 swap 區域一直被大量使用,這就說明物理內存不足。
- 可能需要考慮系統上 swap 使用比例或者添加物理內存。
三、uptime查看系統負載--top動態管理進程
1.uptime查看cpu負載工具
18:54:11 | 當前時間 |
48 | 系統運行時間,說明系統已經運行了48分鐘 |
3 | 當前登錄用戶數 |
load average:0.08,0.17,0.25 | 系統負載均衡,即任務隊列的平均長度。三個數值為1分鐘、5分鐘、15分鐘前到現在的平均值 |
任務隊列的平均長度(cpu隊列數為3時):
注:如果服務器cpu為1核,則load average>=3為負載過高;如果服務器cpu為4核,則>=12為負載過高(通常單核一分鐘平均負載不要超過3)
2.top命令動態管理
Cpu(s) | 系統用戶進程使用cpu百分比 |
sy | 內核中的進程占用cpu百分比 |
ni | 用戶進程空間內改變過優先級的進程占用cpu百分比 |
id | 空閑cpu百分比 |
wa | cpu等待I/O完成的時間總量 |
hi(硬中斷消耗時間) | 硬中斷占的cpu百分比 |
si(軟中斷消耗時間) | 軟中斷占的cpu百分比 |
st(steal偷) | 虛擬機偷取物理的時間 |
PID | 進程id |
USER | 進程所有者的用戶名 |
PR | 優先級,由內核動態調整,用戶不能修改。rt表示任務正在實時調度優先級下運行 |
NI | 進程優先級,nice值。負值表示高優先級 |
VIRT | 虛擬內存,是進程正在使用的所有內存 |
RES | 是進程所使用的物理內存,是實際使用內存 |
SHR | 共享內存大小,單位kb |
S | 進程狀態 |
%CPU | 上次更新到現在的cpu占用百分比 |
%MEM | 進程使用的物理內存百分比 |
TIME+ | 進程使用的cpu時間總計,單位1/100s |
COMMAND | 命令名;命令行 |
快捷鍵
- 默認三秒刷新一次,按s修改刷新時間
- 按空格立刻刷新
- q退出
- P按cpu排序
- M按內存排序
- T:按時間排序
- 數字鍵1:顯示每個內核的cpu使用率
- -p:進程pid,查看某個進程狀態
- -u/U:指定顯示用戶
- h:幫助
注:lscpu命令可以查看cpu系統中cpu詳細信息,并且在sockets字段表示物理cpu數量
實驗——
步驟一:使用top動態只查看某個或某些進程的信息
步驟二:找出系統中使用cpu最多的進程
注:在一個linux進程中,最多可以使用的cpu占用百分比跟內核數有關,可以超過100%
3.fuser命令根據文件或端口號找相應進程
- -k:默認結束進程,也可以執行發送信號(可用信號與kill命令不同)
- -i:在結束進程前會交互式確認
- -u:在進程后顯示進程所屬用戶名
- -c:查看有哪些進程訪問掛載點下文件
實驗——
步驟一:根據/media目錄查看有哪些進程正在訪問目錄,并列出進程用戶名稱
步驟二:查看 boot 分區下有哪些進程在訪問文件
步驟三:查看 tcp 協議 22 號端口有哪些進程
注:對文件或目錄執行會輸出相應的進程號(c表示執行進程的用戶在當前查詢目錄中;f表示文件,但通常文件默認不顯示;r表示root目錄;e表示正在運行的可執行文件)
4.lsof命令:用于查看進程打開的文件、端口(TCP,UDP)
- -i:列出符合條件的進程。IPv4或IPv6(4,6,協議,:端口,@ip)
- -p:列出指定進程號所打開的文件
一般用于進程在讀哪些文件,或哪個進程在使用端口
四、前后臺進程切換-nice進程優先級
1.Linux后臺進程與前臺進程的區別
- 前臺進程:是在終端中運行的命令,命令執行過程中持續占用前臺。
- 依賴終端:那么該終端就為進程的控制終端,一旦這個終端關閉,這個進程也隨之消失。
- 脫離終端:一旦這個終端關閉,這個進程不會消失。
- 后臺進程: 進程放入后臺運行,通常不會影響當前終端后續命令執行。如:tar -cf 命令等。
- 后臺運行并脫離終端:其中有一類進程也叫守護進程(Daemon),是運行在后臺的一種特殊進程,不受終端控制,它不需要終端的交互。
- Linux 的大多數服務器就是用守護進程實現的。比如,Web 服務器 httpd 等。
2.進程前臺與后臺運行(跟系統任務相關的幾個進程)
& | 跟在命令最后,可以把命令放在后臺執行 |
ctrl+z | 將前臺命令放在后臺,并且暫停 |
jobs | 查看當前后臺運行進程(作業控制命令) |
fg | 將后臺命令調至前臺繼續運行(fg %命令序號) |
bg? | 將后臺暫停命令變為繼續執行(bg %命令序號) |
nohup | 脫離終端 |
注:雖然bg 1使得后臺暫停命令繼續運行,但vi命令無法在后臺執行,因此很快就停止運行
3.kill給進程發送信號
- 相關 3 個命令:kill、killall、pkill
- kill 命令:kill 進程號
- killall 和 pkill 命令用于殺死指定名字的進程
- 通過信號的方式來控制進程的
- kill -l =====> 列出所有支持的信號
信號編號 | 信號名 | 作用 |
1 | SIGHUP | 重新加載配置 |
2 | SIGINT | 鍵盤中斷:ctrl + c |
3 | SIGQUIT | 退出 |
9 | SIGKILL | 強制終止 |
15 | SIGTERM | 終止(正常結束),缺省信號 |
18 | SIGCONT | 繼續 |
19 | SIGSTOP | 停止 |
20 | SIGTSTP | 暫停ctrl + z |
命令一:kill命令
補充
實驗一:kill -1重新加載配置實驗,用sshd進程來看,我們正常情況下修改sshd服務監聽22號端口號,改為2200端口,然后再用kill -1命令重新加載更新端口號
準備:SELinux不允許隨便修改服務的監聽端口,因此我們需要先暫時關閉這個服務(enforcing開啟,permissive關閉,也可以直接在配置文件/etc/selinux/config里面永久修改)
查看當前端口號,然后在配置文件/etc/ssh/sshd_config中修改端口號為2200
保存之后,通過systemctl? restart? sshd命令重啟sshd服務,會發現監聽端口號改變,但sshd的進程號也隨著服務的關閉開啟而改變
再次將端口號改回22,使用kill -1重載配置,會發現命令是通過進程重載配置文件,進程號不會變
實驗二:kill -9強制終止實驗。使用sshd服務,正常情況下遠程連接會在/var/run/sshd.pid下生成保存遠程連接進程號的文件。首先通過systemctl stop命令遠程關閉服務,會發現這個文件會被刪除
重新啟動sshd服務,然后改用kill -9強制終止進程,會發現該配置文件沒有被正常清理,變成殘留
因此kill? -9命令存在缺陷,會導致一些因進程產生的文件殘留。
命令二:killall命令(-i 交互式殺死某個進程)
命令三:pkill命令(-t 終端號:按照終端號剔除用戶)
4.進程的優先級管理
注:優先級取值為(-20,19),越小優先級越高,默認為0
命令1:nice -n——指定程序運行的優先級
命令2:renice——改變進程的運行優先級
5.tmux終端復用工具
- tmux終端復用工具,在R9.4系統中可通過光盤進行rpm安裝。
- 在系統中默認情況下我們登錄系統會打開相應的終端用于命令輸入,用戶輸入的命令中部分命令屬于依賴終端運行。也就是說用戶退出終端,終端結束,依賴終端命令的進程也就隨之結束。
- 在tmux中我們可以打開會話,這里的會話類似于系統中的打開終端。
- 在基于tmux的“會話”當中,如果我們以特定方式“退出”會話,會話相應進程是不會結束的(我們可以再次回到此會話),那么基于會話存在的依賴終端的進程也就可以繼續運行。
實驗——
步驟一:安裝tmux包后,開啟會話:tmux或tmux? new-session -s hf01(默認會話名稱為0)
步驟二:切換會話,讓會話臨時退出
ctrl+b+w:列出所有會話,通過上下鍵+Enter切換會話
ctrl+b+d:臨時退出當前會話
進入會話執行exit則表示關閉會話
步驟三:在退出tmux后,可通過輸入tmux ls列出當前存在的會話名稱
步驟四:進入指定會話
步驟五:結束會話(除exit之外)
6.time命令:查看命令執行時間
格式:time CMD
- real time:時鐘走過的時間
- user time:程序在用戶態的CPU時間
- sys time:程序在內核態的CPU時間
7.ulimit:限制普通用戶開啟進程數量
臨時生效配置:ulimit? -u? 15(限制用戶能夠開啟的進程數量是15)
永久生效配置:vim? /etc/security/limits.d/20-nproc.conf(rocky9沒有這個文件,要自己寫)
第一列:用戶名。如果是*則表示全局用戶
第二列:soft指當前系統生效的設置值。hard表面系統中所能夠設置的最大值
第三列:操作系統級別對每個用戶創建的進程數的限制
第四列:限制用戶的進程數量
注:配置重啟之后,可以查看當前用戶限制打開的進程數量:ulimit -u
驗證:安裝stress壓力測試工具進行驗證(需要先安裝epel-release擴展源或直接網上下載rpm包)
步驟:user1用戶使用stress命令開啟15個進程,,用root用戶查看進行驗證
補充:限制用戶能夠寫入的文件大小:ulimit? -f(查看當前用戶能夠創建的文件大小)
注:默認單位kb
補充
- 進程調度:操作系統決定哪個就緒進程獲得cpu的執行權的過程
- 中斷處理:cpu響應硬件或軟件中斷,暫停當前任務,轉而去執行中斷服務程序,完成后恢復原任務
- 信號:內核或進程向目標進程發送的異步通知
- 進程優先級:決定進程被調度執行的優先順序
- 進程切換:CPU從一個進程切換到另一個進程時,保存當前進程的上下文,并加載新進程的上下文
- 進程狀態:運行、就緒、阻塞
- 進程內存:進程運行時分配的地址空間