私はいくつかのディスクイメージを処理するためにいくつかのシェルスクリプトを書いており、いくつかのディスクイメージにアクセスするにはループデバイスを使用する必要があります。ただし、プログラムを競合状態にさらさずにループデバイスを適切に割り当てる方法がわかりません。
私losetup -f
は次の未割り当てのループデバイスを取得し、そのループデバイスを次のように割り当てるために使用できることを知っています。
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
しかし、プログラムの複数のインスタンスを同時に実行したい場合、これはほぼ競合状態の教科書の例であり、それは私をかなり悩ませます。このプログラムの複数のインスタンスを実行している場合、または他のプログラムもループデバイスを取得しようとしている場合、各プロセスは次の呼び出しの前にループデバイスを割り当てることができないlosetup -f
場合があります。その場合、両方のプロセスが同じループであると見なします。デバイスは利用可能ですが、入手できるのは1つだけです。
これに外部同期を使用することもできますが、(可能な場合は)追加の複雑さを避けたいです。また、ループデバイスを使用する他のプログラムは、思いついた同期を尊重しない可能性があります。
この潜在的な競合状態を回避するにはどうすればよいですか?理想的には、たとえば次のようなコマンドを使用して、ループデバイスをアトミックに検出およびバインドできるようにしたいと考えています。
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
ただし、それを行うと、$ld
ループデバイスパスに割り当てられず、sudo
アウトを移動すると、sudo ld=$(losetup -f myfile.img)
アクセス許可エラーが発生します。
</dev/tty
ため?