Скрипт %_initdir/halt размонтирует loop-устройства, но не освобождает задействованые /dev/loop* устройствами файлы. При том, что loop-устройства не обязательно были смонтированны (например, использовались как swap). Таким образом, на этапе перемонтирования файловой системы, на которой эти файлы находятся, в ro происходит ошибка и система выключается с файловой системой (в том числе и /) всё ещё смонтированной в rw.
Мож патчик нарисуешь?
Актуально для загрузки через sysvinit: в startup 0.9.9.17-alt1 скрипт halt размонтирует loop-файловые системы, но losetup не вызывает вовсе, поэтому loop-устройства с ещё занятыми файлами (например swap-файл) мешают перемонтировать их раздел в ro. Патч добавляет отцепление незанятых loop-устройств перед remount,ro (занятые останутся, `losetup -D` их не трогает): --- a/rc.d/init.d/halt +++ b/rc.d/init.d/halt @@ -185,6 +185,12 @@ $cryptdisks_early_exe stop fi +# Detach loop devices that are no longer in use: their backing files may +# live on a filesystem which is about to be remounted read-only, and a +# still attached loop device (a swap file, for example) makes that fail. +[ ! -x /sbin/losetup ] || + action 'Detaching loop devices:' /sbin/losetup -D ||: + # Unmount and remount read-only anything that's left mounted. action 'Remounting remaining filesystems (if any) read-only:' \ umount -afnr -t noproc,nosysfs,notmpfs,nodevfs,nodevtmpfs,nousbfs,norpc_pipefs,nonfsd Под systemd этим занимается systemd-shutdown, скрипт halt в выключении не участвует. Прогнать halt на живой машине не могу — патч примерный; проверены синтаксис (bash -n) и поведение `losetup -D` при отсутствии устройств (rc=0).