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:
parent
3e9f0c03d6
commit
3b3984b484
4 changed files with 55 additions and 4 deletions
|
@ -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
|
||||||
-------
|
-------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue