Disk Partition Aligment

1. 파티션 정렬의 이해

기본적으로 Disk partitioning 시에 첫번째 파티션은 항상 64번째 섹터에 해당하는 LBA 주소 63에서 시작하여, 이 섹터는 기본적으로 512 Byte의 크기를 가지고 있습니다.
이 이유는 CHS(Cylinder, Head, Sector) 가 63 섹터 구조를 가지기 때문입니다. 디스크의 숨겨진 트랙(Logical Sector 0~62, Total 63 cector, 31.5KB) 영역이 끝나는 지점(보통 MBR 이라고 하는 영역 입니다.)이 62 sector 이기 때문입니다.
이런 구조에서, 1 sector가 512 Byte일 경우에는 크게 문제가 없던 것이, disk가 고용량이 되면서, Advanced Format 형식(1sector 당 4K 할당)의 Disk가 나오면서 또는 RAID 구성시에 strip size 를 크게 잡을 경우에 문제가 발생하기 시작 합니다.
위의 그림은 RAID 구성시에 strip size을 64K 로 설정하고, cluster size를 64K 로 설정한 경우를 보여 줍니다.
첫번째 줄이 Strip size, 두번째 줄이 sector, 세번째 줄이 정렬이 안된 파티션, 네번째 줄이 정렬이 된 파티션을 의미 합니다.
위의 그림에서 정렬이 되지 않은 3번째 파티션을 보면, sector size가 4K가 되면서 파티션이 63 sector에서 시작을 할 경우, RAID의 strip size 경계를 살짝 넘어서는 문제가 발생을 합니다. 이 의미는, 1번째 cluster를 처리를 하기 위하여 2개의 strip unit을 호출을 해야 한다는 의미가 됩니다. 즉 이 경계를 잘 맞추고 있다면 1번의 호출로 끝나는 것이 경계가 맞지 않아 2번 호출을 해야 한다는 것이 되고, 이 문제는 Disk 의 read/write 성능에 큰 손해를 끼치게 됩니다.
그래서 4번째 줄과 같이, 첫번째 파티션의 시작을 128 sector (64K)에서 시작을 하도록 권장을 하고 있습니다.
하지만, 대용량 파일의 read/write 성능을 위하여 format 시에 block size나 RIAD의 strip size를 1M로 설정하는 경우도 있기 때문에 요즘에는 128 sector 보다는 아래와 같이 2048 sector(1M)를 권장하고 있습니다.

2. fdisk 를 이용한 파티셔닝

fdisk 의 경우에는 util-linux-ng 2.17.1 부터 제대로 된 정렬을 지원 합니다. 그러므로 오래된 OS를 사용하고 있다면 fdisk 보다는 parted 를 이용할 것을 권고 합니다.
fdisk를 이용하여 파티션 정렬을 할 경우, 2.17.1 이후 버전을 사용하는 것을 권고하며, DOS 호환 모드를 비활성화 시키면, fdisk는 1MB 경계에서 정렬이 됩니다.
fdisk 를 이용할 경우, 다음의 사항을 권고 합니다.
  1. 1.
    util-linux-ng 2.17.1 이후 버전을 사용
  2. 2.
    fdisk 의 경고를 잘 보십시오.
  3. 3.
    DOS 호환 모드를 비활성화 (-c 옵션)
  4. 4.
    표시 단위는 sector 를 이용 (-u 옵션)
  5. 5.
    파티션의 끝을 지정할 경우에는, + 사이즈(M,G) 옵션 사

2.1 잘못된 정렬 예제

