在 bash 脚本中检索 BTRFS 根子卷的子卷 ID 和名称

在 bash 脚本中检索 BTRFS 根子卷的子卷 ID 和名称

我正在设计一个复杂的 ArchLinux 脚本,它将安装 ArchLinux 并自动配置系统以进行正确安装。该脚本可以安装带有子卷的BTRFS并配置SystemdBoot,这就是问题所在。

基本上,我需要脚本能够检索根子卷的 ID 和名称,以便脚本正确配置 SystemdBoot。

我已经知道需要什么命令来获取此信息,即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序列。

相关内容