구형 HDD (CHS)
예: Head 255, Sector: 63, Cylinder: 60801
- 1개 HDD에 헤드: 255개
- 1개 트랙: 63 섹터
- 1장 디스크의 실린더: 60801개 트랙
- 위와 같은 정보를 CHS(Cylinder, Head, Sector)방식이라고 함
- 1개 섹터(물리적 디스크 접근의 최소단위)의 위치를 정하려면 아래의 정보가 필요하다.
- 1)실린더 번호: 외부에서 세어봐서 몇 번째 트랙인가
- 2)헤드 번호: 어떤 헤드가 Read? Write? 디스크 면인가
- 3)섹터 번호: 트랙안의 '몇 번 째' '블록' 인가
-> 물론 Linux의 디바이스 드라이버가 CHS 값을 계산하여 Disk와 I/O 하기 때문에 유저가 신경 쓸 필요가 없다.
LBA
- LBA(Logical Block Addressing): 현재는 LBA 방식으로 접근한다.
- 전체 섹터에 0부터 일련번호(섹터 번호)를 붙여서 이 번호를 이용해, 접근하는 섹터를 지정하는 단순한 방식
- 보통은 섹터 번호가 작을수록 디스크 외측 영역을 사용한다.
파티션
- 물리디스크를 여러개의 논리적 디스크로 분할
- 인접한 블록 섹션을 별개의 디스크로 취급하게 한다.
- 파티션을 지정하고 파일시스템이 사용될 수 있도록 초기화하고, 파일 정보를 기록하기 위한 형식으로 만들어야한다.
- 새로운 디스크 장착시 파티션 생성 필수!
- 파티션 생성 -> 파일 시스템 할당
파티션 테이블
- 리눅스 커널은 파티션들(/dev/sda1, /dev/sda2)을 마치 각각 하나의 블록 장치처럼 보여준다.
- 파티션은 실제로 파티션 테이블이라고 하는 한 영역에 정의되어 있다.

파티션 테이블이 각 파티션을 담당한다.
각 파티션, 파일 시스템이 데이터를 관리한다.

MBR

- MBR(Master Boot Record, MBR)
- 전통적으로 사용되고 있는 파티션 테이블
- Name이 없음
- Primary partition, Extended Partition, Logical Partition이 있음
- Primary partition: 디스크의 기본적인 구획
1.1 MBR은 Primary partition을 4개 까지 가질 수 있음
1.2 4개 이상의 파티션을 원하면 1개의 Primary partition 을 Extended Partition으로 지정한다.
Extended Partition은 1개만 지정 가능
1.3 확장된 파티션은 OS가 다른 파티션인 것 처럼 사용할 수 있는 Logical Partition 으로 세분한다.
Logical Partition 은 '무한개' 지정 가능
e.g.
$ sudo parted -l
Model: ATA TAMMUZ SSD (scsi)
...
Number Start End Size Type File system Flags
1 1049kB 316GB 316GB primary ext4
2 316GB 320GB 4235MB extended
5 316GB 320GB 4235MB logical linux-swap(v1)
0번 섹터 MBR | Description |
---|
0~455Byte | boot strap loader. 부팅 시, BIOS가 읽어와서 실행하는 GRUB 스테이지1이 있다. |
456~509Byte (64Byte) | 파티션 테이블 |
510~511Byte | 0xAA55 값 기록 다른 값이 기록되어있다면, MBR이 망가진 것 |
$ hexdump
로 0xAA55 확인
$ sudo hexdump -s 510 -n 2 /dev/sda
LBA의 한계
- 섹터수를 표시하는 숫자는 모두 4Byte(
0x00000000 ~ 0xFFFFFFFF
)로 섹터 수가 0xFFFFFFFF
을 넘는 대용량 디스크는 지원하지 않는다.

