[PATCH] dracut: add anaconda-pre-shutdown.sh to fix eject (#809920)

Will Woods wwoods at redhat.com
Fri Feb 22 23:26:30 UTC 2013


So it turns out that having the device that contains the runtime image
mounted *underneath* the runtime image means we have a mount loop, e.g.:

   The DVD can't be unmounted because it holds the image for /
   / can't be unmounted because the DVD is mounted underneath it

To fix this, we move the repo mount(s) back out from under the runtime
image during dracut's pre-shutdown hook (new in dracut 025).
---
 anaconda.spec.in                |  2 +-
 dracut/Makefile.am              |  3 ++-
 dracut/anaconda-pre-shutdown.sh | 20 ++++++++++++++++++++
 dracut/module-setup.sh          |  1 +
 4 files changed, 24 insertions(+), 2 deletions(-)
 create mode 100644 dracut/anaconda-pre-shutdown.sh

diff --git a/anaconda.spec.in b/anaconda.spec.in
index 85585f0..57a4c7c 100644
--- a/anaconda.spec.in
+++ b/anaconda.spec.in
@@ -34,7 +34,7 @@ Source0: %{name}-%{version}.tar.bz2
 %define firewalldver 0.2.9-1
 %define pythonurlgrabberver 3.9.1-5
 %define utillinuxver 2.15.1
-%define dracutver 024-16
+%define dracutver 025
 
 BuildRequires: audit-libs-devel
 BuildRequires: gettext >= %{gettextver}
diff --git a/dracut/Makefile.am b/dracut/Makefile.am
index 7646e23..53a30cb 100644
--- a/dracut/Makefile.am
+++ b/dracut/Makefile.am
@@ -39,7 +39,8 @@ dist_dracut_SCRIPTS = module-setup.sh \
 		      fetch-updates-disk \
 		      parse-kickstart \
 		      anaconda-modprobe.sh \
-		      save-initramfs.sh
+		      save-initramfs.sh \
+		      anaconda-pre-shutdown.sh
 
 
 MAINTAINERCLEANFILES = Makefile.in
diff --git a/dracut/anaconda-pre-shutdown.sh b/dracut/anaconda-pre-shutdown.sh
new file mode 100644
index 0000000..78f9f06
--- /dev/null
+++ b/dracut/anaconda-pre-shutdown.sh
@@ -0,0 +1,20 @@
+# Fix mount loops that prevent unmount/eject.
+#
+# During startup, we mount our repo (e.g. the DVD) at $repodir or $isodir.
+# We then mount the runtime image from that repo at /newroot and switch into it.
+# Switching moves $repodir to /newroot/$repodir, which creates a mount loop:
+#
+# -> You can't unmount the runtime image because the DVD is mounted under it
+# -> You can't unmount the DVD because it holds the mounted runtime image
+#
+# And now you can't unmount or eject the DVD!
+#
+# We fix this by moving the repo mounts back out from under the runtime image
+# during shutdown. Then everything can be unmounted like normal.
+
+. /lib/anaconda-lib.sh
+
+for mnt in $repodir $isodir; do
+    oldmnt=/oldroot$mnt
+    grep -qw $oldmnt /proc/mounts && mount --move $oldmnt $mnt
+done
diff --git a/dracut/module-setup.sh b/dracut/module-setup.sh
index b9997f8..bc917e5 100755
--- a/dracut/module-setup.sh
+++ b/dracut/module-setup.sh
@@ -34,6 +34,7 @@ install() {
     inst_hook pre-pivot 50 "$moddir/anaconda-copy-ks.sh"
     inst_hook pre-pivot 50 "$moddir/anaconda-copy-cmdline.sh"
     inst_hook pre-pivot 99 "$moddir/save-initramfs.sh"
+    inst_hook pre-shutdown 50 "$moddir/anaconda-pre-shutdown.sh"
     # kickstart parsing, WOOOO
     inst_hook initqueue/online 10 "$moddir/fetch-kickstart-net.sh"
     inst "$moddir/fetch-kickstart-disk" "/sbin/fetch-kickstart-disk"
-- 
1.8.1.2



More information about the anaconda-patches mailing list