Browse Source
In the case a boot shim is found on the boot partition, we do keep the boot partition pristine, and only install the generated mender `grub.cfg` file we need. In all other cases, we fall back to the old functionality of installing mender-grub and nuking the existing bootloader. Changelog: commit Signed-off-by: Ole Petter <ole.orhagen@northern.tech>change-dependabot-prefix
3 changed files with 161 additions and 97 deletions
@ -0,0 +1,144 @@ |
|||
#!/usr/bin/env bash |
|||
# |
|||
# Copyright 2022 Northern.tech AS |
|||
# |
|||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|||
# you may not use this file except in compliance with the License. |
|||
# You may obtain a copy of the License at |
|||
# |
|||
# http://www.apache.org/licenses/LICENSE-2.0 |
|||
# |
|||
# Unless required by applicable law or agreed to in writing, software |
|||
# distributed under the License is distributed on an "AS IS" BASIS, |
|||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
# See the License for the specific language governing permissions and |
|||
# limitations under the License. |
|||
|
|||
# grub_create_grub_config |
|||
# |
|||
# |
|||
function grub_create_grub_config() { |
|||
|
|||
run_and_log_cmd "wget -Nq '${MENDER_GRUBENV_URL}' -P work/" |
|||
run_and_log_cmd "tar xzvf work/${MENDER_GRUBENV_VERSION}.tar.gz -C work/" |
|||
|
|||
cat <<- EOF > work/grub-mender-grubenv-${MENDER_GRUBENV_VERSION}/mender_grubenv_defines |
|||
mender_rootfsa_part=${MENDER_ROOTFS_PART_A_NUMBER} |
|||
mender_rootfsb_part=${MENDER_ROOTFS_PART_B_NUMBER} |
|||
mender_grub_storage_device=${MENDER_GRUB_STORAGE_DEVICE} |
|||
kernel_imagetype=kernel |
|||
initrd_imagetype=initrd |
|||
EOF |
|||
|
|||
# For partuuid support grub.cfg expects dedicated variables to be added |
|||
if [ "${MENDER_ENABLE_PARTUUID}" == "y" ]; then |
|||
rootfsa_partuuid=$(disk_get_partuuid_from_device "${root_part_a_device}") |
|||
rootfsb_partuuid=$(disk_get_partuuid_from_device "${root_part_b_device}") |
|||
log_info "Using root partition A partuuid in grubenv: $rootfsa_partuuid" |
|||
log_info "Using root partition B partuuid in grubenv: $rootfsb_partuuid" |
|||
cat <<- EOF >> work/grub-mender-grubenv-${MENDER_GRUBENV_VERSION}/mender_grubenv_defines |
|||
mender_rootfsa_uuid=${rootfsa_partuuid} |
|||
mender_rootfsb_uuid=${rootfsb_partuuid} |
|||
EOF |
|||
else |
|||
cat <<- EOF >> work/grub-mender-grubenv-${MENDER_GRUBENV_VERSION}/mender_grubenv_defines |
|||
mender_kernel_root_base=${MENDER_STORAGE_DEVICE_BASE} |
|||
EOF |
|||
fi |
|||
|
|||
if [ -n "${MENDER_GRUB_KERNEL_BOOT_ARGS}" ]; then |
|||
cat <<- EOF > work/grub-mender-grubenv-${MENDER_GRUBENV_VERSION}/11_bootargs_grub.cfg |
|||
set bootargs="${MENDER_GRUB_KERNEL_BOOT_ARGS}" |
|||
EOF |
|||
fi |
|||
|
|||
( |
|||
cd work/grub-mender-grubenv-${MENDER_GRUBENV_VERSION} |
|||
run_and_log_cmd "make 2>&1" |
|||
run_and_log_cmd "sudo make DESTDIR=../ BOOT_DIR=boot install-boot-files" |
|||
run_and_log_cmd "sudo make DESTDIR=../rootfs install-tools" |
|||
) |
|||
|
|||
} |
|||
|
|||
# grub_install_grub_editenv_binary |
|||
# |
|||
# Install the editenv binary |
|||
function grub_install_grub_editenv_binary() { |
|||
log_info "Installing the GRUB editenv binary" |
|||
|
|||
arch=$(probe_arch) |
|||
|
|||
run_and_log_cmd "wget -Nq ${MENDER_GRUB_BINARY_STORAGE_URL}/${arch}/grub-editenv -P work/" |
|||
run_and_log_cmd "sudo install -m 751 work/grub-editenv work/rootfs/usr/bin/" |
|||
|
|||
} |
|||
|
|||
# grub_install_with_shim_present |
|||
# |
|||
# Keep the existing boot shim, and bootloader, and only install the mender-grub |
|||
# config |
|||
function grub_install_with_shim_present() { |
|||
|
|||
grub_create_grub_config |
|||
|
|||
grub_install_grub_editenv_binary |
|||
|
|||
} |
|||
|
|||
# grub_install_mender_grub |
|||
# |
|||
# Install mender-grub on the converted boot partition |
|||
function grub_install_mender_grub() { |
|||
kernel_imagetype=${MENDER_GRUB_KERNEL_IMAGETYPE:-$(probe_kernel_in_boot_and_root)} |
|||
initrd_imagetype=${MENDER_GRUB_INITRD_IMAGETYPE:-$(probe_initrd_in_boot_and_root)} |
|||
|
|||
run_and_log_cmd "sudo ln -s ${kernel_imagetype} work/rootfs/boot/kernel" |
|||
if [ "${initrd_imagetype}" != "" ]; then |
|||
run_and_log_cmd "sudo ln -s ${initrd_imagetype} work/rootfs/boot/initrd" |
|||
fi |
|||
|
|||
log_info "Generating the mender-grub config..." |
|||
grub_create_grub_config |
|||
|
|||
# Remove conflicting boot files. These files do not necessarily effect the |
|||
# functionality, but lets get rid of them to avoid confusion. |
|||
# |
|||
# There is no Mender integration for EFI boot or systemd-boot. |
|||
sudo rm -rf work/boot/loader work/rootfs/boot/loader |
|||
sudo rm -rf work/boot/EFI/Linux |
|||
sudo rm -rf work/boot/EFI/systemd |
|||
sudo rm -rf work/boot/NvVars |
|||
for empty_dir in $( |
|||
cd work/boot && find . -maxdepth 1 -type d -empty |
|||
); do |
|||
sudo rmdir work/boot/$empty_dir |
|||
done |
|||
|
|||
log_info "Installing GRUB..." |
|||
|
|||
log_info "Installing mender-grub-editenv" |
|||
grub_install_grub_editenv_binary |
|||
|
|||
local -r arch=$(probe_arch) |
|||
local -r efi_name=$(probe_grub_efi_name) |
|||
local -r efi_target_name=$(probe_grub_efi_target_name) |
|||
|
|||
log_info "GRUB EFI: ${efi_target_name}" |
|||
|
|||
run_and_log_cmd "wget -Nq ${MENDER_GRUB_BINARY_STORAGE_URL}/${arch}/${efi_name} -P work/" |
|||
run_and_log_cmd "sudo mkdir -p work/boot/EFI/BOOT" |
|||
run_and_log_cmd "sudo cp work/${efi_name} -P work/boot/EFI/BOOT/${efi_target_name}" |
|||
|
|||
# Copy dtb directory to the boot partition for use by the bootloader. |
|||
if [ -d work/rootfs/boot/dtbs ]; then |
|||
# Look for the first directory that has dtb files. First check the base |
|||
# folder, then any subfolders in versioned order. |
|||
for candidate in work/rootfs/boot/dtbs $(find work/rootfs/boot/dtbs/ -maxdepth 1 -type d | sort -V -r); do |
|||
if [ $(find $candidate -maxdepth 1 -name '*.dtb' | wc -l) -gt 0 ]; then |
|||
run_and_log_cmd "sudo cp -r $candidate work/boot/dtb" |
|||
break |
|||
fi |
|||
done |
|||
fi |
|||
} |
Loading…
Reference in new issue