디스크 이미지를 처리하기 위해 일부 쉘 스크립트를 작성 중이며 루프 장치를 사용하여 일부 디스크 이미지에 액세스해야합니다. 그러나 프로그램을 경쟁 조건에 노출시키지 않고 루프 장치를 올바르게 할당하는 방법을 잘 모르겠습니다.
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)
.
</dev/tty
?