Bash 스크립트에서 BTRFS 루트 하위 볼륨의 하위 볼륨 ID 및 이름 검색

Bash 스크립트에서 BTRFS 루트 하위 볼륨의 하위 볼륨 ID 및 이름 검색

저는 ArchLinux를 설치하고 적절한 설치를 위해 시스템을 자동으로 구성하는 복잡한 ArchLinux 스크립트를 설계하고 있습니다. 스크립트는 하위 볼륨으로 BTRFS를 마운트하고 문제인 SystemdBoot를 구성할 수 있습니다.

기본적으로 스크립트가 SystemdBoot를 올바르게 구성하려면 루트 하위 볼륨의 ID와 이름을 검색할 수 있는 스크립트가 필요합니다.

이 정보를 얻으려면 어떤 명령이 필요한지 이미 알고 있습니다 btrfs su li /. 그러나 루트 하위 볼륨의 값을 검색하여 변수로 저장하고 RootSubvolID이를 RootSubvolName스크립트의 이 줄에 각각 사용할 수 있습니다.

if [ "$use_btrfs" = "yes" ]; then
   root_flags="${root_flags} rootflags=subvolid=[RootSubvolID],subvol=[RootSubvolName]"
fi

답변1

하위 볼륨의 이름이 공백으로 시작하지 않고 개행 문자를 포함하지 않는다는 것을 보장할 수 있는 경우 다음을 수행할 수 있습니다.

if 
  name=$(
    LC_ALL=C btrfs sub show / |
      LC_ALL=C grep -aPom1 '^\s*Name:\s*\K\S.*'
  ) &&
    id=$(
      LC_ALL=C btrfs sub show / |
        LC_ALL=C grep -aPom1 '^\s*Subvolume ID:\s*\K\d+$'
    )
then
  do-something-with "$name" and "$id"
else
  echo >&2 "Can't determine name and/or id"
fi

하위 볼륨 ID의 경우 다음을 사용할 수도 있습니다.

id=$(btrfs inspect-internal rootid /)

이는 특이한 하위 볼륨 이름이 있는 경우 더 안정적일 수 있습니다.

또는 이름에 ,문자가 없다고 가정하고 마운트 테이블에서 정보를 얻을 수 있습니다.

IFS=,
set -o noglob
for o in $(findmnt -no options -M /)
  case $o in
    subvolid=*) id=${o#*=};;
    subvol=*) name=${o#*=};;
  esac
done

이름의 일부 문자는 \xHH시퀀스로 표시될 수 있습니다.

관련 정보