Linux에서 하나의 디스크는 여러 ID로 식별될 수 있다. 식별하는 방식에 따라 DM(Device Mapper), WWID (World Wide Identifier), UUID (Universally Unique Identifier)라는 이름으로 ID가 붙여진다. DM, WWID, UUID는 각각 다른 방식으로 디스크나 논리 장치를 식별할 뿐만 아니라 시스템에 따라 다른 용도로 사용된다. 이 ID 값들이 어떻게 매핑되는지와 이를 확인하는 방법을 알아보자.
WWID는 주로 SAN(Storage Area Network)에서 사용되는 디스크나 LUN(Logical Unit Number)을 식별하는 데 사용된다. WWID는 스토리지 하드웨어에 따라 할당되며, 보통 스토리지 시스템에서 직접 할당하기 때문에 동일한 디스크를 다른 시스템에 연결해도 동일한 WWID를 유지한다.
(생성/소멸 시기) 스토리지에서 각 LUN에 WWID를 부여한다.
/dev/sdb의 wwid를 확인해보자.
OS 밴더사나 버전마다 다르겠지만 RHEL7,8 의 경우 다음과 같이 확인 할 수 있다.
# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
3600508b1001cdb68f0cef5b2633d3cf6
더 쉬운 방법은 /dev/disk/by-id/ 디렉토리에서 확인하는 방법이다. 주로 scsi-로 시작하는 이름이 WWID이다.
# ls -l /dev/disk/by-id/ |grep sda2 |grep scsi
lrwxrwxrwx 1 root root 10 Aug 21 18:08 scsi-0HP_LOGICAL_VOLUME_00000000-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Aug 21 18:08 scsi-3600508b1001c3f56a7b67d63de96ec9b-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Aug 21 18:08 scsi-SHP_LOGICAL_VOLUME_5001438009F3EB10-part2 -> ../../sda2
UUID는 각 파티션이나 파일 시스템, LVM에 대해 고유한 식별자를 부여하는 방식이다. 파일시스템의 UUID는 fstab 파일에서 파일 시스템을 마운트할 때 사용된다.
(생성 시기) UUID는 스토리지 디바이스가 물리적으로 연결될 때 자동으로 생성되며, 커널은 해당 스토리지 디바이스에서 이 식별자를 추출한다.
(변경 시점) 기본적으로는 스토리지를 재연결한다고 해서 UUID가 변경되지는 않지만, 특정 작업(파티션 생성, 파일 시스템 변경 등)을 수행하면 UUID가 변경될 수 있다. 예를 들어 UUID가 변경 되는 경우는 다음과 같다.
(LVM의 UUID)
UUID는 blkid 명령어를 사용하여 확인할 수 있다.
/dev/mapper/vg_data-lv_data 의 UUID를 확인하려면 다음과 같이 확인 할 수 있다.
# blkid /dev/mapper/vg_data-lv_data
/dev/mapper/vg_data-lv_data: UUID="e07ef351-2c65-4a84-8332-e122c52f7f42" BLOCK_SIZE="4096" TYPE="xfs"
아래 결과값을 보면 파일시스템뿐만 아니라 파티션에도 UUID가 할당되는 것을 확인 할 수 있다.
# blkid
/dev/sda1: UUID="8fb50f79-1d6d-4c33-b750-4d6254b59220" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="eb01f4cb-01"
/dev/sda2: UUID="ldrG6X-EhMA-n7Bk-IAxl-VOVz-ipaG-8EaRgK" TYPE="LVM2_member" PARTUUID="eb01f4cb-02"
/dev/sdb: UUID="BGxPjX-tPoH-FtbU-tASm-x1FA-B19F-Sb0Wez" TYPE="LVM2_member"
/dev/mapper/vgos-root: UUID="ebf26d0f-cc01-47b4-ab0d-bef276af7ec3" BLOCK_SIZE="512" TYPE="xfs"
/dev/mapper/vgos-swap: UUID="560f6624-d9e0-44b7-a9eb-3bd28f0b548f" TYPE="swap"
/dev/mapper/vg_data-lv_data: UUID="e07ef351-2c65-4a84-8332-e122c52f7f42" BLOCK_SIZE="4096" TYPE="xfs"
각 LVM의 UUID는 pvdisplay, vgdisplay, lvdisplay 로 확인 할 수 있다.
# pvdisplay /dev/sda2
--- Physical volume ---
PV Name /dev/sda2
VG Name vgos
PV Size 204.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 52224
Free PE 22528
Allocated PE 29696
PV UUID ldrG6X-EhMA-n7Bk-IAxl-VOVz-ipaG-8EaRgK
dm-X로 이름을 붙이는 주체는 Device Mapper 라는 커널 구성 요소이다.
Device Mapper는 물리 또는 논리 디바이스를 매핑하여 virtual device를 생성할 수 있는 커널 수준의 프레임워크이다.
블록 디바이스는 저장장치의 종류나 제공 방식에 따라 다양한 형태의 이름이 붙을 수 있다. 커널의 Device Mapper는 블록 디바이스를 논리적으로 관리하기 위해 식별된 블록 디바이스에 dm-X 형태의 이름을 할당하며, 사용자에게는 /dev/mapper/과 같은 별칭으로 제공한다. 즉, dm-X로 이름 붙여진 저장공간은 항상 블록 디바이스이며, 이는 Device Mapper를 통해 생성된 논리적인 블록 디바이스임을 알 수 있다.

