Create initramfs without using udevadm
authorHarald Hoyer <harald@redhat.com>
Thu, 15 Aug 2013 08:44:20 +0000 (10:44 +0200)
committerHarald Hoyer <harald@redhat.com>
Thu, 15 Aug 2013 08:44:20 +0000 (10:44 +0200)
This enables building a hostonly image, without the udev database
populated.

dracut-functions.sh
dracut.sh
modules.d/90crypt/module-setup.sh
modules.d/90dmraid/module-setup.sh
modules.d/90lvm/module-setup.sh

index 7fab2b8..9a12eb4 100755 (executable)
@@ -260,22 +260,6 @@ else
     }
 fi
 
-get_persistent_dev() {
-    local i _tmp _dev
-
-    _dev=$(udevadm info --query=name --name="$1" 2>/dev/null)
-    [ -z "$_dev" ] && return
-
-    for i in /dev/mapper/* /dev/disk/by-uuid/* /dev/disk/by-id/*; do
-        [[ $i == /dev/mapper/mpath* ]] && continue
-        _tmp=$(udevadm info --query=name --name="$i" 2>/dev/null)
-        if [ "$_tmp" = "$_dev" ]; then
-            printf -- "%s" "$i"
-            return
-        fi
-    done
-}
-
 # get_fs_env <device>
 # Get and set the ID_FS_TYPE variable from udev for a device.
 # Example:
@@ -287,33 +271,16 @@ get_fs_env() {
 
     [[ $1 ]] || return
     unset ID_FS_TYPE
-    if ID_FS_TYPE=$(udevadm info --query=env --name="$1" \
-        | { while read line; do
-                    [[ "$line" == DEVPATH\=* ]] && found=1;
-                    if [[ "$line" == ID_FS_TYPE\=* ]]; then
-                        printf "%s" "${line#ID_FS_TYPE=}";
-                        exit 0;
-                    fi
-                done; [[ $found ]] && exit 0; exit 1; }) ; then
-        if [[ $ID_FS_TYPE ]]; then
-            printf "%s" "$ID_FS_TYPE"
-            return 0
-        fi
-    fi
-
-    # Fallback, if we don't have udev information
-    if find_binary blkid >/dev/null; then
-        ID_FS_TYPE=$(blkid -u filesystem -o export -- "$1" \
-            | while read line; do
-                if [[ "$line" == TYPE\=* ]]; then
-                    printf "%s" "${line#TYPE=}";
-                    exit 0;
-                fi
-                done)
-        if [[ $ID_FS_TYPE ]]; then
-            printf "%s" "$ID_FS_TYPE"
-            return 0
-        fi
+    ID_FS_TYPE=$(blkid -u filesystem -o export -- "$1" \
+        | while read line; do
+            if [[ "$line" == TYPE\=* ]]; then
+                printf "%s" "${line#TYPE=}";
+                exit 0;
+            fi
+            done)
+    if [[ $ID_FS_TYPE ]]; then
+        printf "%s" "$ID_FS_TYPE"
+        return 0
     fi
     return 1
 }
@@ -329,6 +296,23 @@ get_maj_min() {
     printf "%s" "$((0x${_majmin%:*})):$((0x${_majmin#*:}))"
 }
 
+# get a persistent path from a device
+get_persistent_dev() {
+    local i _tmp _dev
+
+    _dev=$(get_maj_min "$1")
+    [ -z "$_dev" ] && return
+
+    for i in /dev/mapper/* /dev/disk/by-uuid/* /dev/disk/by-id/*; do
+        [[ $i == /dev/mapper/mpath* ]] && continue
+        _tmp=$(get_maj_min "$i")
+        if [ "$_tmp" = "$_dev" ]; then
+            printf -- "%s" "$i"
+            return
+        fi
+    done
+}
+
 # find_block_device <mountpoint>
 # Prints the major and minor number of the block device
 # for a given mountpoint.
index f6ddfe0..90605e1 100755 (executable)
--- a/dracut.sh
+++ b/dracut.sh
@@ -828,10 +828,6 @@ if [[ $hostonly ]]; then
             unset hostonly
         fi
     done
-    if ! [[ -d /run/udev/data ]]; then
-        dwarning "Turning off host-only mode: udev database not found!"
-        unset hostonly
-    fi
 fi
 
 declare -A host_fs_types
index 1e87559..bb014b9 100755 (executable)
@@ -29,19 +29,18 @@ installkernel() {
 install() {
 
     check_crypt() {
-        local dev=$1 fs=$2
+        local dev=$1 fs=$2 UUID
 
         [[ $fs = "crypto_LUKS" ]] || return 1
-        ID_FS_UUID=$(udevadm info --query=property --name=$dev \
+        UUID=$(blkid -u crypto -o export $dev \
             | while read line; do
-                [[ ${line#ID_FS_UUID} = $line ]] && continue
-                eval "$line"
-                echo $ID_FS_UUID
+                [[ ${line#UUID} = $line ]] && continue
+                printf "%s" "${line#UUID=}"
                 break
                 done)
-        [[ ${ID_FS_UUID} ]] || return 1
+        [[ ${UUID} ]] || return 1
         if ! [[ $kernel_only ]]; then
-            echo " rd.luks.uuid=luks-${ID_FS_UUID} " >> "${initdir}/etc/cmdline.d/90crypt.conf"
+            echo " rd.luks.uuid=luks-${UUID} " >> "${initdir}/etc/cmdline.d/90crypt.conf"
         fi
         return 0
     }
index cea7bd8..87465d9 100755 (executable)
@@ -27,25 +27,26 @@ install() {
     local _i
 
     check_dmraid() {
-        local dev=$1 fs=$2 holder DEVPATH DM_NAME
+        local dev=$1 fs=$2 holder DEVPATH DM_NAME majmin
         [[ "$fs" != *_raid_member ]] && return 1
 
-        DEVPATH=$(udevadm info --query=property --name=$dev \
-            | while read line; do
-                [[ ${line#DEVPATH} = $line ]] && continue
-                eval "$line"
-                echo $DEVPATH
-                break
-                done)
-        for holder in /sys/$DEVPATH/holders/*; do
-            [[ -e $holder ]] || continue
-            DM_NAME=$(udevadm info --query=property --path=$holder \
-                | while read line; do
-                    [[ ${line#DM_NAME} = $line ]] && continue
-                    eval "$line"
-                    echo $DM_NAME
+
+        majmin=$(get_maj_min $dev)
+        DEVPATH=$(
+            for i in /sys/block/*; do
+                [[ -e "$i/dev" ]] || continue
+                if [[ $a == $(<"$i/dev") ]]; then
+                    printf "%s" "$i"
                     break
-                    done)
+                fi
+            done
+        )
+
+        for holder in "$DEVPATH"/holders/*; do
+            [[ -e "$holder" ]] || continue
+            dev="/dev/${holder##*/}"
+            DM_NAME="$(/usr/sbin/dmsetup info -c --noheadings -o name "$dev" 2>/dev/null)"
+            [[ ${DM_NAME} ]] && break
         done
 
         [[ ${DM_NAME} ]] || return 1
