-
Notifications
You must be signed in to change notification settings - Fork 401
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(lvm): add new module lvmthinpool-monitor
Previously dracut didn't support the feature of lvm thinpool autoextend. The feature is useful to cases such as kdump, when vmcore to be saved to a lvm thin volume. The thinpool should be able to autoextend, otherwise an IO error will be caused and leaves an incomplete vmcore. There is lvm2-monitor.service and dmeventd avaliable, however considering [1], it is not suitable for kdump and memory limited cases. This patch achieves the same by parallel looping a shell function in the background, which calls lvextend periodically. If thredshold reaches, autoextend it, if not then nothing happens. [1]: https://lists.fedoraproject.org/archives/list/kexec@lists.fedoraproject.org/message/YF254ZO3PJ3U56P4OKHV3JNYP2PJUMYX/ Signed-off-by: Tao Liu <ltao@redhat.com>
Showing
4 changed files
with
80 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#!/bin/bash | ||
|
||
# called by dracut | ||
check() { | ||
# No point trying to support lvm if the binaries are missing | ||
require_binaries lvm sort tr awk || return 1 | ||
|
||
return 255 | ||
} | ||
|
||
# called by dracut | ||
depends() { | ||
echo lvm | ||
return 0 | ||
} | ||
|
||
# called by dracut | ||
install() { | ||
inst_multiple sort tr awk | ||
inst_script "$moddir/start-thinpool-monitor.sh" "/bin/start-thinpool-monitor" | ||
|
||
inst "$moddir/start-thinpool-monitor.service" "$systemdsystemunitdir/start-thinpool-monitor.service" | ||
$SYSTEMCTL -q --root "$initdir" add-wants initrd.target start-thinpool-monitor.service | ||
} |
14 changes: 14 additions & 0 deletions
14
modules.d/80lvmthinpool-monitor/start-thinpool-monitor.service
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
[Unit] | ||
Description=Lvm thinpool monitor service | ||
Before=initrd.target | ||
After=initrd-fs.target | ||
Conflicts=shutdown.target emergency.target | ||
|
||
[Service] | ||
Type=forking | ||
ExecStart=/bin/start-thinpool-monitor | ||
PIDFile=/run/thinpool-moni.pid | ||
StandardInput=null | ||
StandardOutput=journal+console | ||
StandardError=journal+console | ||
KillSignal=SIGHUP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#!/bin/sh | ||
|
||
type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh | ||
|
||
LVS=$(getargs rd.lvm.lv -d rd_LVM_LV=) | ||
|
||
is_lvm2_thinp_device() { | ||
_device_path=$1 | ||
_lvm2_thin_device=$(lvm lvs -S 'lv_layout=sparse && lv_layout=thin' \ | ||
--nosuffix --noheadings -o vg_name,lv_name "$_device_path" 2> /dev/null) | ||
|
||
[ -n "$_lvm2_thin_device" ] && return $? | ||
} | ||
|
||
for LV in $LVS; do | ||
if is_lvm2_thinp_device "/dev/$LV"; then | ||
THIN_POOLS="$(lvm lvs -S 'lv_layout=sparse && lv_layout=thin' \ | ||
--nosuffix --noheadings -o vg_name,pool_lv "$LV" \ | ||
| awk '{printf("%s/%s",$1,$2);}') $THIN_POOLS" | ||
fi | ||
done | ||
|
||
THIN_POOLS=$(echo "$THIN_POOLS" | tr ' ' '\n' | sort -u | tr '\n' ' ') | ||
|
||
if [ -n "$THIN_POOLS" ]; then | ||
if [ -e "/etc/lvm/lvm.conf" ]; then | ||
# Use 'monitoring=0' to override the value in lvm.conf, in case | ||
# dmeventd monitoring been started after the calling. | ||
CONFIG="activation {monitoring=0}" | ||
else | ||
CONFIG="activation {monitoring=0 thin_pool_autoextend_threshold=70 thin_pool_autoextend_percent=20}" | ||
fi | ||
|
||
while true; do | ||
for THIN_POOL in $THIN_POOLS; do | ||
lvm lvextend --use-policies --config "$CONFIG" "$THIN_POOL" | ||
done | ||
sleep 5 | ||
done & | ||
echo $! > /run/thinpool-moni.pid | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters