{"id":589,"date":"2014-03-05T21:09:21","date_gmt":"2014-03-05T21:09:21","guid":{"rendered":"http:\/\/www.pasko.net\/wordpress\/?p=589"},"modified":"2014-03-05T21:09:21","modified_gmt":"2014-03-05T21:09:21","slug":"rhel6-livecd-creator-bug-fix","status":"publish","type":"post","link":"https:\/\/www.pasko.net\/wordpress\/2014\/03\/05\/rhel6-livecd-creator-bug-fix\/","title":{"rendered":"RHEL6 livecd-creator bug fix"},"content":{"rendered":"<p id=\"top\" \/>\n<h1><strong>Problem<\/strong><\/h1>\n<p>Running livecd-creator (livecd-tools-13.4.5-1.el6.x86_64 + python-imgcreate-13.4.5-1.el6.x86_64.rpm) leaves loopback mounts around after execution.<\/p>\n<h1><strong>Environment<\/strong><\/h1>\n<p>RedHat Enterprise Linux 6.5 running under Virtualbox 4.3<\/p>\n<pre><em>#<strong>\u00a0lsof | grep loop<\/strong>\n# \n# <strong>time livecd-creator -d -v --logfile=\/tmp\/livecd.debug.out -c \/a\/infoboot.ks -f \"INFO\"<\/strong>\n<\/em># ...\n#Inserting fragment md5sums into iso image...\n#fragmd5 = a1223c226ed416222a53519717949fd69cfef83f3bf48e8fe5f3d46d5686\n#frags = 20\n#Setting supported flag to 0\n# real\u00a0\u00a0 \u00a05m54.977s\n# user\u00a0\u00a0 \u00a05m14.839s\n# sys\u00a0\u00a0 \u00a01m32.820s<strong><\/strong><em><strong>\n\n# lsof | grep loop<\/strong><\/em>\n <em> loop0\u00a0\u00a0\u00a0\u00a0 10927\u00a0\u00a0\u00a0\u00a0\u00a0 root\u00a0 cwd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DIR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 8,3\u00a0\u00a0\u00a0\u00a0 4096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2 \/<\/em>\n <em> loop0\u00a0\u00a0\u00a0\u00a0 10927\u00a0\u00a0\u00a0\u00a0\u00a0 root\u00a0 rtd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DIR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 8,3\u00a0\u00a0\u00a0\u00a0 4096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2 \/<\/em>\n <em> loop0\u00a0\u00a0\u00a0\u00a0 10927\u00a0\u00a0\u00a0\u00a0\u00a0 root\u00a0 txt\u00a0\u00a0 unknown\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/proc\/10927\/exe<\/em><\/pre>\n<p>loopback turds are left around as the unmounts fail and lazy unmounts are tried, which never resolve themselves.<\/p>\n<p>This leaves a situation where only so many livecd-creators can be run before failing with &#8216;can&#8217;t get loop device&#8217;<\/p>\n<p>I coded a workaround as follows.<\/p>\n<p>\/usr\/lib\/python2.6\/site-packages\/imgcreate\/fs.py<\/p>\n<p>The entire modified fs.py file from livecd-tools-13.4.5-1.el6.x86_64.rpm lives <a title=\"Modfied fs.py from the livecd-tools rpm for RHEL 6.5 python-imgcreate-13.4.5-1.el6.x86_64.rpm\" href=\"http:\/\/www.pasko.net\/fs.py\" target=\"_blank\">here<\/a>.<\/p>\n<p>Diff of orig version and patched version<\/p>\n<pre>$ diff -c fs.py fs.py.ORIG\n*** fs.py\u00a0\u00a0 \u00a02014-03-07 09:41:35.000000000 -0700\n--- fs.py.ORIG\u00a0\u00a0 \u00a02014-03-05 15:22:30.000000000 -0700\n***************\n*** 27,33 ****\n\u00a0 import logging\n\u00a0 import tempfile\n\u00a0 import time\n- import re\n\n\u00a0 from imgcreate.errors import *\n\n--- 27,32 ----\n***************\n*** 112,147 ****\n\u00a0\u00a0\u00a0\u00a0\u00a0 def unmount(self):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if not self.mounted:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", self.dest])\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc == 0:\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"umount %s succeeded\", self.dest )\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Second attempt Unmounting directory %s\" % self.dest)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Calling fuser -ck on %s\" % self.dest)\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if re.match( \".*yum.*\", self.dest) == None: # We don't want to nuke everything associated with yum\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/sbin\/fuser\", '-ck', self.dest])\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"fuser -ck returned\u00a0 %s\" % rc )\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 time.sleep(2)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", self.dest])\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc == 0:\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Second umount succeeded\")\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"Unable to unmount %s normally, using lazy unmount\" % self.dest)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", \"-l\", self.dest])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc != 0:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 raise MountError(\"Unable to unmount fs at %s\" % self.dest)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"lazy umount succeeded on %s\" % self.dest)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print &gt;&gt; sys.stdout, \"lazy umount succeeded on %s\" % self.dest\n\n!\n\n\u00a0 class LoopbackMount:\n\u00a0\u00a0\u00a0\u00a0\u00a0 \"\"\"LoopbackMount\u00a0 compatibility layer for old API\"\"\"\n--- 111,128 ----\n\u00a0\u00a0\u00a0\u00a0\u00a0 def unmount(self):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if not self.mounted:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", self.dest])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc != 0:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"Unable to unmount %s normally, using lazy unmount\" % self.dest)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", \"-l\", self.dest])\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc != 0:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 raise MountError(\"Unable to unmount fs at %s\" % self.dest)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"lazy umount succeeded on %s\" % self.dest)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print &gt;&gt; sys.stdout, \"lazy umount succeeded on %s\" % self.dest\n\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n\n\u00a0 class LoopbackMount:\n\u00a0\u00a0\u00a0\u00a0\u00a0 \"\"\"LoopbackMount\u00a0 compatibility layer for old API\"\"\"\n***************\n*** 156,184 ****\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.diskmount.unmount()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 def lounsetup(self):\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if not self.losetup:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n!\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/sbin\/losetup\", \"-d\", self.loopdev])\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc == 0:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.losetup = False\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.loopdev = None\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info( \"First call to losetup remove Succeeded \" )\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Calling fuser -ck on %s\" % self.loopdev)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/sbin\/fuser\", '-ck', self.loopdev])\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"fuser -ck returned\u00a0 %s\" % rc )\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.loopdev = None\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.losetup = False\n-\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/sbin\/losetup\", \"-d\", self.loopdev])\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc != 0:\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Second call to losetup -d Failed for %s\", self.loopdev)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Second call to losetup -d Succeeded for %s \", self.loopdev)\n-\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 def loopsetup(self):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if self.losetup:\n--- 137,146 ----\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.diskmount.unmount()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 def lounsetup(self):\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if self.losetup:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/sbin\/losetup\", \"-d\", self.loopdev])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.losetup = False\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.loopdev = None\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 def loopsetup(self):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if self.losetup:\n***************\n*** 404,430 ****\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc == 0:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Second attempt Unmounting directory %s\" % self.mountdir)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Calling fuser -ck on %s\" % self.mountdir)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/sbin\/fuser\", '-ck', self.mountdir])\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"fuser -ck returned\u00a0 %s\" % rc )\n!\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 time.sleep(2)\n!\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", self.mountdir])\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc == 0:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.info(\"Second umount succeeded\")\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"Second Unmounting directory %s failed, using lazy umount\" % self.mountdir)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print &gt;&gt; sys.stdout, \"Second Unmounting directory %s failed, using lazy umount\" %self.mountdir\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", \"-l\", self.mountdir])\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc != 0:\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 raise MountError(\"Unable to unmount filesystem at %s\" % self.mountdir)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"lazy umount succeeded on %s\" % self.mountdir)\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print &gt;&gt; sys.stdout, \"lazy umount succeeded on %s\" % self.mountdir\n-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if self.rmdir and not self.mounted:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try:\n--- 366,380 ----\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc == 0:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"Unmounting directory %s failed, using lazy umount\" % self.mountdir)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print &gt;&gt; sys.stdout, \"Unmounting directory %s failed, using lazy umount\" %self.mountdir\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rc = subprocess.call([\"\/bin\/umount\", \"-l\", self.mountdir])\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if rc != 0:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 raise MountError(\"Unable to unmount filesystem at %s\" % self.mountdir)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 logging.debug(\"lazy umount succeeded on %s\" % self.mountdir)\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print &gt;&gt; sys.stdout, \"lazy umount succeeded on %s\" % self.mountdir\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.mounted = False\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if self.rmdir and not self.mounted:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try:\n\n<\/pre>\n<p>The entire modified fs.py file from livecd-tools-13.4.5-1.el6.x86_64.rpm lives <a title=\"Modfied fs.py from the livecd-tools rpm for RHEL 6.5 python-imgcreate-13.4.5-1.el6.x86_64.rpm\" href=\"http:\/\/www.pasko.net\/fs.py\" target=\"_blank\">here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Problem Running livecd-creator (livecd-tools-13.4.5-1.el6.x86_64 + python-imgcreate-13.4.5-1.el6.x86_64.rpm) leaves loopback mounts around after execution. Environment RedHat Enterprise Linux 6.5 running under Virtualbox 4.3 #\u00a0lsof | grep loop # # time livecd-creator -d -v &#8211;logfile=\/tmp\/livecd.debug.out -c \/a\/infoboot.ks -f &#8220;INFO&#8221; # &#8230; #Inserting fragment &hellip; <a href=\"https:\/\/www.pasko.net\/wordpress\/2014\/03\/05\/rhel6-livecd-creator-bug-fix\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[6,1],"tags":[],"class_list":["post-589","post","type-post","status-publish","format-standard","hentry","category-nerd","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/posts\/589","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/comments?post=589"}],"version-history":[{"count":0,"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/posts\/589\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/media?parent=589"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/categories?post=589"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pasko.net\/wordpress\/wp-json\/wp\/v2\/tags?post=589"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}