2013-06-09 2 views
1

파이썬에서 디스크 이미징 (예 : .dd 형식)을위한 스크립트를 만들려고합니다. 원래는 다른 16 진 디버거를 얻기 위해 프로젝트로 시작했는데 드라이브에서 원시 데이터를 얻는 데 좀 더 관심이있었습니다. 처음에는 드라이브를 이미지 할 수 있기를 바 랐습니다. 크기가 디스크 크기 인과파이썬 디스크 이미징

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

: 어쨌든, 나는 약 일주일 정도 둘러보고 및 발견 한 작은 드라이브에있는 드라이브에서 정보를 얻을 수있는 가장 좋은 방법은 뭔가를 것으로 보인다. 큰 디스크를 사용하려고하는 문제는 잘 알려진 문제 인 것 같습니다. 심지어 내 경우에는 총 크기가 250059350016 바이트입니다.

"OverflowError : C long으로 변환하기에 너무 큰 Python int"

이 문제를 해결하는 더 적절한 방법이 있습니까? 작은 플래시 드라이브에서는 문제가 없지만 드라이브를 이미지화하려고하면 오류가 발생합니다.

필자는 섹터 수 (5128)에 대해 반복적으로 언급 한 것을 보았지만 (제 경우에는 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

잘 보입니다. 내가 어떻게 생각하지 않았는지 모르겠다. :(이 사이트에 대해 좋은 점이 있다면 나 자신의 어리 석음을 깨닫게 해줍니다. 하하하. Martijn이 자신의 대답을 설정 한 것과 비슷하지만 본질적으로 똑같은 모습을 보이고 있습니다. 도와주세요! – Ferasdour

+0

Wellp, 스포트 라이트를 훔치는 방법 LOL. 두 사람 모두 시도해 보았습니다. 한 번 실행하면 내 특별한 요구 사항에 더 잘 어울리는 것 같습니다 :) – Ferasdour

+0

@Ferasdour : 그들은 본질적으로 같은 일을합니다. 'i.write()'는 쓰여진 바이트 수를 반환하고 빈 문자열을 쓰면'0'을 반환합니다. –

1

블록 단위로 데이터를 읽습니다. 장치의 끝에 도달하면 .read(blocksize)은 빈 문자열을 반환합니다.

당신은 루프에서 쉽게 할 수있는 감시와 iter()을 사용할 수 있습니다 : 당신은 정말 더 라인 번역이 발생하지 있는지 확인하려는 경우, 바이너리 모드로 'rb'을 장치를 열려면

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 

.

import shutil 

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

을하고 그것을 읽고 당신을 위해 쓰기, 오프닝 알아서 할게요 :

그러나 다른 파일에 복사본을 생성하려는 경우, 당신은 shutil.copyfile()보고 싶다. 당신이 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

관련 문제