パーティションラベルが既知の場合は、デバイス名とマウントポイントを取得します。

パーティションラベルが既知の場合は、デバイス名とマウントポイントを取得します。

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

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

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好ましい方法だとは思わない。

他の大学

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

blkidLinuxではうまく機能しますが、SolarisやFreeBSDでは使用できません(少なくともインストールされるとは期待できません)。同じだ findfs

Linux、Solaris、FreeBSDでデバイス名を移植可能にする方法は?

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

幸いなことに、df -Pこれはテストされたすべてのシステムで非常によく似た結果を生み出します。問題は、私の醜いスクリプトが移植性がないようです(Sunをawk使用してSolarisとFreeBSDでawkテスト)。好ましい方法は何ですか?gawkawk

関連質問

uuidを使ってフラッシュドライブのマウントポイントを取得するには? 問題:/proc/mountsLinuxでも解析は移植性がなく面倒です。解析がmount悪いようです。 Perlは通常使用できません。

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

一般化する

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

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

答え1

次の手順を実行できます。

  1. devname使い始めるblkid_dev_devname(...)
  2. 以下を使用してprobこのパーティションをインポートします。blkid_new_probe_from_filename(...)
  3. setmntent(...)、、getmntent(...)&を使ってマウントポイントをコピーendmntent(...)してください!mnt->mnt_fsnamedevnamemnt->mnt_dir

詳細については、次の参考資料を参照してください。

コンテンツデータ構造

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

関連情報