PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片

‘‘‘
术语规范:
简述:BS指256M,bs指256K

BS:指大小,256M
bs:指大小,256K
SecsPerBS:每BS扇区数
SecsPerbs:每bs扇区数

FRid:文件记录号
FRDs:文件记录在整个LUN上应该的物理扇区号
FRDBS:文件记录在整个LUN上应该的BS号
FRDbs:文件记录在整个LUN上应该的bs号
FRDbsiBS:文件记录所在的bs,在所在BS中的序号
FRDSibs:文件记录所在的扇区,在所在的bs中的序号

SMDid:位图所在的磁盘号
SMBS:位图所在的磁盘的BS号
SMbs:位图所在的磁盘的bs号
SMDs:位图的起始扇区号

SDid:源数据所在的磁盘号
SDBS:源数据所在的BS号
SDbs:源数据所在的bs号
SDs:源数据所在的扇区号
SDSibs:源数据所在的扇区,在所在的bs中的序号
SDbsiBS:源数据所在的bs,在所在的BS中的序号

Mbsi8GM:数据所在bs条目,在8G位图中的序号
MbsiBS:数据所在的bs条目,在当前BS位图中的序号
MBSi8GM:数据所在的BS条目,在8G位图中的序号
‘‘‘
import sys
import os
import struct
import sqlite3
import time

BS = 256 * 1024 * 1024
bs = 256 * 1024
SecsPerBS = BS // 512
SecsPerbs = bs // 512
bs_tnum = 128 * 1024 * 1024

def trans(FRid, MFT_Slice_List):
    mft_no_clus = FRid // 8
    mft_no_sec = (FRid % 8) * 2

    for i in MFT_Slice_List:
        if i[0] + i[2] > mft_no_clus:
            if i[0] > mft_no_clus:
                continue

            FRDs = (mft_no_clus - i[0] + i[1]) * 16 + mft_no_sec
            break

    FRDs += 262208  # DBR pos
    return FRDs

def find_FRid_SDbs(FRid):
    mftlist = []
    FRDS = trans(FRid, MFT_Slice_List)

    # cu_mft 是 allv2.db 的cursor

    cu_mft.execute(r"select * from mft_info  WHERE FRID = %d" % FRid)
    rows = cu_mft.fetchall()
    # SDid, SDS, FRid 是 row[0], row[1], row[2]
    new = 0
    for row in rows:
        if row[1] % 512 == FRDS % 512:      # 扇区号一致
            new += 1
            SDid = row[0]
            SDS = row[1]
            mftlist.append([FRid, FRDS, SDid, SDS])

    if new != 1:    # 所选记录不唯一, 返回空的 mftlist
        print("FR(%d), result not found or not only, new = %d, FRDS = %d" % (FRid, new, FRDS))
        # os.system("pause")
        # pass
        return

    return mftlist

