파티션의 이해
- 작성자
- 고친과정
2003년 9월 22일 : 처음씀
1.1. 파티션(Partition)의 목적
- 첫째 : 하나의 물리적 디스크를 몇개의 영역으로 나누어 관리가 용이하도록 하는 것.
- 둘째 : 운영체제가 여러가지인 경우 그러한 각각의 고유 파일시스템을 단일 영역에 독립적으로 유지할수 있게 하기 위해서.
- 셋째 : 한 파티션이 손실되더라도 다른 파티션 영역은 손실로부터 보호할수 있는 확률을 높이기 위한 수단.
1.2. 먼저 알아둘 필요가 있는 C/H/S, LBA mode란?
1.2.1. CHS모드
참고 그림 |
[PNG image (54.93 KB)] |
출처: https://commons.wikimedia.org/wiki/File:Cylinder_Head_Sector.svg |
Cylinder(0~1023), Head(0~15), Sector(1~63) 이렇게 3가지 요소를 통한 주소매핑을 하여 최대 528MByte가 주소매핑 가능합니다.
그러나 만약 BIOS가 LBA를 지원하게 되면 내부적으로 LBA로 바꾸어 헤드수를 늘려 가상적인 헤드수를 갖게 될수 있는데 이를 이용하면 Head의 범위는 0~15가 아닌 0~255 의 범위를 주소매핑 가능하게 됩니다.
그렇게 되면 최대 주소매핑 가능한 공간은 8GByte가 됩니다.
바로 이 크기가 1024실린더 제약이라는 말이 나오는 근거가 됩니다.
그리고 BIOS를 통하지 않고 PIO/DMA를 통한 접근을 시도하면 추가적으로 Cylinder는 0~65,535의 범위를 가질수 있고 반면에 Head는 0~15의 범위가 되며 Sector는 0~255의 범위를 가질수 있도록 되어 있습니다.
이는 2의 28승을 뜻하며 가능한 주소매핑 영역은 총 128GByte가 되는 비약적인 발전을 가질수 있습니다.
그리고 이는 한 블럭에 512바이트라는 것을 가정한 계산 이며 블럭당 크기가 커질수록 그 용량은 늘어납니다.
1.3. LBA모드
0 ~ 268,435,456(2의 28승)Blocks의 범위를 갖는 선형 주소방식으로 물리적 위치 주소를 나타내는 방식입니다.
그리고 1개의 Block은 통상 512/1024/2048/4096Bytes 로 구성되며 보통 대부분의 HDD는 512로 구성됩니다.
그러므로 하나의 Block이 512byte라고 가정하고 계산해보면 약 128GByte가 최대 주소매핑공간이 되는 방식입니다.
점차 HDD의 용량이 증가함에 따라서 충분할줄 알았던 LBA 주소에 사용되는 bit 가 모자르게 됨에 따라서 최근(2002년에 ATA-6 사양이 선택적 48비트 논리 블록 주소 지정을 도입) 에는 이것을 좀더 늘려 48bit address 지정할수 있도록 확장되었으며 이것은 281,474,976,710,656개의 Block을 지정할수 있는 범위로 비약적으로 증가하였습니다. 이것은 1개의 Block이 512byte라고 가정하고 계산하면 131,072TB에 해당하는 엄청난 주소공간이 된 것입니다.
그리고 1개의 Block은 통상 512/1024/2048/4096Bytes 로 구성되며 보통 대부분의 HDD는 512로 구성됩니다.
그러므로 하나의 Block이 512byte라고 가정하고 계산해보면 약 128GByte가 최대 주소매핑공간이 되는 방식입니다.
점차 HDD의 용량이 증가함에 따라서 충분할줄 알았던 LBA 주소에 사용되는 bit 가 모자르게 됨에 따라서 최근(2002년에 ATA-6 사양이 선택적 48비트 논리 블록 주소 지정을 도입) 에는 이것을 좀더 늘려 48bit address 지정할수 있도록 확장되었으며 이것은 281,474,976,710,656개의 Block을 지정할수 있는 범위로 비약적으로 증가하였습니다. 이것은 1개의 Block이 512byte라고 가정하고 계산하면 131,072TB에 해당하는 엄청난 주소공간이 된 것입니다.
1.4. 파티션은 어디에 위치한 것일까?
파티션은 주 파티션과 확장 파티션으로 나뉘어 지는데 주 파티션의 경우는 LBA방식으로 나타낸다면 0번 섹터이며 CHS방식으로 나타낸다면 0/0/1 에 위치한것이 됩니다.
즉, 물리적으로 가장 처음부분이 주 파티션이 위치하는 곳이며 이곳을 Master Boot Record(MBR)이라고도 불리워집니다.
도스에서 "fdisk /MBR"명령은 이곳을 초기화 하는 명령이 되는 것이고요.
또한 이곳에는 파티션정보만 있는것이 아니고 PC가 부팅되면 이곳에서 부팅코드를 읽어와서 부팅하게 됩니다.
즉, 만약 이곳이 읽어질수 없는 상태(파괴?)가 된다면 하드디스크는 무용지물이 되버리는 중요한 영역이 되는 것입니다.
즉, 물리적으로 가장 처음부분이 주 파티션이 위치하는 곳이며 이곳을 Master Boot Record(MBR)이라고도 불리워집니다.
도스에서 "fdisk /MBR"명령은 이곳을 초기화 하는 명령이 되는 것이고요.
또한 이곳에는 파티션정보만 있는것이 아니고 PC가 부팅되면 이곳에서 부팅코드를 읽어와서 부팅하게 됩니다.
즉, 만약 이곳이 읽어질수 없는 상태(파괴?)가 된다면 하드디스크는 무용지물이 되버리는 중요한 영역이 되는 것입니다.
1.5. MBR의 구조
MBR은 1개의 Sector로 보통 구성되어지는데 이 크기는 통상 512바이트입니다.
그리고 이 512바이트중에서 처음 446바이트는 운영체제를 읽어들이기 위한 준비단계 코드가 들어 있으며 나머지 64바이트가 파티션에 대한 정보를 담아두는 테이블입니다.
그리고 마지막 2바이트는 MBR이 맞는지 확인하기 위한 예약값으로 기록되어 있습니다.
즉, 446 + 64 + 2 의 구조를 가지고 있습니다.
파티션 1개를 명시하는데는 16바이트의 영역이 소요되는데 64바이트뿐이 없으니까 64 / 16 = 4 개의 파티션이 나뉘어 질수 있는 계산이 나옵니다.
여기서 의문을 가지시는 분이 계실텐데 "나는 파티션 5개 나눠서 쓰는데?" 라고 생각하시는 분이 계실겁니다. 맞습니다. 5개건 100개건 용량 남는데로 파티션을 나누는 것이 가능하지만 이것은 주파티션에서 나뉘어진 부파티션에서 그러한 파티션의 증설이 됩니다. 어디까지는 주파티션이건 부파티션이건 하나의 섹터에 4개의 파티션만이 기록되는것을 반드시 알고 계셔야 합니다.
부 파티션은 이 4개의 파티션중에 1개의 파티션에 부파티션의 위치를 명시하여 확장되는 개념이라고 보시면 이해가 되실겁니다.
즉, 다음과 같은 모양새가 될수 있습니다.
그리고 이 512바이트중에서 처음 446바이트는 운영체제를 읽어들이기 위한 준비단계 코드가 들어 있으며 나머지 64바이트가 파티션에 대한 정보를 담아두는 테이블입니다.
그리고 마지막 2바이트는 MBR이 맞는지 확인하기 위한 예약값으로 기록되어 있습니다.
즉, 446 + 64 + 2 의 구조를 가지고 있습니다.
파티션 1개를 명시하는데는 16바이트의 영역이 소요되는데 64바이트뿐이 없으니까 64 / 16 = 4 개의 파티션이 나뉘어 질수 있는 계산이 나옵니다.
여기서 의문을 가지시는 분이 계실텐데 "나는 파티션 5개 나눠서 쓰는데?" 라고 생각하시는 분이 계실겁니다. 맞습니다. 5개건 100개건 용량 남는데로 파티션을 나누는 것이 가능하지만 이것은 주파티션에서 나뉘어진 부파티션에서 그러한 파티션의 증설이 됩니다. 어디까지는 주파티션이건 부파티션이건 하나의 섹터에 4개의 파티션만이 기록되는것을 반드시 알고 계셔야 합니다.
부 파티션은 이 4개의 파티션중에 1개의 파티션에 부파티션의 위치를 명시하여 확장되는 개념이라고 보시면 이해가 되실겁니다.
즉, 다음과 같은 모양새가 될수 있습니다.
#1 Linux #2 Windows 98 #3 DataBackup #4 Extension --->>>> #1 WindowsXP #2 No used #3 Extension ->>> ... #4 No used이런식으로 파티션의 확장개념이 적용됩니다.
1.6. MBR 파티션정보 테이블
위에서 16바이트당 1개의 파티션을 명시할수 있다고 설명하였습니다. 그러면 16바이트에는 어떤것이 기술될까요? 다음과 같습니다.
이러한 정보를 통해서 운영체제위치를 찾아 부팅하게 됩니다.
여기서 맨처음 "boot indicator"이 부분이 80h 인가 그냥 0인가에 따라서 부팅가능한 파티션인가를 결정짓게 됩니다.
fdisk에서 보면 Active와 같은 개념이겠죠. 아무리 운영체제가 설치되어 있더라도 이 부분이 80h가 아니라면 부팅을 시도하지 않습니다.
보통 부트매니저는 이를 이용한 방식을 사용하는 경우가 많습니다. 여기서 또 문제가 되는것이 1024실린더를 넘는 영역을 어떻게 부팅할것인가라는 논재의 시점이 발생하는데 이 부분에 대한 설명은 너무 세부적인 부분이라서 접도록 하겠습니다.
아래는 제 PC의 MBR sector를 예시로 나타내어 봅니다.
OFFSET | 값 | 내용 |
00H | byte boot indicator | |
00H | non-bootable partition | |
80H | bootable partition (one partition only but minzkn is first 80H) | |
01H | byte beginning sector head number | |
02H | byte beginning sector (2 high bits of cylinder) | |
03H | byte beginning cylinder (low order bits of cylinder) | |
04H | byte system indicator | |
00H | unknown operating system (Empty partition) | |
01H | FAT12 | |
02H | XENIX | |
04H | FAT16 | |
05H | Extended partition (DOS) | |
06H | FAT16 (32bit sector number) | |
0BH | FAT32 | |
0CH | FAT32 (64bit sector number) | |
05H | byte ending sector head number | |
06H | byte ending sector (2 high bits of cylinder) | |
1st byte (sector) Sector offset within cylinder High order bits of cylinder | ||
07H | byte ending cylinder (low order bits of cylinder) | |
2nd byte (cylinder) Low order bits of cylinder | ||
08H | dword number of sectors preceding the partition | |
0BH | dword number of sectors in the partition |
이러한 정보를 통해서 운영체제위치를 찾아 부팅하게 됩니다.
여기서 맨처음 "boot indicator"이 부분이 80h 인가 그냥 0인가에 따라서 부팅가능한 파티션인가를 결정짓게 됩니다.
fdisk에서 보면 Active와 같은 개념이겠죠. 아무리 운영체제가 설치되어 있더라도 이 부분이 80h가 아니라면 부팅을 시도하지 않습니다.
보통 부트매니저는 이를 이용한 방식을 사용하는 경우가 많습니다. 여기서 또 문제가 되는것이 1024실린더를 넘는 영역을 어떻게 부팅할것인가라는 논재의 시점이 발생하는데 이 부분에 대한 설명은 너무 세부적인 부분이라서 접도록 하겠습니다.
아래는 제 PC의 MBR sector를 예시로 나타내어 봅니다.
00000000 FA EB 21 01 B4 01 4C 49 | 4C 4F 16 08 D3 09 38 4B [..!...LILO....8K] 00000010 00 00 00 00 96 09 38 4B | F1 3F 24 25 81 00 80 60 [......8K.?$%...`] 00000020 1E 82 34 03 B8 C0 07 8E | D0 BC 00 08 FB 52 53 06 [..4..........RS.] 00000030 56 FC 8E D8 31 ED 60 B8 | 00 12 B3 36 CD 10 61 B0 [V...1.`....6..a.] 00000040 0D E8 66 01 B0 0A E8 61 | 01 B0 4C E8 5C 01 60 1E [..f....a..L.\.`.] 00000050 07 80 FA FE 75 02 88 F2 | BB 00 02 8A 76 1E 89 D0 [....u.......v...] 00000060 80 E4 80 30 E0 78 0A 3C | 10 73 06 F6 46 1C 40 75 [...0.x.<.s..F.@u] 00000070 2E 88 F2 66 8B 76 18 66 | 09 F6 74 23 52 B4 08 B2 [...f.v.f..t#R...] 00000080 80 53 CD 13 5B 72 57 0F | B6 CA BA 7F 00 42 66 31 [.S..[rW......Bf1] 00000090 C0 40 E8 60 00 66 3B B7 | B8 01 74 03 E2 EF 5A 53 [.@.`.f;...t...ZS] 000000A0 8A 76 1F BE 20 00 E8 DF | 00 B4 99 66 81 7F FC 4C [.v.. ......f...L] 000000B0 49 4C 4F 75 29 5E 68 80 | 08 07 31 DB E8 C9 00 75 [ILOu)^h...1....u] 000000C0 FB BE 06 00 89 F7 B9 0A | 00 B4 9A F3 A6 75 0F B0 [.............u..] 000000D0 02 AE 75 0A 06 55 B0 49 | E8 CF 00 CB B4 40 B0 20 [..u..U.I.....@. ] 000000E0 E8 C7 00 E8 B4 00 FE 4E | 00 74 07 BC E8 07 61 E9 [.......N.t....a.] 000000F0 5C FF F4 EB FD 60 55 55 | 66 50 06 53 6A 01 6A 10 [\....`UUfP.Sj.j.] 00000100 89 E6 53 F6 C6 60 74 70 | F6 C6 20 74 14 BB AA 55 [..S..`tp.. t...U] 00000110 B4 41 CD 13 72 0B 81 FB | 55 AA 75 05 F6 C1 01 75 [.A..r...U.u....u] 00000120 41 52 06 B4 08 CD 13 07 | 72 B4 51 C0 E9 06 86 E9 [AR......r.Q.....] 00000130 89 CF 59 C1 EA 08 92 40 | 49 83 E1 3F 41 F7 E1 93 [..Y....@I..?A...] 00000140 8B 44 08 8B 54 0A 39 DA | 73 92 F7 F3 39 F8 77 8C [.D..T.9.s...9.w.] 00000150 C0 E4 06 86 E0 92 F6 F1 | 08 E2 89 D1 41 5A 88 C6 [............AZ..] 00000160 EB 1C B4 42 5B BD 05 00 | 60 CD 13 73 16 4D 74 B8 [...B[...`..s.Mt.] 00000170 31 C0 CD 13 61 4D EB F0 | 66 50 59 58 88 E6 B8 01 [1...aM..fPYX....] 00000180 02 EB E1 8D 64 10 61 C3 | 66 AD 66 09 C0 74 0A 66 [....d.a.f.f..t.f] 00000190 03 46 10 E8 5F FF 80 C7 | 02 C3 C1 C0 04 E8 03 00 [.F.._...........] 000001A0 C1 C0 04 24 0F 27 04 F0 | 14 40 60 BB 07 00 B4 0E [...$.'...@`.....] 000001B0 CD 10 61 C3 00 00 00 00 | F1 3F 24 25 00 00 00 01 [..a......?$%....] 000001C0 01 00 83 FE FF FF 3F 00 | 00 00 93 29 00 04 00 FE [......?....)....] 000001D0 FF FF 83 FE FF FF D2 29 | 00 04 D2 29 00 04 00 FE [.......)...)....] 000001E0 FF FF 82 FE FF FF A4 53 | 00 08 4B 34 80 00 00 FE [.......S..K4....] 000001F0 FF FF 83 FE FF FF EF 87 | 80 08 D2 D1 EF 6B 55 AA [.............kU.]
1.7. MBR 파티션의 용도를 나타내는 "byte system indicator"에 대한 목록 (리눅스의 fdisk에서 인용)
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx 5 Extended 42 SFS 86 NTFS volume set da Non-FS data 6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt 9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT f W95 Ext'd (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT 1e Hidden W95 FAT1
1.8. MBR로 나타낼수 있는 용량의 한계
MBR의 Partition 범위지정 한계는 32bit까지이므로 4,294,967,296개의 Block까지만 지정할수 있으며 이것은 약 2TB용량까지만 다룰수 있다는 의미입니다.
오늘날 2TB이상의 HDD가 출시되고 있고 이를 활용할수 있도록 하려면 2TB보다 큰 용량을 나타낼수 있는 Partition지정방식의 정의가 필요했습니다.
이를 위해서 현재 가장 널리 사용되어지는 것이 GPT(GUID Partition Table)방식입니다.
오늘날 2TB이상의 HDD가 출시되고 있고 이를 활용할수 있도록 하려면 2TB보다 큰 용량을 나타낼수 있는 Partition지정방식의 정의가 필요했습니다.
이를 위해서 현재 가장 널리 사용되어지는 것이 GPT(GUID Partition Table)방식입니다.
1.9. GPT
- Partition table header (LBA 1)
OFFSET 크기 내용 0 8 Signature ("EFI PART", 45 46 49 20 50 41 52 54) 8 4 Revision (For version 1.0, the value is 00 00 01 00) 12 4 Header size (in bytes, usually 5C 00 00 00 meaning 92 bytes) 16 4 CRC32 of header (0 to header size), with this field zeroed during calculation 20 4 Reserved; must be zero 24 8 Current LBA (location of this header copy) 32 8 Backup LBA (location of the other header copy) 40 8 First usable LBA for partitions (primary partition table last LBA + 1) 48 8 Last usable LBA (secondary partition table first LBA - 1) 56 16 Disk GUID (also referred as UUID on UNIXes) 72 8 Partition entries starting LBA (always 2 in primary copy) 80 4 Number of partition entries 84 4 Size of a partition entry (usually 128) 88 4 CRC32 of partition array 92 * Reserved; must be zeroes for the rest of the block (420 bytes for a 512-byte LBA)
- GUID partition entry format (LBA 2–33)
OFFSET 크기 내용 0 16 Partition type GUID 16 16 Unique partition GUID 32 8 First LBA (little-endian) 40 8 Last LBA (inclusive, usually odd) 48 8 Attribute flags (e.g. bit 60 denotes read-only) 56 72 Partition name (36 UTF-16LE code units)
- Partition attributes
BIT 내용 0 System partition (disk partitioning utilities must reserve the partition as is) 60 Read-only 62 Hidden 63 Do not automount (i.e., do not assign drive letter)