[arch-releng] [PATCH 1/2] Use the archisolabel= command line option to mount the archiso device If the archisolabel= option is specified on the kernel commandline, a device /dev/archiso will be created and will be used to boot the live system.

Thomas Bächler thomas at archlinux.org
Fri Jul 24 21:21:14 EDT 2009


---
 archiso/hooks/archiso       |   67 +++++++++++++------------------------------
 archiso/hooks/archiso-early |    8 ++--
 2 files changed, 24 insertions(+), 51 deletions(-)

diff --git a/archiso/hooks/archiso b/archiso/hooks/archiso
index d779478..688a880 100644
--- a/archiso/hooks/archiso
+++ b/archiso/hooks/archiso
@@ -50,61 +50,34 @@ run_hook ()
         ramdisk_size="75%"
     fi
     msg -n ":: Mounting tmpfs, size=${ramdisk_size}..."
-	mount -t tmpfs -o "size=${ramdisk_size}" tmpfs /tmpfs
+    mount -t tmpfs -o "size=${ramdisk_size}" tmpfs /tmpfs
     msg "done."
 
-    # external drives may need to settle
-    msg ":: Waiting for devices to settle..."
-    /sbin/udevadm trigger --subsystem-match=usb
-    /sbin/udevadm settle
-    usbdelay=$(( ${usbdelay:-0} + 1 ))
-    msg ":: Waiting ${usbdelay}s for USB devices"
-    /bin/sleep "${usbdelay}"
-
-    msg ":: Scanning for boot device..."
+    msg ":: Waiting for boot device..."
 
     /bin/mkdir -p /bootmnt
-    found=0
-
-    /bin/modprobe -q isofs >/dev/null 2>&1
-    msg ":: Scanning cd drives..."
-    for cdrom in /dev/hd[a-z] /dev/sr[0-9]* /dev/scd[a-z] /dev/sg[0-9]*; do
-        [ ! -e "${cdrom}" ] && continue
-        if mount -r -t iso9660 "${cdrom}" /bootmnt >/dev/null 2>&1; then
-            if [ -e "/bootmnt/isomounts" ]; then
-                found=1
-                msg "${cdrom}"
-                break
-            fi
-        else
-            echo "Failed to mount ${cdrom}"
-        fi
-        [ ${found} -eq 0 ] && umount /bootmnt >/dev/null 2>&1
+    while ! poll_device /dev/archiso 30; do
+      echo "ERROR: boot device didn't show up after 30 seconds..."
+      echo "   Falling back to interactive prompt"
+      echo "   You can try to fix the problem manually, log out when you are finished"
+      PS1="ramfs$ " /bin/sh -i
     done
 
-    if [ ${found} -eq 0 ]; then
-        msg ":: Scanning usb drives..."
-        for usb in /dev/sd[a-z][0-9]; do
-            [ ! -e "${usb}" ] && continue
-            if mount -r -t vfat "${usb}" /bootmnt >/dev/null 2>&1 ||\
-                mount -r -t ext2 "${usb}" /bootmnt >/dev/null 2>&1; then
-                if [ -e "/bootmnt/isomounts" ]; then
-                    found=1
-                    msg "${usb}"
-                    break
-                fi
-            else
-                echo "Failed to mount ${usb}"
-            fi
-            [ ${found} -eq 0 ] && umount /bootmnt >/dev/null 2>&1
-        done
-    fi
-
-    if [ ${found} -eq 0 ]; then
-        echo "ERROR: cannot find boot device, cannot continue..."
-        echo "   Falling back to interactive prompt"
-        PS1="ramfs$ " /bin/sh -i
+    eval $(fstype < /dev/archiso 2>/dev/null)
+    if [ -n "${FSTYPE}" -a "${FSTYPE}" != "unknown" ]; then
+      if mount -r -t "${FSTYPE}" /dev/archiso /bootmnt >/dev/null 2>&1; then
+        if [ -e "/bootmnt/isomounts" ]; then
+          echo "SUCCESS: Mounted archiso volume successfully."
+        else
+          echo "ERROR: Mounting was successful, but the isomounts file does not exist."
+          exit 1
+        fi
+      else
+        echo "ERROR: Failed to mount /dev/archiso"
         exit 1
+      fi
+    else
+      echo "ERROR: /dev/archiso found, but the filesystem type is unknown."
     fi
 
     /bin/modprobe -q squashfs >/dev/null 2>&1
diff --git a/archiso/hooks/archiso-early b/archiso/hooks/archiso-early
index 884c4be..d57b73b 100644
--- a/archiso/hooks/archiso-early
+++ b/archiso/hooks/archiso-early
@@ -1,8 +1,8 @@
 # vim: set ft=sh:
 run_hook ()
 {
-    # Set our usbdelay time. Default: 0
-    cd /
-    /bin/mkdir -p etc/modprobe.d/
-    echo "options usb-storage delay_use=${usbdelay:-0}" > /etc/modprobe.d/usb-delay
+  if [ -n "${archisolabel}" ]; then
+    echo "ACTION==\"add|change\", SUBSYSTEM==\"block\", IMPORT{program}=\"vol_id --export \$tempnode\"" > /lib/udev/rules.d/00-archiso-device.rules
+    echo "ENV{ID_FS_LABEL_ENC}==\"${archisolabel}\", SYMLINK+=\"archiso\"" >> /lib/udev/rules.d/00-archiso-device.rules
+  fi
 }
-- 
1.6.3.3



More information about the arch-releng mailing list