From 67df6700d8d4f313da15001eaaa491c1a2b27f12 Mon Sep 17 00:00:00 2001 From: Kairui Song Date: Dec 10 2020 10:20:58 +0000 Subject: squash: also squash systemctl if switch-root is not needed systemctl need to be accessible on switch-root, but we unmount the squash image on switch-root, so it will fail. systemctl depends on a lot of libraries, squash them can save more RAM. So allow modules (eg. kdump) to tell dracut that switch-root will be intercepted, then we don't need to take care of that. Signed-off-by: Kairui Song (cherry picked from commit 3ee0ca5eb74be5d1fbd0e6d643f6fff06234177f) Resolves: #1691705 patch_name: 0020.patch present_in_specfile: true location_in_specfile: 20 squash_commits: true --- diff --git a/dracut-init.sh b/dracut-init.sh index 50d23e2..b1ac996 100644 --- a/dracut-init.sh +++ b/dracut-init.sh @@ -150,6 +150,10 @@ dracut_module_included() { [[ " $mods_to_load $modules_loaded " == *\ $*\ * ]] } +dracut_no_switch_root() { + >"$initdir/lib/dracut/no-switch-root" +} + if ! [[ $DRACUT_INSTALL ]]; then DRACUT_INSTALL=$(find_binary dracut-install) fi diff --git a/dracut.sh b/dracut.sh index 6de88b3..8144a16 100755 --- a/dracut.sh +++ b/dracut.sh @@ -1772,24 +1772,6 @@ if dracut_module_included "squash"; then mv $initdir/$folder $squash_dir/$folder done - # Reinstall required files for the squash image setup script. - # We have moved them inside the squashed image, but they need to be - # accessible before mounting the image. Also install systemctl, - # it's requires for switch-root, but we will umount the image before switch-root - inst_multiple "echo" "sh" "mount" "modprobe" "mkdir" "systemctl" - hostonly="" instmods "loop" "squashfs" "overlay" - - for folder in "${squash_candidate[@]}"; do - # Remove duplicated files in squashfs image, save some more space - [[ ! -d $initdir/$folder/ ]] && continue - for file in $(find $initdir/$folder/ -not -type d); - do - if [[ -e $squash_dir${file#$initdir} ]]; then - mv $squash_dir${file#$initdir} $file - fi - done - done - # Move some files out side of the squash image, including: # - Files required to boot and mount the squashfs image # - Files need to be accessable without mounting the squash image @@ -1851,6 +1833,28 @@ if dracut_module_included "squash"; then ln -s squash/init.sh $initdir/init ln -s squash/shutdown.sh $initdir/shutdown + # Reinstall required files for the squash image setup script. + # We have moved them inside the squashed image, but they need to be + # accessible before mounting the image. + inst_multiple "echo" "sh" "mount" "modprobe" "mkdir" + hostonly="" instmods "loop" "squashfs" "overlay" + + # Only keep systemctl outsite if we need switch root + if [[ ! -f "$initdir/lib/dracut/no-switch-root" ]]; then + inst "systemctl" + fi + + for folder in "${squash_candidate[@]}"; do + # Remove duplicated files in squashfs image, save some more space + [[ ! -d $initdir/$folder/ ]] && continue + for file in $(find $initdir/$folder/ -not -type d); + do + if [[ -e $squash_dir${file#$initdir} ]]; then + mv $squash_dir${file#$initdir} $file + fi + done + done + mksquashfs $squash_dir $squash_img -comp xz -b 64K -Xdict-size 100% &> /dev/null if [[ $? != 0 ]]; then