def find_bs_SMBS(FRDs, SDid, SDs):

    SMDBS_list = []     # 位图列表
    FRbs = (FRDs // 512)

    SDBS = SDs // SecsPerBS
    SDbsiBS = (SDs % SecsPerBS) // SecsPerbs
    print("FRDs,SDid,SDs is:",FRDs,SDid,SDs)
    print("SDbsiBS is %d"%SDbsiBS)
    # cu_m 是 map_v2.db 的 cursor
    cu_m.execute(r"select * from map_info where v_num =  %d" % (FRbs * 512 + 1))  # +1: 是因为v7000 MAP最低位为1,可能表示类型
    rows = cu_m.fetchall()
    print("rows: ", rows)
    os.system("pause")

    x = 0
    # EM_SMDid, EM_SMBS, EM_Mbsi8GM, EM_FRDS_add_1 = range(4)
    for row in rows:

        Mbsi8GM = row[2]     # 数据所在bs条目,在8G位图中的序号
        FRDbsiBS = (FRDs % SecsPerBS) // SecsPerbs
        MbsiBS = (Mbsi8GM + 2) % 1024   # 数据所在的bs条目,在当前BS位图中的序号
        MBSi8GM = (Mbsi8GM + 2) // 1024  # 数据所在的BS条目,在8G位图中的序号
        print("MBSi8GM,SDbsiBS,MbsiBS is", MBSi8GM, SDbsiBS, MbsiBS)
        os.system("pause")
        if MBSi8GM == 0:
            if SDbsiBS == MbsiBS:
                x += 1
                SMDid = row[0]  # 位图所在的磁盘号
                SMBS = row[1]  # 位图所在的磁盘的BS号
                SMDBS_list.append([SMDid, SMBS, 0, SMDid, SMBS])
        else:
            if SDbsiBS == MbsiBS:
                x += 1
                SMDid = row[0]  # 位图所在的磁盘号
                SMBS = row[1]  # 位图所在的磁盘的BS号
                SMDBS_list.append([SMDid, SMBS, MBSi8GM, SDid, SDBS])
                SMDBS_list.append([SMDid, SMBS, 0, SMDid, SMBS])

    if x == 0:
        print("FRDs:%d result not found!" % FRDs)
        # os.system("pause")
        # pass
        print("line 131 ,x == 0")
        return
    os.system("pause")
    print(SMDBS_list)
    return SMDBS_list

#tmp1 writefile to disk
writedisk = False
if writedisk:
    fd = open("\\\\.\\physicaldrive3",‘rb+‘)
def update_1Gmap(bsMapList, map1g_list):

    SMDid, SMBS, MBSi8GM, SDid, SDBS = bsMapList
    SMDs = SMBS * SecsPerBS + 1024
    SDbs = SDBS * 1024

    smFile = sDisk[SMDid][1]  # 位图所在磁盘
    sdFile = sDisk[SDid][1]  # 数据所在磁盘

    # 到指定位图位置,读取 bs = 256K 字节
    smFile.seek(SMDs * 512)
    mData = smFile.read(bs)

    if MBSi8GM == 0:  # 8GB 的第一个256K
        mapitem = struct.unpack_from("1022Q", mData, 0)
        start_sec = 1024
    elif MBSi8GM < 32:
        # print("MBSi8gm IS",MBSi8GM)
        mapitem = struct.unpack_from("1024Q", mData, MBSi8GM * 8192 - 16)  # 1024 * 8 代表一个256M
        start_sec = 0
    else:
        return
    t = 0
    keyMap = SMDid * 1000000 + SMBS * 100 + MBSi8GM
    cu.execute(r"INSERT or ignore into MAP values(%d, %d, %d, %d, %d, %d)" % (keyMap, SMDid, SMBS, MBSi8GM, SDid, SDBS))
    cx.commit()
    # print(keyMap, SMDid, SMBS, MBSi8GM, SDid, SDBS)
    # os.system("pause")

    for ii in mapitem:
        if ii == 3:  # 跳过位图为3的
            t += 1
            continue

        FRDbs = (ii - 1) // 512

        if FRDbs > bs_tnum:
            t += 1
            print("FRDBS is too large, FRDbs: %d" % FRDbs)

        else:
            value1 = (SDbs + t) * SecsPerbs  + start_sec # value指应该的bs的扇区位置
            value = value1 + (SDid << 48)

            # valueT = 0

            if map1g_list[FRDbs] != 0 and map1g_list[FRDbs] != value:
                print("FRDBS is error, FRDbs: %d,\tmap1g_list[FRDbs]:%08X\tvalue:%08X" % (FRDbs, map1g_list[FRDbs], value))
                os.system("pause")
                # pass
            else:
                map1g_list[FRDbs] = value
                #tmp1 write file
                if writedisk:
                    fd.seek(FRDbs * 512)
                    sDisk[SDid][1].seek(value * 512)
                    tmpdata = sDisk[SDid][1].read(bs)
                    fd.write()
                #tmp write file end
                # SMDid, SMBS, MBSi8GM, SDid, SDBS
            t += 1

sDisk = []
sDisk.append("")
sDisk.append("")
sDisk.append("")
sDisk.append("")
sDisk.append(["h:\mdisk4.img", 0])
sDisk.append(["g:\mdisk5.img", 0])
sDisk.append(["i:\mdisk6.img", 0])
sDisk.append(["d:\mdisk7.img", 0])
sDisk.append(["e:\mdisk8.img", 0])
sDisk.append(["f:\mdisk9.img", 0])

for disk in sDisk[4:10]:
    disk[1] = open(disk[0], ‘rb‘)

cx_mft = sqlite3.connect("f:\zy\\new_mft\\allv2.db")
cu_mft = cx_mft.cursor()
cx_m = sqlite3.connect("F:\\zy\\map\\map_v2.db")
cu_m = cx_m.cursor()
cx = sqlite3.connect("f:\\zy\\map\\256M_to_disk_map.db")
cu = cx.cursor()

cu.execute("""create table if not exists MAP(
        mapKey INT PRIMARY KEY NOT NULL,
        SMDid int,
        SMDBS int,
        Mbsi8GM int,
        SDid int,
        SDDBS int
        );
""")
# 打开1GMAP文件,读入LIST
MAP_file = "F:\\zy\\map\\1gmap_1.img"
f_map1g = open(MAP_file, ‘rb+‘)
dmap = f_map1g.read()
map1g_list = list(struct.unpack(‘%dQ‘ % bs_tnum, dmap))

# 前两个256M块
# cu.execute(r"INSERT or ignore into MAP values(%d, %d, %d, %d, %d, %d)" % (40080010, 4, 800, 10, 6, 814))
# cu.execute(r"INSERT or ignore into MAP values(%d, %d, %d, %d, %d, %d)" % (40080000, 4, 800, 0, 4, 800))
tlst = [[4, 800, 10, 6, 814], [4, 800, 0, 4, 800]]
update_1Gmap(tlst[0], map1g_list)
update_1Gmap(tlst[1], map1g_list)

# 解析mft_list 文件
f = open("mft_list.txt", ‘r‘)     # 位置在哪??
d = f.readlines()
MFT_Slice_List = []
for i in d:
    t = i.split()
    # t[0] 是 VCN 号, t[1] 是 LCN 号, t[2] 是 连续簇数
    MFT_Slice_List.append([int(t[0]), int(t[1]), int(t[2])])

# MFT的编号;在LUN中应该的扇区位置;现在所在的磁盘号;现在所在磁盘的扇区位置
# EL_FRid, EL_FRDS, EL_SDid, EL_SDS = range(4)

for i in MFT_Slice_List[2:]:
    print("start: ", i)
    tt = 0      # 用于累计KB数, 1 KB是一个FR
    curFRID = i[0] * 8
    curFRID = 1988304 # test1
    slice0p = trans(curFRID, MFT_Slice_List)  # 要处理的第一个bs片断的起始扇区号

    slice0s = 512 - slice0p % 512  # 第一个片断的扇区数
    slice0FRnum = slice0s // 2
    sliceEnd_s = (i[2] * 16 + slice0p) % 512   # 最后一个片断的扇区数
    middle_bs = (i[2] * 16 - slice0s - sliceEnd_s) // 512  # 中间有多少个bs片断

    for ii in range(middle_bs + 2):
        if ii == 0:  # 第一个片断
            p = slice0p
            start_fr = curFRID
            fr_num = slice0FRnum
        elif ii == middle_bs + 1:  # 最后一个片断
            p = ii * 512 - 512 + (slice0p + slice0s)
            start_fr = curFRID + slice0FRnum + ii * 256
            fr_num = sliceEnd_s // 2
        else:
            p = ii * 512 - 512 + (slice0p + slice0s)
            start_fr = curFRID + slice0FRnum + ii * 256
            fr_num = 256

        FRDbs = p // 512
        if map1g_list[FRDbs] != 0:
            continue

        isfoundmap = False
        for FRid1 in range(start_fr, start_fr + fr_num + 1):
            mftlist = find_FRid_SDbs(FRid1)  # 在这个函数中,又求了一次 FRDS, ??
            if mftlist is None:
                continue
            else:
                SMDBS_list = find_bs_SMBS(mftlist[0][1], mftlist[0][2], mftlist[0][3])
                # print("SMDBS_list: ", SMDBS_list)
                # SMDBS_list 可能完成多个匹配
                if SMDBS_list is None:
                    break
                else:
                    isfoundmap = True
                for lst in SMDBS_list:
                    # print("********************")
                    #SMDBS_list = find_bs_SMBS(lst[1], lst[2], lst[3])  # SMDBS_list 可能完成多个匹配
                    print("lins 293 ",lst)
                    update_1Gmap(lst, map1g_list)
            if isfoundmap:
                break;
            print("line296")
            os.system("pause")
        print("line 298")
        os.system("pause")

print("end:", time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime(time.time())))

