diff options
Diffstat (limited to 'contrib/dracut/02zfsexpandknowledge')
-rw-r--r-- | contrib/dracut/02zfsexpandknowledge/Makefile.am | 22 | ||||
-rwxr-xr-x | contrib/dracut/02zfsexpandknowledge/module-setup.sh.in | 132 |
2 files changed, 154 insertions, 0 deletions
diff --git a/contrib/dracut/02zfsexpandknowledge/Makefile.am b/contrib/dracut/02zfsexpandknowledge/Makefile.am new file mode 100644 index 000000000..0a2170bfc --- /dev/null +++ b/contrib/dracut/02zfsexpandknowledge/Makefile.am @@ -0,0 +1,22 @@ +pkgdracutdir = $(dracutdir)/modules.d/02zfsexpandknowledge +pkgdracut_SCRIPTS = \ + module-setup.sh + +EXTRA_DIST = \ + $(top_srcdir)/contrib/dracut/02zfsexpandknowledge/module-setup.sh.in + +$(pkgdracut_SCRIPTS): + -$(SED) -e 's,@bindir\@,$(bindir),g' \ + -e 's,@sbindir\@,$(sbindir),g' \ + -e 's,@datadir\@,$(datadir),g' \ + -e 's,@dracutdir\@,$(dracutdir),g' \ + -e 's,@udevdir\@,$(udevdir),g' \ + -e 's,@udevruledir\@,$(udevruledir),g' \ + -e 's,@sysconfdir\@,$(sysconfdir),g' \ + "$(top_srcdir)/contrib/dracut/02zfsexpandknowledge/[email protected]" >'$@' + +clean-local:: + -$(RM) $(pkgdracut_SCRIPTS) + +distclean-local:: + -$(RM) $(pkgdracut_SCRIPTS) diff --git a/contrib/dracut/02zfsexpandknowledge/module-setup.sh.in b/contrib/dracut/02zfsexpandknowledge/module-setup.sh.in new file mode 100755 index 000000000..830ee42f6 --- /dev/null +++ b/contrib/dracut/02zfsexpandknowledge/module-setup.sh.in @@ -0,0 +1,132 @@ +#!/bin/sh + +get_devtype() { + local typ + typ=$(udevadm info --query=property --name="$1" | grep "^ID_FS_TYPE=" | sed 's|^ID_FS_TYPE=||') + if [ "$typ" = "" ] ; then + typ=$(blkid -c /dev/null "$1" -o value -s TYPE) + fi + echo "$typ" +} + +get_pool_devices() { + # also present in 99zfssystemd + local poolconfigtemp + local poolconfigoutput + local pooldev + local prefix + poolconfigtemp=`mktemp` + @sbindir@/zpool list -v -H "$1" > "$poolconfigtemp" 2>&1 + if [ "$?" != "0" ] ; then + poolconfigoutput=$(cat "$poolconfigtemp") + dinfo "zfsexpandknowledge: pool $1 cannot be listed: $poolconfigoutput" + else + while read pooldev ; do + for prefix in /dev/disk/* /dev/mapper ; do + if [ -e "$prefix"/"$pooldev" ] ; then + dinfo "zfsexpandknowledge: pool $1 has device $prefix/$pooldev" + echo `readlink -f "$prefix"/"$pooldev"` + break + fi + done + done < <(cat "$poolconfigtemp" | awk -F '\t' 'NR>1 { print $2 }') + fi + rm -f "$poolconfigtemp" +} + +find_zfs_block_devices() { + local dev + local blockdev + local mp + local fstype + local pool + local key + local n + local poolconfigoutput + numfields=`head -1 /proc/self/mountinfo | awk '{print NF}'` + if [ "$numfields" == "10" ] ; then + fields="n n n n mp n n fstype dev n" + else + fields="n n n n mp n n n fstype dev n" + fi + while read $fields ; do + if [ "$fstype" != "zfs" ]; then continue ; fi + if [ "$mp" == "$1" ]; then + pool=$(echo "$dev" | cut -d / -f 1) + get_pool_devices "$pool" + fi + done < /proc/self/mountinfo +} + +array_contains () { + local e + for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done + return 1 +} + +check() { + local mp + local dev + local blockdevs + local fstype + local majmin + local _slavedev + local _slavedevname + local _slavedevtype + local _slavemajmin + local _dev + +if [[ $hostonly ]]; then + + for mp in \ + "/" \ + "/etc" \ + "/bin" \ + "/sbin" \ + "/lib" \ + "/lib64" \ + "/usr" \ + "/usr/bin" \ + "/usr/sbin" \ + "/usr/lib" \ + "/usr/lib64" \ + "/boot"; + do + mp=$(readlink -f "$mp") + mountpoint "$mp" >/dev/null 2>&1 || continue + blockdevs=$(find_zfs_block_devices "$mp") + if [ -z "$blockdevs" ] ; then continue ; fi + dinfo "zfsexpandknowledge: block devices backing ZFS dataset $mp: $blockdevs" + for dev in $blockdevs + do + array_contains "$dev" "${host_devs[@]}" || host_devs+=("$dev") + fstype=$(get_devtype "$dev") + host_fs_types["$dev"]="$fstype" + majmin=$(get_maj_min "$dev") + if [[ -d /sys/dev/block/$majmin/slaves ]] ; then + for _slavedev in /sys/dev/block/$majmin/slaves/*; do + [[ -f $_slavedev/dev ]] || continue + _slavedev=/dev/$(basename "$_slavedev") + _slavedevname=$(udevadm info --query=property --name="$_slavedev" | grep "^DEVNAME=" | sed 's|^DEVNAME=||') + _slavedevtype=$(get_devtype "$_slavedevname") + _slavemajmin=$(get_maj_min "$_slavedevname") + dinfo "zfsexpandknowledge: slave block device backing ZFS dataset $mp: $_slavedevname" + array_contains "$_slavedevname" "${host_devs[@]}" || host_devs+=("$_slavedevname") + host_fs_types["$_slavedevname"]="$_slavedevtype" + done + fi + done + done + for a in "${host_devs[@]}" + do + dinfo "zfsexpandknowledge: host device $a" + done + for a in "${!host_fs_types[@]}" + do + dinfo "zfsexpandknowledge: device $a of type ${host_fs_types[$a]}" + done + +fi + +return 1 +} |