在 Linux 運維中,「這個目錄掛在哪塊盤?」「這塊盤掛在哪個目錄?」是高頻剛需。工具眾多(df、mount、lsblk、findmnt、/proc/mounts、/etc/mtab),輸出格式各異、適用場景不同、甚至有陷阱。本文系統對比主流工具,建立「查掛載、查磁碟、查關聯」標準化操作指南。
| 工具 | 數據源 | 關鍵優勢 | 核心劣勢 | 最佳場景 |
|---|---|---|---|---|
| df | 內核 VFS 統計 | **顯示空間使用率 (已用/可用/%)**、**腳本友好** | 掛載點與設備可能換行分離、不顯示掛載選項、不顯示未格式化設備 | **容量監控、告警、腳本取可用空間** |
| mount / findmnt | /proc/self/mountinfo (最新) | **掛載點與設備同行、顯示完整掛載選項、樹狀結構、JSON 輸出** | 不直接顯示空間使用率 | **查掛載關係、選項審計、自動化解析** |
| lsblk | /sys/block + udev | **樹狀顯示設備-分區-掛載點、顯示 TYPE/FSTYPE/SIZE/UUID、支援 JSON** | 不顯示空間使用率、不顯示掛載選項細節 | **盤點存儲拓撲、識別設備屬性、腳本解析** |
| /proc/mounts | 內核實時 | 最權威、最實時、內核視角 | 格式簡陋、設備可能顯示為 major:minor、路徑轉義 | 內核級調試、容器命名空間差異排查 |
| /etc/mtab | 用戶態維護 | 傳統兼容 | 不可靠:mount -n 不更新、bind mount 可能不同步、systemd 環境常被 symlink 到 /proc/self/mounts | 僅兼容舊腳本 |
# 人類可讀 + 顯示文件系統類型 + 同步顯示 inode 使用
df -hT --inodes
# 僅顯示特定掛載點
df -h / /home /var /mnt/data
# 腳本提取可用空間 (KB)
df -k /data | awk 'NR==2 {print $4}'
# 顯示所有 (含 0 大小虛擬文件系統)
df -ha
# 同步顯示掛載選項 (部分版本支援)
df -h --output=source,target,fstype,options,size,used,avail,pcent
# 現象: 設備名過長導致換行
# /dev/mapper/vg_data-lv_mysql
# 511980 32840 479140 7% /home/mt
# 解決: 使用 -P 強制 POSIX 輸出 (不換行)
df -hP
# 或用 findmnt/lsblk 獲取關聯再 df
# 樹狀顯示所有掛載 (預設)
findmnt
# 顯示指定掛載點詳情
findmnt /mnt/data
# 顯示指定設備的所有掛載點
findmnt /dev/sda1
# 自定義列輸出 (腳本解析首選)
findmnt -rn -o SOURCE,TARGET,FSTYPE,OPTIONS,USED,AVAIL,USE%
# -r 原始輸出 -n 無表頭
# JSON 輸出 (程序化處理)
findmnt -J -o SOURCE,TARGET,FSTYPE,OPTIONS
# 僅顯示真實設備掛載 (過濾虛擬 fs)
findmnt -t nosysfs,noproc,nodevpts,notmpfs
# 完整信息 (含掛載點、類型、UUID、標籤)
lsblk -o +FSTYPE,MOUNTPOINT,UUID,LABEL,PARTUUID,PARTLABEL
# 僅顯示有掛載點的
lsblk -o +MOUNTPOINT | grep -v '^$'
# JSON 輸出
lsblk -J -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID
# 顯示所有設備 (含無分區/無文件系統)
lsblk -a
# 顯示掛載選項 (需 root, 內核 4.18+)
lsblk -o +MOUNTPOINT,MOUNTOPTIONS
# 顯示所有掛載 (含虛擬 fs)
mount | column -t
# 僅顯示特定類型
mount -t ext4,xfs
# 顯示掛載選項 (關鍵審計: noexec, nosuid, nodev, ro, rw, relatime, noatime)
mount | grep /mnt/data
TARGET="/var/lib/mysql"
# 1. 獲取設備與文件系統
DEV=$(findmnt -n -o SOURCE --target "$TARGET")
FSTYPE=$(findmnt -n -o FSTYPE --target "$TARGET")
OPTIONS=$(findmnt -n -o OPTIONS --target "$TARGET")
# 2. 獲取空間使用
read SIZE USED AVAIL USE% <<< $(df -P "$TARGET" | awk 'NR==2 {print $2,$3,$4,$5}')
# 3. 獲取 inode 使用
read IUSED IFREE IUSE% <<< $(df -P --inodes "$TARGET" | awk 'NR==2 {print $3,$4,$5}')
echo "Target: $TARGET"
echo "Device: $DEV ($FSTYPE)"
echo "Options: $OPTIONS"
echo "Space: $SIZE KB total, $USED used, $AVAIL avail ($USE%)"
echo "Inodes: $IUSED used, $IFREE free ($IUSE%)"
DEV="/dev/nvme0n1p3"
findmnt -rn -o TARGET --source "$DEV" | while read MNT; do
df -hP "$MNT" | awk 'NR==2 {printf "%-30s %8s %8s %8s %s\n", $6, $2, $3, $4, $5}'
done
# 生成 CSV 報告
lsblk -J -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID,LABEL,PARTUUID,PARTLABEL,ROTA,RO,RM,MODEL,VENDOR | \
jq -r '.blockdevices[] | [.name, .size, .type, .fstype, .mountpoint, .uuid, .label, .rota, .model] | @csv' > storage_inventory.csv
# 檢查用戶可寫目錄是否缺少 noexec/nosuid/nodev
findmnt -rn -o TARGET,OPTIONS -t ext4,xfs,btrfs,ext3,ext2 | \
awk -F'[ ,]' '$2 !~ /noexec/ || $2 !~ /nosuid/ || $2 !~ /nodev/ {print $1 " -> " $2}' | \
grep -E '/home|/tmp|/var/tmp|/dev/shm|/opt|/app|/data'

掛載點與磁碟關聯查看,核心在於**選對工具、解對輸出、避開陷阱**。確立 findmnt 為查關係首選、lsblk 為查拓撲首選、df -hP 為查容量首選、/proc/self/mountinfo 為最終權威來源,構建標準化查詢腳本庫,納入巡檢、發布、擴容、審計、故障排查全流程,讓存儲可視化管理無盲區。