私は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
シーケンスとして表示できます。