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

