1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
#!/bin/bash
# called by dracut
check() {
# No point trying to support lvm if the binaries are missing
require_binaries lvm grep || return 1
[[ $hostonly ]] || [[ $mount_needs ]] && {
for fs in "${host_fs_types[@]}"; do
[[ $fs == LVM*_member ]] && return 0
done
return 255
}
return 0
}
# called by dracut
depends() {
# We depend on dm_mod being loaded
echo dm initqueue
return 0
}
# called by dracut
cmdline() {
local _activated
declare -A _activated
for dev in "${!host_fs_types[@]}"; do
[[ -e /sys/block/${dev#/dev/}/dm/name ]] || continue
[[ -e /sys/block/${dev#/dev/}/dm/uuid ]] || continue
uuid=$(< "/sys/block/${dev#/dev/}/dm/uuid")
[[ ${uuid#LVM-} == "$uuid" ]] && continue
dev=$(< "/sys/block/${dev#/dev/}/dm/name")
eval "$(dmsetup splitname --nameprefixes --noheadings --rows "$dev" 2> /dev/null)"
[[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 1
if ! [[ ${_activated[DM_VG_NAME / DM_LV_NAME]} ]]; then
printf " rd.lvm.lv=%s " "${DM_VG_NAME}/${DM_LV_NAME} "
_activated["${DM_VG_NAME}/${DM_LV_NAME}"]=1
fi
done
}
installkernel() {
hostonly='' dracut_instmods -o -P ".*/(bcache/|md-cluster).*" "=drivers/md"
}
# called by dracut
install() {
inst_multiple lvm grep
# lvm links for recovery inside the initramfs
inst_multiple -o \
lvchange \
lvconvert \
lvcreate \
lvdisplay \
lvextend \
lvmconfig \
lvmdiskscan \
lvmsadc \
lvmsar \
lvreduce \
lvremove \
lvrename \
lvresize \
lvs \
lvscan \
pvchange \
pvck \
pvcreate \
pvdisplay \
pvmove \
pvremove \
pvresize \
pvs \
pvscan \
vgcfgbackup \
vgcfgrestore \
vgchange \
vgck \
vgconvert \
vgcreate \
vgdisplay \
vgexport \
vgextend \
vgimport \
vgimportclone \
vgmerge \
vgmknodes \
vgreduce \
vgremove \
vgrename \
vgs \
vgscan \
vgsplit
if [[ $hostonly_cmdline == "yes" ]]; then
local _lvmconf
_lvmconf=$(cmdline)
[[ $_lvmconf ]] && printf "%s\n" "$_lvmconf" >> "${initdir}/etc/cmdline.d/20-lvm.conf"
fi
inst_rules "$moddir/64-lvm.rules"
if [[ $hostonly ]] || [[ $lvmconf == "yes" ]]; then
if [[ -f "${dracutsysrootdir-}/etc/lvm/lvm.conf" ]]; then
inst_simple -H /etc/lvm/lvm.conf
fi
export LVM_SUPPRESS_FD_WARNINGS=1
# Also install any files needed for LVM system id support.
if [[ -f "${dracutsysrootdir-}/etc/lvm/lvmlocal.conf" ]]; then
inst_simple -H /etc/lvm/lvmlocal.conf
fi
eval "$(lvm dumpconfig global/system_id_source &> /dev/null)"
if [ "$system_id_source" == "file" ]; then
eval "$(lvm dumpconfig global/system_id_file)"
if [ -f "$system_id_file" ]; then
inst_simple -H "$system_id_file"
fi
fi
unset LVM_SUPPRESS_FD_WARNINGS
fi
inst_rules 11-dm-lvm.rules
# debian udev rules
inst_rules 56-lvm.rules 60-persistent-storage-lvm.rules
inst_script "$moddir/lvm_scan.sh" /sbin/lvm_scan
inst_hook cmdline 30 "$moddir/parse-lvm.sh"
if [[ $hostonly ]] && find_binary lvs &> /dev/null; then
for dev in "${!host_fs_types[@]}"; do
[[ -e /sys/block/${dev#/dev/}/dm/name ]] || continue
dev=$(< "/sys/block/${dev#/dev/}/dm/name")
eval "$(dmsetup splitname --nameprefixes --noheadings --rows "$dev" 2> /dev/null)"
# shellcheck disable=SC2015
[[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || continue
case "$(lvs --noheadings -o segtype "${DM_VG_NAME}" 2> /dev/null)" in
*thin* | *cache* | *era*)
inst_multiple -o thin_dump thin_restore thin_check thin_repair \
cache_dump cache_restore cache_check cache_repair \
era_check era_dump era_invalidate era_restore
break
;;
esac
done
fi
if ! [[ $hostonly ]]; then
inst_multiple -o thin_dump thin_restore thin_check thin_repair \
cache_dump cache_restore cache_check cache_repair \
era_check era_dump era_invalidate era_restore
fi
}
|