4

尝试在 python 中为磁盘映像(例如 .dd 格式)制作脚本。最初是作为一个获得另一个十六进制调试器的项目开始的,并且对尝试从驱动器获取原始数据更感兴趣。这变成了希望能够首先对驱动器进行映像。无论如何,我已经环顾一周左右,发现从较小驱动器上的驱动器获取信息的最佳方法似乎是:

with file("/dev/sda") as f:
 i=file("~/imagingtest.dd", "wb")
 i.write(f.read(SIZE))

size 是磁盘大小。问题是,这似乎是一个众所周知的问题,尝试使用大磁盘显示为(即使在我的情况下总大小为 250059350016 字节):

“溢出错误:Python int 太大而无法转换为 C long”

有没有更合适的方法来解决这个问题?因为它适用于小型闪存驱动器,但尝试映像驱动器失败。

我已经看到提到可能只是按扇区数(在我的情况下为 488397168)按扇区大小(512)进行迭代,但是想确切地验证如何以一种可行的方式执行此操作。

在此先感谢您的帮助,对于您容易注意到的任何无知,我们深表歉意。

4

2 回答 2

4

是的,你应该这样做。尽管如果您愿意,您可以高于扇区大小。

with open("/dev/sda",'rb') as f:
    with open("~/imagingtest.dd", "wb") as i:
        while True:
            if i.write(f.read(512)) == 0:
                break
于 2013-06-09T09:05:37.453 回答
2

以块为单位读取数据。当到达设备末尾时,.read(blocksize)将返回空字符串。

您可以使用iter()哨兵在循环中轻松执行此操作:

from functools import partial

blocksize = 12345

with open("/dev/sda", 'rb') as f:
    for block in iter(partial(f.read, blocksize), ''):
        # do something with the data block

'rb'如果您想确保不发生行转换,您真的想以二进制模式打开设备。

但是,如果您尝试将副本创建到另一个文件中,则需要查看shutil.copyfile()

import shutil

shutil.copyfile('/dev/sda', 'destinationfile')

它会为你处理打开、阅读和写作。如果您想更好地控制用于此的块大小,请使用shutil.copyfileobj(),自己打开文件对象并指定块大小:

import shutil

blocksize = 12345

with open("/dev/sda", 'rb') as f, open('destinationfile', 'wb') as dest:
    shutil.copyfileobj(f, dest, blocksize)
于 2013-06-09T09:05:45.250 回答