Devin.KR
로그인

리눅스 blkid 명령어 사용법 - UUID·파일시스템 타입 확인과 fstab 안전하게 쓰기

개발자 조회 1

이 명령어를 언제 쓰는가

/etc/fstab을 쓸 때 필요한 UUID를 얻으려고 쓴다. /dev/sdb1 같은 커널 이름은 디스크를 추가하거나 컨트롤러 순서가 바뀌면 재부팅 후에 다른 디스크를 가리킬 수 있다. UUID는 파일시스템을 만들 때 안에 기록되는 값이라 디바이스 이름이 바뀌어도 따라다닌다. 그래서 요즘 fstab은 UUID나 LABEL로 쓰는 것이 표준이다.

또 하나의 용도는 "이 파티션에 뭐가 들어 있나" 확인이다. 포맷해도 되는 빈 디스크인지, 이미 xfs 파일시스템과 데이터가 있는지 mkfs 전에 반드시 확인해야 한다. 이 확인을 건너뛴 mkfs 한 줄이 복구 불가능한 사고가 된다.

기본 형식

blkid [옵션] [디바이스]

인자 없이 실행하면 알고 있는 모든 디바이스의 정보를 나열한다. 디바이스를 주면 그것만 본다. 대개 /sbin 또는 /usr/sbin에 있고 정확한 조회에는 루트 권한이 필요하므로 sudo blkid로 쓴다.

자주 쓰는 옵션

옵션의미예시
-s 태그특정 태그만 출력(UUID, TYPE, LABEL, PARTUUID)blkid -s UUID /dev/sdb1
-o value이름 없이 값만. 스크립트용blkid -s UUID -o value /dev/sdb1
-o exportKEY=VALUE 형태. 셸에서 eval 하기 좋다blkid -o export /dev/sdb1
-p캐시를 무시하고 디바이스를 직접 다시 읽는다blkid -p /dev/sdb1
-U / -LUUID·LABEL로 디바이스 이름을 역으로 찾는다blkid -U 3f7c1e2a-...
-g캐시에서 사라진 디바이스 항목을 정리sudo blkid -g

실전 예제

1) 전체 디바이스의 UUID와 타입을 훑는다. fstab 작성 전 기본 확인이다.

sudo blkid
/dev/sda1: LABEL="cloudimg-rootfs" UUID="5a1b0c9e-2d34-4f88-91aa-7c6b5e0d3f21" TYPE="ext4" PARTUUID="9f0c6d1b-01"
/dev/sdb1: LABEL="data" UUID="3f7c1e2a-6b90-4c1d-9a55-0b3d2f8e14aa" TYPE="xfs" PARTUUID="a12f4c8d-01"

2) fstab 한 줄을 명령으로 만들어 낸다. 손으로 UUID를 옮겨 적다 한 글자 틀리면 부팅이 멈춘다. 복사가 아니라 생성이 안전하다.

UUID=$(sudo blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /data xfs defaults,noatime,nofail 0 2" | sudo tee -a /etc/fstab

3) 포맷해도 되는 디스크인지 확인한다. 아무 출력도 없고 종료 코드가 2이면 알려진 파일시스템 서명이 없다는 뜻이다.

sudo blkid -p /dev/sdc; echo "exit=$?"

4) UUID로 디바이스를 역추적한다. fstab에 적힌 UUID가 지금 어느 디스크인지 확인할 때 쓴다.

sudo blkid -U 3f7c1e2a-6b90-4c1d-9a55-0b3d2f8e14aa
/dev/sdb1

5) 셸 변수로 한꺼번에 받는다. 마운트 스크립트에서 타입까지 자동으로 정할 때 편하다.

eval "$(sudo blkid -o export /dev/sdb1)"
echo "type=$TYPE uuid=$UUID label=$LABEL"

함정과 주의점

blkid는 캐시를 본다. 결과는 /run/blkid/blkid.tab에 캐시되며, 방금 mkfs로 새로 포맷했는데 옛 UUID가 나오는 일이 생긴다. 이 상태로 fstab을 쓰면 재부팅 시 마운트에 실패한다. 방금 바뀐 디바이스를 볼 때는 반드시 -p(캐시 무시, 직접 읽기)를 붙이거나 udevadm settle 후 다시 확인하라. lsblk -f는 캐시가 아니라 udev 데이터베이스를 보므로 교차 확인용으로 좋다.

디스크를 dd로 복제하면 UUID가 겹친다. UUID는 파일시스템 안에 저장된 값이라 통째 복사하면 그대로 따라온다. 같은 UUID를 가진 디바이스가 두 개 있으면 fstab의 UUID= 항목이 어느 쪽을 잡을지 알 수 없고, 부팅할 때마다 결과가 달라진다. 복제본은 xfs_admin -U generate(xfs)나 tune2fs -U random(ext4)으로 UUID를 새로 발급해야 한다.

서명이 여러 개 남아 있으면 결과가 흔들린다. 예전에 LVM으로 쓰던 디스크를 파티션만 지우고 다시 포맷하면 옛 서명이 남아 blkid가 엉뚱한 타입을 보고하거나 마운트가 실패한다. 이럴 때는 wipefs -a로 서명을 지운 뒤 다시 만든다. 다만 wipefs는 데이터를 못 쓰게 만드는 명령이니 대상 디바이스를 두 번 확인하고 실행하라.

UUID와 PARTUUID는 다른 값이다. UUID는 파일시스템의 식별자, PARTUUID는 파티션 테이블의 식별자다. GPT에서는 파티션마다 부여된 GUID가, MBR에서는 9f0c6d1b-01처럼 디스크 서명과 파티션 번호를 조합한 값이 나온다. 포맷하면 UUID는 바뀌지만 PARTUUID는 그대로다. 부트로더 설정에는 PARTUUID를 쓰는 경우가 있으니 어느 쪽을 요구하는지 확인하고 넣어야 한다.

일반 사용자로는 command not found가 날 수 있다. /sbin이 PATH에 없는 배포판이 있다. 이때는 sudo blkid 또는 /sbin/blkid로 실행한다. macOS에는 blkid가 없으며 diskutil info가 비슷한 정보를 준다.

함께 보면 좋은 명령어

  • lsblklsblk -f는 같은 정보를 트리로 보여 준다. 전체 구조 파악에는 이쪽이 낫다.
  • mount — blkid로 얻은 UUID를 mount UUID=... 형태로 바로 쓸 수 있다.
  • findmnt — fstab에 적은 항목이 실제로 유효한지 findmnt --verify로 검증한다.