web-dev-qa-db-ja.com

パーティションラベルがわかっている場合は、デバイス名とマウントポイントを取得します

ファイルシステムのラベルがわかっている場合、パーティションデバイス名とマウントポイントを取得するにはどうすればよいですか?

いくつかの可能性があります:

Linux

ファイルシステムラベルからデバイス名

デバイス名はblkidで取得できます。

blkid -l -o device -t LABEL="$label" -c /dev/null

マウントポイントへのデバイス名

blkidでマウントポイントを取得しようとしましたが、失敗しました。 -sスイッチを使用すると、ラベルが提供されているときに他のすべてのフィールドを照会できます。

blkid -l -t LABEL="$label" -o value -s LABEL      # yields label
blkid -l -t LABEL="$label" -o value -s TYPE       # yields partition type
blkid -l -t LABEL="$label" -o value -s UUID       # yields UUID
blkid -l -t LABEL="$label" -o value -s MOUNTPOINT # yields nothing

マウントポイントの取得は明らかにサポートされていませんが、-o listオプションが指定されたときにリストされますが、簡単に解析できる方法ではありません。

blkid -o list -c /dev/null <device>

次の試みはdf -Pを使用することでした。デバイスが変数deviceに格納されていると仮定して、これが私が思いついたものです。

export device
mountpoint=$(df -P |
  awk --assign dev="$device" \
    '{if ($1==dev)             \
      {for (i=1; i<=NF-5; i++) \
        $i=$(i+5);             \
        NF-=5;                 \
        print                  \
      }                        \
    }')

このコードは機能します。ただし、醜いので、dfの解析が好ましい方法であるとは確信していません。

他のユニス

ファイルシステムラベルからデバイス名

blkidはLinuxで美しく動作しますが、SolarisまたはFreeBSDでは使用できません(少なくとも1つはインストールされることを期待できません)。同じことがfindfsにも当てはまります。

Linux、Solaris、FreeBSDでポータブルな方法でデバイス名を取得するにはどうすればよいですか?

マウントポイントへのデバイス名

幸い、df -Pは、テストされたすべてのシステムで非常に類似した出力を生成します。問題は、私の醜いawkスクリプトが移植可能ではないように見えることです(SolarisおよびFreeBSD awkでSungawkawkでテスト済み)。推奨される方法は何ですか?

関連する質問

idを使用してフラッシュドライブのマウントポイントを取得するにはどうすればよいですか? 問題:/proc/mountsの解析は移植性がなく、Linuxでも面倒です。 mountの解析はさらに悪いようです。 Perlは通常利用できません。

ディスクがマウントされている場所を確認するコマンドはありますか? 問題:バグのあるawkスクリプトで/proc/mountsを解析します。ソリューションは移植性がありません。

概要

ファイルシステムラベルがポータブルな方法で提供されている場合(POSIXシェルを想定)、デバイス名とマウントポイントを取得したいと思います。ディスクラベルには空白やその他の非ASCII文字が含まれている可能性があり、さらに複雑になっているようです。

         Label-To-Device    Device-To-Mount-Point
         ---------------    ---------------------
Linux           ✓                    ✓ (ugly)
Solaris         .                    .
FreeBSD         .                    .
6
Marco

次の手順に従って実行できます。

  1. blkid_dev_devname(...)を使用してdevnameを取得します
  2. blkid_new_probe_from_filename(...)を使用してこのパーティションのprobを取得します
  3. setmntent(...)getmntent(...)、およびendmntent(...)を使用します。ここで、mnt->mnt_fsnameはマウントポイントであるdevnameコピーmnt->mnt_dirと同じです。 !!

詳細については、これらのリファレンスを参照してください

mntentデータ構造

struct mntent {    
    char *mnt_fsname;   /* name of mounted file system */    
    char *mnt_dir;      /* file system path prefix */      
    ...
}; 
1
NTN