]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
squash: also squash systemctl if switch-root is not needed
authorKairui Song <kasong@redhat.com>
Wed, 13 Mar 2019 09:36:53 +0000 (17:36 +0800)
committerHarald Hoyer <harald@hoyer.xyz>
Fri, 19 Jul 2019 13:38:54 +0000 (15:38 +0200)
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 <kasong@redhat.com>
dracut-init.sh
dracut.sh

index 1ebafff7b96247f99896e6d9f9c1cd0aee93954f..a2dba68f425d70d2ef996eabcc82b4d534bdb415 100644 (file)
@@ -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
index f05a757b6563b139ca8dcfea9c2ac8549082c666..f2d785e55187b88c03696acf2e4a9129cfda49f1 100755 (executable)
--- 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 accessible without mounting the squash image
@@ -1849,6 +1831,28 @@ if dracut_module_included "squash"; then
     mv $initdir/init $initdir/init.stock
     ln -s squash/init.sh $initdir/init
 
+    # 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