Command-Line
從腳本中查找未掛載分區的文件系統
我正在使用 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!'
然後只是
cut
或awk
得到你需要的東西。