zj3t

email: euntaejang@gmail.com

Latest Posts

폴더안에 있는 파일들의 MD5 해시값을 구해주는 파이썬 코드

import os

import hashlib, glob

def file2md5(filename):
    md5 = hashlib.md5()
    with open(filename, 'rb') as f:


        for chunk in iter(lambda: f.read(8192), ''):
            md5.update(chunk)


    return md5.hexdigest()


path=raw_input("Input path of folder: ") #폴더 경로 입력, 문자열로 입력받음
array=os.listdir(path) #경로에 있는 파일들의 리스트를 가져옴


i=0
for path, dirs, files in os.walk(path): #하위 디렉토리를 검색해주는 os.walk 모듈을 사용    for file in files: #input 디렉터리 안에 있는 모든 파일을 출력(폴더안의 폴더 또한 해당)
        print os.path.join(path,file)
        flist = glob.glob(os.path.join(path,file))


        for i in flist:
            print i,os.path.getsize(i),file2md5(i)


    #for dir in dirs:                   #input 디렉터리 안에 있는 모든 폴더 들을 출력
        #print os.path.join(path,dir)

예약된 영역(Reserved Area)는 FAT 파일시스템에서 가장 앞 부분에 위치하는 구조로서 여러 개의 섹터로 구성된다. 예약된 영역의 크기는 기본적으로 FAT12/16 에서는 1 섹터, FAT32 에서는 32 섹터를 사용한다. 예약된 영역은 다시 부트 섹터(Boot Sector), FSINFO(File System INFOrmation) 섹터, 추가적인 섹터로 구분된다. 다음은 예약된 영역의 추상적인 구조이다.

1. 부트 섹터
부트 섹터의 크기는 1섹터로 FAT 파일시스템의 처음에 위치한다. 부트섹터(512 바이트)의 구조는 다음과 같다.
 FAT 형식 범위 설명
 10진수 16진수
 FAT12/16 0 – 2 0x0000 – 0x0002 Jump command to boot code
 FAT32
 FAT12/16 3 – 61 0x0003 – 0x003D BIOS Parameter Block (BPB)
 FAT32 3 – 89 0x000 – 0x0059
 FAT12/16 62 – 509 0x003E- 0x01FD Boot code and error message
 FAT32 90 – 509 0x005A – 0x01FD
 FAT12/16 510 – 511 0x01FE – 0x01FF Signature (0x55AA)
 FAT32

부트 섹터의 처음 3 바이트는 0x003E 또는 0x005A의 부트 코드로 점프하기 위한 점프 명령어가 위치한다. 이후 클러스터 크기, FAT 크기, 루트 디렉터리 위치, 총 섹터 수 등의 파일시스템 정보를 기록한 BPB 영역이 온다. 이후에는 해당 파일시스템을 부팅하기 위한 부트 코드가 위치한다. 부트 코드는 점프 명령에 의해 실행되는데 이때 BPB 정보를 참조하여 파일시스템을 부팅한다. (NTLDR : NT Loader 실행) 부트 코드 실행과정에서 정상적이지 않은 동작이 발생할 경우 저장된 에러 메시지를 출력하게 된다.
각 BPB 영역에 대해 자세히 살펴보면 다음과같다. 
[ FAT12/16/32 ] 공통된 데이터 구조
 범위 설명
 10진수 16진수
 0 – 2 0x0000 – 0x0002 Jump command to boot code (usually 0xEB5890)
 3 – 10 0x0003 – 0x000A OEM ID (Win95=MSWIN4.0, Win98=MSWIN4.1,
 Win2K/XP/Vista=MSDOS5.0, Linux=mkdosfs)
 11 – 12 0x000B – 0x000C Bytes per sector
 13 – 13 0x000D – 0x000D Sectors per cluster
 14 – 15 0x000E – 0x000F Reserved sector count (FAT12/16=1)
 16 – 16 0x0010 – 0x0010 Number of FAT tables
 17 – 18 0x0011 – 0x0012 Root directory entry count (FAT12/16=512, FAT32=0)
 19 – 20 0x0013 – 0x0014 Total sector 16 (FAT12/16=variable, FAT32=0)
 21 – 21 0x0015 – 0x0015 Media Type
 22 – 23 0x0016 – 0x0017 FAT size 16 (FAT12/16=variable, FAT32=0)
 24 – 25 0x0018 – 0x0019 Sector per track (typically 32 for hard drive)
 26 – 27 0x001A – 0x001B Number of heads (typically 255 for hard drive)
 28 – 31 0x001C – 0x001F Hidden sectors
 32 – 35 0x0020 – 0x0023 Total sector32

