diff options
author | torben | 2016-03-10 17:52:08 +0100 |
---|---|---|
committer | torben | 2016-03-10 17:52:08 +0100 |
commit | 5f3702c0f7b3b1ca1518852f1cba9f11b06f11f4 (patch) | |
tree | 0f25c21c28d0d2db2db20ac6a6747e89843ec5e4 /builder/build-initramfs.sh | |
parent | Sync (diff) | |
download | systemd-init-5f3702c0f7b3b1ca1518852f1cba9f11b06f11f4.tar.gz systemd-init-5f3702c0f7b3b1ca1518852f1cba9f11b06f11f4.tar.xz systemd-init-5f3702c0f7b3b1ca1518852f1cba9f11b06f11f4.zip |
Improve.
Diffstat (limited to 'builder/build-initramfs.sh')
-rwxr-xr-x | builder/build-initramfs.sh | 305 |
1 files changed, 159 insertions, 146 deletions
diff --git a/builder/build-initramfs.sh b/builder/build-initramfs.sh index 846663a4..1adcf7ca 100755 --- a/builder/build-initramfs.sh +++ b/builder/build-initramfs.sh @@ -50,12 +50,12 @@ set +o errexit ## endregion source "$(dirname "${BASH_SOURCE[0]}")/dnbd3-rootfs/scripts/rebash/core.sh" core.import exceptions -exceptions.activate core.import logging core.import utils core.import change_root # endregion # region properties +build_initramfs__doc_test_setup__='exceptions.activate' dracut_resource_url='https://www.kernel.org/pub/linux/utils/boot/dracut/dracut-043.tar.gz' file_path='/boot/initramfs.img' dracut_parameter='--force --no-hostonly' @@ -413,159 +413,172 @@ cleanup() { ## endregion # endregion # region controller -result=0 -if ! [ -f "/lib/modules/$(uname --kernel-release)/build/Makefile" ];then - logging.critical 'Missing core dependency "linux-headers" to compile against given or current kernel.' -fi -dependency_check core dependencies utils_dependency_check program || \ - result=$? -dependency_check core shared_library_pattern_dependencies \ - utils_dependency_check_shared_library 'shared library' || result=$? -dependency_check core package_dependencies utils_dependency_check_pkgconfig \ - package || result=$? -[[ $result == 0 ]] || exit $result - -logging.set_commands_level debug -logging.set_level critical - -if ! parse_command_line "$@"; then - print_help_message "$0" - exit 1 -fi +main() { + local __doc__=' + Main Entry point for the build initramfs logic. Triggers command line + parsing and calls sub routines depending on given command line arguments. -dependency_check optional dependencies utils_dependency_check program || \ - result=$? -dependency_check optional shared_library_pattern_dependencies \ - utils_dependency_check_shared_library 'shared library' || result=$? -dependency_check optional package_dependencies \ - utils_dependency_check_pkgconfig package || result=$? -[[ $result == 1 ]] && exit $result -## region handle delegated operations to specified target -if [[ "$target" != '' ]]; then - _target="$target" - if [[ -f "$target" ]]; then - _target="$(mktemp --directory)" - _xmount_mountpoint_target="$(mktemp --directory)" - xmount --in qemu "$target" --out raw "$_xmount_mountpoint_target" - _xmount_device_target="$(losetup --find)" - losetup "$_xmount_device_target" loopdev \ - "${_xmount_mountpoint_target}/"*.dd - mount "$_xmount_device_target" "$_target" + Example: + + `main` + ' + exceptions.activate + # region dependency checks and command line parsing + result=0 + if ! [ -f "/lib/modules/$(uname --kernel-release)/build/Makefile" ]; then + logging.critical 'Missing core dependency "linux-headers" to compile against given or current kernel.' fi - if [[ -d "$_target" ]]; then - _temporary_working_directory="$(chroot "$_target" mktemp --directory)" - mount --bind "$(pwd)" "${_target}${_temporary_working_directory}" - _parameter_skip=false - _parameter_to_forward=() - for _parameter; do - if $_parameter_skip; then - _parameter_skip=false - elif [[ "$_parameter" == '-t' ]] || \ - [[ "$_parameter" == '--target' ]] - then - _parameter_skip=true - else - _parameter_to_forward+=("$_parameter") - fi - done - # NOTE: We would have to temporary patch dracut to avoid removing the - # environment variables "LD_LIBRARY_PATH" and "LD_PRELOAD" to get - # "fakechroot" working with dracut. So we should remove this variables - # before running the patched dracut version to follow the initial - # intention. You should first do: - # >>> unset LD_LIBRARY_PATH - # >>> unset LD_PRELOAD - # and patch "dracut.sh" temporary to comment out: - # >>> unset LD_LIBRARY_PATH - # >>> unset LD_PRELOAD - # To avoid to broke the "fakechroot" environment pipe the ldconfig call - # to the native one: - # >>> FAKECHROOT_CMD_SUBST=/usr/bin/ldconfig=/usr/bin/ldconfig - change_root "${_target}" \ - "${_temporary_working_directory}/${BASH_SOURCE[0]}" \ - ${_parameter_to_forward[*]} - mv "${_target}/$file_path" "$file_path" - # Do cleanup procedures. - umount "${_target}${_temporary_working_directory}" - rm --recursive --force "${_target}${_temporary_working_directory}" + dependency_check core dependencies utils_dependency_check program || \ + result=$? + dependency_check core shared_library_pattern_dependencies \ + utils_dependency_check_shared_library 'shared library' || result=$? + dependency_check core package_dependencies utils_dependency_check_pkgconfig \ + package || result=$? + [[ $result == 0 ]] || exit $result + + logging.set_commands_level debug + logging.set_level critical + + if ! parse_command_line "$@"; then + print_help_message "$0" + exit 1 + fi + + dependency_check optional dependencies utils_dependency_check program || \ + result=$? + dependency_check optional shared_library_pattern_dependencies \ + utils_dependency_check_shared_library 'shared library' || result=$? + dependency_check optional package_dependencies \ + utils_dependency_check_pkgconfig package || result=$? + [[ $result == 1 ]] && exit $result + # endregion + # region handle delegated operations to specified target + if [[ "$target" != '' ]]; then + _target="$target" if [[ -f "$target" ]]; then - umount "$_target" - losetup --detach "$_xmount_device_target" - umount "$_xmount_mountpoint_target" - rm --recursive --force "$_target" "$_xmount_mountpoint_target" + _target="$(mktemp --directory)" + _xmount_mountpoint_target="$(mktemp --directory)" + xmount --in qemu "$target" --out raw "$_xmount_mountpoint_target" + _xmount_device_target="$(losetup --find)" + losetup "$_xmount_device_target" loopdev \ + "${_xmount_mountpoint_target}/"*.dd + mount "$_xmount_device_target" "$_target" fi + if [[ -d "$_target" ]]; then + _temporary_working_directory="$(chroot "$_target" mktemp --directory)" + mount --bind "$(pwd)" "${_target}${_temporary_working_directory}" + _parameter_skip=false + _parameter_to_forward=() + for _parameter; do + if $_parameter_skip; then + _parameter_skip=false + elif [[ "$_parameter" == '-t' ]] || \ + [[ "$_parameter" == '--target' ]] + then + _parameter_skip=true + else + _parameter_to_forward+=("$_parameter") + fi + done + # NOTE: We would have to temporary patch dracut to avoid removing the + # environment variables "LD_LIBRARY_PATH" and "LD_PRELOAD" to get + # "fakechroot" working with dracut. So we should remove this variables + # before running the patched dracut version to follow the initial + # intention. You should first do: + # >>> unset LD_LIBRARY_PATH + # >>> unset LD_PRELOAD + # and patch "dracut.sh" temporary to comment out: + # >>> unset LD_LIBRARY_PATH + # >>> unset LD_PRELOAD + # To avoid to broke the "fakechroot" environment pipe the ldconfig call + # to the native one: + # >>> FAKECHROOT_CMD_SUBST=/usr/bin/ldconfig=/usr/bin/ldconfig + change_root "${_target}" \ + "${_temporary_working_directory}/${BASH_SOURCE[0]}" \ + ${_parameter_to_forward[*]} + mv "${_target}/$file_path" "$file_path" + # Do cleanup procedures. + umount "${_target}${_temporary_working_directory}" + rm --recursive --force "${_target}${_temporary_working_directory}" + if [[ -f "$target" ]]; then + umount "$_target" + losetup --detach "$_xmount_device_target" + umount "$_xmount_mountpoint_target" + rm --recursive --force "$_target" "$_xmount_mountpoint_target" + fi + fi + exit 0 + fi + # endregion + # region handle dependencies which can be resolved automatically + logging.info 'Checking dracut.' + if [[ ! -f "$(dirname "${BASH_SOURCE[0]}")/dracut/dracut-install" ]]; then + logging.info "Dracut isn't available yet loading it." + initialize_dracut fi - exit 0 -fi -## endregion -## region handle dependencies which can be resolved automatically -logging.info 'Checking dracut.' -if [[ ! -f "$(dirname "${BASH_SOURCE[0]}")/dracut/dracut-install" ]]; then - logging.info "Dracut isn't available yet loading it." - initialize_dracut -fi -_dracut_modules_source='../../dnbd3-rootfs' -_dracut_modules_target="$(dirname "${BASH_SOURCE[0]}")/dracut/modules.d/90dnbd3-rootfs" -if [[ ! -L "$_dracut_modules_target" || "$(readlink \ - "$_dracut_modules_target")" != "$_dracut_modules_source" ]] -then - logging.info \ - "Link dnbd3 plugin into dracut modules folder ($_dracut_modules_source -> $_dracut_modules_target)." - if ! ln --symbolic --force "$_dracut_modules_source" \ - "$_dracut_modules_target" 2>/dev/null; then - logging.warn \ - "Link \"$_dracut_modules_source\" to \"$_dracut_modules_target\" fails. We will copy them. So we have to recopy it every time to ensure that recompiled things take effect." - cp --recursive --force --no-target-directory \ - "$(dirname "${BASH_SOURCE[0]}")/$(basename "$_dracut_modules_source")" \ - "$_dracut_modules_target" + _dracut_modules_source='../../dnbd3-rootfs' + _dracut_modules_target="$(dirname "${BASH_SOURCE[0]}")/dracut/modules.d/90dnbd3-rootfs" + if [[ ! -L "$_dracut_modules_target" || "$(readlink \ + "$_dracut_modules_target")" != "$_dracut_modules_source" ]] + then + logging.info \ + "Link dnbd3 plugin into dracut modules folder ($_dracut_modules_source -> $_dracut_modules_target)." + if ! ln --symbolic --force "$_dracut_modules_source" \ + "$_dracut_modules_target" 2>/dev/null; then + logging.warn \ + "Link \"$_dracut_modules_source\" to \"$_dracut_modules_target\" fails. We will copy them. So we have to recopy it every time to ensure that recompiled things take effect." + cp --recursive --force --no-target-directory \ + "$(dirname "${BASH_SOURCE[0]}")/$(basename "$_dracut_modules_source")" \ + "$_dracut_modules_target" + fi fi -fi -## endregion -## region prepare and perform final dracut call -_loglevel='' -if [ "$verbose" == 'yes' ]; then - _loglevel='--verbose' -fi -_modules='dnbd3-rootfs' -if [ "$debug" == 'yes' ]; then - _loglevel="$_loglevel --stdlog 4" - _modules="$_modules i18n terminfo" -fi -if [ "$use_systemd_in_initramfs" == 'yes' ]; then - _modules="$_modules systemd systemd-initrd dracut-systemd" -fi -if [[ "$full_cleanup" == 'yes' ]]; then - logging.info 'Removing all modules.' - rm "$(dirname "${BASH_SOURCE[0]}")/dnbd3-rootfs" \ - "$(dirname "${BASH_SOURCE[0]}")/dracut" --recursive --force -elif [[ "$cleanup" == 'yes' ]]; then - logging.info 'Removing distribution specific files.' - cleanup -else - logging.info 'Build initramfs.' - # NOTE: We deactivate our exception handle since dracut returns "1" if it - # is launched with help parameter ("-h" or "--help"). - exceptions.deactivate - # NOTE: We temporary allow dracut to forward all messages since we forward - # all logging configurations. - _commands_log_level_backup="$(logging.get_commands_level)" - _log_level_backup="$(logging.get_level)" - logging.set_level debug - logging.set_commands_level debug - "$(dirname "${BASH_SOURCE[0]}")/dracut/dracut.sh" --local \ - $_loglevel --modules "$_modules" ${dracut_parameter[*]} "$file_path" - _return_code=$? - logging.set_commands_level "$_commands_log_level_backup" - logging.set_level "$_log_level_backup" - if [[ "$_return_code" != 0 ]]; then - logging.error 'Building initial ram file system fails.' - exit 1 + # endregion + # region prepare and perform final dracut call + _loglevel='' + if [ "$verbose" == 'yes' ]; then + _loglevel='--verbose' fi - exceptions.activate -fi -exceptions.deactivate -## endregion + _modules='dnbd3-rootfs' + if [ "$debug" == 'yes' ]; then + _loglevel="$_loglevel --stdlog 4" + _modules="$_modules i18n terminfo" + fi + if [ "$use_systemd_in_initramfs" == 'yes' ]; then + _modules="$_modules systemd systemd-initrd dracut-systemd" + fi + if [[ "$full_cleanup" == 'yes' ]]; then + logging.info 'Removing all modules.' + rm "$(dirname "${BASH_SOURCE[0]}")/dnbd3-rootfs" \ + "$(dirname "${BASH_SOURCE[0]}")/dracut" --recursive --force + elif [[ "$cleanup" == 'yes' ]]; then + logging.info 'Removing distribution specific files.' + cleanup + else + logging.info 'Build initramfs.' + # NOTE: We deactivate our exception handle since dracut returns "1" if it + # is launched with help parameter ("-h" or "--help"). + exceptions.deactivate + # NOTE: We temporary allow dracut to forward all messages since we forward + # all logging configurations. + _commands_log_level_backup="$(logging.get_commands_level)" + _log_level_backup="$(logging.get_level)" + logging.set_level debug + logging.set_commands_level debug + "$(dirname "${BASH_SOURCE[0]}")/dracut/dracut.sh" --local \ + $_loglevel --modules "$_modules" ${dracut_parameter[*]} "$file_path" + _return_code=$? + logging.set_commands_level "$_commands_log_level_backup" + logging.set_level "$_log_level_backup" + if [[ "$_return_code" != 0 ]]; then + logging.error 'Building initial ram file system fails.' + exit 1 + fi + exceptions.activate + fi + # endregion + exceptions.deactivate +} # endregion # region vim modline # vim: set tabstop=4 shiftwidth=4 expandtab: |