dracut-functions.sh: cope with optional field #7 in mountinfo

also handle fstab entries with LABEL=, UUID= and PARTUUID=
master
Harald Hoyer 2013-01-23 14:10:15 +01:00
parent d6d3173916
commit c8d685c9d3
2 changed files with 56 additions and 16 deletions

View File

@ -311,10 +311,17 @@ get_maj_min() {
# $ find_block_device /usr # $ find_block_device /usr
# 8:4 # 8:4
find_block_device() { find_block_device() {
local _x _mpt _majmin _dev _fs _maj _min local _x _mpt _majmin _dev _fs _maj _min _find_mpt
_find_mpt="$1"
if [[ $use_fstab != yes ]]; then if [[ $use_fstab != yes ]]; then
while read _x _x _majmin _x _mpt _x _x _fs _dev _x; do while read _x; do
[[ $_mpt = $1 ]] || continue set -- $_x
_majmin="$3"
_mpt="$5"
[[ $8 = "-" ]] && shift
_fs="$8"
_dev="$9"
[[ $_mpt = $_find_mpt ]] || continue
[[ $_fs = nfs ]] && { echo $_dev; return 0;} [[ $_fs = nfs ]] && { echo $_dev; return 0;}
[[ $_fs = nfs3 ]] && { echo $_dev; return 0;} [[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
[[ $_fs = nfs4 ]] && { echo $_dev; return 0;} [[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
@ -332,7 +339,7 @@ find_block_device() {
while read _dev _mpt _fs _x; do while read _dev _mpt _fs _x; do
[ "${_dev%%#*}" != "$_dev" ] && continue [ "${_dev%%#*}" != "$_dev" ] && continue


if [[ $_mpt = $1 ]]; then if [[ $_mpt = $_find_mpt ]]; then
[[ $_fs = nfs ]] && { echo $_dev; return 0;} [[ $_fs = nfs ]] && { echo $_dev; return 0;}
[[ $_fs = nfs3 ]] && { echo $_dev; return 0;} [[ $_fs = nfs3 ]] && { echo $_dev; return 0;}
[[ $_fs = nfs4 ]] && { echo $_dev; return 0;} [[ $_fs = nfs4 ]] && { echo $_dev; return 0;}
@ -355,16 +362,40 @@ find_block_device() {
# $ find_dev_fstype /dev/sda2;echo # $ find_dev_fstype /dev/sda2;echo
# ext4 # ext4
find_dev_fstype() { find_dev_fstype() {
local _x _mpt _majmin _dev _fs _maj _min local _x _mpt _majmin _dev _fs _maj _min _find_dev
while read _x _x _majmin _x _mpt _x _x _fs _dev _x; do _find_dev="$1"
[[ $_dev = $1 ]] || continue 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; echo -n $_fs;
return 0; return 0;
done < /proc/self/mountinfo done < /proc/self/mountinfo


# fall back to /etc/fstab # fall back to /etc/fstab
while read _dev _mpt _fs _x; do while read _dev _mpt _fs _x; do
[[ $_dev = $1 ]] || continue [ "${_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

[[ $_dev -ef $_find_dev ]] || continue
echo -n $_fs; echo -n $_fs;
return 0; return 0;
done < /etc/fstab done < /etc/fstab
@ -381,16 +412,25 @@ find_dev_fstype() {
# $ find_mp_fstype /;echo # $ find_mp_fstype /;echo
# ext4 # ext4
find_mp_fstype() { find_mp_fstype() {
local _x _mpt _majmin _dev _fs _maj _min local _x _mpt _majmin _dev _fs _maj _min _find_mpt
while read _x _x _majmin _x _mpt _x _x _fs _dev _x; do _find_mpt="$1"
[[ $_mpt = $1 ]] || continue 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; echo -n $_fs;
return 0; return 0;
done < /proc/self/mountinfo done < /proc/self/mountinfo


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

View File

@ -766,18 +766,18 @@ if [[ $hostonly ]]; then
fi fi


_get_fs_type() ( _get_fs_type() (
[[ $1 ]] || return [[ $1 ]] || return 1
if [[ -b $1 ]] && get_fs_env $1; then if [[ -b $1 ]] && get_fs_env $1; then
echo "$(readlink -f $1)|$ID_FS_TYPE" echo "$(readlink -f $1)|$ID_FS_TYPE"
return 1 return 0
fi fi
if [[ -b /dev/block/$1 ]] && get_fs_env /dev/block/$1; then if [[ -b /dev/block/$1 ]] && get_fs_env /dev/block/$1; then
echo "$(readlink -f /dev/block/$1)|$ID_FS_TYPE" echo "$(readlink -f /dev/block/$1)|$ID_FS_TYPE"
return 1 return 0
fi fi
if fstype=$(find_dev_fstype $1); then if fstype=$(find_dev_fstype $1); then
echo "$1|$fstype" echo "$1|$fstype"
return 1 return 0
fi fi
return 1 return 1
) )