#coding:utf-8
'''
__author__ = 'similarface'
connection:841196883@qq.com
磁盘操作
'''
import psutil
import os
import commands
import logging
import re
logger = logging.getLogger('Disk')
logger.setLevel(logging.ERROR)
ch = logging.StreamHandler()
# 定义handler的输出格式formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
from collections import defaultdict
class Disk: def getDiskSize(self,part):
'''
获取磁盘分区使用信息
'''
return psutil.disk_usage(part) def getAllCanUseUUID(self):
'''
获取所有可用磁盘的UUID
'''
allcanuse=[]
canusepart=self.getAllCanUseDiskPart()
for part in canusepart:
allcanuse.append(self.getUUIDbyPartName(part))
return allcanuse def getMountStatus(self):
'''
sdiskpart(device='/dev/sda3', mountpoint='/', fstype='ext4', opts='rw'),
...
sdiskpart(device='/dev/sde1', mountpoint='/data3', fstype='ext4', opts='rw')]
:return:
'''
psutil.disk_partitions() def getMountPartList(self):
'''
获取挂载了的磁盘的NAME
:return:
'''
partlist=[]
try:
for item in psutil.disk_partitions():
partlist.append(item.device)
return partlist
except Exception,e:
return partlist def getMountUUID(self):
'''
获取挂载了的磁盘的UUID
:return:
'''
mountuuidlist=[]
for part in self.getMountPartList():
mountuuidlist.append(self.getUUIDbyPartName(part))
return mountuuidlist def getNoMountDisk(self):
'''
获取没有挂载的磁盘
实现方法:
所有的UUID-挂载了的UUID
:return:
'''
#所有的UUID
ALLUUID=self.getAllCanUseUUID()
#挂载了的UUID
MOUNTUUID=self.getMountUUID()
logger.info(ALLUUID)
logger.info(MOUNTUUID)
return list(set(ALLUUID)-set(MOUNTUUID)) def getPartListNameByUUIDList(self,uuidlist):
'''
根据uuidlist获取partlist
:param uuidlist:
:return:
'''
partlist=[]
for uuid in uuidlist:
partlist.append(self.getPartNameByUUID(uuid))
return partlist def getPartNameByUUID(self,uuid):
'''
根据UUID 获取partname
:param uuid:
:return: part name
'''
logger.info(uuid)
return self.getUUIDPartNameMap()[uuid] def getAllCanUseDiskPart(self):
'''
获取所有可用的磁盘的分区名称
:return:
'''
command_str="cat /proc/partitions"
#可用分区
partcanuserlist=[]
try:
status, result=commands.getstatusoutput(command_str)
if status==0:
rereobj = re.compile('\s*')
for item in result.split('\n'):
if not item.startswith("major") and item.strip():
major, minor, blocks,name=rereobj.split(item.strip())
if self.isCanUserPart(major, minor, blocks):
partcanuserlist.append('/dev/'+name)
return partcanuserlist
else:
return partcanuserlist
except Exception,e:
logger.error(e)
return partcanuserlist def isCanUserPart(self,major, minor, blocks):
'''
该分区是否可用
算法:设备8 子计数 块大于204800
:param itemlist:['major', 'minor', '#blocks', 'name']
:return:是否可用
'''
try:
if int(major)==8 and int(minor)%2==1 and int(blocks)>1:
return True
else:
return False
except Exception,e:
return False def get(self): psutil.disk_partitions() def getUUIDPartNameMap(self):
'''
获取UUID 和 分区名的对应关系
key:UUID
value:partname
:return:
'''
uuidpartmap={}
command_str="ls /dev/disk/by-uuid/ -l|grep -v \"total\"|awk '{ print $9,\"/dev\"substr($11,6,5) }'"
try:
status, result=commands.getstatusoutput(command_str)
if status==0:
for item in result.split('\n'):
uuid,parted=item.split(' ')
uuidpartmap[uuid]=parted
logger.info(uuidpartmap)
return uuidpartmap
else:
logger.error(result)
return uuidpartmap
except Exception,e:
logger.error(e)
return uuidpartmap def getUUIDbyPartName(self,part):
'''
根据分区名获取分区的UUID
:param part:
:return:该分区对应的UUID
'''
command_str='blkid '+part
try:
logger.info(command_str)
status, result=commands.getstatusoutput(command_str)
if status==0:
logger.debug("result:")
logger.debug(result)
for item in result.strip().split(' '):
if item.startswith("UUID"):
logger.debug(item)
return item.split('=')[1].replace('"','')
else:
return None
except Exception,e:
print(e)
return None def getPartUUIDNameMap(self):
'''
key:Part
value:UUID
:return:分区-UUID 的字典
'''
uuidpartmap=defaultdict(str)
command_str="ls /dev/disk/by-uuid/ -l|grep -v \"total\"|awk '{ print $9,\"/dev\"substr($11,6,5) }'"
try:
status, result=commands.getstatusoutput(command_str)
if status==0:
for item in result.split('\n'):
uuid,parted=item.split(' ')
uuidpartmap[parted]=uuid
return uuidpartmap
else:
logger.error(result)
return uuidpartmap
except Exception,e:
logger.error(e)
return uuidpartmap if __name__=='__main__':
a=Disk()
#打印没有挂载的磁盘的分区名称
print(a.getPartNameByUUID(a.getNoMountDisk()[0]))

  

