shimboot/build.sh

114 lines
2.9 KiB
Bash
Raw Normal View History

2023-10-02 00:47:30 -05:00
#!/bin/bash
#build the bootloader image
set -e
if [ "$DEBUG" ]; then
set -x
fi
2023-10-02 14:17:59 -05:00
. ./patch_initramfs.sh
2023-10-02 15:53:11 -05:00
. ./build_image.sh
2023-10-02 14:17:59 -05:00
2023-10-02 00:47:30 -05:00
print_help() {
2023-10-04 01:56:57 -05:00
echo "Usage: ./build.sh output_path shim_path rootfs_dir"
2023-10-02 00:47:30 -05:00
}
2023-10-02 14:06:06 -05:00
check_deps() {
2023-10-20 15:51:56 -05:00
local needed_commands="cpio binwalk pcregrep realpath cgpt mkfs.ext4 mkfs.ext2 fdisk rsync"
2023-10-02 14:06:06 -05:00
for command in $needed_commands; do
if ! command -v $command &> /dev/null; then
echo $command
fi
done
}
2023-10-02 00:47:30 -05:00
if [ "$EUID" -ne 0 ]; then
echo "this needs to be run as root."
exit 1
fi
2023-10-06 23:28:40 -05:00
if [ -z "$3" ]; then
2023-10-02 00:47:30 -05:00
print_help
exit 1
fi
2023-10-02 14:06:06 -05:00
missing_commands=$(check_deps)
if [ "${missing_commands}" ]; then
echo "You are missing dependencies needed for this script."
echo "Commands needed:"
echo "${missing_commands}"
exit 1
fi
output_path=$(realpath "${1}")
shim_path=$(realpath "${2}")
2023-10-04 01:56:57 -05:00
rootfs_dir=$(realpath "${3}")
2023-10-02 00:47:30 -05:00
echo "created loop device for shim"
2023-10-02 14:06:06 -05:00
shim_loop=$(create_loop "${shim_path}")
2023-10-02 00:47:30 -05:00
kernel_loop="${shim_loop}p2" #KERN-A should always be p2
echo "copying shim kernel to new file in /tmp"
kernel_dir=/tmp/shim_kernel
mkdir $kernel_dir -p
dd if=$kernel_loop of=$kernel_dir/kernel.bin bs=1M status=none
echo "extracting data from kernel"
previous_dir=$(pwd)
cd $kernel_dir
2023-10-03 12:39:24 -05:00
if [ -e "${kernel_dir}/binwalk.out" ]; then
#don't run binwalk again if we don't need to
binwalk_out=$(cat $kernel_dir/binwalk.out)
else
binwalk_out=$(binwalk --extract kernel.bin --run-as=root)
echo $binwalk_out > $kernel_dir/binwalk.out
fi
2023-10-02 00:47:30 -05:00
#i can't be bothered to learn how to use sed
extracted_file=$(echo $binwalk_out | pcregrep -o1 "\d+\s+0x([0-9A-F]+)\s+gzip compressed data")
2023-10-03 12:20:41 -05:00
echo "extracting initramfs archive from kernel (this may take a while)"
2023-10-02 00:47:30 -05:00
cd _kernel.bin.extracted/
2023-10-03 12:39:24 -05:00
if [ ! -e "_${extracted_file}.extracted/" ]; then
binwalk --extract $extracted_file --run-as=root > /dev/null
fi
2023-10-02 00:47:30 -05:00
cd "_${extracted_file}.extracted/"
cpio_file=$(file ./* | pcregrep -o1 "([0-9A-F]+):\s+ASCII cpio archive")
echo "extracting initramfs cpio archive"
initramfs_dir=/tmp/shim_initramfs
rm -rf $initramfs_dir
cat $cpio_file | cpio -D $initramfs_dir -imd --quiet
echo "shim initramfs extracted to ${initramfs_dir}"
2023-10-02 01:08:31 -05:00
#leave /tmp
2023-10-02 00:47:30 -05:00
cd $previous_dir
2023-10-02 01:08:31 -05:00
echo "patching initramfs"
2023-10-02 14:17:59 -05:00
patch_initramfs $initramfs_dir
2023-10-02 01:08:31 -05:00
echo "creating disk image"
2023-10-06 12:29:10 -05:00
rootfs_size=$(du -sm $rootfs_dir | cut -f 1)
2023-10-20 15:51:56 -05:00
rootfs_part_size=$(($rootfs_size * 11 / 10))
2023-10-06 12:29:10 -05:00
#create a 20mb bootloader partition
2023-10-20 15:51:56 -05:00
#rootfs partition is 20% larger than its contents
2023-10-06 12:29:10 -05:00
create_image $output_path 20 $rootfs_part_size
echo "creating loop device for the image"
image_loop=$(create_loop ${output_path})
echo "creating partitions on the disk image"
create_partitions $image_loop "${kernel_dir}/kernel.bin"
2023-10-06 23:28:40 -05:00
echo "mounting the original shim rootfs"
shim_rootfs="/tmp/shim_rootfs"
make_mountable "${shim_loop}p3"
safe_mount "${shim_loop}p3" $shim_rootfs
echo "copying data into the image"
2023-10-20 07:04:19 -05:00
populate_partitions $image_loop $initramfs_dir $rootfs_dir
2023-10-02 00:47:30 -05:00
echo "cleaning up loop devices"
losetup -d $shim_loop
2023-10-20 15:51:56 -05:00
losetup -d $image_loop
echo "done"