아래의 예제는 잘못된 정렬의 예를 보여 주며, 원인은 DOS 호환 모드 때문 입니다.
1
[[email protected] ~]$ fdisk /dev/sdb
2
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
3
Building a new DOS disklabel with disk identifier 0xe4909079.
4
Changes will remain in memory only, until you decide to write them.
5
After that, of course, the previous content won't be recoverable.
6
7
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
8
9
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
10
switch off the mode (command 'c') and change display units to
11
sectors (command 'u').
12
13
Command (m for help): p
14
15
Disk /dev/sdb: 160.0 GB, 160041885696 bytes
16
255 heads, 63 sectors/track, 19457 cylinders
17
Units = cylinders of 16065 * 512 = 8225280 bytes
18
Sector size (logical/physical): 512 bytes / 512 bytes
19
I/O size (minimum/optimal): 512 bytes / 512 bytes
20
Disk identifier: 0xe4909079
21
22
Device Boot Start End Blocks Id System
23
24
Command (m for help): n
25
Command action
26
e extended
27
p primary partition (1-4)
28
p
29
Partition number (1-4): 1
30
First cylinder (1-19457, default 1):
31
Using default value 1
32
Last cylinder, +cylinders or +size{K,M,G} (1-19457, default 19457): +10G
33
34
Command (m for help): u
35
Changing display/entry units to sectors
36
37
Command (m for help): p
38
39
Disk /dev/sdb: 160.0 GB, 160041885696 bytes
40
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
41
Units = sectors of 1 * 512 = 512 bytes
42
Sector size (logical/physical): 512 bytes / 512 bytes
43
I/O size (minimum/optimal): 512 bytes / 512 bytes
44
Disk identifier: 0xe4909079
45
46
Device Boot Start End Blocks Id System
47
/dev/sdb1 63 20980889 10490413+ 83 Linux
48
49
Command (m for help): q
Copied!

2.2 2.17.1 이전의 fdisk를 이용한 파티션 정렬

-S 32 -H 64 옵션을 사용하여, 두번째 synlinder를 정렬에 사용할 수 있습니다.
1
[[email protected] ~]$ fdisk -S 32 -H 64 /dev/sdc
2
3
The number of cylinders for this disk is set to 65536.
4
There is nothing wrong with that, but this is larger than 1024,
5
and could in certain setups cause problems with:
6
1) software that runs at boot time (e.g., old versions of LILO)
7
2) booting and partitioning software from other OSs
8
(e.g., DOS FDISK, OS/2 FDISK)
9
10
Command (m for help): p
11
12
Disk /dev/sdc: 68.7 GB, 68719476736 bytes
13
64 heads, 32 sectors/track, 65536 cylinders
14
Units = cylinders of 2048 * 512 = 1048576 bytes
15
Disk identifier: 0x5a3b93b6
16
17
Device Boot Start End Blocks Id System
18
19
Command (m for help): n
20
Command action
21
e extended
22
p primary partition (1-4)
23
p
24
Partition number (1-4): 1
25
First cylinder (1-65536, default 1): 2
26
Last cylinder or +size or +sizeM or +sizeK (2-65536, default 65536):
27
Using default value 65536
28
29
Command (m for help): p
30
31
Disk /dev/sdc: 68.7 GB, 68719476736 bytes
32
64 heads, 32 sectors/track, 65536 cylinders
33
Units = cylinders of 2048 * 512 = 1048576 bytes
34
Disk identifier: 0x5a3b93b6
35
36
Device Boot Start End Blocks Id System
37
/dev/sdc1 2 65536 67107840 83 Linux
38
39
Command (m for help): w
40
The partition table has been altered!
41
42
Calling ioctl() to re-read partition table.
43
Syncing disks.
44
[[email protected] ~]$ fdisk -lu /dev/sdc
45
46
Disk /dev/sdc: 68.7 GB, 68719476736 bytes
47
64 heads, 32 sectors/track, 65536 cylinders, total 134217728 sectors
48
Units = sectors of 1 * 512 = 512 bytes
49
Disk identifier: 0x5a3b93b6
50
51
Device Boot Start End Blocks Id System
52
/dev/sdc1 2048 134217727 67107840 83 Linux
Copied!

2.3 최신 버전의 fdisk를 이용한 파티션 정렬

