dracut/0001-dracut-export-host_fs_...

150 lines
4.2 KiB
Diff

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