PicoShim/builder/lib/rootfs_utils.sh
kxtzownsu 870c554fdb it builds but doesn't boot all the way!
bugs that need fixed:
stateful lsb-factory, bootstrapping rootfs
2024-09-14 06:13:31 -04:00

148 lines
3.3 KiB
Bash

#!/bin/bash
# Code was borrowed from the SH1mmer repo, credits to them
# https://github.com/MercuryWorkshop/sh1mmer
get_sector_size() {
"$SFDISK" -l "$1" | grep "Sector size" | awk '{print $4}'
}
get_final_sector() {
"$SFDISK" -l -o end "$1" | grep "^\s*[0-9]" | awk '{print $1}' | sort -nr | head -n 1
}
# create_stateful(){
# local final_sector=$(get_final_sector "$loopdev")
# local sector_size=$(get_sector_size "$loopdev")
# # special UUID is from grunt shim, dunno if this is different on other shims
# "$CGPT" add "$loopdev" -i 1 -b $((final_sector + 1)) -s $((state_size / sector_size)) -t "9CC433E4-52DB-1F45-A951-316373C30605"
# partx -u -n 1 "$loopdev"
# mkfs.ext4 -F "$loopdev"p1
# sync
# }
create_stateful(){
local image="$1"
fdisk "$image" << EOF > /dev/null 2>&1
n
1
+${state_size}M
w
EOF
}
is_ext2() {
local rootfs="$1"
local offset="${2-0}"
local sb_magic_offset=$((0x438))
local sb_value=$(dd if="$rootfs" skip=$((offset + sb_magic_offset)) \
count=2 bs=1 2>/dev/null)
local expected_sb_value=$(printf '\123\357')
if [ "$sb_value" = "$expected_sb_value" ]; then
return 0
fi
return 1
}
enable_rw_mount() {
local rootfs="$1"
local offset="${2-0}"
if ! is_ext2 "$rootfs" $offset; then
echo "enable_rw_mount called on non-ext2 filesystem: $rootfs $offset" 1>&2
return 1
fi
local ro_compat_offset=$((0x464 + 3))
printf '\000' |
dd of="$rootfs" seek=$((offset + ro_compat_offset)) \
conv=notrunc count=1 bs=1 2>/dev/null
}
disable_rw_mount() {
local rootfs="$1"
local offset="${2-0}"
if ! is_ext2 "$rootfs" $offset; then
echo "disable_rw_mount called on non-ext2 filesystem: $rootfs $offset" 1>&2
return 1
fi
local ro_compat_offset=$((0x464 + 3))
printf '\377' |
dd of="$rootfs" seek=$((offset + ro_compat_offset)) \
conv=notrunc count=1 bs=1 2>/dev/null
}
shrink_partitions() {
local shim="$1"
fdisk "$shim" <<EOF > /dev/null 2>&1
d
12
d
11
d
10
d
9
d
8
d
7
d
6
d
5
d
4
d
1
w
EOF
}
truncate_image() {
local buffer=35
local sector_size=$("$SFDISK" -l "$1" | grep "Sector size" | awk '{print $4}')
local final_sector=$(get_final_sector "$1")
local end_bytes=$(((final_sector + buffer) * sector_size))
echo "Truncating image to $(format_bytes "$end_bytes")"
truncate -s "$end_bytes" "$1" > /dev/null 2>&1
# recreate backup gpt table/header
sgdisk -e "$1" 2>&1 | sed 's/\a//g' > /dev/null 2>&1
}
format_bytes() {
numfmt --to=iec-i --suffix=B "$@"
}
shrink_root() {
loopdev="$@"
echo "$@"
echo "$1"
echo "Shrinking ROOT-A Partition"
echo $loopdev
enable_rw_mount "${loopdev}p3"
e2fsck -fy "${loopdev}p3"
resize2fs -M "${loopdev}p3"
disable_rw_mount "${loopdev}p3"
local sector_size=$(get_sector_size "$loopdev")
local block_size=$(tune2fs -l "${loopdev}p3" | grep "Block size" | awk '{print $3}')
local block_count=$(tune2fs -l "${loopdev}p3" | grep "Block count" | awk '{print $3}')
local original_sectors=$("$CGPT" show -i 3 -s -n -q "$loopdev")
local original_bytes=$((original_sectors * sector_size))
local resized_bytes=$((block_count * block_size))
local resized_sectors=$((resized_bytes / sector_size))
echo "Resizing ROOT from $(format_bytes ${original_bytes}) to $(format_bytes ${resized_bytes})"
"$CGPT" add -i 3 -s "$resized_sectors" "$loopdev"
partx -u -n 3 "$loopdev"
}