feat(dracut.sh): add "--enhanced-cpio" option for calling dracut-cpio
The new dracut-cpio binary is capable of performing copy-on-write optimized initramfs archive creation, but due to the rust dependency isn't built / installed by default. This change adds a new "--enhanced-cpio" parameter for dracut which sees dracut-cpio called for archive creation instead of GNU cpio. Signed-off-by: David Disseldorp <ddiss@suse.de>master
parent
51d21c6b37
commit
afe4a6dbb7
95
dracut.sh
95
dracut.sh
|
@ -226,6 +226,7 @@ Creates initial ramdisk images for preloading modules
|
||||||
otherwise you will not be able to boot.
|
otherwise you will not be able to boot.
|
||||||
--no-compress Do not compress the generated initramfs. This will
|
--no-compress Do not compress the generated initramfs. This will
|
||||||
override any other compression options.
|
override any other compression options.
|
||||||
|
--enhanced-cpio Attempt to reflink cpio file data using dracut-cpio.
|
||||||
--list-modules List all available dracut modules.
|
--list-modules List all available dracut modules.
|
||||||
-M, --show-modules Print included module's name to standard output during
|
-M, --show-modules Print included module's name to standard output during
|
||||||
build.
|
build.
|
||||||
|
@ -412,6 +413,7 @@ rearrange_params() {
|
||||||
--long zstd \
|
--long zstd \
|
||||||
--long no-compress \
|
--long no-compress \
|
||||||
--long gzip \
|
--long gzip \
|
||||||
|
--long enhanced-cpio \
|
||||||
--long list-modules \
|
--long list-modules \
|
||||||
--long show-modules \
|
--long show-modules \
|
||||||
--long keep \
|
--long keep \
|
||||||
|
@ -770,6 +772,7 @@ while :; do
|
||||||
--zstd) compress_l="zstd" ;;
|
--zstd) compress_l="zstd" ;;
|
||||||
--no-compress) _no_compress_l="cat" ;;
|
--no-compress) _no_compress_l="cat" ;;
|
||||||
--gzip) compress_l="gzip" ;;
|
--gzip) compress_l="gzip" ;;
|
||||||
|
--enhanced-cpio) enhanced_cpio_l="yes" ;;
|
||||||
--list-modules) do_list="yes" ;;
|
--list-modules) do_list="yes" ;;
|
||||||
-M | --show-modules)
|
-M | --show-modules)
|
||||||
show_modules_l="yes"
|
show_modules_l="yes"
|
||||||
|
@ -982,6 +985,7 @@ stdloglvl=$((stdloglvl + verbosity_mod_l))
|
||||||
[[ $tmpdir ]] || tmpdir="$dracutsysrootdir"/var/tmp
|
[[ $tmpdir ]] || tmpdir="$dracutsysrootdir"/var/tmp
|
||||||
[[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
|
[[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
|
||||||
[[ $compress_l ]] && compress=$compress_l
|
[[ $compress_l ]] && compress=$compress_l
|
||||||
|
[[ $enhanced_cpio_l ]] && enhanced_cpio=$enhanced_cpio_l
|
||||||
[[ $show_modules_l ]] && show_modules=$show_modules_l
|
[[ $show_modules_l ]] && show_modules=$show_modules_l
|
||||||
[[ $nofscks_l ]] && nofscks="yes"
|
[[ $nofscks_l ]] && nofscks="yes"
|
||||||
[[ $ro_mnt_l ]] && ro_mnt="yes"
|
[[ $ro_mnt_l ]] && ro_mnt="yes"
|
||||||
|
@ -1188,6 +1192,19 @@ else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $enhanced_cpio == "yes" ]]; then
|
||||||
|
enhanced_cpio="$dracutbasedir/dracut-cpio"
|
||||||
|
if [[ -x $enhanced_cpio ]]; then
|
||||||
|
# align based on statfs optimal transfer size
|
||||||
|
cpio_align=$(stat --file-system -c "%s" -- "$initdir")
|
||||||
|
else
|
||||||
|
dinfo "--enhanced-cpio ignored due to lack of dracut-cpio"
|
||||||
|
unset enhanced_cpio
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
unset enhanced_cpio
|
||||||
|
fi
|
||||||
|
|
||||||
# shellcheck disable=SC2154
|
# shellcheck disable=SC2154
|
||||||
if [[ $no_kernel != yes ]] && ! [[ -d $srcmods ]]; then
|
if [[ $no_kernel != yes ]] && ! [[ -d $srcmods ]]; then
|
||||||
printf "%s\n" "dracut: Cannot find module directory $srcmods" >&2
|
printf "%s\n" "dracut: Cannot find module directory $srcmods" >&2
|
||||||
|
@ -2252,6 +2269,8 @@ if dracut_module_included "squash"; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $do_strip == yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
|
if [[ $do_strip == yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
|
||||||
|
# stripping files negates (dedup) benefits of using reflink
|
||||||
|
[[ -n $enhanced_cpio ]] && ddebug "strip is enabled alongside cpio reflink"
|
||||||
dinfo "*** Stripping files ***"
|
dinfo "*** Stripping files ***"
|
||||||
find "$initdir" -type f \
|
find "$initdir" -type f \
|
||||||
-executable -not -path '*/lib/modules/*.ko' -print0 \
|
-executable -not -path '*/lib/modules/*.ko' -print0 \
|
||||||
|
@ -2322,15 +2341,29 @@ if [[ $create_early_cpio == yes ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# The microcode blob is _before_ the initramfs blob, not after
|
# The microcode blob is _before_ the initramfs blob, not after
|
||||||
if ! (
|
if [[ -n $enhanced_cpio ]]; then
|
||||||
umask 077
|
if ! (
|
||||||
cd "$early_cpio_dir/d"
|
umask 077
|
||||||
find . -print0 | sort -z \
|
cd "$early_cpio_dir/d"
|
||||||
| cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null \
|
find . -print0 | sort -z \
|
||||||
${cpio_owner:+-R "$cpio_owner"} -H newc -o --quiet > "${DRACUT_TMPDIR}/initramfs.img"
|
| $enhanced_cpio --null ${cpio_owner:+--owner "$cpio_owner"} \
|
||||||
); then
|
--mtime 0 --data-align "$cpio_align" --truncate-existing \
|
||||||
dfatal "dracut: creation of $outfile failed"
|
"${DRACUT_TMPDIR}/initramfs.img"
|
||||||
exit 1
|
); then
|
||||||
|
dfatal "dracut-cpio: creation of $outfile failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if ! (
|
||||||
|
umask 077
|
||||||
|
cd "$early_cpio_dir/d"
|
||||||
|
find . -print0 | sort -z \
|
||||||
|
| cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null \
|
||||||
|
${cpio_owner:+-R "$cpio_owner"} -H newc -o --quiet > "${DRACUT_TMPDIR}/initramfs.img"
|
||||||
|
); then
|
||||||
|
dfatal "dracut: creation of $outfile failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -2386,15 +2419,41 @@ if [[ $compress == $DRACUT_COMPRESS_ZSTD* ]] && ! check_kernel_config CONFIG_RD_
|
||||||
compress="cat"
|
compress="cat"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! (
|
if [[ -n $enhanced_cpio ]]; then
|
||||||
umask 077
|
if [[ $compress == "cat" ]]; then
|
||||||
cd "$initdir"
|
# dracut-cpio appends by default, so any ucode remains
|
||||||
find . -print0 | sort -z \
|
cpio_outfile="${DRACUT_TMPDIR}/initramfs.img"
|
||||||
| cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null ${cpio_owner:+-R "$cpio_owner"} -H newc -o --quiet \
|
else
|
||||||
| $compress >> "${DRACUT_TMPDIR}/initramfs.img"
|
ddebug "$compress compression enabled alongside cpio reflink"
|
||||||
); then
|
# dracut-cpio doesn't output to stdout, so stage for compression
|
||||||
dfatal "dracut: creation of $outfile failed"
|
cpio_outfile="${DRACUT_TMPDIR}/initramfs.img.uncompressed"
|
||||||
exit 1
|
fi
|
||||||
|
|
||||||
|
if ! (
|
||||||
|
umask 077
|
||||||
|
cd "$initdir"
|
||||||
|
find . -print0 | sort -z \
|
||||||
|
| $enhanced_cpio --null ${cpio_owner:+--owner "$cpio_owner"} \
|
||||||
|
--mtime 0 --data-align "$cpio_align" "$cpio_outfile" || exit 1
|
||||||
|
[[ $compress == "cat" ]] && exit 0
|
||||||
|
$compress < "$cpio_outfile" >> "${DRACUT_TMPDIR}/initramfs.img" \
|
||||||
|
&& rm "$cpio_outfile"
|
||||||
|
); then
|
||||||
|
dfatal "dracut-cpio: creation of $outfile failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
unset cpio_outfile
|
||||||
|
else
|
||||||
|
if ! (
|
||||||
|
umask 077
|
||||||
|
cd "$initdir"
|
||||||
|
find . -print0 | sort -z \
|
||||||
|
| cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null ${cpio_owner:+-R "$cpio_owner"} -H newc -o --quiet \
|
||||||
|
| $compress >> "${DRACUT_TMPDIR}/initramfs.img"
|
||||||
|
); then
|
||||||
|
dfatal "dracut: creation of $outfile failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# shellcheck disable=SC2154
|
# shellcheck disable=SC2154
|
||||||
|
|
|
@ -530,6 +530,15 @@ will not be able to boot.
|
||||||
Specifies the kernel image, which to include in the UEFI executable. The default is
|
Specifies the kernel image, which to include in the UEFI executable. The default is
|
||||||
_/lib/modules/<KERNEL-VERSION>/vmlinuz_ or _/boot/vmlinuz-<KERNEL-VERSION>_
|
_/lib/modules/<KERNEL-VERSION>/vmlinuz_ or _/boot/vmlinuz-<KERNEL-VERSION>_
|
||||||
|
|
||||||
|
**--enhanced-cpio**::
|
||||||
|
Attempt to use the dracut-cpio binary, which optimizes archive creation for
|
||||||
|
copy-on-write filesystems by using the copy_file_range(2) syscall via Rust's
|
||||||
|
io::copy(). When specified, initramfs archives are also padded to ensure
|
||||||
|
optimal data alignment for extent sharing. To retain reflink data
|
||||||
|
deduplication benefits, this should be used alongside the **--no-compress**
|
||||||
|
and **--no-strip** parameters, with initramfs source files, **--tmpdir**
|
||||||
|
staging area and destination all on the same copy-on-write capable filesystem.
|
||||||
|
|
||||||
ENVIRONMENT
|
ENVIRONMENT
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,8 @@ _dracut() {
|
||||||
--local --hostonly --no-hostonly --fstab --help --bzip2 --lzma
|
--local --hostonly --no-hostonly --fstab --help --bzip2 --lzma
|
||||||
--xz --zstd --no-compress --gzip --list-modules --show-modules --keep
|
--xz --zstd --no-compress --gzip --list-modules --show-modules --keep
|
||||||
--printsize --regenerate-all --noimageifnotneeded --early-microcode
|
--printsize --regenerate-all --noimageifnotneeded --early-microcode
|
||||||
--no-early-microcode --print-cmdline --reproducible --uefi'
|
--no-early-microcode --print-cmdline --reproducible --uefi
|
||||||
|
--enhanced-cpio'
|
||||||
[ARG]='-a -m -o -d -I -k -c -L --kver --add --force-add --add-drivers
|
[ARG]='-a -m -o -d -I -k -c -L --kver --add --force-add --add-drivers
|
||||||
--omit-drivers --modules --omit --drivers --filesystems --install
|
--omit-drivers --modules --omit --drivers --filesystems --install
|
||||||
--fwdir --libdirs --fscks --add-fstab --mount --device --nofscks
|
--fwdir --libdirs --fscks --add-fstab --mount --device --nofscks
|
||||||
|
|
Loading…
Reference in New Issue