저는 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
시퀀스로 표시될 수 있습니다.