Command-Line

從腳本中查找未掛載分區的文件系統

  • May 8, 2021

我正在使用 AIF(Arch 安裝框架)編寫自定義自動安裝,我需要在給定分區的分區上找到文件系統。

到目前為止,我有這個:

grok_partitions () {
   local partitions=
   for label in `ls /dev/disk/by-label | grep "Arch"`
   do
       if [ $label == "Arch" ]
       then
           mount_point="/"
       else
           IFS="-" read base mount <<< "${label}"
           mount_point="/${mount}"
       fi

       local partition=$(readlink -f /dev/disk/by-label/${label})
       local part_no=$(echo ${partition} | grep -Po '\d+')
       local fs=$(parted -mls | grep "^${part_no}" | cut -d: -f5)
       partitions+="${partition} raw ${label} ${fs};yes;${mount_point};target;no_opts;${label};no_params\n"
   done

   # do the swap
   if [ -e /dev/disk/by-label/swap ]
   then
       local partition=$(readlink -f /dev/disk/by-label/swap)
       partitions+="$partition raw swap swap;yes;no_mountpoint;target;no_opts;swap;no_params"
   else
       # if there's no labeled swap, use the first one we find
       local partition=$(fdisk -l | grep -m1 swap | awk '{ print $1 }')
       if [ ! -e $partition ]
       then
           echo "No swap detected. Giving up."
           exit 1
       fi
       partitions+="$partition raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params"
   fi

   echo -n ${partitions}
}

這在我只有一個硬碟驅動器的機器上執行良好,但在我的執行在 LiveCD 上的 VM 中執行時(顯然)失敗了(LiveCD 被拾取為另一個驅動器,/dev/sr0)。

我想到了一些可以嘗試的技巧:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • 使用parted -mls,但用聰明的腳本提取我關心的分區,然後像我在腳本中所做的那樣解析

有沒有更好、更簡單的方法來做到這一點?我已經有了我感興趣的分區,我只需要找到它們的文件系統(以及找到可用的交換)。

我想我找到了答案:blkid

從手冊頁:

blkid 程序是使用 libblkid(3) 庫的命令行界面。它可以確定塊設備保存的內容類型(例如文件系統或交換),以及來自內容元數據(例如 LABEL 或 UUID 欄位)的屬性(令牌、NAME=值對)。

顯然,它會列印設備名稱以及文件系統類型(以及一些其他有用的資訊)。要獲取所有設備及其類型的列表:

blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

要查找所有/dev/sd*/設備,只需添加一個 grep:

blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

然後只是cutawk得到你需要的東西。

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