Linux中磁盤空間排查實(shí)戰(zhàn)指南
問題場(chǎng)景
生產(chǎn)環(huán)境磁盤使用率突破閾值,需要快速定位空間占用源并制定清理策略。
診斷鏈路
1. 全局視圖:df定位分區(qū)
df -h # 人類可讀格式 df -i # 檢查inode耗盡情況
2. 目錄級(jí)排查:du統(tǒng)計(jì)占用
# 一級(jí)目錄占用排序 du -sh /* 2>/dev/null | sort -hr | head -10 # 深度遍歷(謹(jǐn)慎使用) du -h --max-depth=2 /var | sort -hr | head -20
3. 文件級(jí)定位:find精準(zhǔn)打擊
# 查找大文件(>100MB)
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 查找最近7天修改的大文件
find /var/log -type f -mtime -7 -size +50M
常見陷阱
陷阱1:已刪除文件未釋放空間
lsof | grep deleted # 需要重啟占用進(jìn)程或kill -HUP
陷阱2:隱藏的Docker占用
docker system df # 查看Docker空間占用 docker system prune -a --volumes # 清理懸空資源
陷阱3:inode耗盡但空間充足
df -i # 檢查inode使用率 find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
預(yù)防措施
- 配置logrotate自動(dòng)輪轉(zhuǎn)日志
- 設(shè)置磁盤使用率告警(建議80%閾值)
- 定期清理臨時(shí)文件和舊備份
- 監(jiān)控Docker鏡像和容器數(shù)量
方法補(bǔ)充
磁盤空間耗盡(No space left on device)是Linux運(yùn)維中最常見的問題之一。下文將帶你走通從系統(tǒng)級(jí)檢查到目錄級(jí)定位的完整排查鏈路,覆蓋df、du、lsof、find等核心工具的使用場(chǎng)景和技巧。
快速體檢:df - 查看整體磁盤使用情況
df(disk free)用于查看文件系統(tǒng)的總?cè)萘?、已用空間、可用空間和掛載點(diǎn)。它是排查的第一步,能快速鎖定哪個(gè)分區(qū)已經(jīng)飽和。
基礎(chǔ)用法
df -h # 以人類可讀的格式顯示(GB/MB)
輸出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 98G 78G 15G 84% /
/dev/sda2 500G 498G 2.0G 100% /home
- Use% 100%:該分區(qū)已滿,需要進(jìn)一步排查。
- Avail 0:可用空間為零,系統(tǒng)可能無法寫入日志或創(chuàng)建臨時(shí)文件。
常用選項(xiàng)
| 命令 | 說明 |
|---|---|
df -h | 人類可讀大?。ㄗ詣?dòng)K/M/G) |
df -i | 查看inode使用情況(小文件過多也會(huì)導(dǎo)致“空間不足”) |
df -T | 顯示文件系統(tǒng)類型(如xfs、ext4) |
df --total | 匯總所有文件系統(tǒng)的總計(jì) |
特殊情況:df 顯示已滿,但 du 統(tǒng)計(jì)很小
原因可能是:
- 文件已被刪除,但仍有進(jìn)程打開該文件(句柄未釋放)。
- 掛載點(diǎn)下有“隱藏”的舊文件(如子目錄被另一設(shè)備掛載覆蓋)。
精確定位:du - 分析目錄和文件大小
du(disk usage)用于統(tǒng)計(jì)目錄或文件的真實(shí)磁盤占用。當(dāng)df發(fā)現(xiàn)分區(qū)滿后,用du逐級(jí)深入,找出大文件或大目錄。
常用命令組合
# 查看當(dāng)前目錄下所有子目錄的大小,按人類可讀排序 du -sh * | sort -hr # 查看整個(gè)分區(qū)下最大的10個(gè)目錄(深度1) sudo du -h /home --max-depth=1 | sort -hr | head -10 # 更全面的掃描:跳過某些目錄,排除proc、sys等偽文件系統(tǒng) sudo du -h --exclude=/proc --exclude=/sys --max-depth=1 / | sort -hr
參數(shù)詳解
| 參數(shù) | 含義 |
|---|---|
-s | 匯總(只顯示總計(jì)) |
-h | 人類可讀格式 |
-d N 或 --max-depth=N | 只顯示N層子目錄 |
--exclude=PATTERN | 排除匹配的目錄/文件 |
-a | 同時(shí)顯示文件(默認(rèn)只顯示目錄) |
-c | 最后顯示總和 |
常用定位大文件的快速命令
# 查找超過1GB的文件
find /home -type f -size +1G -exec ls -lh {} \; 2>/dev/null
# 查找超過500MB且最近7天修改過的文件
find /var/log -type f -size +500M -mtime -7 -exec ls -lh {} \;進(jìn)階診斷:inode 耗盡與文件句柄泄漏
有時(shí)候 df -h 顯示空間有余,但系統(tǒng)仍報(bào)“No space left on device”。這通常是 inode耗盡 或 文件句柄未釋放 導(dǎo)致的。
檢查inode使用率
df -i
輸出示例:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 5.2M 5.2M 0 100% /home
IUse% 100%:inode已滿,通常因?yàn)榇嬖诖罅啃∥募ㄈ缇彺?、郵件隊(duì)列)。
解決方案:
# 找到包含大量小文件的目錄 sudo find /home -type f -printf "%h\n" | sort | uniq -c | sort -rn | head -10 # 進(jìn)入該目錄,清理舊文件(例如超過30天的日志) find /home/cache -type f -mtime +30 -delete
文件被刪除但未釋放句柄(lsof)
當(dāng)進(jìn)程正在使用某個(gè)文件時(shí),即使你執(zhí)行了rm,磁盤空間也不會(huì)立即釋放,直到進(jìn)程關(guān)閉該文件或重啟。
診斷方法:
# 查看所有已刪除但仍被進(jìn)程占用的文件 lsof | grep deleted # 更精確:只看某個(gè)分區(qū)下的已刪除文件 lsof /home | grep deleted
輸出示例:
java 12345 root 14w REG 8,1 10485760 123456 /home/log/app.log (deleted)
解決:重啟對(duì)應(yīng)進(jìn)程(systemctl restart java-app)或重定向其輸出(> /proc/12345/fd/14,但通常重啟更可靠)。
常見場(chǎng)景與解決策略
/var/log 日志文件過大
# 查看日志目錄占用 sudo du -sh /var/log/* | sort -hr # 清理3個(gè)月前的系統(tǒng)日志(以journalctl為例) sudo journalctl --vacuum-time=3d # 安全截?cái)嗳罩疚募ūA糇钚?000行) sudo tail -n 1000 /var/log/syslog > /tmp/syslog.tmp && sudo mv /tmp/syslog.tmp /var/log/syslog
Docker/容器存儲(chǔ)膨脹
# 查看Docker占用空間 docker system df # 清理未使用的鏡像、容器、卷和構(gòu)建緩存 docker system prune -a -f # 進(jìn)一步清理所有停止的容器和未使用的卷 docker volume prune -f
/tmp 目錄臨時(shí)文件堆積
# 清理超過24小時(shí)未訪問的臨時(shí)文件 sudo find /tmp -type f -atime +1 -delete sudo find /var/tmp -type f -atime +1 -delete
數(shù)據(jù)庫文件(如MySQL、PostgreSQL)過大
- 檢查數(shù)據(jù)庫的數(shù)據(jù)目錄(通常在
/var/lib/mysql或/var/lib/pgsql)。 - 使用數(shù)據(jù)庫自身的清理命令:
OPTIMIZE TABLE、VACUUM FULL。 - 考慮歸檔舊數(shù)據(jù)或遷移到更大的存儲(chǔ)卷。
自動(dòng)化監(jiān)控與預(yù)警
為了避免手工排查,可以設(shè)置定期監(jiān)控和告警。
使用cron + df 定時(shí)檢查并發(fā)送郵件
# 編輯root的crontab
sudo crontab -e
# 添加如下行(每小時(shí)檢查一次,使用率超過90%發(fā)郵件)
0 * * * * /usr/bin/df -h | awk 'NR>1 && $5+0 > 90 {print $0}' | mail -s "Disk Alert" admin@example.com集成到 Prometheus + Grafana
安裝 node_exporter 采集磁盤指標(biāo),配置告警規(guī)則:disk_used_percent > 90%。
使用 ncdu 交互式分析(推薦)
# 安裝 sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # RHEL/CentOS # 使用 ncdu /home
上下鍵導(dǎo)航,d 刪除文件,q 退出,界面友好,適合交互式清理。
到此這篇關(guān)于Linux中磁盤空間排查實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Linux磁盤空間排查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Centos7遠(yuǎn)程桌面 vnc/vnc-server的設(shè)置詳解
這篇文章主要介紹了Centos7遠(yuǎn)程桌面 vnc/vnc-server的設(shè)置詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10
LuManager圖文安裝使用教程和創(chuàng)建MysqL快速建站基本教程
這篇文章主要介紹了LuManager圖文安裝使用教程和創(chuàng)建MysqL快速建站基本教程,需要的朋友可以參考下2016-04-04
Linux利用inotify和rsync服務(wù)實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)同步的原理解析
inotify是系統(tǒng)內(nèi)核的一個(gè)監(jiān)控服務(wù),屬于操作系統(tǒng)內(nèi)核的一個(gè)特有機(jī)制,用于監(jiān)控文件的信息變化,這篇文章主要介紹了Linux利用inotify和rsync服務(wù)實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)同步,需要的朋友可以參考下2022-10-10
linux如何編譯安裝新內(nèi)核支持NTFS文件系統(tǒng)(以redhat7.2x64為例)
這篇文章主要介紹了linux如何編譯安裝新內(nèi)核支持NTFS文件系統(tǒng)(以redhat7.2x64為例),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10
在Unix/Linux上使用通用二進(jìn)制文件安裝MySQL方式
本文介紹了如何在Unix/Linux平臺(tái)上從壓縮的tar文件二進(jìn)制發(fā)行版安裝MySQL,首先,需要下載并解壓縮發(fā)行版,然后創(chuàng)建一個(gè)符號(hào)鏈接并將其添加到PATH變量中,接下來,設(shè)置發(fā)行版的所有權(quán)和訪問權(quán)限,初始化數(shù)據(jù)目錄,啟動(dòng)MySQL服務(wù)器,并設(shè)置配置文件2025-02-02
Linux中設(shè)置SSH免密碼(密鑰)登錄的具體步驟
SSH是一種加密的網(wǎng)絡(luò)協(xié)議,廣泛用于遠(yuǎn)程管理服務(wù)器和安全傳輸文件,通常在使用SSH時(shí)需要輸入密碼進(jìn)行驗(yàn)證,但通過配置免密登錄,我們可以省去每次輸入密碼的麻煩,所以本文給大家介紹了Linux中設(shè)置SSH免密碼(密鑰)登錄的具體步驟,需要的朋友可以參考下2025-07-07