[ FAT12/16 ] 추가적인 데이터 구조
 범위 설명
 10진수 16진수
 36 – 36 0x0024 – 0x0024 INT 0x13 drive number (Floppy=0x00, Hard Drvie=0x80)
 37 – 37 0x0025 – 0x0025 Not used
 38 – 38 0x0026 – 0x0026 Boot signature
 39 – 42 0x0027 – 0x002A Volume serial number
 43 – 53 0x002B – 0x0035 Volume label (ASCII)
 54 – 61 0x0036 – 0x003D File system type
 62 – 509 0x003E – 0x01FD Boot code and error message
 510 – 511 0x01FE – 0x01FF Signature (0x55AA)

[ FAT32 ] 추가적인 데이터 구조
 범위 설명
 10진수 16진수
 36 – 39 0x0024 – 0x0027 FAT size 32
 40 – 41 0x0028 – 0x0029 Ext flags
 42 – 43 0x002A – 0x002B FAT32 volume version
 44 – 47 0x002C – 0x002F Root directory cluster offset
 48 – 49 0x0030 – 0x0031 FSINFO(File System INFOrmation) offset
 50 – 51 0x0032 – 0x0033 Backup boot sector offset
 52 – 63 0x0034 – 0x003F Reserved
 64 – 64 0x0040 – 0x0040 INT 0x13 drive number (Floppy=0x00, Hard Drive=0x80)
 65 – 65 0x0041 – 0x0041 Not used (typically 0)
 66 – 66 0x0042 – 0x0042 Boot signature
 67 – 70 0x0043 – 0x0046 Volume serial number
 71 – 81 0x0047 – 0x0051 Volume label (ASCII)
 82 – 89 0x0052 – 0x0059 File system type
 90 – 509 0x0060 – 0x01FD Boot code and error message
 510 – 511 0x01FE – 0x01FF Signature (0x55AA)

다음 그림은 실제 필자의 컴퓨터를 FAT32로 포맷한 후 덤프한 결과이다.
위의 부트 섹터는 볼륨의 0번째 섹터이다. FAT32의 경우에는 부트 섹터가 손상될 것을 대비하여 6번째 섹터에 내용을 백업해 둔다. 따라서, 파티션 복구 도구들의 경우에 부트 섹터가 정상적이지 않을 경우 백업되어 있는 부트 섹터를 복사하여 사용하여 복구하곤 한다.

2. FSINFO(File System INFOrmation)
FSINFO는 일반적으로 1번째 섹터(부트 섹터 다음)에 저장되는 구조 7번째 섹터에 내용을 백업해 둔다. 이것의 위치는 BPB에 정의되어 있기 때문에 임의로 지정이 가능하다. FSINFO 구조의 용도는 운영체제에게 첫 비할당 클러스터의 위치 전체 비할당 클러스터의 수를 알려준다.
이것이 무슨 의미가 있을까? 우선 첫번재 비할당 클러스터의 위치를 알려줌으로써 해당 볼륨에 저장하고자 하는 파일을 빠르게 할당할 수 있도록 도와준다. 그리고 전체 비할당 클러스터의 수를 통해 해당 파일이 볼륨에 할당 가능한지 여부도 알 수 있다. 특정 볼륨에 파일을 복사할 경우 여유 공간이 있는지 없는지를 파악하기 위해서는 기존에는 FAT 영역 전체를 검색해봐야 했다. 하지만 FSINFO 구조때문에 볼륨의 여유 공간을 빠르게 파악할 수 있다. 다음은 FSINFO 섹터의 데이터 구조이다. 
 범위 설명
 10진수 16진수
 0 – 3 0x0000 – 0x0003 Signature (0x41615252)
 4 – 483 0x0004 – 0x01E3 Not used
 484 – 487 0x01E4 – 0x01E7 Signature (0x61417272)
 488 – 491 0x01E8 – 0x01EB Number of free clusters
 492 – 495 0x01EC – 0x01EF Next free cluster
 496 – 509 0x01F0 – 0x01FD Not used
 510 – 511 0x01FE – 0x01FF Signature (0x55AA)
