Bash
在 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
如果您可以保證子卷的名稱不會以空格開頭並且不會包含換行符,您可以這樣做:
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
序列。