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


16

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、気の利いたスクリプティングで気になるパーティションを引き出してから、scripttですでに行っているように解析します

これを行うより良い、より簡単な方法はありますか?私はすでに興味のあるパーティションを持っているので、それらのファイルシステムを見つけるだけで十分です(利用可能なスワップを見つけます)。


3
@Mikelいいえ、その質問はマウントされたファイルシステムを見ます。あなたはファイルシステムをマウントすることができますが、それはのは、スワップのための作業は、唯一の実行中のカーネルでサポートされているファイルシステムのために働くしません、これは強力な、遅くはない、と...マウントタイプか見て
ジル「SO-ストップが悪さ」

回答:


16

私は答えを見つけたと思います: 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!'

それからちょうどcutまたはawkあなたが必要なものを得るために。


11
blkidには、あなたが自分自身で必要なものをフィルタリングすることはできません- SED / grepを/ awkの魔法は必要:blkid -s TYPE -o value /dev/sda3
ペトルUzel

@PetrUzel-素晴らしい!それがまさに私が探していたものです!
beatgammit

2
sudoルートでない場合は忘れずに実行してください!これも私を捕まえblkid、ステータスコード0ですべてのエラーメッセージと終了を印刷しない場合はそれができていないアクセスブロックデバイス...
Asfand Qazi

パイプへの必要性はめったにありませんgrepとはsedgrep foo | sed 's/pattern/repl/'よりきれいに書かれていますsed '/foo/s/pattern/repl/'
ウィリアムパーセル

9

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ではそうです。


スクリプトからファイルシステムのタイプを確実に除外する方法はありますか?
beatgammit

ファイルシステムのフルネームが十分にフィルタリングされていると考えているかどうかに依存します| cut -d: -f2 | cut -d( -f1。ほどきれいでblkidはないのは確かです。:)
ティムケネディ

2

ブロックデバイスのTYPEタグのみを表示し、その値のみを出力します。

blkid -s TYPE -o value "$device"

例:

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

0

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

スクリプトを作成して、次のようなファイルシステムタイプのみを返します。

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.