[CS] 리눅스 스토리지 기초 - 1. 블록 디바이스, 파티션, 파일 시스템

· 3 분 소요


리눅스에서 디스크를 사용하려면 세 가지 단계를 거친다: 디스크 인식(블록 디바이스) → 파티션 나누기 → 파일 시스템으로 포맷. 이 글에서는 물리적 디스크가 “쓸 수 있는 공간”이 되기까지의 과정을 살펴본다.

장치 파일과 디바이스 드라이버 구조에 대한 기본 개념은 Everything is a File 철학리눅스 디바이스 드라이버 구조를 참고하자.


TL;DR

  • 블록 디바이스: 디스크처럼 고정 크기 블록 단위로 데이터를 읽고 쓰는 장치. /dev/sda, /dev/nvme0n1
  • 파티션: 하나의 디스크를 논리적으로 나눈 영역. MBR(2TB 제한)과 GPT(사실상 무제한) 방식이 있다
  • 파일 시스템: 파티션 위에 데이터를 구조화하는 방식. ext4, xfs, btrfs 등
  • 흐름: 디스크 인식 → 파티션 생성 → 파일 시스템 포맷 → 마운트(다음 글)


블록 디바이스와 캐릭터 디바이스

리눅스에서 장치는 크게 두 종류로 나뉜다.

구분 블록 디바이스 캐릭터 디바이스
데이터 단위 고정 크기 블록(보통 512B~4KB) 바이트 스트림
랜덤 접근 가능 불가 (순차)
예시 /dev/sda, /dev/nvme0n1 /dev/tty, /dev/null
용도 디스크, SSD 터미널, 시리얼 포트, GPU

/dev 디렉토리에서 장치 파일을 확인할 수 있다.

ls -l /dev/sda /dev/tty
# brw-rw---- 1 root disk 8, 0 ... /dev/sda
# crw-rw-rw- 1 root tty  5, 0 ... /dev/tty

출력의 첫 글자가 장치 타입을 나타낸다. b는 블록 디바이스, c는 캐릭터 디바이스다. 8, 05, 0은 각각 major/minor 번호다.

major/minor 번호

  • major 번호: 어떤 드라이버가 이 장치를 담당하는지 식별 (예: 8 = SCSI 디스크 드라이버)
  • minor 번호: 같은 드라이버가 담당하는 여러 장치 중 어떤 것인지 식별 (예: 0 = 첫 번째 디스크)

디스크 인식 확인

# 연결된 블록 디바이스 목록
lsblk
# NAME   SIZE TYPE MOUNTPOINT
# sda    500G disk
# ├─sda1  50G part /
# └─sda2 450G part /home

# 파티션 테이블 정보
fdisk -l /dev/sda


파티션

파티션이란

하나의 물리적 디스크를 논리적으로 나누는 것이다. 운영체제는 각 파티션을 독립적인 스토리지 영역으로 다룬다.

lsblk
NAME   SIZE TYPE MOUNTPOINT
sda    500G disk
├─sda1  50G part /
├─sda2  20G part /boot
└─sda3 430G part /home

sdb    1TB  disk
└─sdb1  1TB part /mnt/data

여기서 자주 혼동되는 세 가지 개념을 구분할 필요가 있다.

  • 파티션: 디스크의 물리적 영역 (sda1)
  • 파일 시스템: 그 파티션에 설치된 데이터 구조 (ext4, xfs)
  • 마운트 포인트: 파일 시스템이 디렉토리 트리에 연결된 경로 (/, /home)
물리적 계층:
디스크 sda → 파티션 sda1 (ext4로 포맷됨)
디스크 sdb → 파티션 sdb1 (xfs로 포맷됨)

논리적 계층 (VFS):
/ (sda1의 ext4가 마운트됨)
├── bin/
├── var/
└── mnt/
    └── data/  (sdb1의 xfs를 여기에 마운트 가능)

파티션 테이블: MBR vs. GPT

파티션 테이블은 디스크의 파티션 정보를 기록하는 방식이다.

구분 MBR (Master Boot Record) GPT (GUID Partition Table)
최대 디스크 크기 2TB 사실상 무제한 (약 9.4ZB)
최대 파티션 수 4개 (주 파티션) 128개
부팅 방식 BIOS UEFI
안정성 단일 복사본 헤더/테이블 이중 백업

MBR의 2TB 제한

MBR은 512바이트 섹터를 기본 단위로 쓰고, 주소를 32비트로 표현한다.

2^32 × 512B = 4,294,967,296 × 512 = 2,199,023,255,552B ≈ 2TB

32비트 주소 공간으로 512바이트 섹터를 가리키면, 최대 약 2TB까지만 주소 지정이 가능하다.

GPT의 해결

GPT는 64비트 LBA(Logical Block Addressing)를 사용해 이 제한을 없앴다.

파티셔닝 도구

도구 대상 특징
fdisk MBR 대화형, 전통적
gdisk GPT fdisk의 GPT 버전
parted MBR/GPT 모두 스크립트 가능, 범용


파일 시스템

파티션을 나눴으면 그 위에 파일 시스템을 만들어야 한다. 파일 시스템은 데이터를 디스크에 어떻게 구조화해서 저장할지 정의하는 체계다.

종류

크게 두 가지로 나뉜다.

블록 디바이스 기반 파일 시스템

물리적 디스크(블록 디바이스) 위에 데이터를 저장한다. 일반적으로 “파일 시스템”이라 하면 이쪽을 말한다.

  • ext4, xfs, btrfs 등

논리적/가상 파일 시스템

물리적 블록 디바이스가 없다. 다른 소스를 파일 시스템 인터페이스로 보여준다.

파일 시스템 데이터 소스
OverlayFS 기존 디렉토리들을 조합
tmpfs RAM
procfs, sysfs 커널 메모리
bindfs 다른 디렉토리의 뷰

ext4 vs. xfs vs. btrfs

항목 ext4 xfs btrfs
저널링 메타데이터+데이터 메타데이터만 CoW 기반
확장 가능 가능 가능
축소 가능 불가 가능
inode 할당 포맷 시 고정 동적 할당 동적 할당
최대 파일 크기 16TB 8EB 16EB
K8s PV 용도 범용, 기본값 대용량/고성능 스냅샷 활용

mkfs로 포맷하기

# ext4로 포맷
mkfs.ext4 /dev/sdb1

# xfs로 포맷
mkfs.xfs /dev/sdb1

# 포맷 결과 확인
lsblk -f
# NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
# sdb1   ext4         a1b2c3d4-...                         /mnt/data


정리

디스크를 사용 가능한 스토리지로 만드는 과정을 정리하면 다음과 같다.

물리적 디스크 (/dev/sda)
    ↓ 파티셔닝 (fdisk, gdisk, parted)
파티션 (/dev/sda1, /dev/sda2)
    ↓ 포맷 (mkfs.ext4, mkfs.xfs)
파일 시스템 (ext4, xfs)
    ↓ 마운트 (mount)
디렉토리 트리에 연결 (/mnt/data)

이 글에서는 마운트 전까지, 즉 블록 디바이스 인식 → 파티션 분할 → 파일 시스템 생성까지를 다뤘다. 파일 시스템이 준비되었으면 마운트를 통해 디렉토리 트리에 연결해야 한다.



hit count

댓글남기기