summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorChris Lamb <chris@chris-lamb.co.uk>2008-03-26 08:19:59 +0000
committerDaniel Baumann <daniel@debian.org>2011-03-09 17:47:58 +0100
commita242992a320b66e152fb1ba1705f9d8a9bf0313b (patch)
tree9a17f0f43091e59fd8cdaa51a8764530a3f930ea /scripts
parent924d99d21049feb1213e1816d4345364bfb0900c (diff)
downloadlive-boot-a242992a320b66e152fb1ba1705f9d8a9bf0313b.tar.gz
live-boot-a242992a320b66e152fb1ba1705f9d8a9bf0313b.zip
hooks/live, scripts/live: Add USB modules, workaround udevtrigger (?) bug
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.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/live24
1 files changed, 24 insertions, 0 deletions
diff --git a/scripts/live b/scripts/live
index 7632fc8..797f5df 100755
--- a/scripts/live
+++ b/scripts/live
@@ -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}" ]