• python linux 磁盘操作


    #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('
    '):
                        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('
    '):
                        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('
    '):
                        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]))
    

      

  • 相关阅读:
    iOS 8以后 定位手动授权问题
    IOS int NSInteger NSNumber区分
    Java基础知识(JAVA集合框架之List与Set)
    Java基础知识(JAVA基本数据类型包装类)
    Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
    Java基础知识(重载和覆盖)
    Java基础知识(抽象类和接口)
    host文件
    天猫页面显示错位
    专题8:javascript函数详解
  • 原文地址:https://www.cnblogs.com/similarface/p/5550553.html
Copyright © 2020-2023  润新知