该脚本创建了十个图像文件并将文件复制到其中。
#!/bin/bash
# script to create multiple floppy images for installing hwp30
#+on virtualbox.
# umount image in case mounted
sudo umount /media/floppy
# create ten blank 2.88mb images.
#+then mount each image and copy over file(s).
for n in {1..10}; do
mkfs.msdos -C "hwp30-${n}.img" 2880
sudo mount -o loop "hwp30-${n}.img" /media/floppy
sudo cp -v "../DISK${n}" /media/floppy
# if first disk then copy over INSTALL.EXE
if [[ $n -eq 1 ]]; then
sudo cp -v ../INSTALL* /media/floppy
fi
sudo umount /media/floppy
done
# done?
if [[ $? -eq 0 ]]; then
echo "done!"
fi
当我运行此脚本时,挂载、复制文件和卸载不同步;它们没有按照正确的顺序完成。卸载时几次显示“设备正忙”。
脚本完成后,我需要执行umount
几次命令来卸载它们(即使是相同的挂载点?)。
我认为这叫做竞争条件。 怎么修?
答案1
问题可能是,即使复制已完成,仍然有从缓存到已安装映像的 IO 正在进行。
sync; sync
在该行之前添加sudo umount /media/floppy
.. 这将请求刷新未写入的数据 - 并等待它发生。