如何用Python识别Linux系统分区?psutil及fstab方案探讨
识别Linux系统卷的Python实现方案
关于psutil库的能力
psutil本身没有直接标记“系统卷”的API,但它能通过psutil.disk_partitions()获取磁盘挂载的核心信息(设备路径、挂载点、文件系统类型等),你可以基于这些数据结合规则筛选系统卷。
读取fstab第6列的思路是否可行?
可行,但存在局限性:
- fstab第6列是dump备份标记,常规配置下
0表示无需备份,非0值(通常为1)表示需要定期备份。系统核心卷(如/、/boot)一般设为1,数据卷多设为0,这是通用惯例。 - 但该规则不是绝对的:管理员可手动修改dump值,比如将某数据卷设为
1,或把非关键系统卷设为0,仅靠这个字段判断会出现误差。
更简便可靠的Python实现方式
方案1:psutil+挂载点规则筛选
系统卷通常挂载到核心路径(/、/boot、/home(若为单独分区)等),同时排除/mnt、/data、/media这类典型数据卷挂载前缀,再过滤掉虚拟文件系统(如tmpfs、proc)。
代码示例:
import psutil def get_linux_system_volumes(): # 定义系统核心挂载点(可根据实际环境调整) critical_mounts = {'/', '/boot', '/home'} # 排除典型数据卷挂载前缀 exclude_prefixes = ('/mnt', '/data', '/media') system_volumes = [] # all=False 自动过滤虚拟文件系统(如proc、tmpfs) for partition in psutil.disk_partitions(all=False): mount_point = partition.mountpoint # 判断是否为系统核心挂载点,或非数据卷路径 if (mount_point in critical_mounts) or \ (not any(mount_point.startswith(prefix) for prefix in exclude_prefixes)): system_volumes.append({ 'device': partition.device, 'mount_point': mount_point, 'fs_type': partition.fstype }) return system_volumes if __name__ == '__main__': volumes = get_linux_system_volumes() for vol in volumes: print(f"系统卷:设备={vol['device']},挂载点={vol['mount_point']},文件系统={vol['fs_type']}")
方案2:psutil结合fstab解析(双重验证)
如果要兼顾fstab的配置规则,可以同时解析fstab的dump字段,再和psutil的挂载信息关联,提升判断准确性:
代码示例:
import psutil def parse_fstab(): fstab_data = [] with open('/etc/fstab', 'r') as f: for line in f: line = line.strip() # 跳过注释和空行 if not line or line.startswith('#'): continue # 按空格分割(兼容多空格/tab分隔) parts = line.split() if len(parts) >= 6: fstab_data.append({ 'device': parts[0], 'mount_point': parts[1], 'dump_flag': parts[5] }) return fstab_data def get_system_volumes_with_fstab(): fstab_entries = parse_fstab() system_volumes = [] # 获取真实挂载的分区 mounted_parts = psutil.disk_partitions(all=False) for part in mounted_parts: # 匹配fstab中的条目 for entry in fstab_entries: if entry['mount_point'] == part.mountpoint: # 结合dump标记和挂载点规则判断 if entry['dump_flag'] != '0' or part.mountpoint in {'/', '/boot'}: system_volumes.append({ 'device': part.device, 'mount_point': part.mountpoint, 'fs_type': part.fstype, 'dump_flag': entry['dump_flag'] }) break return system_volumes if __name__ == '__main__': volumes = get_system_volumes_with_fstab() for vol in volumes: print(f"系统卷:设备={vol['device']},挂载点={vol['mount_point']},dump标记={vol['dump_flag']}")
总结
- psutil是获取磁盘挂载信息的高效工具,需结合规则筛选系统卷;
- fstab第6列的思路可作为辅助,但不能单独依赖;
- 最可靠的方式是挂载点规则+psutil过滤虚拟文件系统,必要时结合fstab配置做双重验证。
内容的提问来源于stack exchange,提问作者Naga
相关产品推荐
相关产品推荐