- 1섹터 per 512Byte 인 시스템
- 최대 표시 가능한 섹터 번호:
429,496,795
- 1섹터 당 512Byte인 시스템:
429,496,795 * 512
= 2,190,433,320,450 Byte
≒ 2TB
$ echo "ibase=16;FFFFFFFF" | bc
4294967295
$ echo "ibase=16;FFFFFFFF*FF*2" | bc
2190433320450
- 따라서, MBR안의 파티션 테이블을 이용할 경우, 2TByte 이상의 디스크를 사용하는 파티션 작성은 불가능하다.
- GPT를 사용하던가(아래에 설명이 있음), 요즘엔 아예 1 섹터당 4KB를 적용하기도한다.
GPT
- GPT(Globally Unique Identifier Partition Table)
- 현재는 GPT를 사용하는 디스크에서 OS를 가동할 때는 UEFI규격에 대응한 OS가 필요하다.
- GPT는 1섹터 ~ 33섹터에 기록하는 새로운 파티션 테이블이다.
- 파티션 테이블이 망가질 때를 대비해서 같은 내용이 디스크의 끝에도 기록되어 있다.
- GPT 헤더는 파티션으로 이용할 수 있는 섹터의 범위가 기록되어 있다.

- 각 파티션 정보는 '파티션 테이블 엔트리'에 기록된다.
- 1개의 '파티션 테이블 엔트리' = 128Byte
- 1개 섹터(512Byte) = 4개 '파티션 테이블 엔트리'
- 각 파티션의 시작 섹터와 종료 섹터를 나타내는 수치: 8Byte로 기록됨(2TB 이상의 Disk의 섹터 수에 대응)
- 각 파티션에는 GUID 고유 라벨 기록
- 부트로더를 저장하는 파티션은 'EFI 시스템 파티션(ESP)' 라벨
- RHEL6는
/boot/efi
에 마운트되는 파일 시스템이 ESP
이 아래에 Stage2에 해당하는 GRUB(grub.efi)를 저장한다.
따라서 GRUB 스테이지 1, 스테이지 1.5는 필요 없다.
ESP는 VFAT형식으로 포맷
기존 파티션 vs GPT
- | 기존 파티션 | GPT |
---|
파티션 테이블 장소 | MBR | MBR 바로 뒤(디스크 끝에 복제) |
최대 디스크 용량 | 2TB | 8ZB(실제로는 무한대) |
최대 파티션 수 | 15(SCSI) | 128 (헤더 설정을 변경하면 128 초과개도 가능) |
파티션 라벨 | 파티션 ID(용도를 표시하는 ID) | GUID(용도를 표시하는 ID + 유니크 ID) |
파티션 작성 툴 | fdisk | parted , gdisk |
UEFI
- UEFI는 BIOS의 후속작이다.
- 시스템 BIOS는 설계상 메모리를 1MB 밖에 사용할 수 없다.
- UEFI는 이런 제한을 없앴다.
- Bootstrap loader의 로딩 방법도 변경되어 종래의 GRUB 스테이지 1, 스테이지 1.5, 스테이지 2와 같이 단계적 부트 로더를 가동할 필요가 없어졌다.
- GPT 방식으로 작성된 'EFI 시스템 파티션'에 저장된 부트로더를 직접 가동하는 것도 가능하다.
Boot Firmware + Partition Table 종류
종류 | Boot Partition |
---|
BIOS + MBR | Boot Disk의 0번 섹터가 Boot Sector, 첫 번째 파티션이 Boot Partition 단 Linux의 GRUB는 첫번째가 아닌 파티션을 Boot Partition으로 지정할 수 있다. |
UEFI + GPT | Boot Disk의 ★ ESP(EFI System Partiton) ★이 Boot Partition
 |
