一部のディスクイメージ操作を処理するためにいくつかのシェルスクリプトを作成しており、一部のディスクイメージにアクセスするにはループデバイスを使用する必要があります。しかし、私のプログラムを競合状態にさらさずにループデバイスを正しく割り当てる方法はわかりません。
losetup -f
割り当てられていない次のループデバイスをインポートし、次のようにそのループデバイスを割り当てるために使用できることを知っています。
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
しかし、これはプログラムの複数のインスタンスを同時に実行しようとしている状況で発生する競合状態の教科書の例なので、面倒です。このプログラムの複数のインスタンスを実行したり、他のプログラムもループデバイスを取得しようとすると、各プロセスは次の呼び出し前にループデバイスを割り当てることができませんlosetup -f
。この場合、両方のプロセスが同じループデバイスを使用できると思います。しかし、一人だけを得ることができます。
これには外部同期を使用できますが、可能であれば追加の複雑さを避けたいと思います。さらに、ループデバイスを使用する他のプログラムは、私が提案する同期を尊重しません。
これらの潜在的な競争状態をどのように防ぐことができますか?理想的には、次のコマンドを使用してループデバイスを自動的に検索してバインドできることを願っています。
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
ただし、これを行うと、$ld
ループデバイスパスが割り当てられず、外に移動すると権限エラーがsudo
発生します。sudo ld=$(losetup -f myfile.img)
ベストアンサー1
これは並行性の典型的な問題です。リソースを割り当てるときは、リソースが利用可能であることを自動的に確認してスケジュールする必要があります。そうしないと、リソースが利用可能であることを確認する時点と予約している時点との間で他のプロセスがリソースを予約できます。それ。
losetup
自動割り当てモード(-f
)を使用して--show
オプションを渡してループデバイスパスを印刷します。
ld=$(sudo losetup --show -f /tmp/1m)
このオプションはバージョン2.13(もともと次のように追加されました。-s
ただし、リリースされたすべてのバージョンでサポートされており、最新バージョンではオプション名が--show
削除されました。-s
残念ながら、BusyBoxバージョンにはこの機能はありません。
Linuxカーネルバージョン3.1紹介する新しいデバイスを介してカーネルから直接ラウンドロビンデバイス割り当てタスクを実行する方法/dev/loop-control
。このメソッドはutil-linux 2.21からのみサポートされています。 kernel <3.1またはutil-linux <2.21の場合、プログラムはlosetup
ループデバイスエントリを列挙して1つを予約します。ただし、コードに競合状態は表示されません。安全でなければなりませんが、そうでない場合でも、すべてのデバイスが割り当てられたと誤って報告する小さなウィンドウがある可能性があります。