다음은 필자의 볼륨에서 FSINFO 섹터를 확인한 것이다. 내용에서 알 수 있듯이 여유 클러스터의 수는 0x032D70(208240) 이고, 첫 여유 클러스터의 주소는 0x48E1(18657) 이다.


3. 추가적인 예약된 영역
앞서 부트 섹터는 0, 6번 섹터를 사용하고, FSINFO는 1, 7번 섹터를 사용한다고 했다. 이외에도 2번 섹터는 부트 섹터의 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 섹터이다. 그리고 이 내용은 8번에 백업해 둔다. 이렇게 기본적으로 FAT32는 0, 1, 2, 6, 7, 8번의 섹터를 사용한다.
결과적으로 총 32섹터 중 6개 섹터만 사용하고 나머지 섹터는 만약을 대비해 예약되어 있다. 따라서 이러한 섹터는 일반적으로 어플리케이션에서 접근하지 않기 때문에 간혹 예약된 나머지 영역에 데이터를 숨겨두는 경우도 있다.

그렇다면 항상 FAT32에서 예약된 영역을 32섹터를 가질까? 다음은 필자의 USB를 FAT32로 포맷한 후 EnCase를 통해 해당 볼륨을 살펴본 것이다. 보는 바와 같이 예약된 영역이 38섹터의 크기를 가지고 있다. 결국, 예약된 영역은 장치 타입이나 포맷 소프트웨어에 따라 변할 수 있기 때문에 반드시 부트 섹터의 오프셋 14-15의 예약된 영역 섹터 수를 확인한 후 접근해야 한다.
FAT(File Allocation Table)이라는 용어는 이름 그대로 파일의 할당 정보를 표현한 테이블이다. FAT라는 용어는 MS-DOS 때부터 쓰여 왔는데, Windows로 넘어가면서 파일시스템 자체를 가리키는 용어가 되었다. FAT의 의미상의 혼동이 올 수 있으므로 앞으로 테이블은 "FAT 영역", 파일시스템은 "FAT 파일시스템" 으로 구분해서 표기하겠다.
FAT 파일시스템은 구조가 간단하다는 장점 때문에 일반 시스템 외에도 메모리 카드, 디지털 카메라, 플래시 메모리 등에 널리사용되고 있다. FAT 파일시스템은 크게 FAT12, FAT16, FAT32 로 나눌 수 있다. FAT 뒤의 숫자는 비트 수로 최대 표현 가능한 클러스터의 수를 의미한다.
FAT 형식최대 표현 가능한 클러스터 수
 FAT12 4,084 (2^12 – 12)
 FAT16 65,524 (2^16 – 12)
 FAT32 268,435,444 (2^28 – 12)
