Browse Source

dracut-functions.sh: make use of findmnt

master
Harald Hoyer 11 years ago
parent
commit
9d36d4fb1d
  1. 163
      dracut-functions.sh

163
dracut-functions.sh

@ -319,131 +319,96 @@ get_maj_min() { @@ -319,131 +319,96 @@ get_maj_min() {
# $ find_block_device /usr
# 8:4
find_block_device() {
local _x _mpt _majmin _dev _fs _maj _min _find_mpt
local _majmin _dev _majmin _find_mpt
_find_mpt="$1"
if [[ $use_fstab != yes ]]; then
while read _x; do
set -- $_x
_majmin="$3"
_mpt="$5"
[[ $8 = "-" ]] && shift
_fs="$8"
_dev="$9"
[[ $_mpt = $_find_mpt ]] || continue
[[ $_fs = nfs ]] && { echo $_dev; return 0;}
[[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
[[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
[[ $_fs = btrfs ]] && {
get_maj_min $_dev
return 0;
}
if [[ ${_majmin#0:} = $_majmin ]]; then
echo $_majmin
return 0 # we have a winner!
[[ -d $_find_mpt/. ]]
while read _majmin _dev; do
if [[ -b $_dev ]]; then
if ! [[ $_majmin ]] || [[ $_majmin == 0:* ]]; then
read _majmin < <(get_maj_min $_dev)
fi
if [[ $_majmin ]]; then
echo $_majmin
else
echo $_dev
fi
return 0
fi
if [[ $_dev = *:* ]]; then
echo $_dev
return 0
fi
done < /proc/self/mountinfo
done < <(findmnt -e -v -n -o 'MAJ:MIN,SOURCE' "$_find_mpt")
fi
# fall back to /etc/fstab
while read _dev _mpt _fs _x; do
[ "${_dev%%#*}" != "$_dev" ] && continue

if [[ $_mpt = $_find_mpt ]]; then
[[ $_fs = nfs ]] && { echo $_dev; return 0;}
[[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
[[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
[[ $_dev != ${_dev#UUID=} ]] && _dev=/dev/disk/by-uuid/${_dev#UUID=}
[[ $_dev != ${_dev#LABEL=} ]] && _dev=/dev/disk/by-label/${_dev#LABEL=}
[[ -b $_dev ]] || return 1 # oops, not a block device.
get_maj_min "$_dev" && return 0

while read _majmin _dev; do
if ! [[ $_dev ]]; then
_dev="$_majmin"
unset _majmin
fi
if [[ -b $_dev ]]; then
[[ $_majmin ]] || read _majmin < <(get_maj_min $_dev)
if [[ $_majmin ]]; then
echo $_majmin
else
echo $_dev
fi
return 0
fi
if [[ $_dev = *:* ]]; then
echo $_dev
return 0
fi
done < /etc/fstab
done < <(findmnt -e --fstab -v -n -o 'MAJ:MIN,SOURCE' "$_find_mpt")

return 1
}

# find_dev_fstype <device>
# Echo the filesystem type for a given device.
# find_mp_fstype <mountpoint>
# Echo the filesystem type for a given mountpoint.
# /proc/self/mountinfo is taken as the primary source of information
# and /etc/fstab is used as a fallback.
# No newline is appended!
# Example:
# $ find_dev_fstype /dev/sda2;echo
# $ find_mp_fstype /;echo
# ext4
find_dev_fstype() {
local _x _mpt _majmin _dev _fs _maj _min _find_dev
_find_dev="$1"
strstr "$_find_dev" "/dev" || _find_dev="/dev/block/$_find_dev"
while read _x; do
set -- $_x
_majmin="$3"
_mpt="$5"
[[ $8 = "-" ]] && shift
_fs="$8"
_dev="$9"
strstr "$_dev" "/dev" || continue
[[ $_dev -ef $_find_dev ]] || continue
[[ $_fs = "autofs" ]] && continue
echo -n $_fs;
return 0;
done < /proc/self/mountinfo
find_mp_fstype() {
local _fs

# fall back to /etc/fstab
while read _dev _mpt _fs _x; do
[ "${_dev%%#*}" != "$_dev" ] && continue
case "$_dev" in
LABEL=*)
_dev="$(echo $_dev | sed 's,/,\\x2f,g')"
_dev="/dev/disk/by-label/${_dev#LABEL=}"
;;
UUID=*)
_dev="/dev/disk/by-uuid/${_dev#UUID=}"
;;
PARTUUID=*)
_dev="/dev/disk/by-partuuid/${_dev#PARTUUID=}"
;;
esac
if [[ $use_fstab != yes ]]; then
while read _fs; do
[[ $_fs ]] || continue
[[ $_fs = "autofs" ]] && continue
echo -n $_fs
return 0
done < <(findmnt -e -v -n -o 'FSTYPE' "$1")
fi

[[ $_dev -ef $_find_dev ]] || continue
echo -n $_fs;
return 0;
done < /etc/fstab
while read _fs; do
[[ $_fs ]] || continue
[[ $_fs = "autofs" ]] && continue
echo -n $_fs
return 0
done < <(findmnt --fstab -e -v -n -o 'FSTYPE' "$1")

return 1
}

# find_mp_fstype <mountpoint>
# Echo the filesystem type for a given mountpoint.
# find_dev_fstype <device>
# Echo the filesystem type for a given device.
# /proc/self/mountinfo is taken as the primary source of information
# and /etc/fstab is used as a fallback.
# No newline is appended!
# Example:
# $ find_mp_fstype /;echo
# $ find_dev_fstype /dev/sda2;echo
# ext4
find_mp_fstype() {
local _x _mpt _majmin _dev _fs _maj _min _find_mpt
_find_mpt="$1"
while read _x; do
set -- $_x
_majmin="$3"
_mpt="$5"
[[ $8 = "-" ]] && shift
_fs="$8"
_dev="$9"
[[ $_mpt = $_find_mpt ]] || continue
[[ $_fs = "autofs" ]] && continue
echo -n $_fs;
return 0;
done < /proc/self/mountinfo

# fall back to /etc/fstab
while read _dev _mpt _fs _x; do
[ "${_dev%%#*}" != "$_dev" ] && continue
[[ $_mpt = $_find_mpt ]] || continue
echo -n $_fs;
return 0;
done < /etc/fstab

return 1
find_dev_fstype() {
local _x _mpt _majmin _dev _fs _maj _min _find_dev
_find_dev="$1"
[[ "$_find_dev" = /dev* ]] || _find_dev="/dev/block/$_find_dev"
find_mp_fstype "$_find_dev"
}

# finds the major:minor of the block device backing the root filesystem.

Loading…
Cancel
Save