Saya menulis beberapa skrip shell untuk menangani beberapa hal gambar disk, dan saya perlu menggunakan perangkat loop untuk mengakses beberapa gambar disk. Namun, saya tidak yakin bagaimana cara mengalokasikan perangkat loop dengan benar tanpa memaparkan program saya ke kondisi balapan.
Saya tahu bahwa saya dapat menggunakan losetup -f
untuk mendapatkan perangkat loop yang tidak teralokasi berikutnya, dan kemudian mengalokasikan perangkat loop seperti ini:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Namun, dalam kasus di mana saya ingin menjalankan beberapa contoh program pada saat yang sama, ini hampir merupakan contoh buku teks dari kondisi lomba, dan itu cukup mengganggu saya. Jika saya memiliki beberapa instance dari program ini berjalan, atau program lain yang mencoba juga mendapatkan perangkat loop, maka setiap proses mungkin tidak dapat mengalokasikan perangkat loop sebelum panggilan berikutnya losetup -f
, dalam hal ini kedua proses akan berpikir bahwa loop yang sama perangkat tersedia, tetapi hanya satu yang bisa mendapatkannya.
Saya dapat menggunakan sinkronisasi eksternal untuk ini, tetapi saya ingin (jika mungkin) menghindari kompleksitas tambahan. Selain itu, program lain yang menggunakan perangkat loop sepertinya tidak akan menghargai sinkronisasi apa pun yang mungkin saya buat.
Bagaimana saya bisa menghindari kondisi lomba potensial ini? Idealnya, saya ingin dapat menemukan dan mengikat perangkat loop secara atom, misalnya dengan perintah seperti:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Namun, ketika saya melakukan itu, $ld
tidak mendapatkan ditugaskan ke jalur perangkat loop, dan pindah sudo
keluar, karena sudo ld=$(losetup -f myfile.img)
memberikan kesalahan izin.
sumber
</dev/tty
?losetup --find --show
balapan.for i in {1..100}; do losetup -f -s $i & done
tidak memberi saya 100 perangkat loop. Perangkat loop tidak cukup umum untuk itu tidak menjadi masalah secara normal; jika itu satu-satunya pilihan Anda adalah membuat kunci Anda sendiri dan / atau memeriksa apakah perangkat loop yang benar dibuat sebagai renungan.losetup
mungkin gagal (misalnya karena Anda kehabisan entri loop), tetapi jika melaporkan nama perangkat, itu adalah perangkat yang berhasil dialokasikan. Apakah versi sebelumnya memiliki bug yang menyebabkannya menuliskan nama perangkat meskipun alokasi gagal? Saya melihat dalam kode sumber bahwa antarmuka untuk alokasi in-kernel hanya ada sejak kernel 3.1, apakah mungkin bug dengan antarmuka yang lebih lama yang memerlukanlosetup
utilitas untuk melakukan pencarian?/dev/loop14
dan semacamnya dan perangkat mungkin hilang sama sekali pada akhirnya. Mungkin perbaikannya adalah dari/dev/loop-control
, dulu hanya melihat/proc/partitions
...losetup
digunakan/dev/loop-control
jika ada, dan itu sepertinya tidak memiliki kondisi ras: alokasi yang terjadi di kernel dan mencetak jalur perangkat adalah hal terakhir yang dilakukan utilitas.Saya menemukan jawabannya. Meskipun saya tidak yakin bagaimana masalah dengan izinnya, saya bisa memotret terlebih dahulu dan bertanya kemudian seperti ini:
sumber
Anda bisa menggunakan
flock
:Idenya di sini adalah bahwa Anda mencoba dan
flock
file perangkat loop; jika instance lain dari skrip yang sama mendapatkannya terlebih dahulu, ia akan memanggillosetup $ld myfile.img
danflock
akan mengembalikan 0. Untuk skrip yang kehilangan balapan,losetup
tidak akan dipanggil danflock
akan mengembalikan 1, menyebabkan loop berulang.Untuk lebih banyak lihat
man flock
.sumber
Jika semua yang ingin Anda lakukan dengan gambar sebagai perangkat loopback adalah me-mount-nya sebagai sistem file dan bekerja dengan konten,
mount
perintah ini dapat menangani hal ini secara otomatis.sumber