Blame 0001-dracut-export-host_fs_types-host_devs.patch

Harald Hoyer 6adbc8
From 7ae5d9d11d1a0ccd31dced528e2792f1c1d5aeca Mon Sep 17 00:00:00 2001
Harald Hoyer 6adbc8
From: Harald Hoyer <harald@redhat.com>
Harald Hoyer 6adbc8
Date: Thu, 8 Dec 2011 10:25:58 +0100
Harald Hoyer 6adbc8
Subject: [PATCH] dracut: export host_fs_types host_devs
Harald Hoyer 6adbc8
Harald Hoyer 6adbc8
Determine devices and filesystems to be included in the host-only
Harald Hoyer 6adbc8
initramfs image.
Harald Hoyer 6adbc8
Harald Hoyer 6adbc8
To get a minimal initramfs, which can mount
Harald Hoyer 6adbc8
 /
Harald Hoyer 6adbc8
 /etc
Harald Hoyer 6adbc8
 /usr
Harald Hoyer 6adbc8
 /usr/bin
Harald Hoyer 6adbc8
 /usr/sbin
Harald Hoyer 6adbc8
 /usr/lib
Harald Hoyer 6adbc8
 /usr/lib64
Harald Hoyer 6adbc8
 /boot
Harald Hoyer 6adbc8
we look in fstab for the corresponding devices and determine their and
Harald Hoyer 6adbc8
their slaves' filesystem type and put all that in $host_fs_types
Harald Hoyer 6adbc8
and $host_devs.
Harald Hoyer 6adbc8
---
Harald Hoyer 6adbc8
 dracut           |   42 +++++++++++++++++++++++++++++++++++++++++-
Harald Hoyer 6adbc8
 dracut-functions |   30 ++++++++++++++++++++++++++----
Harald Hoyer 6adbc8
 2 files changed, 67 insertions(+), 5 deletions(-)
Harald Hoyer 6adbc8
Harald Hoyer 6adbc8
diff --git a/dracut b/dracut
Harald Hoyer 6adbc8
index 45ee759..3d08680 100755
Harald Hoyer 6adbc8
--- a/dracut
Harald Hoyer 6adbc8
+++ b/dracut
Harald Hoyer 6adbc8
@@ -507,12 +507,52 @@ trap 'exit 1;' SIGINT
Harald Hoyer 6adbc8
 # Need to be able to have non-root users read stuff (rpcbind etc)
Harald Hoyer 6adbc8
 chmod 755 "$initdir"
Harald Hoyer 6adbc8
 
Harald Hoyer 6adbc8
+if [[ $hostonly ]]; then
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
+    _get_fs_type() (
Harald Hoyer 6adbc8
+        [[ $1 ]] || return
Harald Hoyer 6adbc8
+        if [[ -b /dev/block/$1 ]] && get_fs_env /dev/block/$1; then
Harald Hoyer 6adbc8
+            echo -n "$ID_FS_TYPE "
Harald Hoyer 6adbc8
+            return 1
Harald Hoyer 6adbc8
+        fi
Harald Hoyer 6adbc8
+        if find_dev_fstype $1; then
Harald Hoyer 6adbc8
+            echo -n " "
Harald Hoyer 6adbc8
+            return 1
Harald Hoyer 6adbc8
+        fi
Harald Hoyer 6adbc8
+        return 1
Harald Hoyer 6adbc8
+    )
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
+    push host_mp \
Harald Hoyer 6adbc8
+        "/" \
Harald Hoyer 6adbc8
+        "/etc" \
Harald Hoyer 6adbc8
+        "/usr" \
Harald Hoyer 6adbc8
+        "/usr/bin" \
Harald Hoyer 6adbc8
+        "/usr/sbin" \
Harald Hoyer 6adbc8
+        "/usr/lib" \
Harald Hoyer 6adbc8
+        "/usr/lib64" \
Harald Hoyer 6adbc8
+        "/boot"
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
+    host_fs_types=""
Harald Hoyer 6adbc8
+    for mp in "${host_mp[@]}"; do
Harald Hoyer 6adbc8
+        mountpoint "$mp" >/dev/null 2>&1 || continue
Harald Hoyer 6adbc8
+        push host_devs $(find_block_device "$mp")
Harald Hoyer 6adbc8
+    done
Harald Hoyer 6adbc8
+    for dev in "${host_devs[@]}"; do
Harald Hoyer 6adbc8
+        unset fs_type
Harald Hoyer 6adbc8
+        for fstype in $(_get_fs_type $dev) \
Harald Hoyer 6adbc8
+            $(check_block_and_slaves _get_fs_type $dev); do
Harald Hoyer 6adbc8
+            strstr " $host_fs_types " "$fstype" || host_fs_types+="$fstype "
Harald Hoyer 6adbc8
+        done
Harald Hoyer 6adbc8
+    done
Harald Hoyer 6adbc8
+fi
Harald Hoyer 6adbc8
+echo "host_fs_types=$host_fs_types"
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
 export initdir dracutbasedir dracutmodules drivers \
Harald Hoyer 6adbc8
     fw_dir drivers_dir debug no_kernel kernel_only \
