Bash

在 bash 腳本中檢索 BTRFS 根子卷的子卷 ID 和名稱

  • December 18, 2021

我正在設計一個複雜的 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

如果您可以保證子卷的名稱不會以空格開頭並且不會包含換行符,您可以這樣做:

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 /)

面對不尋常的 subvol 名稱,這可能更可靠。

或者,您可以從掛載表中獲取資訊,假設名稱不包含,字元:

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

請注意名稱中的某些字元可能表示為\xHH序列。

引用自:https://unix.stackexchange.com/questions/682950