Dos 호환 모드 (-c) 옵션을 비활성화 시키고, 섹터 단위를 사용하도록 옵션을 주어, LBA 주소 2048 에서 파티션을 시작할 수 있도록 할 수 있습니다.
1
[[email protected] ~]$ fdisk -c -u /dev/sdb
2
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
3
Building a new DOS disklabel with disk identifier 0xfae13403.
4
Changes will remain in memory only, until you decide to write them.
5
After that, of course, the previous content won't be recoverable.
6
7
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
8
9
Command (m for help): p
10
11
Disk /dev/sdb: 160.0 GB, 160041885696 bytes
12
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
13
Units = sectors of 1 * 512 = 512 bytes
14
Sector size (logical/physical): 512 bytes / 512 bytes
15
I/O size (minimum/optimal): 512 bytes / 512 bytes
16
Disk identifier: 0xfae13403
17
18
Device Boot Start End Blocks Id System
19
20
Command (m for help): n
21
Command action
22
e extended
23
p primary partition (1-4)
24
p
25
Partition number (1-4): 1
26
First sector (2048-312581807, default 2048):
27
Using default value 2048
28
Last sector, +sectors or +size{K,M,G} (2048-312581807, default 312581807): +10G
29
30
Command (m for help): p
31
32
Disk /dev/sdb: 160.0 GB, 160041885696 bytes
33
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
34
Units = sectors of 1 * 512 = 512 bytes
35
Sector size (logical/physical): 512 bytes / 512 bytes
36
I/O size (minimum/optimal): 512 bytes / 512 bytes
37
Disk identifier: 0xfae13403
38
39
Device Boot Start End Blocks Id System
40
/dev/sdb1 2048 20973567 10485760 83 Linux
41
42
Command (m for help): q
Copied!

3. parted 를 이용한 파티셔닝

parted 를 이용하여 파티셔닝 정렬을 할 경우에는, label을 GPT로 만들면 첫번째 실린더를 2048 sector 부터 생성해 줍니다.
1
(parted) mklabel GTP
Copied!
이 의미는 mkpart 시에 시작이 0 이 아니라, 1 이어야 한다는 것입니다.
1
(parted) mkpart primary 0 100%
2
Warning: The resulting partition is not properly aligned for best performance.
3
Ignore/Cancel?
Copied!
시작을 0으로 하면, 위와 같이 정렬이 되지 않는다는 메시지가 나오게 됩니다. 그러므로 아래와 같이 1로 설정을 하도록 합니다.
1
(parted) mkpart primary 1 100%
2
(parted) print
3
Model: ATA ST3000DM001-9YN1 (scsi)
4
Disk /dev/sdb: 3001GB
5
Sector size (logical/physical): 512B/4096B
6
Partition Table: gpt
7
8
Number Start End Size File system Name Flags
9
1 1049kB 3001GB 3001GB primary
Copied!
또는 unit을 sector로 변경을 하여 설정을 하는 것이 더 직관적 입니다.
1
(parted) mkpart primary 2048s 100%
2
(parted) print
3
Model: ATA ST3000DM001-9YN1 (scsi)
4
Disk /dev/sdb: 5860533168s
5
Sector size (logical/physical): 512B/4096B
6
Partition Table: gpt
7
8
Number Start End Size File system Name Flags
9
1 2048s 5860532223s 5860530176s primary
Copied!

4. 파티션 정렬 확인

1
Partition_Offset ÷ Stripe_Unit_Size = 정수
2
Stripe_Unit_Size ÷ File_Allocation_Unit_Size = 정수
Copied!
Partition StartingOffset 을 1024로 나누었을 경우, 정수의 값이 나온다면 정렬이 잘 되어 있다고 볼 수 있습니다. StartingOffset 값은 sector 값으로 보시면 되며, 첫번째 파티션의 시작 sector 값이 1024 의 배수이면 된다는 의미 입니다. 그냥 적정 값으로 2048 sector에서 시작하면 된다고 외워도 되겠습니다.
또, parted 를 이용하여 확인이 가능 합니다.
1
[[email protected] ~]$ parted /dev/sda align-check optimal 1
2
1 aligned
Copied!

5. 참고 문서

Last modified 2yr ago