從腳本中尋找已卸載分區的檔案系統

從腳本中尋找已卸載分區的檔案系統

我正在使用 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 上運行的虛擬機中運行時(LiveCD 被選為另一個驅動器 /dev/sr0),它就失敗了(顯然)。

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

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

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

答案1

我想我找到了答案: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得到你需要的東西。

答案2

file -s /path/to/device將識別磁碟/分割區/切片上的檔案系統。

啦啦:

[root@node2 ~]# file -s /dev/mapper/VolGroup00-LogVol00
/dev/mapper/VolGroup00-LogVol00: Linux rev 1.0 ext3 filesystem data (needs journa recovery) (large files)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv1 
/dev/mapper/coraid--pool-coraid--lv1: Linux GFS2 Filesystem (blocksize 4096, lockproto lock_dlm)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv2 
/dev/mapper/coraid--pool-coraid--lv2: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

至少在 Linux 上是這樣。

答案3

僅顯示區塊設備的 TYPE 標記,並僅輸出其值:

blkid -s TYPE -o value "$device"

例子:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs

答案4

可以與許多檔案系統一起使用並且具有甚至可以與結構損壞的檔案系統一起使用的優點的第二個選項是testdisk。 (您可以sudo apt install testdisk在基於 Debian 的系統上運行安裝它。)

編寫腳本以僅傳回檔案系統類型,如下所示:

$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'

相關內容