FAT12는 12비트를 사용하여 클러스터를 표현할 수 있기 때문에 최대 4,096(2^12)개의 클러스터를 표현할 수 있다. 하지만 000h, 001h, FF6h~FFFh 값은 사용하지 않거나 다른 목적으로예약되어 있기 때문에 최대 4,084(^12 – 12)개의 클러스터를 표현할 수 있다. FAT16의 경우에도 예약된 클러스터를 제외하면 최대 65,524(2^16 – 12) 개의 클러스터를 표현할 수 있고, FAT32는 268,435,444(2^28 – 12)개의 클러스터를 표현할 수 있다. FAT32에서 28비트만 사용하는 이유는 4비트가 사전에 예약되어 다른 용도로 사용되기 때문이다.
이러한 변천과정은 당연히 저장매체의 용량이 기하급수적으로 커져가면서 파일시스템이 그 용량을 표현하지 못했기 때문에 비트 수를 증가시킨 것이다. 하지만 이러한 비트 수 증가에도 FAT32는 최대 2TB 의 용량까지만 표현가능하다. 클러스터의 크기를 32KB로 하면 8TB 까지 표현가능하지만 MBR 구조의 비트 수 제한으로 최대 2TB 까지만 표현가능하다.
2TB 는 과거에는 꿈의 용량이었지만 현재는 손에 잡히는 용량이며, 이 용량 또한 넘어서는 제품이 속속들이 개발되고 있다. 이러한 상황에서 FAT32를 사용하기는 무리이기 때문에, FAT32를 확장한 exFAT가 제안되었다. 이는 Windows Embedded CE 6.0부터 사용되었는데 현재는 Windows Vista Sevice Pack 1부터는 기본으로 지원하며, Windows XP에서는 패치를 통해 사용 가능하다.
exFAT는 클러스터 표현 비트를 64비트로 확장시켰으며, 비트맵을 사용하여 클러스터를 효율적으로 관리한다. 이외에도 FAT32에서 제한되었던 많은 기능이 추가되었다. exFAT에 대해서는 추후에 다시 자세히 살펴볼 예정이다.
다음은 FAT 파일시스템의 추상적인 구조를 보여준다. FAT 파일시스템은 크게 예약된 영역(Reserved Area), FAT 영역(FAT Area), 데이터 영역(Data Area)로 나눌 수 있다. 각 영역의 자세한 내용은 다음 포스팅부터 자세히 살펴볼 것이다.




일반적으로 컴퓨터에 대한 지식이 있는 사람들은 컴퓨터 구입 후 하드디스크의 용량을 그대로 사용하는 것이 아니라 최소한 두 개(C:, D:)의 파티션으로 분할 후 사용할 것이다. 예전에 파티션 분할은 저장매체 포맷 전에 수행해야만 가능했다. 하지만 최근에는 포맷 후에도 안정적으로 파티션을 생성, 수정, 제거 할수 있는 도구들이 많이 나와있다. 
내가 주로 사용하는 프로그램은 Acronis Disk Director Sever 이다. 이전 제품들은 사용할 때마다 간혹 오류가 발생하곤 했는데 이 도구는 3년째 사용중이지만 한번도 실망 시킨적이 없었다. 그렇다면 왜 파티션을 분할해서 사용하는 것일까? 많은 이유가 있겠지만 몇가지 중요한 이유만 살펴보자.
  • 분할된 파티션을 중요 데이터 저장용도나 백업 용도로 사용할 수 있다. 따라서 운영체제를 새로 설치할 경우 해당 운영체제 설치 파티션만 포맷 후 가능하기 때문에 데이터를 별도의 저장매체에 백업할 필요가 없다.
     
  • 하나의 컴퓨터에서 다양한 운영체제(Linux, Windows, Max OS X 등)를 설치하여 멀티부팅이 가능하다.
     
  • NTFS는 MFT라는 구조를 사용해 파일시스템의 메타 정보를 관리한다. 저장매체 공간이 클 수록 MFT의 크기는 매우 커지기 때문에 파일 탐색이나 공간 낭비가 심할 수 있다. 따라서 비교적 적은 공간으로 분할하는 것이 성능을 향상시켜준다. 
     
  • 하드디스크 입장에서도 파티션은 연속된 섹터를 분할한 것이므로 플래터의 공간이 내부, 외부로 나눠질 것이다. 따라서 파티션을 나누게 되면 파일 탐색의 경우 헤드의 움직임이 적어지므로 탐색 시간이 빠르게 된다.