Harald Hoyer 6adbc8
     add_drivers mdadmconf lvmconf filesystems \
Harald Hoyer 6adbc8
     use_fstab libdir usrlibdir fscks nofscks \
Harald Hoyer 6adbc8
     stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
Harald Hoyer 6adbc8
-    debug
Harald Hoyer 6adbc8
+    debug host_fs_types host_devs
Harald Hoyer 6adbc8
 
Harald Hoyer 6adbc8
 # Create some directory structure first
Harald Hoyer 6adbc8
 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
Harald Hoyer 6adbc8
diff --git a/dracut-functions b/dracut-functions
Harald Hoyer 6adbc8
index c54cd7c..258d376 100755
Harald Hoyer 6adbc8
--- a/dracut-functions
Harald Hoyer 6adbc8
+++ b/dracut-functions
Harald Hoyer 6adbc8
@@ -165,8 +165,11 @@ get_fs_type() (
Harald Hoyer 6adbc8
         echo "nfs"
Harald Hoyer 6adbc8
         return
Harald Hoyer 6adbc8
     fi
Harald Hoyer 6adbc8
-    get_fs_env $1 || return
Harald Hoyer 6adbc8
-    echo $ID_FS_TYPE
Harald Hoyer 6adbc8
+    if get_fs_env $1; then
Harald Hoyer 6adbc8
+        echo $ID_FS_TYPE
Harald Hoyer 6adbc8
+        return
Harald Hoyer 6adbc8
+    fi
Harald Hoyer 6adbc8
+    find_dev_fstype $1
Harald Hoyer 6adbc8
 )
Harald Hoyer 6adbc8
 
Harald Hoyer 6adbc8
 get_fs_uuid() (
Harald Hoyer 6adbc8
@@ -174,11 +177,11 @@ get_fs_uuid() (
Harald Hoyer 6adbc8
     echo $ID_FS_UUID
Harald Hoyer 6adbc8
 )
Harald Hoyer 6adbc8
 
Harald Hoyer 6adbc8
-# finds the major:minor of the block device backing the root filesystem.
Harald Hoyer 6adbc8
 find_block_device() {
Harald Hoyer 6adbc8
     local _x _mpt _majmin _dev _fs _maj _min
Harald Hoyer 6adbc8
     if [[ $use_fstab != yes ]]; then
Harald Hoyer 6adbc8
         while read _x _x _majmin _x _mpt _x _x _fs _dev _x; do
Harald Hoyer 6adbc8
+            [[ $_mpt = $1 ]] || continue
Harald Hoyer 6adbc8
             [[ $_fs = nfs ]] && { echo $_dev; return 0;}
Harald Hoyer 6adbc8
             [[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
Harald Hoyer 6adbc8
             [[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
Harald Hoyer 6adbc8
@@ -189,7 +192,7 @@ find_block_device() {
Harald Hoyer 6adbc8
                     echo $_maj:$_min
Harald Hoyer 6adbc8
                 } && return 0
Harald Hoyer 6adbc8
             }
Harald Hoyer 6adbc8
-            if [[ $_mpt = $1 ]] && [[ ${_majmin#0:} = $_majmin ]]; then
Harald Hoyer 6adbc8
+            if [[ ${_majmin#0:} = $_majmin ]]; then
Harald Hoyer 6adbc8
                 echo $_majmin
Harald Hoyer 6adbc8
                 return 0 # we have a winner!
Harald Hoyer 6adbc8
             fi
Harald Hoyer 6adbc8
@@ -215,6 +218,25 @@ find_block_device() {
Harald Hoyer 6adbc8
     return 1
Harald Hoyer 6adbc8
 }
Harald Hoyer 6adbc8
 
Harald Hoyer 6adbc8
+find_dev_fstype() {
Harald Hoyer 6adbc8
+    local _x _mpt _majmin _dev _fs _maj _min
Harald Hoyer 6adbc8
+    while read _x _x _majmin _x _mpt _x _x _fs _dev _x; do
Harald Hoyer 6adbc8
+        [[ $_dev = $1 ]] || continue
Harald Hoyer 6adbc8
+        echo -n $_fs;
Harald Hoyer 6adbc8
+        return 0;
Harald Hoyer 6adbc8
+    done < /proc/self/mountinfo
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
+    # fall back to /etc/fstab
Harald Hoyer 6adbc8
+    while read _dev _mpt _fs _x; do
Harald Hoyer 6adbc8
+        [[ $_dev = $1 ]] || continue
Harald Hoyer 6adbc8
+        echo -n $_fs;
Harald Hoyer 6adbc8
+        return 0;
Harald Hoyer 6adbc8
+    done < /etc/fstab
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
+    return 1
Harald Hoyer 6adbc8
+}
Harald Hoyer 6adbc8
+
Harald Hoyer 6adbc8
+# finds the major:minor of the block device backing the root filesystem.
Harald Hoyer 6adbc8
 find_root_block_device() { find_block_device /; }
Harald Hoyer 6adbc8
 
Harald Hoyer 6adbc8
 # Walk all the slave relationships for a given block device.