There is a syntax error in /etc/rc.d/init.d/halt that causes calls to losetup to fail. This occurs around line 141 in initscript-6.40: for dev in $remaining ; do losetup $dev > /dev/null 2>&1 && \ runcmd $"Detaching loopback device $dev: " losetup -d $device done The loop variable is 'dev', but the call to losetup uses '$device'. This results in a bad losetup command line, generating errors on the console and failing to unconfigure the loopback device. The solution: Replace $device with $dev.
An additional problem is that mounts using the loopback are not unmounted prior to the losetup commands. It supposed to happen on the line: runcmd $"Unmounting loopback filesystems: " umount $remaining In my case, /proc/mounts has something like: /dev/loop0 /mnt/disc1 iso9660 ... The awk line finds it and prints "/dev/loop0" but it needs to print the second column, "/mnt/disc1". Running the mount command says: cdimage.iso on /mnt/disc1 type iso9660 ... and umount wants one of those two, not /dev/loop0. This occurs when mounting with the "loop" option. Manually setting up a loop could be different. Maybe it's best to try unmounting via both 1st and 2nd entry in /proc/mounts.
The dev/devices confusion will be fixed in initscripts-6.51-1, thanks!