スクリプトからマウントされていないパーティションのファイルシステムを見つける

スクリプトからマウントされていないパーティションのファイルシステムを見つける

私は AIF (Arch Installation Framework) を使用してカスタム自動インストールを作成しており、パーティションを指定してパーティション上のファイルシステムを見つける必要があります。

これまでのところ、私はこれを持っています:

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}
}

これは、ハード ドライブが 1 つしかないマシンでは正常に動作しましたが、LiveCD で実行されている VM で実行すると (当然ですが) 失敗しました (LiveCD は別のドライブ /dev/sr0 として取得されていました)。

試すことができるハックをいくつか考えました:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • を使用しますparted -mlsが、巧妙なスクリプトを使用して、関心のあるパーティションを抽出し、スクリプトで既に行っているように解析します。

これを行うための、より優れた、より簡単な方法はありますか? 関心のあるパーティションはすでにあるので、それらのファイルシステム (および使用可能なスワップ) を見つけるだけです。

答え1

答えを見つけたと思います:blkid

man ページから:

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

答え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

多くのファイルシステムで動作し、構造が破損したファイルシステムでも動作するという利点を持つ 2 番目のオプションは です。( Debian ベースのシステムでは を実行してインストールtestdiskできます。)sudo apt install testdisk

次のようにファイルシステムの種類だけを返すようにスクリプトを作成します。

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

関連情報