hooks/live, scripts/live: Add USB modules, workaround udevtrigger (?) bug
authorChris Lamb <chris@chris-lamb.co.uk>
Wed, 26 Mar 2008 08:19:59 +0000 (08:19 +0000)
committerDaniel Baumann <daniel@debian.org>
Wed, 9 Mar 2011 16:47:58 +0000 (17:47 +0100)
This patch goes some way towards fixing USB-backed persistence by
configuring the live initramfs to contain the "sd_mod" module and adding
a hacky workaround to a udev-related race condition.

For some reason, the usual udevtrigger/udevsettle pairing does not block
after we have loaded our USB modules and /dev/sda1 (for example) is ready.
Because of this, we sleep for a little while and break if a new block
device appears.

This seems to be a bug either in udev or in my understanding of how the
tool is meant to work. Some information may be gained from the casper bug:

  https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591

Sleep-based hacks like this are really ugly, but I take some comfort in
finding them elsewhere in the source.

hooks/live
scripts/live

index ca2a761..a4aced3 100755 (executable)
@@ -101,6 +101,9 @@ manual_add_modules ohci1394
 manual_add_modules sbp2
 manual_add_modules sr_mod
 
+# Hardware: usb
+manual_add_modules sd_mod
+
 # Hardware: network
 auto_add_modules net
 
index 7632fc8..797f5df 100755 (executable)
@@ -994,6 +994,30 @@ setup_unionfs ()
        # Looking for "${root_persistence}" device or file
        if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
        then
+               # Load USB modules
+               num_block=$(ls -l /sys/block | wc -l)
+               for module in sd_mod uhci-hcd ehci-hcd ohci-hcd usb-storage
+               do
+                       modprobe -q -b ${module}
+               done
+
+               udevtrigger
+               udevsettle
+
+               # For some reason, udevsettle does not block in this scenario,
+               # so we sleep for a little while.
+               #
+               # See https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591
+               for timeout in 5 4 3 2 1
+               do
+                       sleep 1
+
+                       if [ $(ls -l /sys/block | wc -l) -gt ${num_block} ]
+                       then
+                               break
+                       fi
+               done
+
                cowprobe=$(find_cow_device "${root_persistence}")
 
                if [ -b "${cowprobe}" ]