LIT-linux-disk-identification-overview
2026-02-15
topic/linux
topic/storage
topic/sysadmin
요약
Linux에서 블록 디바이스를 식별하는 방법은 10가지 이상 존재하며, 각 방법은 스토리지 스택의 서로 다른 레이어에서 동작한다. 커널 디바이스 이름(/dev/sdX)은 부팅마다 변경될 수 있으므로, 안정적인 시스템 운영을 위해 UUID, PARTUUID 등 지속적 식별자를 사용해야 한다.
핵심 포인트
1. UUID (Universally Unique Identifier) - 파일시스템 수준
- 파일시스템 포맷 시 자동 생성되는 128비트 식별자 (8-4-4-4-12 형식)
- 모든 Linux 파일시스템이 지원 (FAT/exFAT/NTFS는 더 짧은 형식 사용)
- 파일시스템을 다시 포맷하면 새로 생성됨
- 하드웨어 이동에도 유지됨 (콘텐츠 기반 식별)
- 조회:
blkid -s UUID,lsblk -o UUID,/dev/disk/by-uuid/ - fstab에서 가장 널리 권장되는 식별 방법
2. PARTUUID (Partition UUID) - 파티션 테이블 수준
- GPT: 파티션 엔트리에 저장된 128비트 UUID. 파일시스템 변경에도 유지됨
- MBR: libblkid가 pseudo-PARTUUID 생성 (
SSSSSSSS-PP형식). 파티션 번호 변경 시 바뀔 수 있음 - 파일시스템과 독립적 -- 포맷해도 변경되지 않음
- initramfs 없이도 커널이 직접 해석 가능 (임베디드 시스템에서 유용)
- 조회:
blkid -s PARTUUID,lsblk -o PARTUUID,/dev/disk/by-partuuid/ - 가상 블록 디바이스(md RAID, LVM LV)에는 존재하지 않음
3. LABEL (파일시스템 라벨) - 파일시스템 수준
- 사용자가 직접 설정하는 이름. 가독성이 좋음
- 최대 길이가 파일시스템마다 다름: ext4=16자, XFS=12자, Btrfs=256자, FAT=11자
- 설정 도구:
e2label(ext),xfs_admin -L(XFS),btrfs filesystem label(Btrfs),fatlabel(FAT) - 시스템 전체에서 고유해야 함. 디스크 복제 시 충돌 발생 가능
- 조회:
blkid -s LABEL,lsblk -o LABEL,/dev/disk/by-label/
4. PARTLABEL (GPT 파티션 라벨) - 파티션 테이블 수준
- GPT 파티션 엔트리 헤더에 정의. 최대 72자
- 파일시스템 타입과 독립적. 포맷해도 유지됨
- MBR에는 PARTLABEL 개념 없음 (GPT 전용)
- 설정 도구:
gdisk,cgdisk - 조회:
blkid -s PARTLABEL,lsblk -o PARTLABEL,/dev/disk/by-partlabel/
5. 디바이스 경로 (커널 네이밍) - 커널 수준
| 패턴 | 대상 | 예시 |
|---|---|---|
/dev/sd[a-z][1-9] | SCSI/SATA/SAS/USB | /dev/sda1 |
/dev/nvme[C]n[N]p[P] | NVMe (컨트롤러C, 네임스페이스N, 파티션P) | /dev/nvme0n1p1 |
/dev/vd[a-z][1-9] | VirtIO (KVM/QEMU) | /dev/vda1 |
/dev/hd[a-d] | IDE (레거시) | /dev/hda1 |
/dev/xvd[a-z] | Xen | /dev/xvda1 |
- 커널이 디바이스를 발견하는 순서에 따라 할당 -> 부팅마다 변경 가능
- NVMe의 네임스페이스: NVMe SSD를 독립적인 논리 블록 주소 범위로 분할하는 기능. 대부분의 드라이브는 단일 네임스페이스(n1) 사용
- fstab이나 중요 설정에 사용하면 안 됨
6. by-id - 하드웨어 시리얼 수준
- 하드웨어 시리얼 번호 기반 식별.
/dev/disk/by-id/ - 접두사로 전송 방식을 나타냄:
ata-,scsi-,nvme-,usb-,wwn- - 형식 예시:
ata-Samsung_SSD_860_EVO_250GB_S3YJNB0K123456-part1 - 파일시스템 변경에도 유지되지만, 디바이스를 다른 컨트롤러로 이동하면 변경될 수 있음
- 파티션은
-partN접미사 추가 - WWN 심볼릭 링크도 이 디렉토리에 제공됨
7. by-path - 물리 경로 수준
- PCI 물리 경로 기반 식별.
/dev/disk/by-path/ - 형식 예시:
pci-0000:03:00.0-nvme-1-part1 - 디바이스가 같은 컨트롤러의 다른 포트로 이동하면 변경됨
- "하드웨어 변경에 내성 있는 지속적 네이밍에 적합하지 않음"
- 인프라 문서화 용도로만 권장
8. WWN (World Wide Name) - 하드웨어 고유 식별자
- 디바이스 제조사가 하드코딩한 전세계 고유 식별자
- 8바이트(64비트) 또는 16바이트(128비트). 16진수로 표현
/dev/disk/by-id/에wwn-0x...형식으로 심볼릭 링크 제공- Fibre Channel, SATA, SAS, SCSI, NVMe 등에서 사용
- 하드웨어 변경(포트, 컨트롤러 이동)에도 완전히 유지 -- 가장 안정적인 하드웨어 식별자
- 조회:
ls -l /dev/disk/by-id/ | grep wwn,scsi_id
9. Device Mapper 이름 - 가상화 레이어
/dev/mapper/<VG>-<LV>형식 (LVM)/dev/mapper/<이름>(LUKS/dm-crypt)- 커널 내부 이름:
/dev/dm-N(마이너 번호 순, 사용 지양) - LVM 경로(
/dev/VG/LV)는 이미 지속적 네이밍 제공 lvm(8)은 fstab에/dev/VG/LV형식 사용을 권장 (/dev/mapper/VG-LV는 내부 사용)
10. MD 디바이스 네이밍 - RAID 레이어
/dev/md0,/dev/md1,/dev/md127등- mdadm.conf에 등록된 어레이는 안정적인 이름, 미등록 어레이는 부팅마다 변경 가능
- md 어레이 자체 UUID를 슈퍼블록에 저장 (파일시스템 UUID와는 별개)
/dev/disk/by-id/md-uuid-*심볼릭 링크 제공
MD RAID 디바이스에 PARTUUID가 없는 이유
- PARTUUID는 파티션 테이블에서 유래: GPT의 각 파티션 엔트리, 또는 MBR의 디스크 시그니처+파티션 번호에서 생성
- MD 디바이스는 가상 블록 디바이스: 커널의 md 드라이버가 생성하며, 어떤 물리적 파티션 테이블에도 엔트리로 존재하지 않음
- 파티션 레이어 위에 위치: 스토리지 스택에서 MD는 파티션 위에 존재:
물리 디스크 → 파티션 (PARTUUID 존재) → MD RAID (PARTUUID 없음) → 파일시스템 (UUID 존재) - 구성 파티션은 PARTUUID를 가짐:
/dev/sda1,/dev/sdb1은 각각 PARTUUID가 있지만, 이들로 조립된/dev/md0는 파티션 테이블에 없으므로 PARTUUID 없음 - mdadm은 자체 메타데이터를 사용: PARTUUID를 신경 쓰지 않고, 슈퍼블록의 어레이 UUID로 식별
- 예외: md 디바이스 자체에 파티션 테이블을 만들면(md 위에 GPT 작성) 그 파티션들은 PARTUUID를 가지게 됨
지속성 종합 비교
| 식별 방법 | 스택 레이어 | 리포맷 시 | 하드웨어 이동 시 | 디스크 복제 시 | 파티셔닝 변경 시 |
|---|---|---|---|---|---|
| UUID | 파일시스템 | 변경됨 | 유지 | 충돌 | 유지 |
| PARTUUID | 파티션 테이블 | 유지 | 유지 | 충돌(GPT)/변경가능(MBR) | 변경됨 |
| LABEL | 파일시스템 | 변경됨 | 유지 | 충돌 | 유지 |
| PARTLABEL | 파티션 테이블 | 유지 | 유지 | 충돌 | 변경됨 |
| by-id | 하드웨어 | 유지 | 컨트롤러 변경 시 변경 | 고유 | 유지 |
| by-path | PCI 경로 | 유지 | 변경됨 | N/A | 유지 |
| WWN | 하드웨어 | 유지 | 유지 | 고유 | 유지 |
| /dev/sdX | 커널 | 유지 | 변경 가능 | N/A | 유지 |
| /dev/mapper/VG-LV | LVM | 유지 | 유지 | 충돌 | N/A |
| /dev/mdN | md RAID | 유지 | 유지 | 설정 의존 | N/A |
fstab 모범 사례 요약
- 일반적인 경우: UUID 사용 (가장 안전)
- 자주 포맷하는 파티션: PARTUUID 사용
- initramfs 없는 시스템: PARTUUID 사용 (커널 직접 해석)
- LVM 볼륨:
/dev/VG/LV사용 (이미 지속적) - MD RAID: UUID 또는 LABEL 사용 (PARTUUID 불가)
- 절대 사용 금지:
/dev/sdX등 커널 디바이스 이름
나의 생각
디스크 식별 방법은 스토리지 스택의 계층적 구조를 그대로 반영한다. 물리 하드웨어(WWN, by-id) -> PCI 경로(by-path) -> 파티션 테이블(PARTUUID, PARTLABEL) -> 파일시스템(UUID, LABEL) -> 가상화 레이어(LVM, md RAID) 순으로 각 계층마다 고유한 식별 체계가 존재한다. MD RAID에 PARTUUID가 없는 것은 이 계층 구조에서 자연스러운 결과이며, 가상 블록 디바이스는 자체 메타데이터(md 슈퍼블록, LVM 메타데이터)로 식별한다는 원칙을 보여준다.
Links
- 원본: REF-archwiki-persistent-block-device-naming
- 원본: REF-linux-device-path-naming-conventions
- 원본: REF-linux-wwn-world-wide-name
- 원본: REF-linux-device-mapper-lvm-naming
- 원본: REF-linux-md-raid-device-naming
- 원본: REF-linux-fstab-identification-best-practices
- 관련 Permanent Note: [[]]
- 관련 Reference Note: REF-lvm
- 관련 Reference Note: REF-luks