web-dev-qa-db-ja.com

特定のデバイスが常に同じデバイスファイルを使用するようにするにはどうすればよいですか?

UUID経由でハードドライブをマウントし、デバイスファイル経由で別のハードドライブをマウントする場合、最初のハードドライブが常に/ dev/sdaXで2番目の/ dev/sdbXであり、その逆ではないことを確認するにはどうすればよいですか?

私がやろうとしていることのいくつかの説明:私はRaspberry Piゼロ、USBハブ、外付けハードドライブ、およびsdカード(すべてパワーバンクから電力を供給されています)を接続しています。次に、ラズベリーの電源を入れると、外付けハードドライブのSDカードのバックアップが自動的に作成されます。
簡略化されたfstabは次のようになります。

...
uuid=123123   /mnt/exthd   ntfs   rw,... 0 0
/dev/sdb1     /mnt/sdcard  vfat   ro,... 0 0

カードをフォーマットするか、もちろん別のカードを使用すると変更されるため、UUIDを介してSDカードをマウントできません。

質問は、外付けドライブが常に/ dev/sda1を使用してマウントされていることを確認できますか?

または、たとえばlsblkの出力を解析し、サイズが小さいデバイスを調べて、このデバイスファイルを使用する必要がありますか?

ラズベリーなどからのフィードバックはありませんのでご注意ください。私は確認する必要があります、これは常に機能します。そして、必要に応じて、自分で構文解析を行うことができると思います。問題は、私がそれに対処しなければならないのか、それとももっと簡単な方法があるのか​​ということだけです。

3
fancyPants

devpath属性がUSBポートで一定であることに気づきました。新しいudevルールを追加し、デバイスが接続されているポートに基づいて特定のシンボリックリンクを作成できます。 /etc/udev/rules.dディレクトリに次のような新しいファイルを追加するだけです。

#new symlink for my front USB port:
KERNELS=="2-1.8", SUBSYSTEMS=="usb", ATTRS{devpath}=="1.8", SYMLINK+="usb_port1"

名前が.rulesで終わっていることを確認してください。例: port1.rules。今後は、/dev/usb_port1を使用してfstabエントリを作成できます。これは、その特定のポートに接続されているデバイスが/dev/のシンボリックリンクの下に一覧表示されるためです。 SDカードも同じで、落ち着くはずです。

何が起こっているのかというと、特定のポート(==パーツ)の一意のプロパティをチェックし、これらが一致したら、+=に新しいシンボリックリンクを追加(/dev/)します。

照合する属性に関する情報は、udevadm info -a /dev/sdb1(デバイスの場合はsdb1)を介して取得できます。必ず1つの親デバイスブロックからのみ属性を取得し、それが一意のdevpathおよびKERNELSエントリを持つものにする必要があります。可能な場合はいくつかのUSBポートを試して、どのポートが変更されるかを確認してください。

PS:udevは、デバイスを接続するときにスクリプトを実行することもできます。バックアップのニーズに役立つ場合があります。ただし、システムの起動がプラグインとしてカウントされるかどうかはわかりません。そのため、動作を確認する必要があります。

3
Fiximan

私はおそらくFiximanの答えを使用しますが、完全を期すために、サイズが小さく、まだマウントされていないデバイスをマウントするために、私が作成したスクリプトの例を次に示します。

#!/bin/bash

output=$(lsblk -b -I 8 -i | grep "^[\`|]-sd.1" | awk '{print substr($1,3), $4, $7}')

cursize=999999999999999

while read dev size mountpath; do
        echo $dev :: $size :: $mountpath
        if [[ $size -lt $cursize && -z $mountpath ]]
        then
                cursize=$size;
                dev2mount=$dev;
        fi
done <<< "$output"

echo to mount: $dev2mount of $cursize size
1
fancyPants