그림 출처 - https://www.informit.com/articles/article.aspx?p=2995360
예를 들어, LVM(Logical Volume Manager)을 사용해 논리 볼륨을 생성하면 /dev/dm-0과 같은 이름이 할당되며, 암호화된 디스크를 설정한 경우에도 /dev/dm-1과 같은 이름으로 식별된다. 또한, RAID로 구성된 논리 디바이스 역시 Device Mapper를 통해 /dev/dm-2와 같은 이름이 부여된다.
이제 명령어를 통해 dm-2가 어떤 디바이스인지 확인해보자.
우선 dm-X 형태의 이름을 갖고 있기 떄문에 어떤 논리 디바이스와 어떤 물리 디바이스를 매핑할 것이다.
Device Mapper 디바이스는 /dev/mapper 디렉토리에 생성된다.
# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 236 Aug 21 18:08 control
lrwxrwxrwx 1 root root 7 Aug 21 18:08 vg_data-lv_data -> ../dm-2
lrwxrwxrwx 1 root root 7 Aug 21 18:08 vgos-root -> ../dm-0
lrwxrwxrwx 1 root root 7 Aug 21 18:08 vgos-swap -> ../dm-1
위 결과값에서는 vg_data-lv_data 라는 논리 디바이스가 dm-2 에 링크가 되어 있는 것을 확인할 수 있다.
dmsetup 결과값에서 vg_data-lv_data 는 253:2 물리적인 블록 디바이스에 매핑이 되어 있다. (참고로 블록 디바이스는 major-number:minor-number 로 식별된다.)
# dmsetup ls
vg_data-lv_data (253:2)
vgos-root (253:0)
vgos-swap (253:1)
# dmsetup info
Name: vg_data-lv_data
State: ACTIVE
Read Ahead: 8192
Tables present: LIVE
Open count: 1
Event number: 0
Major, minor: 253, 2
Number of targets: 1
UUID: LVM-ikZaz8XjwamujeQIp8MaRtE2o4GilC9c2HSdunfHKhAG8FeIjjCk9t8JK8lig6qe
(...생략...)
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 205G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 204G 0 part
├─vgos-root 253:0 0 100G 0 lvm /
└─vgos-swap 253:1 0 16G 0 lvm [SWAP]
sdb 8:16 0 1.8T 0 disk
└─vg_data-lv_data 253:2 0 931.5G 0 lvm /vm_images
종합해보자면, dm-2는 /dev/mapper/vg_data-lv_data라는 논리 디바이스와 253:2 물리 디바이스를 매핑하고 있으며, 이 물리 디바이스는 /dev/sdb에 해당하는 LVM 파티션에서 생성된 것임을 알 수 있다.
하나의 디스크는 여러 방식으로 식별될 수 있으며, 예를 들어 /dev/sda라는 디바이스는 아래와 같은 ID를 가질 수 있다.
/dev/mapper/my_vg-my_lv/dev/disk/by-id/scsi-3600508b1001c3144f000000000000000e2e1f2b5-1b9c-42d2-8a57-2f023e55cbf8이와 같이 Linux에서는 각 디스크와 파티션에 대해 다양한 ID를 사용하여, 디바이스들을 효율적으로 관리하고 식별할 수 있도록 돕는다. 이러한 ID들을 확인하는 방법을 익혀두면 시스템 관리와 디스크 문제 해결에 유용하게 활용할 수 있다.
다음 포스팅에서는 이번에 다 다루지 못한 스토리지 식별자에 대해 더 알아보자.