2012-01-10 8 views
1

私は、特定のドライブがシステムに接続されているかどうかを判断するためのbashスクリプトを作成しています。データ(オフサイトに移動する必要のあるバックアップ)をそのドライブにコピーします。与えられたUUIDを持つドライブがマウントされているかどうかをbashで確認する

私は、ドライブ/パーティションをUUIDで識別して、ドライブの存在を頻繁にスキャンするスクリプトを作成できるようにしています。プラグインすると、rsync経由でデータをコピーします、その部分が1回以上実行されているかどうかは特に気にしません。後で実行するのはI/Oが安いからです)。私はこれをできるだけシンプルにして問題のドライブを技術者以外の人に渡し、「ここに接続してプラグを抜いて、それを取ってください」と言います。

/etc/fstabを介してグロッピングしても、実際にドライブがマウントされているかどうかはわかりません。mountのオプションは見つかりませんでした。

UUIDを指定すると、そのUUIDを持つドライブがマウントされているかどうか、マウントポイントは何ですか?

答えて

2

/dev/disk/by-uuid /は、添付ボリュームのシンボリックリンクファームです。ボリュームがマウントされているかどうかは分かりませんが、プラグインされているかどうかを知らせますので、とにかく特定のユースケースに対処するかもしれません。

$ ls -l /dev/disk/by-uuid/ 
total 0 
lrwxrwxrwx 1 root root 10 Nov 22 10:08 b928a862-6b3c-45a8-82fe-8f1db2863be3 -> ../../dm-0 
lrwxrwxrwx 1 root root 10 Dec 8 14:33 e37fab85-9b00-4d9b-b25e-0970d6eaa3fa -> ../../sdg1 

$ readlink /dev/disk/by-uuid/b928a862-6b3c-45a8-82fe-8f1db2863be3 
../../dm-0 

これは役に立ちますか?

+0

私は昨年同様の問題を解決し、http://ww.telentについてブログしました。net/2011/2/ – telent

+0

私は '/ dev/disk/by-uuid'について知っていましたが、それを助ける方法を見つけようとしていましたが、 。 –

+2

これはうまくいかないでしょう。マウントされていなくても、/ dev/disk/by-uuidに表示されます。これを実証するテストがあります: 'truncate --size = 2G ext_file; losetup -fv ext_file; mkfs.ext4/dev/loop0; blkid/dev/loop0; ls/dev/disk/by-uuid/' –

2
mount | grep $(readlink -f /dev/disk/by-uuid/$UUID) 
+1

私は 'readlink'が存在することを知りませんでした。 –

2

デバイスはシンボリックリンクでマウントできます。この場合、mountコマンドはシンボリックリンクを参照しますが、実際のパスで参照するか、別のシンボリックリンクを悪化させる可能性があります。

これは、複数のブロックデバイスファイルが1つのブロックデバイス(!)を指すことができるという事実によってさらに複雑になります。これは、mknodコマンドを使用して行うことができます。

この情報を正確に取得するには、/proc/mountsのすべてのエントリのメジャー番号とマイナー番号を、探しているUUIDのメジャー番号とマイナー番号と比較するしかありません。

ここにこれを行う関数/スクリプトがあります。

#!/bin/bash 

# $1:  should be a drive uuid, such as that reported by blkid 
# return: return value of 0 if mounted, 1 if not mounted 
function is_mounted_by_uuid() { 
    input_path=$(readlink -f /dev/disk/by-uuid/"$1") 
    input_maj_min=$(stat -c '%T %t' "$input_path") 

    cat /proc/mounts | cut -f-1 -d' ' | while read block_device; do 
     if [ -b "$block_device" ]; then 
      block_device_real=$(readlink -f "$block_device") 
      blkdev_maj_min=$(stat -c '%T %t' "$block_device_real") 

      if [ "$input_maj_min" == "$blkdev_maj_min" ]; then 
       return 255 
      fi 
     fi 
    done 

    if [ $? -eq 255 ]; then 
     return 0 
    else 
     return 1 
    fi 
} 

if is_mounted_by_uuid "$1"; then 
    echo $(readlink -f /dev/disk/by-uuid/$1) is mounted 
else 
    echo $(readlink -f /dev/disk/by-uuid/$1) is not mounted 
fi 
1

私はこれを行うために見つけた最高のは、UNIXファイルシステム、例えば上の工夫ブロックにUUIDを変換するために、blkidに使用することです

次に、grepによってmountコマンドの出力が表示されます。

:~# mount | grep $(blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0') 
/dev/sdb1 on /media/WD_Disk_1 type ext3 (rw,nosuid,nodev,uhelper=udisks) 

その後、希望のためにそれをgrepするには、完全なコマンドが

:~# mount | grep $(blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0') | grep '/media/WD_Disk_1 ' 
/dev/sdb1 on /media/WD_Disk_1 type ext3 (rw,nosuid,nodev,uhelper=udisks) 

私はif文にこれを入れて、ちょっといいと交換出力を非表示にしているポイント

grep -qs '/media/WD_Disk_1 ' 

をマウントメッセージ:-)

if mount | grep $(blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0') | grep '/media/WD_Disk_1 ' > /dev/null 2>&1; 
then 
    rsync -az --delete /mnt/data/ /media/WD_Disk_1/current_working_data/; 
    echo "sync complete" 
else 
    echo "couldn't find WD_Disk_1 filesystem" 
    exit 1 
fi 
関連する問題