스크립트에서 / 파일 시스템의 UUID 가져 오기


11

/파일 시스템 이 포함 된 볼륨의 UUID를 어떻게 얻을 수 있습니까? 내가 찾은 가장 좋은 것은입니다 blkid -o list. 그러나이 출력은 사람이 읽을 수 있고 구문 분석하기 어렵습니다. 더 좋은 방법이 있습니까?

시스템 별 템플릿으로 구성 관리를 매개 변수화해야합니다.

에 대한 참고 blkid: 미래에 내 질문의 결과를 재사용 할 수 있습니다 사람들을 위해 잡았다 blkid에서 이전 실행의 캐시 결과 /etc/blkid.tab. 즉, blkid루트가 아닌 사용자로 처음 실행 하면 데이터가 반환되지 않습니다. 또한 blkid루트 실행 후 루트가 아닌 사용자로 실행하면 오래된 (부정확 한) 데이터가 반환됩니다.


내 시스템에서는 사람이 읽을 수 있고 고유 한 레이블을 모든 파티션에 할당합니다. 그런 다음 레이블을 사용하여 거의 모든 것을 찾을 수 있습니다 /dev/disk/by-label... 마운트되지 않은 파티션에서도 작동합니다. 그것은 "의미"하지 않는 2 개의 UUIDS를 사용하는 것보다 오류가 덜 발생하는 루트에서 루트 박까지 rsync와 같은 작업을 수행하는 스크립트를 작성할 수 있다는 이점이 있습니다.
Joe

답변:


25

사용 findmnt:

$ findmnt /        
TARGET SOURCE       FSTYPE OPTIONS
/      /dev/md127p1 ext4   rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa

또한 정보 조회 방법 및 정보 표시 방법 (JSON 출력 포함)을 제어하는 ​​여러 옵션이 있습니다. mount패키지 의 일부 이므로 모든 우분투 설치에서 사용할 수 있습니다.


이것은 16.04에서 훌륭하게 작동합니다. 14.04에서 나를 위해 기능하지 못했습니다. 신뢰할 수있는 결과를 얻으려면 이 방법 을 사용해야 했습니다 .
Geek

11

다른 해결책 :

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n 헤더를 억제합니다 (실제로 필요하지는 않지만 구문 분석에 더 안전합니다)
  • -r 원시 출력을 만듭니다 (파싱하는 것이 더 안전합니다)
  • -o UUID,MOUNTPOINT 필요한 정보 만 포함

5

lsblk명령을 사용하여 UUID를 출력 할 수 있지만 파티션의 장치 이름 (예 : / dev / sda2)이 필요합니다. df명령 을 사용 하여 출력을 트리밍 하여이를 얻을 수 있습니다 . 명령 대체를 사용하여 장치 이름을에 지정하십시오 lsblk. lsblk의 일반 출력에는 필요하지 않지만 UUID에 액세스하려면 sudo가 필요합니다.

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"

2
이것은 sudo16.04에 없이 나를 위해 작동합니다 .
Eliah Kagan

사용자 (또는 일부 스크립트)가이 명령을 이전에 루트로 실행 한 경우에만 또한,이 경우 출력이 오래 될 수 있습니다 (캐시에서)
Dmitriusan

@Dmitriusan 나는 루트 가 lsblk없거나 blkid실행 되지 않은 14.04 시스템에서 이것을 실행했으며 완벽하게 작동했습니다. Rovo가 게시 한 버전이 아니라이 명령에 캐싱 문제가 발생하는 이유를 알고 있습니까? 원시 출력이 어떤 식 으로든 캐싱을 우회합니까?
Arronical

장치의 UUID에 액세스하는 모든 명령에는 루트 액세스 (Rovo가 게시 한 버전 포함)가 필요하다고 생각합니다. lsblk와 관련하여 관련 질문 unix.stackexchange.com/questions/210889/… (첫 번째 답변 참조)
Dmitriusan

