BashスクリプトでBTRFSルートサブボリュームのサブボリュームIDと名前を取得する

BashスクリプトでBTRFSルートサブボリュームのサブボリュームIDと名前を取得する

私はArchLinuxをインストールし、適切なインストールのためにシステムを自動的に設定する複雑なArchLinuxスクリプトを設計しています。スクリプトはサブボリュームとしてBTRFSをマウントし、問題のSystemdBootを構成できます。

デフォルトでは、スクリプトがSystemdBootを正しく構成するには、ルートサブボリュームのIDと名前を取得できるスクリプトが必要です。

この情報を取得するには、どのコマンドが必要かを既に知っていますbtrfs su li /。ただし、ルートサブボリュームの値を取得して変数として保存し、スクリプトをこの行RootSubvolIDRootSubvolNameそれぞれ使用できます。

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

おすすめ記事