點(diǎn)實(shí)戰(zhàn):用戶權(quán)限、systemd與日志監(jiān)控)
1. 從RH134考綱出發(fā)說說哪些知識(shí)點(diǎn)最值得反復(fù)啃RH134是紅帽認(rèn)證體系里系統(tǒng)管理員二階段的核心課程也是RHCSA考試后半段的主要覆蓋范圍。它跟RH124的區(qū)別在于RH124解決的是“能不能上手操作”的問題而RH134解決的是“能不能系統(tǒng)化地管理一臺(tái)Linux機(jī)器”的問題。課程主線圍繞用戶與權(quán)限、進(jìn)程與服務(wù)、存儲(chǔ)管理、網(wǎng)絡(luò)配置、軟件包管理、系統(tǒng)日志與監(jiān)控、計(jì)劃任務(wù)等幾個(gè)大塊展開聽起來好像都是基礎(chǔ)但實(shí)際動(dòng)手就會(huì)發(fā)現(xiàn)真正的門檻全藏在命令背后的細(xì)節(jié)里。這篇文章是“常用知識(shí)點(diǎn)匯總合集”的續(xù)篇。前一篇大概已經(jīng)把RH124階段的基礎(chǔ)命令和常規(guī)操作梳理過了這次我換個(gè)角度不按考綱章節(jié)逐條羅列而是以我在實(shí)際機(jī)器上反復(fù)用到的場(chǎng)景為線索把RH134里那些“考了無數(shù)次、工作中幾乎天天碰到、但很多人到考試當(dāng)天才搞明白”的點(diǎn)挑出來逐個(gè)拆開講透。適合看這篇內(nèi)容的人我覺得有三類一是正在備考RHCSA、需要把知識(shí)點(diǎn)串成體系的人二是剛接觸Linux運(yùn)維、想繞過教材直接上手干活的實(shí)習(xí)生或轉(zhuǎn)行者三是已經(jīng)工作一兩年、發(fā)現(xiàn)自己一直只會(huì)用某幾個(gè)命令、遇到報(bào)錯(cuò)就只能搜索的初級(jí)運(yùn)維。如果你屬于其中任何一類這篇內(nèi)容應(yīng)該能幫你省掉不少碰壁的時(shí)間。我會(huì)盡量按“為什么要這樣配、怎么落地執(zhí)行、踩坑是什么”的順序來寫涉及命令時(shí)會(huì)給出可以直接復(fù)制使用的寫法涉及配置文件時(shí)會(huì)展示完整內(nèi)容。下面正式開始。2. 用戶與文件權(quán)限的深水區(qū)不止是useradd和chmod2.1 用戶管理的隱藏參數(shù)與刪除用戶的真實(shí)困境RH134階段對(duì)用戶管理的考察已經(jīng)不完全停留在useradd和passwd這種最基礎(chǔ)的層面了??荚嚭蛯?shí)際運(yùn)維場(chǎng)景里更常見的是帶參數(shù)的用戶創(chuàng)建系統(tǒng)賬戶、無登錄shell、附加組、主組、有效期、家目錄模板這些才是真正拉開差距的地方。我常用的用戶創(chuàng)建組合是這樣的useradd -r -s /sbin/nologin -d /opt/app -M appuser這里四個(gè)參數(shù)的用意要拆開看-r表示創(chuàng)建系統(tǒng)用戶UID會(huì)落在系統(tǒng)賬戶區(qū)間通常是1000以下具體看發(fā)行版配置這類賬戶用于跑服務(wù)而不是給人登錄-s /sbin/nologin指定不能交互式登錄的shell防止有人真的切到該賬戶下執(zhí)行命令-d指定家目錄位置-M則告訴系統(tǒng)不要在創(chuàng)建時(shí)自動(dòng)生成家目錄。這類組合常見于部署中間件或自研程序時(shí)既能讓進(jìn)程以獨(dú)立身份運(yùn)行又不暴露可登錄的shell入口。另一個(gè)容易翻車的點(diǎn)是刪除用戶。userdel如果直接不帶參數(shù)執(zhí)行只會(huì)刪除用戶賬戶本身它的家目錄、收件目錄、臨時(shí)文件全都留在磁盤上。這對(duì)個(gè)人練習(xí)環(huán)境無所謂但生產(chǎn)環(huán)境里通常會(huì)連帶清理標(biāo)準(zhǔn)寫法是userdel -r它會(huì)一并刪除家目錄和郵件池。真正讓人頭疼的是“刪不掉”的故障比如某個(gè)用戶的進(jìn)程還活著系統(tǒng)會(huì)提示userdel: user xxx is currently used by process xxx。此時(shí)需要先確認(rèn)進(jìn)程再處理pgrep -u username pkill -u username userdel -r username安全生產(chǎn)前最好先備份該用戶的數(shù)據(jù)再執(zhí)行清理。如果你只是想臨時(shí)禁用某人而不刪除數(shù)據(jù)用usermod -L鎖住密碼或者把用戶的shell改成/sbin/nologin這兩種方式都比直接刪賬戶溫和回滾也方便。實(shí)際管理服務(wù)器時(shí)我很少直接刪除用戶多數(shù)情況下先用鎖定的方式讓賬戶失效觀察一段時(shí)間確認(rèn)沒有服務(wù)依賴后才真正清理這樣既安全又能隨時(shí)恢復(fù)。2.2 umask、setuid、setgid與粘滯位的疊加邏輯權(quán)限部分RH134的題目經(jīng)常把umask、特殊權(quán)限位和目錄權(quán)限混在一起考。umask的本質(zhì)是“權(quán)限掩碼”它決定新建文件和目錄的默認(rèn)權(quán)限其中文件的基準(zhǔn)權(quán)限是666目錄的基準(zhǔn)權(quán)限是777最終權(quán)限等于基準(zhǔn)權(quán)限減去掩碼中存在的權(quán)限位。例如umask 022時(shí)新建文件的權(quán)限是666-022也就是644新建目錄是777-022即755。這里有個(gè)新手常犯的認(rèn)知錯(cuò)誤umask 022是“減”而不是“與”。如果掩碼是027文件默認(rèn)權(quán)限是666-027640而不是拿二進(jìn)制位去逐個(gè)與運(yùn)算。理解了這一點(diǎn)做題就不會(huì)錯(cuò)。特殊權(quán)限位的表現(xiàn)和計(jì)算也比較容易混淆。setuid4、setgid2、sticky1三個(gè)位可以疊加在普通權(quán)限之上使用方式像是chmod 4755 script或chmod 2770 /data/shared。它們各自的實(shí)際效果是setuid作用于可執(zhí)行文件讓執(zhí)行者臨時(shí)擁有文件屬主的身份。典型例子是/usr/bin/passwd普通用戶執(zhí)行它時(shí)能以root身份修改自己的密碼。setgid作用于目錄時(shí)新創(chuàng)建的文件會(huì)自動(dòng)繼承目錄的屬組而不是創(chuàng)建者的基本組。這個(gè)在團(tuán)隊(duì)協(xié)作目錄里特別有用。sticky作用于目錄時(shí)只有文件屬主、目錄屬主或root才能刪除目錄內(nèi)的文件/tmp就是最典型的例子。把這些位組合使用時(shí)要格外小心。我最常踩的坑是chmod -R 777和遞歸設(shè)置特殊權(quán)限位的組合操作。比如想設(shè)置一個(gè)共享目錄為2770結(jié)果手滑寫成chmod -R 2777不僅把目錄和所有子文件的權(quán)限全部放大還會(huì)讓普通用戶可以在目錄里互相刪文件——因?yàn)闆]加sticky位。建議是每次遞歸授權(quán)后都先跑一遍ls -lR /path/to/dir確認(rèn)權(quán)限位沒有越界再正式上線。2.3 ACL權(quán)限的日常用法與mask的坑ACL訪問控制列表在RH134的考綱里占有一席之地原因在于傳統(tǒng)的u/g/o權(quán)限模型搞不定“多個(gè)用戶對(duì)同一目錄擁有不同權(quán)限”的需求。ACL允許對(duì)獨(dú)立用戶、獨(dú)立組單獨(dú)授權(quán)而不用把所有人都塞進(jìn)同一個(gè)組里?;A(chǔ)操作不復(fù)雜setfacl -m u:zhangsan:rwx /data/project setfacl -m g:devteam:rw /data/project setfacl -x u:zhangsan /data/project getfacl /data/project但ACL有一個(gè)很容易被忽略的機(jī)制mask。當(dāng)目錄設(shè)置了ACL之后mask值會(huì)自動(dòng)出現(xiàn)在getfacl的輸出中它實(shí)際上限制了所有命名用戶、命名組以及所屬組能夠獲得的最大權(quán)限。換句話說即使你給某個(gè)用戶設(shè)了rwx如果mask是r-x那么該用戶實(shí)際能用的權(quán)限只有r-xACL中記錄的名字不會(huì)消失但生效范圍被mask截?cái)嗔?。我遇到過不止一次這樣的情況開發(fā)反饋“我給某個(gè)賬號(hào)授權(quán)的寫權(quán)限怎么不生效”登上去一看getfaclmask是r-x改動(dòng)setfacl -m m::rwx之后立刻正常。所以記住排查ACL問題時(shí)第一件事就是看mask它負(fù)責(zé)卡住權(quán)限上限。生產(chǎn)環(huán)境里如果團(tuán)隊(duì)協(xié)作頻繁變動(dòng)人員建議干脆別依賴手寫多條ACL把目錄的屬組固定好組內(nèi)成員統(tǒng)一加組再用一個(gè)默認(rèn)ACLsetfacl -d -m給新建文件自動(dòng)繼承權(quán)限維護(hù)成本會(huì)低很多。3. systemd現(xiàn)代Linux服務(wù)管理的核心3.1 為什么RH134繞不開systemdRH134很大一部分考試內(nèi)容圍繞systemd展開這個(gè)趨勢(shì)不是紅帽自己拍腦袋決定的而是整個(gè)Linux生態(tài)隨著RHEL 7引入systemd之后形成的現(xiàn)實(shí)。service、chkconfig、rc.local這些傳統(tǒng)工具仍然存在但已經(jīng)全面讓位于systemctl。考試不會(huì)問“systemd比SysV init好在哪”這種理論題但會(huì)要求你完成“寫unit文件、啟動(dòng)服務(wù)、設(shè)置開機(jī)自啟、查看服務(wù)狀態(tài)”這一整套動(dòng)作。理解systemd的關(guān)鍵在于它把“服務(wù)”抽象成unit常見的有service服務(wù)、socket套接字、target啟動(dòng)目標(biāo)、timer定時(shí)器等。systemctl的絕大多數(shù)操作都圍繞unit展開而unit的定義則寫在.service文件、.socket文件等地方。和傳統(tǒng)init腳本相比systemd最大的優(yōu)勢(shì)是并行啟動(dòng)、按依賴關(guān)系啟動(dòng)、崩潰自動(dòng)拉起以及統(tǒng)一管理日志。日常工作中最常用的幾條命令值得反復(fù)盤systemctl start/stop/restart/reload 服務(wù)名 systemctl enable --now 服務(wù)名 systemctl status 服務(wù)名 systemctl list-units --typeservice --staterunning systemctl daemon-reload systemctl is-enabled 服務(wù)名其中enable --now是實(shí)踐里非常順手的組合它把“設(shè)置開機(jī)自啟”和“立刻啟動(dòng)”合并成一步省去了兩條命令兩個(gè)步驟的冗余。寫unit文件后一定要先執(zhí)行daemon-reload否則systemd仍按舊配置執(zhí)行這是一個(gè)非常高頻的低級(jí)失誤。3.2 手寫一個(gè)Tomcat自啟動(dòng)服務(wù)把unit文件吃透很多公司的中間件服務(wù)不是通過標(biāo)準(zhǔn)包管理器安裝的而是解壓tar包直接部署的這類服務(wù)不會(huì)自動(dòng)注冊(cè)到systemd需要自己寫unit文件。Tomcat就是一個(gè)很典型的目標(biāo)我之前花了不少時(shí)間踩這個(gè)坑寫清楚之后對(duì)其他Java服務(wù)就一通百通了。在/etc/systemd/system/下創(chuàng)建tomcat.service[Unit] DescriptionApache Tomcat Web Application Container Afternetwork.target [Service] Typeforking Usertomcat Grouptomcat EnvironmentJAVA_HOME/usr/lib/jvm/java-1.8.0 EnvironmentCATALINA_PID/opt/tomcat/temp/tomcat.pid EnvironmentCATALINA_HOME/opt/tomcat EnvironmentCATALINA_BASE/opt/tomcat ExecStart/opt/tomcat/bin/startup.sh ExecStop/opt/tomcat/bin/shutdown.sh Restarton-failure RestartSec10s [Install] WantedBymulti-user.target這個(gè)文件里有幾個(gè)細(xì)節(jié)需要解釋。Typeforking是關(guān)鍵startup.sh啟動(dòng)Tomcat后主進(jìn)程會(huì)fork出子進(jìn)程然后自己退出systemd需要知道“父進(jìn)程退出不代表服務(wù)失敗”所以必須用Typeforking告訴它去認(rèn)PID文件。而Tomcat的PID文件路徑通過CATALINA_PID指定systemd也要在ExecStart里能看到這個(gè)環(huán)境變量。如果你用Typesimplesystemd會(huì)認(rèn)為啟動(dòng)進(jìn)程就是服務(wù)主進(jìn)程而startup.sh很快就退出了服務(wù)會(huì)被判定失敗。User和Group指定了服務(wù)運(yùn)行的賬戶身份這一點(diǎn)在生產(chǎn)環(huán)境里相當(dāng)重要。用root跑Tomcat雖然省事但一旦應(yīng)用被入侵攻擊者直接獲得root權(quán)限風(fēng)險(xiǎn)極大。正規(guī)做法是創(chuàng)建一個(gè)專用賬戶比如useradd -r -s /sbin/nologin tomcat再把這個(gè)賬戶關(guān)聯(lián)到Tomcat目錄的屬主上。Restarton-failure表示只在非正常退出時(shí)由systemd自動(dòng)拉起進(jìn)程配合RestartSec10s設(shè)置重啟間隔這樣既能容忍偶發(fā)崩潰又不會(huì)由于快速循環(huán)重啟把系統(tǒng)資源耗盡。寫好之后的操作順序我也說一下很多人會(huì)漏掉某個(gè)環(huán)節(jié)導(dǎo)致失敗chown -R tomcat:tomcat /opt/tomcat systemctl daemon-reload systemctl enable --now tomcat systemctl status tomcat --no-pager排錯(cuò)時(shí)優(yōu)先看journalctl -u tomcat -e這里會(huì)直接給出Java進(jìn)程的啟動(dòng)日志比看狀態(tài)碼更直觀。Tomcat服務(wù)最常出現(xiàn)的“ExecStart格式錯(cuò)誤”通常是因?yàn)樾形捕嗔丝崭瘛⒙窂綄戝e(cuò)、引號(hào)不匹配不要慌一行一行檢查就行。3.3 systemd故障排查的順序與常用手段服務(wù)啟動(dòng)失敗我習(xí)慣按以下順序排查第一步systemctl status 服務(wù)名 --no-pager查看主進(jìn)程狀態(tài)、PID、最近日志。如果顯示failed第二步立刻journalctl -u 服務(wù)名 -n 100重點(diǎn)看最后幾十行有沒有明確的報(bào)錯(cuò)關(guān)鍵字比如Permission denied、No such file or directory、Executable path is not absolute等。第三步檢查配置文件語法。unit文件里最常見的坑是ExecStart要求路徑絕對(duì)化且不能包含變量引用除非在用/bin/sh -c等特定寫法時(shí)After少了目標(biāo)會(huì)用默認(rèn)順序啟動(dòng)導(dǎo)致依賴網(wǎng)絡(luò)的服務(wù)在網(wǎng)卡還沒就緒時(shí)就開始啟動(dòng)。另外unit文件的權(quán)限也值得注意chmod 777的unit文件會(huì)導(dǎo)致systemd拒絕加載看到“permission denied”時(shí)先查文件權(quán)限。第四步如果確認(rèn)unit沒問題再看SELinux或AppArmor的攔截日志命令是ausearch -m avc -ts recent或查/var/log/messages。這個(gè)方法救過我好幾次很多奇怪的“服務(wù)起不來、看日志又不報(bào)錯(cuò)”最后都落在SELinux身上。4. 網(wǎng)絡(luò)與遠(yuǎn)程管理的正確姿勢(shì)4.1 靜態(tài)IP配置nmcli與配置文件的取舍RH134階段網(wǎng)絡(luò)配置不會(huì)考得太深但一定會(huì)要求你完成“把一臺(tái)機(jī)器的IP從DHCP改成靜態(tài)地址”這個(gè)任務(wù)。CentOS/RHEL系列管理網(wǎng)絡(luò)的主流方式已經(jīng)是NetworkManager配置文件在/etc/NetworkManager/system-connections/下而不是老教程里那個(gè)/etc/sysconfig/network-scripts/ifcfg-eth0。我推薦優(yōu)先使用nmcli它比直接改配置文件可靠得多原因是NetworkManager會(huì)在后臺(tái)監(jiān)聽配置文件變化某些版本下手動(dòng)改完不會(huì)自動(dòng)重載而nmcli會(huì)保持狀態(tài)一致。完整配置過程如下nmcli con add type ethernet con-name static-eth0 ifname eth0 ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8 114.114.114.114 ipv4.method manual nmcli con up static-eth0這里注意幾個(gè)參數(shù)con-name是連接的名稱可以自定義ifname是實(shí)際網(wǎng)卡接口名必須對(duì)應(yīng)系統(tǒng)的真實(shí)接口ipv4.method manual意為手動(dòng)配置而不是DHCP。配置完成后驗(yàn)證網(wǎng)絡(luò)是否生效ip addr show eth0 ip route show ping -c 4 192.168.1.1如果我必須改配置文件也會(huì)在改動(dòng)后通過nmcli con reload和nmcli con up來激活而不是直接重啟網(wǎng)絡(luò)服務(wù)。這里有個(gè)實(shí)踐小建議在生產(chǎn)環(huán)境操作網(wǎng)絡(luò)前最好準(zhǔn)備一個(gè)備用登錄通道比如帶外管理或IPMI否則一旦改錯(cuò)IPSSH斷掉之后只能去機(jī)房或靠應(yīng)急恢復(fù)手段非常被動(dòng)。我在很多文檔里都寫過這句話但還是每次都會(huì)有人踩。4.2 主機(jī)名管理與SSH連接實(shí)用習(xí)慣hostnamectl set-hostname是修改主機(jī)名的標(biāo)準(zhǔn)命令同時(shí)建議手動(dòng)維護(hù)/etc/hosts。有些環(huán)境下重啟后主機(jī)名會(huì)被DHCP或云平臺(tái)重置需要考慮使用nmcli general hostname來告訴NetworkManager持久化設(shè)置或修改/etc/sysconfig/network。SSH遠(yuǎn)程管理這塊我一般會(huì)注意三個(gè)細(xì)節(jié)一是推薦用ssh-copy-id把公鑰推到目標(biāo)機(jī)器上后續(xù)登錄免密且比定期輸入密碼安全得多二是限制/etc/ssh/sshd_config里的PermitRootLogin和PasswordAuthentication的值避免root直接密碼登錄三是改完配置務(wù)必重啟sshd服務(wù)并開第二個(gè)會(huì)話驗(yàn)證防止配置錯(cuò)誤把自己鎖在外面。這些習(xí)慣看似瑣碎但每一條都來自真實(shí)事故的教訓(xùn)。4.3 firewalld的zone與端口開放firewalld是后iptables時(shí)代管理防火墻的主要工具RH134涉及它的常見操作。最基礎(chǔ)的思路是理解zone區(qū)域的概念每個(gè)zone代表一組規(guī)則網(wǎng)絡(luò)接口可以綁定到某個(gè)zonezone里定義允許或拒絕的端口、服務(wù)和來源。常用操作如下firewall-cmd --get-default-zone firewall-cmd --list-all firewall-cmd --add-port8080/tcp --permanent firewall-cmd --reload firewall-cmd --list-ports--permanent參數(shù)的意思是寫入持久規(guī)則不加的話規(guī)則只在內(nèi)存中生效重啟后消失。加了永久規(guī)則后必須--reload否則當(dāng)前運(yùn)行時(shí)不會(huì)變化。這是一個(gè)非常經(jīng)典的易錯(cuò)點(diǎn)如果只加--permanent而不reload當(dāng)前防火墻狀態(tài)不變看起來“沒生效”如果只加不加永久參數(shù)當(dāng)前生效但重啟后丟失。如果服務(wù)本身啟動(dòng)了但外部訪問不到我通常先本機(jī)ss -lntp確認(rèn)端口是否監(jiān)聽再curl本機(jī)驗(yàn)證然后檢查firewalld規(guī)則最后再看SELinux布爾值。按照這個(gè)順序排查多數(shù)問題能在前三步解決。5. 系統(tǒng)日志與監(jiān)控關(guān)鍵時(shí)刻能救命的技能5.1 journalctl的高頻率用法整理日志是系統(tǒng)運(yùn)維最重要的信息源RH134階段需要掌握的是用journalctl快速定位問題。我用得最多的幾個(gè)參數(shù)組合journalctl -u 服務(wù)名 -e # 查看某服務(wù)最新日志 journalctl -u 服務(wù)名 -n 50 # 查看最近50條 journalctl --since 10 minutes ago --until 5 minutes ago journalctl -p err -b # 查看本次啟動(dòng)以來的錯(cuò)誤級(jí)日志 journalctl -f -u 服務(wù)名 # 實(shí)時(shí)追蹤服務(wù)日志不同優(yōu)先級(jí)日志用-p過濾是排查問題時(shí)的利器。err及以上通常對(duì)應(yīng)真正的故障warning多可忽略debug則用于深入跟蹤。我接到告警時(shí)通常先看-p err -b把當(dāng)次啟動(dòng)的錯(cuò)誤全撈出來再逐條分析。如果日志太多導(dǎo)致磁盤滿了可以設(shè)置SystemMaxUse參數(shù)限制journal占用空間具體位置在/etc/systemd/journald.confSystemMaxUse500M改完記得重啟journald服務(wù)journalctl --vacuum-size500M則能立即壓縮現(xiàn)有日志占用。5.2 日志持久化的關(guān)鍵前提/var/log/journal很多人沒注意到一個(gè)細(xì)節(jié)默認(rèn)情況下journald把日志存在內(nèi)存里的/run/log/journal重啟之后歷史日志全沒了。這在個(gè)人測(cè)試環(huán)境沒問題但在生產(chǎn)環(huán)境里如果遇到故障需要事后排查丟日志的后果相當(dāng)嚴(yán)重。正確做法是手動(dòng)創(chuàng)建持久化目錄并設(shè)置正確權(quán)限mkdir -p /var/log/journal systemctl restart systemd-journald創(chuàng)建之后journalctl就會(huì)自動(dòng)把日志寫入磁盤。建議在部署新系統(tǒng)時(shí)盡早完成這一步因?yàn)榈鹊侥惆l(fā)現(xiàn)已經(jīng)晚了——?dú)v史日志早就沒了。另外不同服務(wù)日志分開看比如Web服務(wù)的訪問日志和錯(cuò)誤日志一般由應(yīng)用自己輸出到/var/log/下不要只依賴journald兩個(gè)體系配合使用才能覆蓋完整排查鏈路。rsyslog那邊也值得一提/etc/rsyslog.conf里的規(guī)則把日志分門別類寫入/var/log/secure、/var/log/messages等文件對(duì)后續(xù)審計(jì)和故障回溯幫助很大。5.3 日常監(jiān)控命令組合top、ss、free、iostat怎么搭配監(jiān)控不是只盯一個(gè)指標(biāo)而是多維度組合。我常用的組合是top看CPU和負(fù)載free -h看內(nèi)存ss -lntp看端口監(jiān)聽和連接狀態(tài)iostat -x 1看磁盤IO。下面分別說明各命令的注意點(diǎn)。top里最容易被忽略的是load average這個(gè)數(shù)字。有人一看到load高就以為CPU爆了實(shí)際上load還受磁盤IO和進(jìn)程等待的影響。應(yīng)該結(jié)合%Cpu(s)里的waiowait來判斷如果wa很高且進(jìn)程普遍處于D狀態(tài)問題大概率在磁盤而不在CPU。free -h的重點(diǎn)是看available而不是簡(jiǎn)單看free列。Linux會(huì)把空閑內(nèi)存用作緩存來加速讀寫free值小不代表內(nèi)存不夠available才是真正可用的余量。只要available足夠緩沖區(qū)占用高不用緊張。ss -lntp替代了老的netstat輸出格式更清晰。排查“端口被占用”時(shí)ss -lntp | grep 端口號(hào)能得到PID和進(jìn)程名再用ps -fp 該P(yáng)ID定位具體程序。生產(chǎn)環(huán)境里出現(xiàn)過同一個(gè)端口被殘留進(jìn)程占用導(dǎo)致新服務(wù)無法啟動(dòng)的問題這類情況在ss輸出里一目了然。iostat -x 1著重看%util和await。如果%util持續(xù)接近100%說明磁盤已接近吞吐上限await過高則可能是排隊(duì)時(shí)間增長單個(gè)請(qǐng)求時(shí)延變大。兩者同時(shí)偏高基本可以確定磁盤性能瓶頸。6. 軟件包管理與dnf/rpm的細(xì)節(jié)6.1 dnf與rpm的配合使用思路RH134對(duì)軟件管理的考察主要在dnf和rpm。處理好這兩個(gè)工具的配合關(guān)系是重點(diǎn)dnf關(guān)心的是依賴關(guān)系和倉庫rpm更關(guān)心已安裝包的文件級(jí)信息。日常使用中裝軟件用dnf查文件屬于哪個(gè)包用rpm驗(yàn)證包完整性也用rpm。以下組合是我多年來用順手的dnf install -y 包名 dnf search 關(guān)鍵字 dnf provides /etc/nginx/nginx.conf rpm -qf /usr/bin/systemctl rpm -ql 包名 rpm -V 包名dnf provides在處理“某個(gè)文件找不到但不知道它屬于哪個(gè)包”的場(chǎng)景里非常高效rpm -qf則用于反向查詢文件來自哪個(gè)安裝包線上排查時(shí)十分有用——比如你想知道/etc/my.cnf是從哪個(gè)包來的一條命令就能定位。6.2 配置本地倉庫的完整思路生產(chǎn)環(huán)境內(nèi)網(wǎng)常常無法訪問外網(wǎng)倉庫所以配置本地倉庫是運(yùn)維基本功。思路是準(zhǔn)備一臺(tái)內(nèi)網(wǎng)服務(wù)器把ISO解壓或掛載進(jìn)去用createrepo生成倉庫元數(shù)據(jù)然后在客戶端配置.repo文件。倉庫配置文件位置在/etc/yum.repos.d/下內(nèi)容模板如下[local-base] nameLocal Base Repository baseurlhttp://192.168.1.10/repo/BaseOS enabled1 gpgcheck0配置完執(zhí)行dnf clean all dnf makecache dnf repolist如果客戶端提示找不到倉庫或元數(shù)據(jù)過期多半是baseurl路徑不匹配或者倉庫端沒有執(zhí)行createrepo。建議先在服務(wù)器上用瀏覽器或curl確認(rèn)目錄能否訪問再檢查客戶端配置文件最后dnf clean all強(qiáng)制刷新緩存很多時(shí)候問題就出在舊緩存上。6.3 版本鎖定與包驗(yàn)證的實(shí)戰(zhàn)技巧生產(chǎn)系統(tǒng)最怕的一件事是“重啟后服務(wù)莫名不可用”而常見原因之一是某個(gè)依賴包被意外升級(jí)。dnf versionlock可以鎖住指定包的版本dnf install -y python3-dnf-plugin-versionlock dnf versionlock add nginx dnf versionlock list這個(gè)插件把指定包鎖定為當(dāng)前版本后續(xù)執(zhí)行dnf update時(shí)會(huì)自動(dòng)跳過鎖定項(xiàng)。使用時(shí)機(jī)是在重要服務(wù)部署完成后立刻鎖定不是等事故發(fā)生了才想起來。rpm -V用于驗(yàn)證已安裝包的關(guān)鍵文件是否被修改。比如懷疑/bin/ls被人動(dòng)過手腳可以執(zhí)行rpm -V coreutils輸出里出現(xiàn)S.5....T.等標(biāo)志說明文件的權(quán)限、大小、修改時(shí)間至少有一項(xiàng)和安裝時(shí)不一樣這時(shí)候就要進(jìn)一步排查。這個(gè)功能在安全審計(jì)場(chǎng)景里特別常用卻很少有人知道掌握之后能幫你在系統(tǒng)異常時(shí)快速定位文件級(jí)別的變化。7. 計(jì)劃任務(wù)at、crontab與systemd timer的取舍7.1 at一次性任務(wù)的注意事項(xiàng)Linux計(jì)劃任務(wù)分三類at處理一次性任務(wù)crontab處理周期性任務(wù)systemd timer作為更現(xiàn)代的方案逐漸流行。RH134要求至少掌握前兩者但實(shí)際工作中三者都值得了解。at的用法很簡(jiǎn)單echo sh /opt/scripts/backup.sh | at 02:30 atq atrm 任務(wù)IDat運(yùn)行前需要atd服務(wù)處于運(yùn)行狀態(tài)并且用戶必須被允許使用at命令相關(guān)配置在/etc/at.allow和/etc/at.deny里。我個(gè)人的習(xí)慣是只要任務(wù)會(huì)重復(fù)執(zhí)行就優(yōu)先用crontab而不是每次都寫at因?yàn)閍t任務(wù)清單不夠直觀時(shí)間久了容易忘記有哪些遺留任務(wù)在等你。7.2 crontab的時(shí)間格式與環(huán)境變量坑crontab -l查看任務(wù)crontab -e編輯任務(wù)這是最基礎(chǔ)的操作。時(shí)間格式“分 時(shí) 日 月 周”五個(gè)字段分別對(duì)應(yīng)其中最需要仔細(xì)的是“星期”字段取值范圍是0到70和7都表示周日。我踩過最大的坑是cron任務(wù)里PATH環(huán)境變量不全的問題。crontab執(zhí)行環(huán)境不像登錄shell那樣有完整的PATH所以/usr/bin/python3可能直接找不到python3。解決方式有兩種要么在crontab文件頂部設(shè)置PATH/usr/local/bin:/usr/bin:/bin要么在腳本內(nèi)部使用絕對(duì)路徑執(zhí)行所有外部命令。第二種方式我自己更推薦因?yàn)樗灰蕾嘽ron服務(wù)端的配置腳本拿到哪里都能跑。%符號(hào)是另一個(gè)大坑。crontab中%有特殊含義會(huì)被當(dāng)作換行如果命令里需要用到date %Y%m%d這種帶百分號(hào)的內(nèi)容必須轉(zhuǎn)義為\%。不轉(zhuǎn)義的結(jié)果是命令被截?cái)嗲胰罩纠锶莂ur error非常難排查。查看cron執(zhí)行情況的方法grep CRON /var/log/cron tail -f /var/log/cron journalctl | grep crond7.3 systemd timer更適合復(fù)雜任務(wù)的現(xiàn)代方案如果你需要更精確的控制或者任務(wù)涉及服務(wù)依賴關(guān)系建議使用systemd timer。它的優(yōu)勢(shì)是支持日志統(tǒng)一收集、失敗重試、隨機(jī)延遲避免“整點(diǎn)風(fēng)暴”還能準(zhǔn)確查看上次執(zhí)行時(shí)間和下次執(zhí)行時(shí)間。一個(gè)最小示例是兩個(gè)文件/etc/systemd/system/backup.service[Service] Typeoneshot ExecStart/usr/local/bin/backup.sh/etc/systemd/system/backup.timer[Unit] DescriptionRun backup daily [Timer] OnCalendar*-*-* 02:00:00 Persistenttrue [Install] WantedBytimers.target啟動(dòng)方式跟普通服務(wù)一樣systemctl enable --now backup.timer systemctl list-timers journalctl -u backup.servicePersistenttrue表示如果錯(cuò)過了預(yù)定執(zhí)行時(shí)間比如機(jī)器當(dāng)時(shí)關(guān)機(jī)下次開機(jī)后會(huì)立刻補(bǔ)跑這一點(diǎn)是cron做不到的。我建議任務(wù)簡(jiǎn)單就繼續(xù)用crontab任務(wù)多、依賴強(qiáng)、需要可靠記錄時(shí)遷移到systemd timer。8. 一些實(shí)在話從頭到尾把RH134的這些知識(shí)點(diǎn)再過一遍其實(shí)看不出哪個(gè)是“難點(diǎn)中的難點(diǎn)”但確實(shí)能感受到知識(shí)點(diǎn)之間的聯(lián)系非常緊密。用戶管理一定關(guān)聯(lián)到文件和目錄權(quán)限權(quán)限又聯(lián)系到進(jìn)程運(yùn)行身份進(jìn)程再關(guān)聯(lián)到systemd服務(wù)服務(wù)又繞不開網(wǎng)絡(luò)與防火墻。考試時(shí)間緊張時(shí)很多人的問題不是“不會(huì)”而是“知識(shí)是散的”遇到題目要從零開始拼接上下文自然慢。我個(gè)人的體會(huì)是學(xué)到這里必須用手里的機(jī)器把每個(gè)環(huán)節(jié)串起來跑一遍而不是一個(gè)個(gè)孤立的命令去背。準(zhǔn)備一臺(tái)干凈的虛擬機(jī)從建立用戶、分配組、設(shè)置ACL、寫unit文件、配防火墻、設(shè)計(jì)劃任務(wù)到模擬一次內(nèi)存告警或磁盤告警并修復(fù)整套流程演練下來比刷兩遍考綱更有用。最后分享一個(gè)小技巧如果你在實(shí)驗(yàn)環(huán)境里搞壞了某個(gè)服務(wù)別急著重裝系統(tǒng)先systemctl status和journalctl -u把日志看明白再嘗試恢復(fù)。這個(gè)過程比單純“能跑起來”更能鍛煉排查能力。等到你遇到故障的第一反應(yīng)不是“重啟試試”而是“先查日志再動(dòng)手”RH134的實(shí)操目標(biāo)也就基本達(dá)成了。