index 00eb66d..4b774c9 100755 (executable)
@@ -29,15 +29,12 @@ install() {
     inst lvm
 
     check_lvm() {
-        local DM_VG_NAME DM_LV_NAME DM_UDEV_DISABLE_DISK_RULES_FLAG
+        local DM_VG_NAME DM_LV_NAME
 
-        eval $(udevadm info --query=property --name=$1 | egrep '(DM_VG_NAME|DM_LV_NAME|DM_UDEV_DISABLE_DISK_RULES_FLAG)=')
-        [[ "$DM_UDEV_DISABLE_DISK_RULES_FLAG" = "1" ]] && return 1
+        eval $(/usr/sbin/dmsetup splitname --nameprefixes --noheadings --rows $1 2>/dev/null)
         [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 1
         if ! [[ " ${_activated[*]} " == *\ ${DM_VG_NAME}/${DM_LV_NAME}\ * ]]; then
-            if ! [[ $kernel_only ]]; then
-                echo " rd.lvm.lv=${DM_VG_NAME}/${DM_LV_NAME} " >> "${initdir}/etc/cmdline.d/90lvm.conf"
-            fi
+            echo " rd.lvm.lv=${DM_VG_NAME}/${DM_LV_NAME} " >> "${initdir}/etc/cmdline.d/90lvm.conf"
             push _activated "${DM_VG_NAME}/${DM_LV_NAME}"
         fi
         if ! [[ $_needthin ]]; then
@@ -61,6 +58,16 @@ install() {
         fi
     fi
 
+    if ! [[ -e ${initdir}/etc/lvm/lvm.conf ]]; then
+        mkdir -p "${initdir}/etc/lvm"
+        {
+            echo 'global {'
+            echo 'locking_type = 4'
+            echo 'use_lvmetad = 0'
+            echo '}'
+        } > "${initdir}/etc/lvm/lvm.conf"
+    fi
+
     inst_rules 11-dm-lvm.rules
     # Gentoo ebuild for LVM2 prior to 2.02.63-r1 doesn't install above rules
     # files, but provides the one below: