Esse é um problema clássico de simultaneidade: ao alocar um recurso, você precisa determinar atomicamente que o recurso é gratuito e reservá-lo, caso contrário, outro processo poderia reservar o recurso entre a hora em que você verifica se está livre e a hora da reserva isso.
Use o modo de alocação automática de losetup
( -f
) e passe a opção --show
para que imprima o caminho do dispositivo de loop.
ld=$(sudo losetup --show -f /tmp/1m)
Esta opção está presente no util-linux desde a versão 2.13 ( inicialmente adicionada como -s
, mas o --show
foi suportado em todas as versões lançadas e as versões recentes eliminaram o nome da opção -s
). Infelizmente a versão do BusyBox não tem isso.
Versão 3.1 do kernel do Linux introduzido um método para executar a operação de alocação de dispositivos de loop diretamente no kernel, através do novo dispositivo /dev/loop-control
. Este método só é suportado desde o util-linux 2.21. Com o kernel < 3.1 ou util-linux < 2.21, o programa losetup
enumera as entradas do dispositivo de loop para reservar uma. Eu não posso ver uma condição de corrida no código embora; ele deve ser seguro, mas pode ter uma pequena janela durante a qual ele informará incorretamente que todos os dispositivos estão alocados, mesmo que isso não ocorra.