戰(zhàn):從目錄結(jié)構(gòu)到文件權(quán)限的命令行指南)
1. 從“知道Linux”到“理解Linux”的關(guān)鍵一步如果你看過(guò)“前篇1”應(yīng)該已經(jīng)對(duì)Linux是什么、為什么服務(wù)器上幾乎都是它、以及怎么在虛擬機(jī)里裝一個(gè)最小化系統(tǒng)有了基本概念。這篇文章的重點(diǎn)不在安裝而在安裝完系統(tǒng)之后的第一腳——把這個(gè)黑乎乎的終端窗口用起來(lái)搞清楚文件系統(tǒng)是怎么組織的、用戶和權(quán)限到底是怎么回事、常用的命令到底該在什么時(shí)候用。換句話說(shuō)前篇1幫你把Linux“跑起來(lái)”這一篇幫你“活下來(lái)”——在純命令行環(huán)境里不再迷路。標(biāo)題里我把這篇叫“前篇2”是因?yàn)樗廊粚儆谌腴T序列不牽扯Shell腳本編程、網(wǎng)絡(luò)服務(wù)搭建、內(nèi)核參數(shù)調(diào)優(yōu)這類進(jìn)階主題。適合剛裝完系統(tǒng)、面對(duì)命令行還有點(diǎn)頭大的新手也適合用過(guò)一陣子但始終覺(jué)得命令是死記硬背、想搞明白背后邏輯的同學(xué)。這篇文章里出現(xiàn)的所有操作都可以在虛擬機(jī)里的CentOS、Ubuntu或者Debian上直接復(fù)現(xiàn)不需要額外購(gòu)買服務(wù)器。我會(huì)盡量把操作背后的“為什么”講清楚而不是只扔給你一串命令。我一直認(rèn)為L(zhǎng)inux入門最大的門檻不是記不住命令而是不理解設(shè)計(jì)者的思路。一旦想通Linux“一切皆文件”“多人多任務(wù)”這兩個(gè)核心理念你會(huì)發(fā)現(xiàn)命令其實(shí)不是記出來(lái)的是推導(dǎo)出來(lái)的。2. 目錄結(jié)構(gòu)為什么Linux沒(méi)有C盤2.1 一切從根“/”開(kāi)始Windows用戶剛接觸Linux最不適應(yīng)的就是盤符消失了。D盤、E盤統(tǒng)統(tǒng)不存在所有文件都掛在一個(gè)叫“/”的根目錄下面。這個(gè)“/”是整個(gè)文件系統(tǒng)的起點(diǎn)跟Windows的“此電腦”地位類似但機(jī)制完全不同Windows里C盤是獨(dú)立的樹(shù)D盤又是另一棵樹(shù)兩棵樹(shù)之間的路徑是物理隔離的Linux則是一棵單一大樹(shù)你插入一塊U盤、掛載一塊新硬盤都是在“/”這棵樹(shù)的某個(gè)分支節(jié)點(diǎn)上長(zhǎng)出新枝葉。這個(gè)節(jié)點(diǎn)就是你選擇的“掛載點(diǎn)”比如常見(jiàn)的/mnt或/media。理解了這個(gè)設(shè)計(jì)很多常識(shí)就能自然推導(dǎo)出來(lái)。比如你發(fā)現(xiàn)某塊磁盤空間不夠但另一塊很大的磁盤還空著這時(shí)候的正規(guī)做法是把新磁盤格式化然后在“/”下建一個(gè)目錄作為掛載點(diǎn)用mount命令把它掛上去。從此你寫文件到這個(gè)目錄實(shí)際寫進(jìn)了新磁盤但對(duì)用戶和程序來(lái)說(shuō)路徑?jīng)]有任何變化。這種“邏輯路徑與物理設(shè)備解耦”的設(shè)計(jì)正是服務(wù)器可以不斷擴(kuò)容的基礎(chǔ)。再比如你用ls -l /看到的那一堆目錄是FHS文件系統(tǒng)層次標(biāo)準(zhǔn)Filesystem Hierarchy Standard約定好的結(jié)構(gòu)。我用一個(gè)生活類比來(lái)幫你記把Linux系統(tǒng)想象成一棟大樓——/etc是管理科所有軟件的配置文件都在這/var是檔案室日志、隊(duì)列、臨時(shí)數(shù)據(jù)/usr是公共圖書(shū)館系統(tǒng)自帶的軟件和庫(kù)文件/home是員工宿舍每個(gè)用戶的家目錄/tmp是前臺(tái)接待區(qū)的便簽紙臨時(shí)文件重啟就清理。這套布局一旦在大腦里建立了畫(huà)面找什么文件都不會(huì)再?zèng)]頭緒。2.2 你必須認(rèn)識(shí)的幾個(gè)關(guān)鍵目錄不是所有目錄都需要第一時(shí)間搞懂但下面這幾個(gè)是高頻出現(xiàn)的建議盡快混個(gè)臉熟/etc系統(tǒng)級(jí)配置文件的大本營(yíng)。改主機(jī)名、配IP地址、設(shè)DNS全都繞不開(kāi)它。里面最有名的是passwd、shadow和fstab三個(gè)文件分別管用戶信息、用戶密碼、開(kāi)機(jī)自動(dòng)掛載磁盤。注意區(qū)分很多初學(xué)者以為改配置就是“隨便編輯”但這里的文件一旦寫錯(cuò)語(yǔ)法可能導(dǎo)致系統(tǒng)啟動(dòng)異常所以動(dòng)手前先備份一份cp /etc/xxx /etc/xxx.bak是職業(yè)習(xí)慣。/var存放變化的數(shù)據(jù)尤其是日志。/var/log/messages或syslog記錄了系統(tǒng)運(yùn)行的各種事件排查故障時(shí)這是第一現(xiàn)場(chǎng)。運(yùn)維圈有個(gè)梗“日志在手天下我有”真出問(wèn)題的時(shí)候/var/log比搜索引擎好使得多。/home普通用戶的家目錄集合。你在/home下能看到的每個(gè)用戶名就是系統(tǒng)里的一個(gè)“人”。用戶登錄后默認(rèn)停在自己的家目錄里權(quán)限上也是自己家隨便折騰別人家不能亂闖。/root管理員root用戶的家目錄。它獨(dú)立在/home之外是因?yàn)橄到y(tǒng)維護(hù)時(shí)即使其他分區(qū)掛掉了root依然要能登錄做修復(fù)。/tmp臨時(shí)文件存放處任何用戶都有權(quán)限寫但系統(tǒng)會(huì)在重啟時(shí)定期清理。你下載個(gè)臨時(shí)安裝包、解壓個(gè)東西放這里挺方便但別指望它存持久化數(shù)據(jù)。還有個(gè)細(xì)節(jié)值得注意你執(zhí)行pwd命令看到的當(dāng)前路徑開(kāi)頭那個(gè)“/”指的是根目錄而相對(duì)路徑比如cd ..里“..”代表當(dāng)前目錄的上級(jí)目錄“.”則代表當(dāng)前目錄本身。這些看似不起眼的符號(hào)在Shell里天天要用打好基礎(chǔ)后面寫腳本才不慌。2.3 用tree和ls看清目錄結(jié)構(gòu)光說(shuō)理論容易忘動(dòng)手看一眼就熟了。在終端輸入tree -L 2 /這條命令會(huì)以樹(shù)的形狀展示根目錄下兩層的內(nèi)容。如果你的系統(tǒng)沒(méi)裝tree用ls -R /也行就是輸出會(huì)密集一些。對(duì)比著看一遍你會(huì)發(fā)現(xiàn)剛才提到的那些目錄都在眼前。還有一個(gè)很實(shí)用的自查思路安裝一款新軟件后想知道它把文件都放哪了可以用rpm -qlCentOS系或dpkg -LDebian系列出來(lái)這比滿世界找安裝目錄高效得多。3. 文件操作和文件打交道的基本功3.1 查看、創(chuàng)建、移動(dòng)、刪除的常用組合Linux的文件操作核心命令不多翻來(lái)覆去就是ls、cd、touch、mkdir、cp、mv、rm這幾個(gè)。真正體現(xiàn)水平的是參數(shù)組合和防止誤操作的習(xí)慣。先看查看類的ls它有三個(gè)高頻參數(shù)ls -l顯示詳細(xì)信息權(quán)限、屬主、大小、時(shí)間ls -a顯示隱藏文件以點(diǎn)開(kāi)頭的文件ls -lh則是把文件大小轉(zhuǎn)成人類易讀的格式。我經(jīng)??吹叫率执虺蒷s -la沒(méi)問(wèn)題但如果你想知道目錄自身的詳細(xì)信息而不展開(kāi)內(nèi)容記得加-d參數(shù)ls -ld /etc。創(chuàng)建目錄用mkdir -p /tmp/test/a/b-p參數(shù)可以一次性創(chuàng)建多級(jí)目錄省去一層層mkdir的麻煩。創(chuàng)建空文件用touch file.txt它還有個(gè)冷門用場(chǎng)改文件時(shí)間戳。如果要復(fù)制目錄必須加-r遞歸參數(shù)cp -r dir1 dir2移動(dòng)或重命名目錄用mv就沒(méi)有這個(gè)限制mv dir1 dir2直接搞定——mv既是移動(dòng)又是重命名這個(gè)雙重身份常讓新手困惑記住“在同一個(gè)目錄下mv就是改名跨目錄mv就是搬運(yùn)”。刪除命令rm是個(gè)容易翻車的高危操作。rm -rf /tmp/test里的-r是遞歸刪除目錄-f是強(qiáng)制不提示。很多重大線上事故都是手快敲成rm -rf /導(dǎo)致的。我個(gè)人的鐵律是敲rm之前先pwd確認(rèn)自己在哪刪除目錄時(shí)盡量先ls看看里面的內(nèi)容回收站思路也行——mv到/tmp下而不是直接rm批量刪除前用echo先輸出一遍文件名確認(rèn)范圍。3.2 文件查看五兄弟cat、less、more、head、tail查看文件內(nèi)容恐怕是日常操作里最頻繁的。cat適合看短文件但長(zhǎng)文件會(huì)把終端刷得亂七八糟這時(shí)用less更合適支持上下翻頁(yè)、按/搜索關(guān)鍵字、按q退出幾乎可以當(dāng)成Windows記事本的終端版來(lái)用。more是less的前輩功能少一些但在某些精簡(jiǎn)系統(tǒng)里仍然存在??撮_(kāi)頭和結(jié)尾用head和tailhead -n 20 /var/log/syslog顯示前20行tail -n 20顯示后20行。真正驚艷的是tail -ffollow它可以持續(xù)跟蹤文件末尾新增的內(nèi)容。排查日志時(shí)開(kāi)一個(gè)終端tail -f實(shí)時(shí)觀察另一個(gè)終端復(fù)現(xiàn)操作這種感覺(jué)就如同開(kāi)了上帝視角——錯(cuò)誤一發(fā)生日志那邊馬上滾出來(lái)。這里分享一個(gè)運(yùn)維中極高頻的組合用法我們要在幾百M(fèi)B的日志里查某個(gè)時(shí)間段的報(bào)錯(cuò)cat整個(gè)文件顯然不行l(wèi)ess直接打開(kāi)等半天的服務(wù)器大日志也痛苦正確做法是用grep在管道里過(guò)濾cat app.log | grep ERROR | tail -n 50或者干脆tail -f app.log | grep ERROR——實(shí)時(shí)過(guò)濾錯(cuò)誤日志只把感興趣的滾出來(lái)。管道這個(gè)符號(hào)“|”后面專章講你先在這里記住一個(gè)認(rèn)識(shí)它能把左邊命令的輸出連續(xù)傳給右邊命令。3.3 軟鏈接Linux里的“快捷方式”Windows有快捷方式Linux對(duì)應(yīng)的是軟鏈接symbolic link。創(chuàng)建方式十分簡(jiǎn)單ln -s /var/log/nginx/access.log /home/user/nginx-log之后你在家目錄訪問(wèn)nginx-log就等于在訪問(wèn)那個(gè)真實(shí)日志文件。軟鏈接在運(yùn)維中使用率極高比如把編譯后的程序目錄做一個(gè)軟鏈到/usr/local/bin就能實(shí)現(xiàn)“升級(jí)程序時(shí)切換鏈接指向”的效果。還有一個(gè)需要理解的同門命令硬鏈接ln不帶-s。硬鏈接比較特殊它跟原文件共享同一個(gè)inode刪除原文件后硬鏈接依然有效軟鏈接則是指針原文件沒(méi)了它就懸空斷裂。日常使用中軟鏈接出現(xiàn)的頻率遠(yuǎn)超硬鏈接但面試時(shí)考官總愛(ài)問(wèn)兩者的區(qū)別建議你把這段話讀兩遍。4. 用戶與權(quán)限多人系統(tǒng)的安全基石4.1 Linux的用戶體系設(shè)計(jì)思路Linux從誕生起就是多用戶、多任務(wù)操作系統(tǒng)。所謂多用戶就是同一臺(tái)機(jī)器上可以同時(shí)有很多人登錄使用各自的文件互不干擾各人的操作也不能隨便影響別人。這套體系靠?jī)蓚€(gè)東西支撐一個(gè)是“用戶”一個(gè)是“權(quán)限位”。在Linux里用戶被區(qū)分成root和普通用戶。root是超級(jí)管理員UID是0擁有壓倒一切的力量普通用戶的UID通常從1000開(kāi)始。還有一個(gè)概念叫“組”把一部分用戶歸到一個(gè)組里配合后續(xù)講的權(quán)限位就能實(shí)現(xiàn)“隊(duì)內(nèi)資源共享、隊(duì)外隔離”。所有的用戶信息都存在/etc/passwd文件里密碼則加密存在/etc/shadow里這就是“影子文件”普通用戶不可讀防止暴力破解。新增用戶有兩個(gè)命令可選useradd -m -u 1001 -s /bin/bash alice-m是自動(dòng)創(chuàng)建家目錄-u指定UID-s指定登錄Shelladduser是更友好的交互式命令會(huì)引導(dǎo)你設(shè)置密碼、填寫信息。刪除用戶用userdel -r alice加-r同時(shí)刪掉家目錄注意這個(gè)操作不可逆。4.2 rwx權(quán)限位讀、寫、執(zhí)行是怎么分配的在終端執(zhí)行l(wèi)s -l每行開(kāi)頭有10個(gè)字符例如drwxr-xr--。第1位是文件類型d代表目錄-代表普通文件l代表軟鏈接。后面9位分成三組每組三位分別對(duì)應(yīng)“屬主文件主人”“屬組擁有組”“其他用戶”的權(quán)限。每組里r代表可讀4、w代表可寫2、x代表可執(zhí)行1。為什么要強(qiáng)調(diào)這三個(gè)數(shù)字因?yàn)閏hmod支持?jǐn)?shù)字法寫權(quán)限。比如chmod 750 script.sh7421表示屬主可讀可寫可執(zhí)行541表示屬組可讀可執(zhí)行0表示其他人啥都不能干。這種數(shù)字表示法是所有Linux考試的必考項(xiàng)也是日常操作最常用的寫法。符號(hào)法chmod ux script.sh給屬主加執(zhí)行權(quán)限也很實(shí)用尤其只改一項(xiàng)權(quán)限時(shí)比數(shù)字法更清晰。這里有個(gè)新手常忽略的細(xì)節(jié)刪除一個(gè)文件看的是你對(duì)這個(gè)文件所在目錄是否有寫權(quán)限而不是對(duì)文件本身的權(quán)限。也就是說(shuō)對(duì)文件有rwx權(quán)限不代表你有權(quán)把它刪了真正的“生殺大權(quán)”在目錄的w權(quán)限上。這個(gè)認(rèn)知差異曾讓很多初學(xué)者在共享目錄里莫名其妙刪不掉別人的文件——其實(shí)是他們自己對(duì)目錄沒(méi)有寫權(quán)限。反過(guò)來(lái)也提醒你對(duì)某個(gè)目錄開(kāi)放w權(quán)限時(shí)等于把目錄內(nèi)的文件“刪除權(quán)”也交出去了。4.3 用chmod、chown和sudo把權(quán)限管好除了chmod另一個(gè)高頻命令是chown變更屬主和屬組。典型場(chǎng)景是軟件需要運(yùn)行在某個(gè)用戶身份下或者你把自己的文件移交給同事。用法chown alice:devops app.log表示屬主改成alice、屬組改成devops。只改屬主就chown alice file只改屬組就chgrp devops file。再來(lái)說(shuō)sudo。它的作用是用另一個(gè)用戶通常是root的身份執(zhí)行單條命令而不用切換登錄身份。比如當(dāng)前用戶沒(méi)有權(quán)限查看root目錄可以sudo ls /root。sudo之所以“安全”是因?yàn)樗墓芸匾?guī)則寫在/etc/sudoers里哪些用戶能執(zhí)行什么命令、要不要輸入密碼、在哪些主機(jī)上生效全都可以精確配置。想給新用戶sudo權(quán)限在配置里加一行“用戶名 ALL(ALL) ALL”就行但我不建議隨便給原則上“最小權(quán)限剛剛夠用”。這里必須單獨(dú)強(qiáng)調(diào)一下能用sudo執(zhí)行單條命令就別用su切到root身份。因?yàn)閟udo是“白名單式授權(quán)”日志會(huì)記錄每一筆操作su一旦切過(guò)去所有命令都以root身份跑誤操作無(wú)記錄、無(wú)約束。生產(chǎn)環(huán)境里許多安裝腳本被要求嚴(yán)禁直接用root跑正是為了減少事故半徑。5. 命令實(shí)操把零散命令組合成工作流5.1 管道、重定向與通配符我前面說(shuō)“命令不是背出來(lái)的是推導(dǎo)出來(lái)的”很大程度上靠的就是管道、重定向和通配符這三樣組合工具。管道符“|”把左邊命令的標(biāo)準(zhǔn)輸出接到右邊的標(biāo)準(zhǔn)輸入。一個(gè)典型例子ps aux | grep nginx從所有進(jìn)程里過(guò)濾含nginx的行——這是排查服務(wù)是否啟動(dòng)的最常用寫法。重定向符號(hào)“”覆蓋寫入和“”追加寫入把命令輸出寫到文件里echo hello readme.txt或者ls /etc etc-list.txt。還有錯(cuò)誤重定向“2”command 2 error.log只把錯(cuò)誤信息存下來(lái)。這三者的組合可以讓你從只會(huì)看終端輸出進(jìn)化到能對(duì)輸出做篩選、落盤、歸檔。通配符則是Shell的模糊匹配工具代表任意長(zhǎng)度字符?代表單個(gè)字符[abc]代表括號(hào)中的任一字符。rm test.log可以一次性刪除所有以test開(kāi)頭、.log結(jié)尾的文件ls /etc/ssh/ssh*_config能精確抓住目標(biāo)配置文件。大量文件操作場(chǎng)景下通配符能省下大半時(shí)間但也要注意通配符是在Shell展開(kāi)的如果當(dāng)前目錄下沒(méi)有匹配的文件它會(huì)原樣傳給命令導(dǎo)致你以為刪了文件實(shí)際沒(méi)刪。5.2 查找文件與內(nèi)容find和grep是兄弟find用于按文件名、類型、時(shí)間、大小找文件。它的基本能力find /var/log -name *.log -mtime 7這條命令的含義在/var/log下找出所有以.log結(jié)尾、修改時(shí)間超過(guò)7天的文件。你可以把-mtime換成-size 100M找大文件、換-user alice找指定用戶的文件。在生產(chǎn)環(huán)境里“找出三天前生成、已歸檔的備份并清理”這類定時(shí)任務(wù)幾乎就是find的標(biāo)準(zhǔn)應(yīng)用。grep用于按文件內(nèi)容過(guò)濾。比如在應(yīng)用日志里搜關(guān)鍵字grep -r OutOfMemory /var/log/app/-r遞歸搜索目錄下所有文件常搭配-n顯示行號(hào)。感覺(jué)信息量太大時(shí)grep可以再接管道grep OutOfMemory /var/log/app/app.log | head -20只看前20行。這兩個(gè)命令的聯(lián)用頻率在你日常操作里絕對(duì)排得進(jìn)前三。5.3 查看進(jìn)程、端口和服務(wù)狀態(tài)入門階段最剛需的運(yùn)維三連就是進(jìn)程、端口和服務(wù)。查看進(jìn)程用ps最常用的是ps -ef顯示全部進(jìn)程完整信息管道過(guò)濾出自己關(guān)心的ps -ef | grep java??炊丝谡加糜胣etstat或ss新系統(tǒng)默認(rèn)推薦ssss -tlnp其中-t是TCP協(xié)議、-l是監(jiān)聽(tīng)狀態(tài)、-n用數(shù)字端口顯示、-p顯示對(duì)應(yīng)進(jìn)程PID。服務(wù)管理方面現(xiàn)代系統(tǒng)多用systemctlsystemctl status nginx查看服務(wù)狀態(tài)、systemctl start nginx啟動(dòng)、systemctl enable nginx設(shè)為開(kāi)機(jī)自啟。遇到服務(wù)啟動(dòng)失敗時(shí)第一件事就是systemctl status它通常會(huì)給出失敗原因或提示用journalctl -xe查細(xì)節(jié)。5.4 安裝軟件apt與yum的簡(jiǎn)明對(duì)照不同Linux發(fā)行版用不同包管理器。Debian/Ubuntu系用aptsudo apt update更新軟件包索引sudo apt install nginx安裝軟件sudo apt remove nginx卸載但保留配置sudo apt purge nginx徹底卸載并把配置一起刪干凈。CentOS/RHEL系用dnf或yumsudo dnf install nginx、sudo dnf remove nginx。另外還有通用安裝方式源碼編譯./configure make make install、二進(jìn)制包.rpm或.deb直接裝、容器鏡像docker pull但初學(xué)者只需掌握包管理器就足以應(yīng)付絕大多數(shù)場(chǎng)景。這里有個(gè)小提示裝完軟件后命令找不到多半是安裝過(guò)程沒(méi)把可執(zhí)行文件放到PATH里或者是CentOS里nginx服務(wù)名叫nginx、但可執(zhí)行文件是/usr/sbin/nginx用which nginx驗(yàn)證一下即可。5.5 一個(gè)綜合實(shí)操場(chǎng)景演練紙上談兵沒(méi)有感覺(jué)我模擬一個(gè)新手最常見(jiàn)的操作流給你走一遍你在自己的虛擬機(jī)上跟著敲就能體驗(yàn)完整# 第一步創(chuàng)建一個(gè)臨時(shí)項(xiàng)目目錄進(jìn)入其中 mkdir -p ~/my-project/logs cd ~/my-project # 第二步生成一個(gè)測(cè)試文件并寫入內(nèi)容 echo 2025-01-01 10:00:01 ERROR connection refused logs/app.log echo 2025-01-01 10:00:02 INFO request ok logs/app.log # 第三步查看末尾日志再過(guò)濾只留下報(bào)錯(cuò)行 tail -f logs/app.log grep ERROR logs/app.log | wc -l # 第四步把這個(gè)日志文件做一個(gè)軟鏈接放到/tmp下便于其他程序讀取 ln -s ~/my-project/logs/app.log /tmp/my-app.log # 第五步把整個(gè)項(xiàng)目目錄打包備份 tar -czf my-project-backup.tar.gz ~/my-project # 第六步清理演練環(huán)境 cd ~ rm -rf my-project my-project-backup.tar.gz /tmp/my-app.log這套流程囊括了創(chuàng)建、追加寫入、查看、過(guò)濾統(tǒng)計(jì)、鏈接、打包歸檔、清理幾乎每一步都是一線操作里會(huì)反復(fù)用到的。tar的-z是gzip壓縮、-c創(chuàng)建歸檔、-f指定文件名解包對(duì)應(yīng)tar -xzf你可以在練習(xí)中多敲兩遍形成肌肉記憶。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄6.1 command not found是初學(xué)者頭號(hào)問(wèn)題分析一下原因要么命令沒(méi)安裝要么命令不在PATH里。方案是先用which命令名確認(rèn)路徑如果沒(méi)有任何輸出說(shuō)明確實(shí)沒(méi)裝如果輸出了路徑但執(zhí)行還是報(bào)錯(cuò)那就是PATH配置問(wèn)題可以臨時(shí)export PATH$PATH:/新路徑試一下。還有個(gè)誤區(qū)分辨有些命令在root用戶下能執(zhí)行普通用戶下不行最典型的就是ifconfig它位于/sbin目錄普通用戶PATH里默認(rèn)不含/sbin所以提示command not found。解決方式是直接用/sbin/ifconfig或者用ip addr新系統(tǒng)的替代命令。6.2 Permission denied不是命令錯(cuò)了是身份或權(quán)限不對(duì)處理思路分三步先ls -l看文件權(quán)限和屬主然后確認(rèn)當(dāng)前用戶是誰(shuí)whoami再判斷是自己該用sudo、還是文件屬組不對(duì)、還是目錄缺少執(zhí)行權(quán)限擋了路。這中間有個(gè)隱藏坑目錄至少有r-x權(quán)限你才能進(jìn)入并列出內(nèi)容如果只有r而缺xls可能能列出部分文件名但cd進(jìn)不去和你預(yù)期的行為完全不一樣。這類權(quán)限問(wèn)題在檢查時(shí)別只盯文件本身一層層往上把父目錄權(quán)限都排查一遍。6.3 磁盤滿但du看不出大文件這是典型的inode耗盡了磁盤還有空間但文件系統(tǒng)的小文件數(shù)量達(dá)到上限導(dǎo)致創(chuàng)建不了新文件。癥狀是df -h顯示還有幾百G空閑但寫文件時(shí)提示No space left on device。排查思路用df -i看inode使用率用find / -xdev -type f | wc -l統(tǒng)計(jì)文件數(shù)量。常見(jiàn)元兇是臨時(shí)目錄和郵件隊(duì)列里積壓了海量小文件清理策略是分批刪先列目錄再刪、一邊刪一邊df -i觀察別貪快一把梭。這類故障在真實(shí)生產(chǎn)環(huán)境里能讓人抓狂提前知道你就贏了一半。6.4 軟鏈接斷裂ls時(shí)標(biāo)紅、訪問(wèn)時(shí)顯示No such file處理方法是先ls -l確認(rèn)鏈接指向哪里再用ls -l驗(yàn)證目標(biāo)路徑是否存在。如果目標(biāo)被移動(dòng)或刪除就成了懸空鏈接刪掉重建ln -s即可。需要特別說(shuō)明刪除軟鏈接本身用rm linkname這里絕不能帶斜杠如果誤敲rm linkname/它會(huì)嘗試刪除鏈接指向的目錄內(nèi)容性質(zhì)就變了。6.5 定時(shí)任務(wù)crond不執(zhí)行先確認(rèn)crond服務(wù)在運(yùn)行systemctl status crond再查看用戶的crontabcrontab -l確認(rèn)腳本本身有執(zhí)行權(quán)限ls -l script.sh。還有個(gè)極易忽略的細(xì)節(jié)定時(shí)任務(wù)的環(huán)境變量和你登錄的用戶環(huán)境不同腳本里用到自定義PATH或全局變量時(shí)務(wù)必寫成絕對(duì)路徑或腳本內(nèi)自行export。我曾見(jiàn)過(guò)一個(gè)備份腳本在手動(dòng)執(zhí)行時(shí)一切正常放到crontab里就一直失敗最后發(fā)現(xiàn)是腳本里用了相對(duì)路徑在定時(shí)任務(wù)的工作目錄下找不到文件——把路徑改絕對(duì)后立刻穩(wěn)定運(yùn)行。6.6 需要永久記住的命令三兄弟man、whatis、history遇到不熟悉的命令man命令名可以打開(kāi)官方手冊(cè)按q退出按/搜索關(guān)鍵詞。想快速回憶命令用途用whatis命令名能給出簡(jiǎn)短說(shuō)明。history能查看自己敲過(guò)的全部命令配合“!編號(hào)”可重復(fù)執(zhí)行。這三個(gè)工具不需要刻意背但要在遇到問(wèn)題的瞬間想到它們你的Linux之旅會(huì)順暢很多。7. 入門之后下一步該往哪里走這一篇的內(nèi)容覆蓋了從目錄結(jié)構(gòu)到用戶權(quán)限、從文件操作到命令組合、從常見(jiàn)故障到排查手法的入門閉環(huán)。如果你認(rèn)真把上面的命令在自己的虛擬機(jī)里過(guò)了一遍此刻已經(jīng)能獨(dú)立完成很多基礎(chǔ)操作了。但這只是第一步接下來(lái)的學(xué)習(xí)路線可以按興趣選如果目標(biāo)是日常開(kāi)發(fā)建議下一步學(xué)Vim編輯器的常用操作和Shell腳本基本語(yǔ)法變量、循環(huán)、條件判斷之后嘗試寫一個(gè)自動(dòng)備份腳本或做一個(gè)監(jiān)控磁盤閾值的報(bào)警腳本。如果目標(biāo)是運(yùn)維建議系統(tǒng)看一遍systemd服務(wù)管理、網(wǎng)絡(luò)配置ip、ss、firewalld、日志輪轉(zhuǎn)與journald然后把前文提到的技術(shù)棧再深耕一層。如果目標(biāo)是嵌入式建議把編譯工具鏈、交叉編譯、文件系統(tǒng)制作與燒寫納入日程這些內(nèi)容都建立在你對(duì)Linux文件系統(tǒng)的理解之上。有一點(diǎn)我特別想對(duì)新手說(shuō)Linux學(xué)習(xí)的反饋周期很短命令敲下去立刻就有結(jié)果所以多動(dòng)手比多收藏強(qiáng)。每次遇到不會(huì)的操作先man、再搜索、再記錄形成自己的筆記體系。我最初學(xué)Linux時(shí)把踩過(guò)的坑都寫在一個(gè)Markdown文件里后來(lái)它成了我再也不怕服務(wù)器故障的底氣。你也可以試試。最后分享一個(gè)我自己養(yǎng)成的習(xí)慣每周選一天把常用命令的用法不看任何參考地默寫一遍順便在虛擬機(jī)里重新搭一遍環(huán)境。幾次下來(lái)你會(huì)發(fā)現(xiàn)那些當(dāng)初要查半天才敢敲的命令早就變成了下意識(shí)的操作。Linux不像別的技術(shù)那樣有那么多“看起來(lái)的高級(jí)感”它講究的就是手里有活、心里有數(shù)——只要你順著上面這些基礎(chǔ)一步步走后面的路自然就通了。