파티션 타입 (Partition Types)
앞서 살펴본 바와 같이 저장매체는 일반적으로 MBR이라는 구조를 통해 파티션을 관리한다. MBR은 MS-DOS 뿐만아니라 Windows, Linux 등에서 공통적으로 사용하는 구조이다. Slice (disk), BSD disklabel 과 같이 특정 운영체제는 자신만의 구조를 사용하기도 한다. 앞으로 저장매체의 용량이 커지면서 MBR도 GPT(GUID Partition Table)로 대체될 것으로 보이지만 당분간은 MBR이 계속 쓰이게 될 것이다.
MBR은 저장매체를 4개의 파티션으로 분할 할 수 있다. 이 중 부팅 가능한 주 파티션(primary partition)은 항상 하나 이상을 가져야 한다. 그렇지 않다면 MBR의 부트 코드를 실행하는 과정에서 부팅 가능한 파티션이 없다는 오류메시지를 발생시킬 것이다. 주 파티션은 4개까지만 생성할 수 있지만 데이터 저장을 위한 논리 파티션은 4개 이상이 가능하다.
이것은 확장 파티션(extended partition)이라는 구조를 통해 가능한데, 확장 파티션은 16 바이트의 파티션 테이블에서 파티션 타입 값을 0x05h, 0x0Fh로 가진다. 확장 파티션을 통해서 생성할 수 있는 논리 파티션도 제한이 있는데, 각 파티션에는 파티션 문자가 할당이 된다. 'A', 'B'는  플로피 드라이브로 예약되어 있기 때문에 최대 24개('C' – 'Z')의 파티션이 생성이 가능하다.
확장 파티션은 데이터를 저장하기 위한 용도가 아니라 논리 파티션을 생성하기 위한 용도로 사용된다. 결국, 데이터는 논리 파티션에 저장된다. 예를 들어, 하나의 저장매체를 C:, D:, E: 3개의 파티션으로 나눌 경우 C:는 부팅 가능한 주 파티션이 되고 D:, E:는 논리 파티션이 된다.
다음은 그림을 통해 살펴본 주 파티션과 확장, 논리 파티션의 관계이다. MS-DOS 환경에서는 확장 파티션을 통해 최대 30개 까지 논리 파티션이 생성가능하다. 확장 파티션은 하나 이상의 파티션 정보가 저장되므로 MBR 영역에 저장되는 것이 아니라 저장매체의 별도의 영역에 저장된다. 따라서, 파티션 타입이 0x05h, 0x0Fh 값을 갖는 확장 파티션일 경우에는 확장 파티션의 시작 위치로 접근하여 논리 파티션 테이블을 확인해야 한다.
다음은 필자의 윈도우 시스템에서 디스크 관리(Disk Management)를 통해 디스크 상태를 살펴본 것이다. 총 2개의 디스크가 장착되어 있고, C:, E: 는 주 파티션이고 D:, F:는 논리 파티션인 것을 확인할 수 있다.

파티션 복구 (Partition Recovery)
해외 복구 도구들의 경우 대부분 삭제된 파일(deleted file) 복구, 파일 카빙(file carving)과 함께 파티션 복구 기능을 지원한다. 파티션 복구는 사용자가 실수로 파티션을 삭제하였을 경우 복구하는 기법이다. 파티션을 삭제하게 되면 파티션 테이블에서 해당 파티션에 대한 정보도 삭제가 된다.
이 경우 파티션 테이블의 정보는 사라졌지만, 해당 파티션이 위치하고 있던 영역의 데이터는 그대로 남아 있기 때문에 지워진 파티션의 부트 섹터(Boot Secotr)의 정보를 토대로 파티션 테이블을 다시 재구성할 수 있다. 만약, 파티션을 지운 후 다른 파티션의 영역을 지워진 파티션 영역까지 확장한 경우는 어떡해 될까?
이 경우에도 지워진 파티션의 부트섹터와 메타 영역이 덮어쓰여지지(overwritten) 않았다면 부트 섹터를 찾아 파티션의 크기를 재조정한 후 복구할 수 있을 것이다.
용어: 
부트 섹터(Boot Sector): 부팅을 하는데 필요한 파일이나 과정들을 하드디스크내에 섹터로 할당 해서 모아둔                               저장소