diff --git a/man/dracut.cmdline.7.asc b/man/dracut.cmdline.7.asc index 5703747bcc..2e99b7370a 100644 --- a/man/dracut.cmdline.7.asc +++ b/man/dracut.cmdline.7.asc @@ -1126,6 +1126,13 @@ NOTE: There must be enough free RAM available to hold the complete image. + This method is very suitable for diskless boots. +**rd.minmem=**____:: +Specify minimum free RAM in MB after copying a live disk image into memory. +The default is 1024. ++ +This parameter only applies together with the parameters rd.writable.fsimg +or rd.live.ram. + **root=**live:____:: Boots a live image retrieved from ____. Requires the dracut 'livenet' module. Valid handlers: __http, https, ftp, torrent, tftp__. diff --git a/modules.d/90dmsquash-live/dmsquash-live-root.sh b/modules.d/90dmsquash-live/dmsquash-live-root.sh index e9434c9343..81c6ed8e73 100755 --- a/modules.d/90dmsquash-live/dmsquash-live-root.sh +++ b/modules.d/90dmsquash-live/dmsquash-live-root.sh @@ -315,6 +315,8 @@ if [ -e /run/initramfs/live/${live_dir}/${squash_image} ]; then fi if [ -e "$SQUASHED" ]; then if [ -n "$live_ram" ]; then + imgsize=$(($(stat -c %s -- $SQUASHED) / (1024 * 1024))) + check_live_ram $imgsize echo 'Copying live image to RAM...' > /dev/kmsg echo ' (this may take a minute)' > /dev/kmsg dd if=$SQUASHED of=/run/initramfs/squashed.img bs=512 2> /dev/null diff --git a/modules.d/90livenet/livenetroot.sh b/modules.d/90livenet/livenetroot.sh index 92ad805bed..66dd41b39a 100755 --- a/modules.d/90livenet/livenetroot.sh +++ b/modules.d/90livenet/livenetroot.sh @@ -16,6 +16,13 @@ netroot="$2" liveurl="${netroot#livenet:}" info "fetching $liveurl" +if getargbool 0 'rd.writable.fsimg'; then + + imgsize=$(($(curl -sIL "$liveurl" | sed -n 's/Content-Length: *\([[:digit:]]*\).*/\1/p') / (1024 * 1024))) + + check_live_ram $imgsize +fi + imgfile= #retry until the imgfile is populated with data or the max retries i=1 diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index 6eaa0fe149..a8ca2c96eb 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -1151,3 +1151,28 @@ load_fstype() { done < /proc/filesystems modprobe "$1" } + +# parameter: size of live image +# calls emergency shell if ram size is too small for the image +check_live_ram() { + minmem=$(getarg rd.minmem) + minmem=${minmem:-1024} + imgsize=$1 + memsize=$(($(sed -n 's/MemTotal: *\([[:digit:]]*\).*/\1/p' /proc/meminfo) / 1024)) + + if [ -z "$imgsize" ]; then + warn "Image size could not be determined" + return 0 + fi + + if [ $((memsize - imgsize)) -lt "$minmem" ]; then + sed -i "N;/and attach it to a bug report./s/echo$/echo\n\ + echo \n\ + echo 'Warning!!!'\n\ + echo 'The memory size of your system is too small for this live image.'\n\ + echo 'Expect killed processes due to out of memory conditions.'\n\ + echo \n/" /usr/bin/dracut-emergency + + emergency_shell + fi +}