如何通过Prometheus或Python获取Linux全部挂载文件系统列表?
获取所有挂载目录的两种方法(Prometheus / Python)
一、通过Prometheus获取
- 直接用PromQL查询所有挂载点标签值:
在Prometheus UI或API中执行以下查询,可获取所有符合条件的mountpoint值:
如果需要排除临时文件系统(如tmpfs),可以进一步过滤:# 获取所有非rootfs的挂载点 label_values(node_filesystem_avail_bytes{fstype!="rootfs"}, mountpoint)label_values(node_filesystem_avail_bytes{fstype!~"tmpfs|rootfs|devtmpfs"}, mountpoint) - 说明:
label_values函数会提取指定指标中某个标签的所有唯一值,返回结果就是所有有效的挂载目录列表,和df输出的挂载点对应。
二、通过Python获取
方式1:调用Prometheus API远程查询
如果需要在Python中批量获取Prometheus监控的所有主机挂载点,可以通过API调用实现:
import requests # 替换为你的Prometheus地址 PROMETHEUS_ENDPOINT = "http://localhost:9090/api/v1/query" # 定义查询语句 QUERY = 'label_values(node_filesystem_avail_bytes{fstype!="rootfs"}, mountpoint)' def get_prometheus_mountpoints(): try: response = requests.get(PROMETHEUS_ENDPOINT, params={"query": QUERY}) response.raise_for_status() data = response.json() if data["status"] == "success": return data["data"]["result"] else: raise Exception(f"Prometheus查询错误: {data.get('error', '未知错误')}") except Exception as e: print(f"获取失败: {str(e)}") return [] if __name__ == "__main__": mountpoints = get_prometheus_mountpoints() if mountpoints: print("所有挂载目录:") for mp in mountpoints: print(f"- {mp}")
方式2:本地读取系统文件或调用df命令
如果是在Linux主机本地执行,直接读取系统文件或调用df更高效:
方法A:读取/proc/mounts文件(推荐)
def get_local_mountpoints(): valid_mountpoints = set() # 过滤掉不需要的文件系统类型 exclude_fstypes = {"tmpfs", "rootfs", "devtmpfs", "sysfs", "proc"} with open("/proc/mounts", "r") as f: for line in f: # 每行格式:设备 挂载点 文件系统类型 选项 转储 检查顺序 parts = line.strip().split() if len(parts) >= 3: mountpoint = parts[1] fstype = parts[2] if fstype not in exclude_fstypes: valid_mountpoints.add(mountpoint) return sorted(valid_mountpoints) if __name__ == "__main__": mountpoints = get_local_mountpoints() print("本地挂载目录:") for mp in mountpoints: print(f"- {mp}")
方法B:调用df命令解析输出
import subprocess def get_mountpoints_from_df(): mountpoints = set() # 执行df -P(POSIX格式,避免换行问题) result = subprocess.run( ["df", "-P"], capture_output=True, text=True, check=True ) # 跳过表头,解析每行数据 for line in result.stdout.strip().split("\n")[1:]: parts = line.split() if len(parts) >= 6: mountpoint = parts[5] mountpoints.add(mountpoint) return sorted(mountpoints) if __name__ == "__main__": mountpoints = get_mountpoints_from_df() print("df返回的挂载目录:") for mp in mountpoints: print(f"- {mp}")
内容的提问来源于stack exchange,提问作者user28270014
相关产品推荐
相关产品推荐

