mkarchiso: implement configurable bootstrap tarball compression

profiledef.sh gains a new option `bootstrap_tarball_compression` which
is a bash array containing the compression program and its arguments.

Related to https://gitlab.archlinux.org/archlinux/archiso/-/issues/130.
This commit is contained in:
nl6720 2022-03-25 18:10:12 +02:00
parent 3e9f0c03d6
commit 3b3984b484
No known key found for this signature in database
GPG key ID: 6B5387E670A955AD
4 changed files with 55 additions and 4 deletions

View file

@ -9,6 +9,8 @@ Added
----- -----
- Add a man page for ``mkarchiso``. - Add a man page for ``mkarchiso``.
- Implement configurable bootstrap tarball compression. It is configured in ``profiledef.sh`` using a bash array called
``bootstrap_tarball_compression``.
Changed Changed
------- -------

View file

@ -3,7 +3,7 @@ archiso
======= =======
The archiso project features scripts and configuration templates to build installation media (*.iso* images and The archiso project features scripts and configuration templates to build installation media (*.iso* images and
*.tar.gz* bootstrap images) as well as netboot artifacts for BIOS and UEFI based systems on the x86_64 architecture. *.tar bootstrap images) as well as netboot artifacts for BIOS and UEFI based systems on the x86_64 architecture.
Currently creating the images is only supported on Arch Linux but may work on other operating systems as well. Currently creating the images is only supported on Arch Linux but may work on other operating systems as well.
Requirements Requirements

View file