python linux 磁盘操作的更多相关文章

  1. Linux - 磁盘操作

    Linux 磁盘常见操作 : df -Ph # 查看硬盘容量 df -T # 查看磁盘分区格式 df -i # 查看inode节点 如果inode用满后无法创建文件 du -h 目录 # 检测目录下所 ...

  2. linux iostat命令详解 磁盘操作监控工具

    Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视. 它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况. ...

  3. linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例

    转自:truemylife.linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例 基本概念: 磁盘.分区.物理卷[物理部分] 卷组[中间部分] 逻辑卷.文件系统[虚拟化后可控制部分] 磁 ...

  4. Linux修复磁盘操作

    Linux修复磁盘操作 1.卸载分区 umount /data 修复磁盘,先判读是磁盘坏了,还是文件系统坏了:一般可以修复,但是建议换磁盘. 2.fsck  -y /dev/sda1  ##-y 参数 ...

  5. python通过SSH登陆linux并操作

    使用python通过SSH登陆linux并操作 用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的. 代码: > ...

  6. Linux磁盘分区fdisk命令操作(简洁版)

    实例(环境为: CentOS Linux release 7.2.1511 (Core), 3.10.0-327.el7.x86_64) 选择要具体操作的第二块磁盘(linux下一切是文件形式对应): ...

  7. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  8. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  9. MySQL 调优基础(四) Linux 磁盘IO

    1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...

随机推荐

  1. 谷歌Chrome浏览器如何设置网页的默认编码方法

    设置->高级->自定义字体->编码->utf-8

  2. laravel框架总结(一) -- 请求和响应

    一.laravel请求 1.获取请求 1>获取请求的 URI path 方法会返回请求的 URI.所以,如果接收到的请求目标是 http://domain.com/foo/bar,那么 path ...

  3. Java中的String、StringBuilder、StringBuffer

    可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为final型的 ...

  4. CI 同时上传多个图片

    最近,一直在研究ci框架,由于项目的需求,在后台需要做一个功能同时上传两张图片.测试了好久都没有两张图片都没有上传成功,(上传的结果是只能上传第二张图片,但是图片名称是第一个图片的).在这里说一下自己 ...

  5. FlexCell控件的使用

    private void grid1_GetCellText(object Sender, FlexCell.Grid.GetCellTextEventArgs e) { // 要使用虚表,可以在Gr ...

  6. Luence学习笔记

    1.Luence的核心索引类 IndexWriter:建立索引的核心组件 Directory:代表一个lucene索引项的位置,是一个抽象类其子类有FSDirectory和RAMDirectory F ...

  7. android 串口调试

    在usb调试过程中,都会选择串口查看log,更希望在串口中输入命令查看相关状态.但是一般情况下串口调试时 进程用户是shell,即使你在adb shell下是root用户. 暴力方法是在 adroid ...

  8. .Net验证码实现基础--Draw

    命名空间 using System.Draw; using System.Draw.Drawing2D; 在form等控件的 事件中 添加 paint事件 ///////画各种形状(空心)////// ...

  9. Python的getattr(),setattr(),delattr(),hasattr()

    判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False.需要注意的是name要用括号括起来   1 >>> class ...

  10. [HDOJ5934]Bomb(强连通分量,缩点)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有n个炸弹,爆炸范围和点燃花费给你,如果一个爆炸那么它爆炸范围内的炸弹也会爆炸.问让所有炸 ...