[파티션] LBA, 파티션 테이블, MBR, GPT

markyang92·2021년 9월 9일
1
post-thumbnail

구형 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)을 마치 각각 하나의 블록 장치처럼 보여준다.
    • 파티션은 실제로 파티션 테이블이라고 하는 한 영역에 정의되어 있다.
  1. 파티션 테이블이 각 파티션을 담당한다.
    각 파티션, 파일 시스템이 데이터를 관리한다.

MBR

  • MBR(Master Boot Record, MBR)
    • 전통적으로 사용되고 있는 파티션 테이블
    • Name이 없음
    • Primary partition, Extended Partition, Logical Partition이 있음
  1. Primary partition: 디스크의 기본적인 구획
    1.1 MBR은 Primary partition4개 까지 가질 수 있음
    1.2 4개 이상의 파티션을 원하면 1개의 Primary partitionExtended 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번 섹터 MBRDescription
0~455Byteboot strap loader. 부팅 시, BIOS가 읽어와서 실행하는 GRUB 스테이지1이 있다.
456~509Byte (64Byte)파티션 테이블
510~511Byte0xAA55 값 기록
다른 값이 기록되어있다면, 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 Byte2TB
$ 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)
    • Name이 있음
  • 현재는 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
파티션 테이블 장소MBRMBR 바로 뒤(디스크 끝에 복제)
최대 디스크 용량2TB8ZB(실제로는 무한대)
최대 파티션 수15(SCSI)128 (헤더 설정을 변경하면 128 초과개도 가능)
파티션 라벨파티션 ID(용도를 표시하는 ID)GUID(용도를 표시하는 ID + 유니크 ID)
파티션 작성 툴fdiskparted, gdisk

UEFI

  • UEFI는 BIOS의 후속작이다.
    • 시스템 BIOS는 설계상 메모리를 1MB 밖에 사용할 수 없다.
  • UEFI는 이런 제한을 없앴다.
  • Bootstrap loader의 로딩 방법도 변경되어 종래의 GRUB 스테이지 1, 스테이지 1.5, 스테이지 2와 같이 단계적 부트 로더를 가동할 필요가 없어졌다.
  • GPT 방식으로 작성된 'EFI 시스템 파티션'에 저장된 부트로더를 직접 가동하는 것도 가능하다.

Boot Firmware + Partition Table 종류

종류          Boot Partition
BIOS + MBRBoot Disk의 0번 섹터가 Boot Sector, 첫 번째 파티션이 Boot Partition
단 Linux의 GRUB는 첫번째가 아닌 파티션을 Boot Partition으로 지정할 수 있다.
UEFI + GPTBoot Disk의 ★ ESP(EFI System Partiton) ★이 Boot Partition
UEFI + MBRMBR 디스크 내, ★ ESP(EFI System Partiton) ★을 FAT32 파일 시스템 및 EFI 부트로더를 심으면, UEFI + MBR

파티션 테이블 툴

  1. parted : MBR, GPT 지원 text 기반 툴
  2. gparted: parted의 GUI 버전
  3. fdisk: 전통적인 text 기반 툴, MBR 지원
  4. gdisk: fdisk 버전의 하나, GPT 지원

$ fdisk -l

  • MBR 지원 툴 답게, Name이 없음

$ parted -l

  • MBR, GPT 지원 툴 답게, Name이 있음
  • parted 커맨드와 주요 내부 커맨드
커맨드설명
check파일 시스템 검사
cp파티션 복제
helphelp
mkfs파일 시스템 생성
mklabel파티션 테이블의 종류를 나타내는 디스크 라벨을 지정
GPT를 사용할 때는 'gpt'를 작성
mkpart파티션을 생성
mkpartfs파티션과 파일 시스템을 동시에 생성
move파티션을 이동 시킴
print현재의 파티션 테이블과 디스크 라벨의 상태를 표시
quitparted 커맨드 종료
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으로 나누어 떨어지지 않는다.

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글