@ -40,6 +40,7 @@ buildmodes=()
bootmodes=() bootmodes=()
airootfs_image_type="" airootfs_image_type=""
airootfs_image_tool_options=() airootfs_image_tool_options=()
bootstrap_tarball_compression=""
cert_list=() cert_list=()
declare -A file_permissions=() declare -A file_permissions=()
efibootimg="" efibootimg=""
@ -1356,6 +1357,32 @@ _validate_requirements_buildmode_bootstrap() {
(( validation_error=validation_error+1 )) (( validation_error=validation_error+1 ))
_msg_error "Validating build mode '${_buildmode}': bsdtar is not available on this host. Install 'libarchive'!" 0 _msg_error "Validating build mode '${_buildmode}': bsdtar is not available on this host. Install 'libarchive'!" 0
fi fi
# Check if the compressor is installed
if (( ${#bootstrap_tarball_compression[@]} )); then
case "${bootstrap_tarball_compression[0]}" in
'bzip'|'gzip'|'lrzip'|'lzip'|'lzop'|'zstd'|'zstdmt')
if ! command -v "${bootstrap_tarball_compression[0]}" &>/dev/null; then
(( validation_error=validation_error+1 ))
_msg_error "Validating build mode '${_buildmode}': '${bootstrap_tarball_compression[0]}' is not available on this host. Install '${bootstrap_tarball_compression[0]/zstdmt/zstd}'!" 0
fi
;;
'cat')
if ! command -v cat &>/dev/null; then
(( validation_error=validation_error+1 ))
_msg_error "Validating build mode '${_buildmode}': 'cat' is not available on this host. Install 'coreutils'!" 0
fi
if (( ${#bootstrap_tarball_compression[@]} > 1 )); then
(( validation_error=validation_error+1 ))
_msg_error "Validating build mode '${_buildmode}': 'cat' compression does not accept arguments!" 0
fi
;;
*)
(( validation_error=validation_error+1 ))
_msg_error "Validating build mode '${_buildmode}': '${bootstrap_tarball_compression[0]}' is not a supported compression method!" 0
;;
esac
fi
} }
_validate_common_requirements_buildmode_iso_netboot() { _validate_common_requirements_buildmode_iso_netboot() {
@ -1632,6 +1659,25 @@ _add_xorrisofs_options_uefi-x64.grub.eltorito() {
# Build bootstrap image # Build bootstrap image
_build_bootstrap_image() { _build_bootstrap_image() {
local tarball_ext
# Set default tarball compression to uncompressed
if (( ! "${#bootstrap_tarball_compression[@]}" )); then
bootstrap_tarball_compression=('cat')
fi
# Set tarball extension
case "${bootstrap_tarball_compression[0]}" in
'cat') tarball_ext='' ;;
'bzip') tarball_ext='.b2z' ;;
'gzip') tarball_ext='.gz' ;;
'lrzip') tarball_ext='.lrz' ;;
'lzip') tarball_ext='.lz' ;;
'lzop') tarball_ext='.lzo' ;;
'zstd'|'zstdmt') tarball_ext='.zst' ;;
*) _msg_error 'Unsupported compression!' 1 ;;
esac
local _bootstrap_parent local _bootstrap_parent
_bootstrap_parent="$(dirname -- "${pacstrap_dir}")" _bootstrap_parent="$(dirname -- "${pacstrap_dir}")"
@ -1640,9 +1686,10 @@ _build_bootstrap_image() {
cd -- "${_bootstrap_parent}" cd -- "${_bootstrap_parent}"
_msg_info "Creating bootstrap image..." _msg_info "Creating bootstrap image..."
bsdtar -cf - "root.${arch}" | gzip -cn9 >"${out_dir}/${image_name}" rm -f -- "${out_dir:?}/${image_name:?}${tarball_ext}"
bsdtar -cf - "root.${arch}" | "${bootstrap_tarball_compression[@]}" >"${out_dir}/${image_name}${tarball_ext}"
_msg_info "Done!" _msg_info "Done!"
du -h -- "${out_dir}/${image_name}" du -h -- "${out_dir}/${image_name}${tarball_ext}"
cd -- "${OLDPWD}" cd -- "${OLDPWD}"
} }
@ -1945,7 +1992,7 @@ _build_iso_base() {
# Build the bootstrap buildmode # Build the bootstrap buildmode
_build_buildmode_bootstrap() { _build_buildmode_bootstrap() {
local image_name="${iso_name}-bootstrap-${iso_version}-${arch}.tar.gz" local image_name="${iso_name}-bootstrap-${iso_version}-${arch}.tar"
local run_once_mode="${buildmode}" local run_once_mode="${buildmode}"
local buildmode_packages="${bootstrap_packages}" local buildmode_packages="${bootstrap_packages}"
# Set the package list to use # Set the package list to use

View file

@ -66,6 +66,8 @@ The image file is constructed from some of the variables in ``profiledef.sh``: `
- ``erofs``: Create an EROFS image for the airootfs work directory - ``erofs``: Create an EROFS image for the airootfs work directory
* ``airootfs_image_tool_options``: An array of options to pass to the tool to create the airootfs image. ``mksquashfs`` and * ``airootfs_image_tool_options``: An array of options to pass to the tool to create the airootfs image. ``mksquashfs`` and
``mkfs.erofs`` are supported. See ``mksquashfs --help`` or ``mkfs.erofs --help`` for all possible options ``mkfs.erofs`` are supported. See ``mksquashfs --help`` or ``mkfs.erofs --help`` for all possible options
* ``bootstrap_tarball_compression``: An array containing the compression program and arguments passed to it for
compressing the bootstrap tarball (defaults to ``cat``). For example: ``bootstrap_tarball_compression=(zstd -c -T0 --long -19)``.
* ``file_permissions``: An associative array that lists files and/or directories who need specific ownership or * ``file_permissions``: An associative array that lists files and/or directories who need specific ownership or
permissions. The array's keys contain the path and the value is a colon separated list of owner UID, owner GID and permissions. The array's keys contain the path and the value is a colon separated list of owner UID, owner GID and
access mode. E.g. ``file_permissions=(["/etc/shadow"]="0:0:400")``. When directories are listed with a trailing backslash (``/``) **all** files and directories contained within the listed directory will have the same owner UID, owner GID, and access mode applied recursively. access mode. E.g. ``file_permissions=(["/etc/shadow"]="0:0:400")``. When directories are listed with a trailing backslash (``/``) **all** files and directories contained within the listed directory will have the same owner UID, owner GID, and access mode applied recursively.