You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Prometheus或Python获取Linux全部挂载文件系统列表?

获取所有挂载目录的两种方法(Prometheus / Python)

一、通过Prometheus获取

  • 直接用PromQL查询所有挂载点标签值:
    在Prometheus UI或API中执行以下查询,可获取所有符合条件的mountpoint值:
    # 获取所有非rootfs的挂载点
    label_values(node_filesystem_avail_bytes{fstype!="rootfs"}, mountpoint)
    
    如果需要排除临时文件系统(如tmpfs),可以进一步过滤:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:12:44