shimboot/build_image.sh

131 lines
3.4 KiB
Bash
Raw Normal View History

2023-10-02 15:23:01 -05:00
#!/bin/bash
set -e
if [ "$DEBUG" ]; then
set -x
fi
2023-10-02 15:53:11 -05:00
create_loop() {
local loop_device=$(losetup -f)
losetup -P $loop_device "${1}"
echo $loop_device
}
2023-10-06 23:28:40 -05:00
#original shim rootfses have a non standard ext2 filesystem
2023-10-02 15:23:01 -05:00
make_mountable() {
2023-10-06 23:28:40 -05:00
printf '\000' | dd of=$1 seek=$((0x464 + 3)) conv=notrunc count=1 bs=1 status=none
2023-10-02 15:23:01 -05:00
}
2023-10-03 12:20:41 -05:00
#set required flags on the kernel partition
make_bootable() {
cgpt add -i 2 -S 1 -T 5 -P 10 -l kernel $1
}
2023-10-02 15:23:01 -05:00
partition_disk() {
local image_path=$(realpath "${1}")
local bootloader_size=${2}
2023-10-02 15:53:11 -05:00
#create partition table with fdisk
2023-10-02 15:23:01 -05:00
(
echo g #new gpt disk label
#create 1MB stateful
echo n #new partition
echo #accept default parition number
echo #accept default first sector
echo +1M #partition size is 1M
#create 32MB kernel partition
echo n
echo #accept default parition number
echo #accept default first sector
echo +32M #partition size is 32M
echo t #change partition type
echo #accept default parition number
echo FE3A2A5D-4F32-41A7-B725-ACCC3285A309 #chromeos kernel type
#create bootloader partition
echo n
echo #accept default parition number
echo #accept default first sector
echo "+${bootloader_size}M" #set partition size
echo t #change partition type
echo #accept default parition number
echo 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC #chromeos rootfs type
#create rootfs partition
echo n
echo #accept default parition number
echo #accept default first sector
echo #accept default size to fill rest of image
2023-10-03 19:29:55 -05:00
echo x #enter expert mode
echo n #change the partition name
echo #accept default partition number
echo "shimboot_rootfs:default" #set partition name
echo r #return to normal more
2023-10-02 15:23:01 -05:00
#write changes
echo w
2023-10-20 15:51:56 -05:00
) | fdisk $image_path > /dev/null
2023-10-02 15:23:01 -05:00
}
2023-10-02 15:53:11 -05:00
safe_mount() {
2023-10-03 12:20:41 -05:00
umount $2 2> /dev/null || /bin/true
2023-10-02 15:53:11 -05:00
rm -rf $2
mkdir -p $2
mount $1 $2
}
create_partitions() {
local image_loop=$(realpath "${1}")
local kernel_path=$(realpath "${2}")
#create stateful
mkfs.ext4 "${image_loop}p1"
#copy kernel
dd if=$kernel_path of="${image_loop}p2" bs=1M oflag=sync
2023-10-03 12:20:41 -05:00
make_bootable $image_loop
2023-10-02 15:53:11 -05:00
#create bootloader partition
mkfs.ext2 "${image_loop}p3"
#create rootfs partition
mkfs.ext4 "${image_loop}p4"
}
populate_partitions() {
local image_loop=$(realpath "${1}")
local bootloader_dir=$(realpath "${2}")
local rootfs_dir=$(realpath "${3}")
#mount and write empty file to stateful
local stateful_mount=/tmp/shim_stateful
safe_mount "${image_loop}p1" $stateful_mount
mkdir -p $stateful_mount/dev_image/etc/
2023-11-09 15:13:59 -06:00
mkdir -p $stateful_mount/dev_image/factory/sh
2023-10-02 15:53:11 -05:00
touch $stateful_mount/dev_image/etc/lsb-factory
umount $stateful_mount
#mount and write to bootloader rootfs
local bootloader_mount=/tmp/shim_bootloader
safe_mount "${image_loop}p3" $bootloader_mount
cp -r $bootloader_dir/* $bootloader_mount
umount $bootloader_mount
2023-10-06 23:28:40 -05:00
#write rootfs to image
2023-10-20 07:04:19 -05:00
local rootfs_mount=/tmp/new_rootfs
2023-10-02 15:53:11 -05:00
safe_mount "${image_loop}p4" $rootfs_mount
2023-10-20 15:51:56 -05:00
rsync --archive --human-readable --hard-links --info=progress2 --sparse $rootfs_dir/ $rootfs_mount/
2023-10-20 07:04:19 -05:00
umount $rootfs_mount
2023-10-02 15:53:11 -05:00
}
2023-10-02 15:23:01 -05:00
create_image() {
local image_path=$(realpath "${1}")
local bootloader_size=${2}
local rootfs_size=${3}
#stateful + kernel + bootloader + rootfs
local total_size=$((1 + 32 + $bootloader_size + $rootfs_size))
2023-10-20 15:51:56 -05:00
rm -rf "${image_path}"
fallocate -l "${total_size}M" "${image_path}"
2023-10-02 15:23:01 -05:00
partition_disk $image_path $bootloader_size
2023-10-20 21:30:02 -05:00
}