2013-06-09 1 views
1

Пытается создать скрипт для создания образа диска (например, .dd) в python. Первоначально он был запущен как проект, чтобы получить еще один hex-отладчик, и, похоже, он больше заинтересовался попыткой получить необработанные данные с диска. который превратился в желание иметь возможность сначала прорисовать диск. В любом случае, я смотрел вокруг в течение недели или около того, и нашел лучший способ получить получить информацию от привода на небольших дисков, кажется, что-то вроде:Python Disk Imaging

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

с размером является размер диска. Проблема в том, что, как представляется, хорошо известная проблема, попытка использования больших дисков проявляется как (даже в моем случае общий размер 250059350016 байт):

«OverflowError: Python int too large to convert to C long»

Есть ли более подходящий способ обойти эту проблему? Поскольку он отлично подходит для небольшого флеш-накопителя, но пытается создать образ диска, он не работает.

Я видел упоминание о возможном простом повторении по размеру сектора (512) по числу секторов (в моем случае 488397168), однако хотел бы точно проверить, как это сделать так, чтобы это было функционально.

Заранее благодарим за любую помощь, извините за любое незнание, которое вы легко замечаете.

+0

читать данные в блоках? Вы действительно хотите открыть устройство в двоичном режиме, 'open ('/ dev/sda', 'rb')', если вы это делаете. Когда вы дойдете до конца устройства, '.read (blocksize)' вернет пустую строку. –

ответ

1

Да, так вы должны это делать. Хотя вы могли бы пойти выше размера сектора, если хотите.

with open("/dev/sda",'rb') as f: 
    with open("~/imagingtest.dd", "wb") as i: 
     while True: 
      if i.write(f.read(512)) == 0: 
       break 
+0

Это хорошо выглядит. Не знаю, как я об этом не думал. :(Если в этом сайте есть что-то хорошее, это заставляет меня осознать мою собственную глупость. Hahaha. Хотя я и отношусь к тому, как Марьянн получил свою настройку ответа, по существу делая то же самое из внешнего вида. помогите! – Ferasdour

+0

Wellp, способ украсть свет пятна! lol. Попробовал их обоих, этот, кажется, лучше соответствует моим конкретным потребностям, как только я их запустил. :) – Ferasdour

+0

@Ferasdour: Они делают практически то же самое. 'i.write()' возвращает количество записанных байтов, записывая пустую строку, таким образом возвращает '0'. –

1

Прочитать данные в блоках. Когда вы дойдете до конца устройства, .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) 
+0

кажется довольно законным здесь.:) И да, я понимаю о двоичной части, забыл добавить ее там, когда набрал вопрос. :/ Извини за это. Я отдам его и посмотрю, что я могу сделать. – Ferasdour

 Смежные вопросы

  • Нет связанных вопросов^_^