dmap = struct.pack("%dQ" % bs_tnum, *map1g_list)

# 更新map文件
f_map1g.seek(0)
f_map1g.write(dmap)
f_map1g.close()

# cu.execute(r"INSERT or ignore into MAP values(%d, %d, %d, %d, %d, %d)" % (40080010, 4, 800, 10, 6, 814))

# 第一个256M块
# cu.execute(r"INSERT or ignore into MAP values(%d, %d, %d, %d, %d, %d)" % (40080000, 4, 800, 0, 4, 800))
# cx.commit()

# BS_ID含义如下:ABBBBBCC,A表示磁盘ID,BBBBB表示本片断位图在磁盘位置(256M块编号),CC表示本次处理的256M块的编号(0-31)
# MAP_POS表示:256M的位置,一般位图仍要向后偏移1024个扇区
# BS_ID_indisk表示8G内的256M序号
# SOURCE_POS表示源磁盘的256M的位置
时间: 2024-12-31 05:44:00

PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片的相关文章

PYTHON代码:根据位图间的关系,连接IBM V7000的8G BS位图

import sqlite3 import struct cx_m = sqlite3.connect("F:\\zy\\map\\map_v2.db") cu_m = cx_m.cursor() BS = 256 * 1024 * 1024 bs = 256 * 1024 sDisk = [] sDisk.append("") sDisk.append("") sDisk.append("") sDisk.append(&q

一起来写2048(160行python代码)

前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到2048,两周后决赛再次遇到2048,后来五月份的广东省赛,又出现了2048.在这三次比赛过程中,我一次2048都没玩过..全靠队友的解释,直到昨天,我突然想起写个2048吧,于是下了个2048玩了几盘,之后就開始用python来写了,心想就不写界面了,为了简洁. 我对python并不熟悉,可是我在之前

Python代码样例列表

├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│      NFA引擎,Python正则测试工具应用示例.py│      Python datetime计时程序的实现方法.py│      python du熊学斐波那契实现.py│      python lambda实现求素数的简短代码.py│      Python localtime()方法计算今天是一年中第几周.py│      Python math方法算24点代码详解.py│      Pyth

十分钟的Python代码知识点总结

#-- 寻求帮助:dir(obj) # 简单的列出对象obj所包含的方法名称,返回一个字符串列表help(obj.func) # 查询obj.func的具体介绍和用法 #-- 测试类型的三种方法,推荐第三种if type(L) == type([]):print("L is list")if type(L) == list:print("L is list")if isinstance(L, list):print("L is list") #-

Effective Python之编写高质量Python代码的59个有效方法

                                                     这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码的59个有效方法>,感觉还不错,具有很大的指导价值.下面将以最简单的方式记录这59条建议,并在大部分建议后面加上了说明和示例,文章篇幅大,请您提前备好瓜子和啤酒! 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,python2和pyt

编写高质量Python代码的59个有效方法(转)

第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,python2和python3 (2)有很多流行的Python运行时环境,CPython.Jython.IronPython以及PyPy等 (3)在开发项目时,应该优先考虑Python3 第二条:遵循PEP风格指南 PEP8是针对Python代码格式而编订的风格指南,参考:http://www.python.org/dev/peps/pep-0008 (1)当编写Python代码时,总是应该遵循PEP8风格指南

python中的zip、map、reduce 、lambda函数的使用。

lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允许在代码内嵌入一个函数的定义. 如下例子: 定义了一个lambda表达式,求三个数的和. 再看一个例子: 用lambda表达式求n的阶乘. ------------------------------ lambda表达式也可以用在def函数中. 看例子: 这里定义了一个action函数,返回了一个l

如何使用 Pylint 来规范 Python 代码风格

https://www.ibm.com/developerworks/cn/linux/l-cn-pylint/ Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码.目前 Pylint 的最新版本是 pylint-0.18.1. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如

一个 11 行 Python 代码实现的神经网络

概要:直接上代码是最有效的学习方式.这篇教程通过由一段简短的 python 代码实现的非常简单的实例来讲解 BP 反向传播算法. 代码如下: Python 1 2 3 4 5 6 7 8 9 10 11 X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ]) y = np.array([[0,1,1,0]]).T syn0 = 2*np.random.random((3,4)) - 1 syn1 = 2*np.random.random((4,1))