sudo가 필요하다는 것에 동의하지만 lsblk가 캐싱에 의존한다는 것을 제안 할 수있는 것은 없습니다. blkid루트로 실행하더라도 에서 캐시 파일을 만들 때 /dev/.blkid.tab, sudo를 사용 lsblk하지 않으면 UUID 열에서 아무것도 표시되지 않습니다. 오래된 출력의 위험이 있다고 생각하지 않습니다.
Arronical

4

내가 생각해 낸 가장 좋은 해결책은

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

최적이 아닌 것처럼 느껴지지만 작동합니다.

참고 : [[: space :]]는Space


이것은 나를 위해 작동하지만와 함께 작동합니다 sudo.
pa4080

4

mountpoint해당 파일 시스템의 현재 마운트 지점에 대한 값을 조정하십시오 .

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'

1

내가 사용하는 것은 다음과 같습니다.

sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

tune2fs는 e2fsprogs 패키지에 있으며 기본적으로 설치되어 있는지 기억할 수 없습니다.

sudo apt install e2fsprogs

설치되어 있지 않은 경우.


내가 얻을 awk: not an option: -e나는 그것이 작동 할 수 있도록하는 답변을 편집했다. 내가 너무 밟았다면 자유롭게 돌려주십시오. 건배! :-)
Geek

이상한, 그것은 나를 위해 -e와 함께 또는없이 작동하는 것 같습니다. -e는 awk에 대한 매뉴얼 페이지에 문서화되어 있습니다. 나는 항상 스크립트에서 그것을 사용했고 그것이없이 잘 작동한다는 것에 놀랐다. :-나는 오래된 유닉스 습관이라고 생각한다. 그러나, 나는 사람들의 혼란을 피하기 위해 어느 곳에서나 어느 곳에서나 일관되게 사용하고 -e를 사용해야했습니다.
John

아, 나는 14.04에서와 동일한 결과를 얻는다 gawk. mawk대신 사용하는 것처럼 보이는 16.04에 지정된 오류가 발생합니다 .
Geek

그것은 / etc / alternatives 것들 중 하나입니다. 내 16.04에서 나를 위해 / etc / alternatives / awk-> / usr / bin / gawk. Mawk가 설치되었지만 / etc / alternatives에서 활성화되지 않았습니다. 내 17.04 그놈에서 그것은 awk를 가리 킵니다. 내 새로운 설치 17.10에서는 mawk입니다. gawk를 설치 한 후 링크가 gawk를 가리키면 gawk를 제거하면 mawk로 돌아갑니다.
John

:-) "더 적은 것이 더
Geek

1

14.04 및 16.04에서 작동하도록 테스트되었습니다.

항상 루트의 UUID를 생산해야하는 간단한 한 줄이 /있다

export DRIVE = $ ( " '{print $ 1}'의 grep '/'| awk -F"); blkid $ DRIVE | 컷 -d ' "'-f2`

우리가 여기서하는 일은 경로 확장 기호로 사용될 /때 일치하지 않도록 루트 기호를 양쪽의 공백과 일치시키기 위해 마운트의 출력을 grepping하는 것입니다. 장치 이름과 THAT를 환경 변수 $ DRIVE에 할당 한 다음 필드 구분 기호로 사용하여 파이프 스루 컷 의 출력을 사용하고 다른 모든 항목을 제거하는 두 번째 필드 만 선택하면 UUID 만 남습니다./awkblkid $DRIVE"

참고 위의 명령에서 GREP은 '실제로 이후에 소속 된 것을 space/ space'가 아닌 '/'이 나타나는한다.

이는 필요하지 않은 이점이 있으며 sudo드라이브 장착 방법에 관계없이 적절한 결과를 반환합니다.

변수를 사용하지 않는 경우이 방법을 시도하기 전에 $ DRIVE 환경 변수를 echo $DRIVE사용하지 않는 것이 빈 줄을 반환하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.