UEFI + MBR | MBR 디스크 내, ★ ESP(EFI System Partiton) ★을 FAT32 파일 시스템 및 EFI 부트로더를 심으면, UEFI + MBR |
파티션 테이블 툴
parted
: MBR, GPT 지원 text 기반 툴
gparted
: parted
의 GUI 버전
fdisk
: 전통적인 text 기반 툴, MBR 지원
gdisk
: fdisk
버전의 하나, GPT 지원
$ fdisk -l
MBR
지원 툴 답게, Name
이 없음
$ parted -l
MBR
, GPT
지원 툴 답게, Name
이 있음
커맨드 | 설명 |
---|
check | 파일 시스템 검사 |
cp | 파티션 복제 |
help | help |
mkfs | 파일 시스템 생성 |
mklabel | 파티션 테이블의 종류를 나타내는 디스크 라벨을 지정 GPT를 사용할 때는 'gpt'를 작성 |
mkpart | 파티션을 생성 |
mkpartfs | 파티션과 파일 시스템을 동시에 생성 |
move | 파티션을 이동 시킴 |
print | 현재의 파티션 테이블과 디스크 라벨의 상태를 표시 |
quit | parted 커맨드 종료 |
resize | 파티션 사이즈 변경 |
rm | 파티션 삭제 |
select | 처리 대상의 디바이스(/dev/sda 등) 지정 |
set | 부트 플래그를 비롯한 각종 플래그 설정 |
4KB 섹터 디스크
- 기존 1섹터=512Byte
- 대용량 디스크에서 섹터 사이즈가 크면, 섹터 단위 접근의 오버헤드를 줄일 수 있다.
- 섹터마다 에러 체크용 정보가 저장되어 있는데, 섹터 사이즈를 크게 함으로써 이러한 메타 데이터의 차지 비율을 줄여, 더욱 효과적으로 사용
- 하지만 HDD에 접근하는 서버, HW, OS, 디바이스 드라이버는 512바이트의 섹터 크기를 전제로 설계
- 이를 컨트롤러가 논리적 512Byte Sector로 에뮬레이션해서, 서버에서는 기존 방식과 동일한 512Byte 섹터가 존재하는 것 처럼 보이지만, 실제 데이터가 읽고 써질 때는 4KB 사이즈 섹터 단위로 사용
- 이 때문에 기본적으로 파티션의 시작 지점과 사이즈는 논리 섹터수로 8의 배수로 준비해두는 것이 좋다.
이를 파티션 정렬 이라고 한다.
- Alignment of sector 기능은 파티션의 시작위치를 '8의 배수 + 7'. 리눅스에서는 필요없는 기능으로, HDD의 점퍼 스위치등으로 바꿀 수 있다면, OFF로 하자.
초기 Kernel dmesg
- 초기에 MBR 테이블을 읽을 때, 리눅스 커널은 다음의 디버깅 메시지를 출력한다고 가정한다.
sda: sda1 sda2 < sda5 >
sda2 < sda5
: /dev/sda2
가 Logical partition /dev/sda5
를 포함하고 있는 확장 파티션이라는 것을 나타낸다.
SSD
- SSD에서 데이터를 읽을 때, 4KB 정도를 읽는다.
- 이러한 읽기는 파티션과 데이터가 4KB 배수에 정렬되어 있지 않으면 적은양의 읽기라도 1번 읽을 것을 두번 읽어야하기 때문에, 적절한 정렬이 필요하다.
parted
, gparted
와 같은 많은 파티셔닝 유틸리티들은 새롭게 생성된 파티션을 디스크의 시작부분으로 부터, 적절한 오프셋으로 보내는 기능을 포함하고 있다.
- 만약 파티션이 어디서부터 시작하는지 궁금하고, 파티션이 경계부터 시작하는지 확인하고 싶다면
/sys/block
을 살펴보자.
- 예를 들어
sda1
의 파티션 시작부분을 보고 싶다면 아래의 명령어를 치면 나온다.
$ cat /sys/block/sda/sda1/start
2048
cat /sys/block/sda/sda2/start
1050624
..본인 mac에 docker로 깔린 Ubuntu에선 파티션의 경계가 4096으로 나누어 떨어지지 않는다.