require_binaries mksquashfs unsquashfs || return 1
for i in CONFIG_SQUASHFS CONFIG_BLK_DEV_LOOP CONFIG_OVERLAY_FS ; do
if ! check_kernel_config $i; then
dinfo "dracut-squash module requires kernel configuration $i (y or m)"
_busybox=$(find_binary busybox)
# Move everything under $initdir except $squash_dir
# itself into squash image
for i in "$initdir"/*; do
[[ "$squash_dir" == "$i"/* ]] || mv "$i" "$squash_dir"/
# Create mount points for squash loader
mkdir -p "$initdir"/squash/
mkdir -p "$squash_dir"/squash/
# Copy dracut spec files out side of the squash image
# so dracut rebuild and lsinitrd can work
mkdir -p "$initdir/usr/lib/dracut/"
for file in "$squash_dir"/usr/lib/dracut/*; do
[[ -f $file ]] || continue
cp "$file" "$initdir/${file#$squash_dir}"
# Install required modules and binaries for the squash image init script.
inst "$_busybox" /usr/bin/busybox
for _i in sh echo mount modprobe mkdir switch_root grep umount; do
ln_r /usr/bin/busybox /usr/bin/$_i
DRACUT_RESOLVE_DEPS=1 inst_multiple sh mount modprobe mkdir switch_root grep umount
# libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
inst_libdir_file -o "libgcc_s.so*"
# FIPS workaround for Fedora/RHEL: libcrypto needs libssl when FIPS is enabled
[[ $DRACUT_FIPS_MODE ]] && inst_libdir_file -o "libssl.so*"
hostonly="" instmods "loop" "squashfs" "overlay"
# Install squash image init script.
inst_simple "$moddir"/init-squash.sh /init
# make sure that library links are correct and up to date for squash loader
if [[ $DRACUT_SQUASH_POST_INST ]]; then