wip(kernel): Artemis grows to fill the stick at its first boot -- metadata only, capped at 256 GiB (#92, Task 2) [skip ci]

Not yet accepted (plan 2026-10-29-stick-5, Task 2, step 3).
- gpt.c: the writer, gpt_grow_last() -- the backup entry array and header to
  the disk's end, the last partition to the last usable sector (whole MiB,
  capped), both headers' CRCs, the backup before the primary, the
  protective MBR's size; gpt_alternate_lba().
- sk_v4_grow.c: the volume grown to its partition -- its fence (the Artemis
  signature, Zuse's genesis marker) moved to the new top, the header last;
  the partition grown no further than the BAM tracks (the block subsystem
  places the fence by the device's size, so a volume must fill it).
- sk_v4_identity.c: a stick of 8 GB or more whose GPT ends short of the disk
  is grown before its partitions are opened; "Artemis: grown to fill the
  stick" / "under 8 GB -- not grown" / "past 256 GiB ... left unused".
- block_subsystem: blk_volume_compute_totals() (compute_totals_from_B,
  public) and blk_subsys_set_format_bam_for(); v3's behaviour unchanged.
- mkartemis --bam-for, mkdiskimage.sh --bam-for, kernel/Makefile
  STICK_GROW_MIN_BYTES / STICK_ARTEMIS_CAP_GIB: the stick's and data stick's
  Artemis BAM sized for 256 GiB (6144 devblocks). STICK.md 5a: 256 GiB (R1).

After: stick_grow PASS (16 GiB: 12129370 user blocks, 8 s POST to prompt;
second boot not grown, recognised; sfdisk --verify: no errors), stick_small
PASS, check_images.sh PASS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
This commit is contained in:
Claude
2026-11-08 12:03:46 +00:00
parent 4e935e4825
commit 5bb247d678
17 changed files with 889 additions and 22 deletions
+7 -4
View File
@@ -17,11 +17,12 @@
# --table gpt -> partition type "EFI System" (UEFI firmware, U-Boot bootefi)
#
# The StarshipOS stick and data stick (docs/v4.0.0/STICK.md 4; --table gpt only):
# --starship IDENT_MIB --mkartemis TOOL --esp-mib E
# --starship IDENT_MIB --mkartemis TOOL --esp-mib E [--bam-for SECTORS]
# lays out an ESP of E MiB holding the SRC:DEST files (E=0: no ESP, no files),
# then a StarshipOS identity partition of IDENT_MIB MiB (all zeros), then a
# StarshipOS Artemis partition to the last whole MiB before the backup GPT,
# formatted and signed by TOOL (tools/mkartemis.c). Every partition starts and
# formatted and signed by TOOL (tools/mkartemis.c) -- with --bam-for, its BAM sized for an Artemis
# of SECTORS, so it can grow that far on a larger stick (STICK.md 5a). Every partition starts and
# ends on a whole MiB, so on 1 KiB blocks, as the kernel's GPT reader needs.
#
# Zuse's minted pair as a stick (docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, Task 1):
@@ -38,7 +39,7 @@
# root, no loop devices.
set -euo pipefail
OUT="" TABLE="" SIZE_MIB="" LABEL="" IDENT_MIB="" MKARTEMIS="" ESP_MIB="" FROM_IDENT="" FROM_ART=""
OUT="" TABLE="" SIZE_MIB="" LABEL="" IDENT_MIB="" MKARTEMIS="" ESP_MIB="" FROM_IDENT="" FROM_ART="" BAM_FOR=""
while [ $# -gt 0 ]; do
case "$1" in
--out) OUT="$2"; shift 2 ;;
@@ -48,6 +49,7 @@ while [ $# -gt 0 ]; do
--starship) IDENT_MIB="$2"; shift 2 ;;
--mkartemis) MKARTEMIS="$2"; shift 2 ;;
--esp-mib) ESP_MIB="$2"; shift 2 ;;
--bam-for) BAM_FOR="$2"; shift 2 ;;
--starship-from) FROM_IDENT="$2"; FROM_ART="$3"; shift 3 ;;
--) shift; break ;;
-*) echo "mkdiskimage.sh: unknown option $1" >&2; exit 2 ;;
@@ -119,7 +121,8 @@ if [ -n "$IDENT_MIB" ]; then
dd if="$FROM_IDENT" of="$OUT" bs=1M seek=$(( IDENT_START / 2048 )) conv=notrunc,sparse status=none
dd if="$FROM_ART" of="$OUT" bs=1M seek=$(( ART_START / 2048 )) conv=notrunc,sparse status=none
else
"$MKARTEMIS" --format "$OUT" --first-lba "$ART_START" --sectors "$ART_SECTORS" >/dev/null || {
"$MKARTEMIS" --format "$OUT" --first-lba "$ART_START" --sectors "$ART_SECTORS" \
${BAM_FOR:+--bam-for "$BAM_FOR"} >/dev/null || {
echo "mkdiskimage.sh: formatting Artemis failed" >&2; rm -f "$OUT"; exit 1; }
fi
if [ "$ESP_MIB" = 0 ]; then