docs: regenerate scripts/functionlist.md; refresh NOTES with jump-points and roadmap; extend rfs-flists with RESP backend design. config: add RESP placeholders to rfs.conf.example. components: keep previous non-destructive git clone logic.

This commit is contained in:
2025-10-01 18:06:13 +02:00
parent 6193d241ea
commit 10ba31acb4
4 changed files with 315 additions and 62 deletions

View File

@@ -54,4 +54,26 @@ READ_SECRET_KEY="REPLACE_ME_READ"
# - ROUTE_REGION: region string for Garage (default: garage)
ROUTE_ENDPOINT="https://hub.grid.tf"
ROUTE_PATH="/zos/store"
ROUTE_REGION="garage"
ROUTE_REGION="garage"
# RESP/DB-style blob store (design-time placeholders; optional)
# Enable to allow pack scripts or future rfs CLI to upload blobs to a RESP-compatible store.
# This does not change the existing S3 flow; RESP acts as an additional backend.
#
# Example URI semantics (see docs/rfs-flists.md additions):
# resp://host:port/db?prefix=blobs
# resp+tls://host:port/db?prefix=blobs&ca=/etc/ssl/certs/ca.pem
# resp+sentinel://sentinelHost:26379/mymaster?prefix=blobs
#
# Minimal keys for a direct RESP endpoint
RESP_ENABLED="false"
RESP_ENDPOINT="localhost:6379" # host:port
RESP_DB="0" # integer DB index
RESP_PREFIX="zos/blobs" # namespace/prefix for content-addressed keys
RESP_USERNAME="" # optional
RESP_PASSWORD="" # optional
RESP_TLS="false" # true/false
RESP_CA="" # path to CA bundle when RESP_TLS=true
# Optional: Sentinel topology (overrides RESP_ENDPOINT for discovery)
RESP_SENTINEL="" # sentinelHost:port (comma-separated for multiple)
RESP_MASTER="" # Sentinel master name (e.g., "mymaster")

View File

@@ -203,4 +203,79 @@ Change Log
- Enforce passwordless root using passwd -d -R in finalization.
- Normalize INSTALL_DIR/COMPONENTS_DIR/KERNEL_DIR/DIST_DIR to absolute paths post-config load.
- Add validation diagnostics prints (input/PWD/PROJECT_ROOT/INSTALL_DIR/resolved).
- Ensure shadow package in container for passwd/chpasswd; keep openssl and openssl-dev; remove perl earlier.
- Ensure shadow package in container for passwd/chpasswd; keep openssl and openssl-dev; remove perl earlier.
Updates 2025-10-01
- Function index regenerated: see [scripts/functionlist.md](scripts/functionlist.md) for an authoritative map of all functions with current line numbers. Use it alongside the quick links below to jump into code fast.
- Key jump-points (current lines):
- Finalization: [bash.initramfs_finalize_customization()](scripts/lib/initramfs.sh:568)
- CPIO creation: [bash.initramfs_create_cpio()](scripts/lib/initramfs.sh:691)
- Validation: [bash.initramfs_validate()](scripts/lib/initramfs.sh:820)
- Kernel embed config: [bash.kernel_modify_config_for_initramfs()](scripts/lib/kernel.sh:130)
- Stage orchestrator entry: [bash.main_build_process()](scripts/build.sh:214)
- Repo-wide index: [scripts/functionlist.md](scripts/functionlist.md)
Roadmap / TODO (tracked in tool todo list)
- Zosception (zinit service graph and ordering)
- Define additional services and ordering for nested/recursive orchestration.
- Likely integration points:
- Networking readiness before RFS: [config/zinit/network.yaml](config/zinit/network.yaml)
- Early udev coldplug: [config/zinit/udev-trigger.yaml](config/zinit/udev-trigger.yaml)
- Post-RFS coldplug: [config/zinit/udev-rfs.yaml](config/zinit/udev-rfs.yaml)
- Ensure dependency edges are correct in the service DAG image (see docs/img_*.png).
- Add zosstorage to initramfs
- Source:
- If packaged: add to [config/packages.list](config/packages.list).
- If built from source: extend [bash.components_parse_sources_conf()](scripts/lib/components.sh:13) and add a build_* function; install via [bash.initramfs_copy_components()](scripts/lib/initramfs.sh:102).
- Zinit unit:
- Add YAML under [config/zinit/](config/zinit/) and hook into the network-ready path.
- Ordering:
- Start after "network" and before/with RFS mounts if it provides storage functionality used by rfs.
- RFS blob store backends (design + docs; http and s3 exist)
- Current S3 store URI construction: [bash.rfs_common_build_s3_store_uri()](scripts/rfs/common.sh:137)
- Flist manifest store patching: [bash.rfs_common_patch_flist_stores()](scripts/rfs/common.sh:385)
- Route URL patching: [bash.rfs_common_patch_flist_route_url()](scripts/rfs/common.sh:494)
- Packers entrypoints:
- [scripts/rfs/pack-modules.sh](scripts/rfs/pack-modules.sh:1)
- [scripts/rfs/pack-firmware.sh](scripts/rfs/pack-firmware.sh:1)
- Proposed additional backend: RESP/DB-style store
- Goal: Allow rfs to push/fetch content-addressed blobs via a RESP-compatible endpoint (e.g., Redis/KeyDB/Dragonfly-like), or a thin HTTP/RESP adapter.
- Draft URI scheme examples:
- resp://host:port/db?tls=0&prefix=blobs
- resp+tls://host:port/db?prefix=blobs&ca=/etc/ssl/certs/ca.pem
- resp+sentinel://sentinelHost:26379/mymaster?prefix=blobs
- Minimum operations:
- PUT blob: SETEX prefix/ab/cd/hash ttl file-bytes or HSET prefix/hash data file-bytes
- GET blob: GET or HGET
- HEAD/exists: EXISTS
- Optional: pipelined/mget for batch prefetch
- Client integration layers:
- Pack-time: extend rfs CLI store resolver (design doc first; scripts/rfs/common.sh can map scheme→uploader if CLI not ready).
- Manifest post-process: still supported; stores table may include multiple URIs (s3 + resp) for redundancy.
- Caching and retries:
- Local on-disk cache under dist/.rfs-cache keyed by hash with LRU GC.
- Exponential backoff on GET failures; fall back across stores in order.
- Auth:
- RESP: optional username/password in URI; TLS with cert pinning parameters.
- Keep secrets in config/rfs.conf or env; do not embed write creds in manifests (read-credential routes only).
- Deliverables:
- Design section in docs/rfs-flists.md (to be added)
- Config keys in config/rfs.conf.example for RESP endpoints
- Optional shim uploader script if CLI support lags.
- Documentation refresh tasks
- Cross-check this files clickable references against [scripts/functionlist.md](scripts/functionlist.md) after changes in lib files.
- Keep “Branding behavior” and “Absolute Path Normalization” pointers aligned with:
- [bash.common.sh normalization](scripts/lib/common.sh:244)
- [bash.initramfs_finalize_customization()](scripts/lib/initramfs.sh:568)
Diagnostics-first reminder
- Use DEBUG=1 and stage markers for minimal rebuilds.
- Quick commands:
- Show stages: ./scripts/build.sh --show-stages
- Minimal rebuild after zinit/init edits: [scripts/rebuild-after-zinit.sh](scripts/rebuild-after-zinit.sh)
- Validate archive: [bash.initramfs_create_cpio()](scripts/lib/initramfs.sh:691), then [bash.initramfs_test_archive()](scripts/lib/initramfs.sh:953)

View File

@@ -165,3 +165,45 @@ Use the helper to inspect a manifest, optionally listing entries and testing a l
- scripts/rfs/verify-flist.sh -m dist/flists/firmware-latest.fl --tree
- Inspect + mount test to a temp dir:
- sudo scripts/rfs/verify-flist.sh -m dist/flists/modules-6.12.44-Zero-OS.fl --mount
## Additional blob store backends (design)
This extends the existing S3/HTTP approach with a RESP/DB-style backend option for rfs blob storage. It is a design-only addition; CLI and scripts will be extended in a follow-up.
Scope
- Keep S3 flow intact via [scripts/rfs/common.sh](scripts/rfs/common.sh:137), [scripts/rfs/common.sh](scripts/rfs/common.sh:385), and [scripts/rfs/common.sh](scripts/rfs/common.sh:494).
- Introduce RESP URIs that can be encoded in config and, later, resolved by rfs or a thin uploader shim invoked by:
- [scripts/rfs/pack-modules.sh](scripts/rfs/pack-modules.sh:1)
- [scripts/rfs/pack-firmware.sh](scripts/rfs/pack-firmware.sh:1)
URI schemes (draft)
- resp://host:port/db?prefix=blobs
- resp+tls://host:port/db?prefix=blobs&ca=/etc/ssl/certs/ca.pem
- resp+sentinel://sentinelHost:26379/mymaster?prefix=blobs
- Credentials may be provided via URI userinfo or config (recommended: config only).
Operations (minimal set)
- PUT blob: write content-addressed key (e.g., prefix/ab/cd/hash)
- GET blob: fetch by exact key
- Exists/HEAD: presence test by key
- Optional batching: pipelined MGET for prefetch
Config keys (see example additions in config/rfs.conf.example)
- RESP_ENDPOINT (host:port), RESP_DB (integer), RESP_PREFIX (path namespace)
- RESP_USERNAME/RESP_PASSWORD (optional), RESP_TLS=0/1 (+ RESP_CA if needed)
- RESP_SENTINEL and RESP_MASTER for sentinel deployments
Manifests and routes
- Keep S3 store in flist stores table (fallback) while enabling route.url patching to HTTP/S3 for read-only access:
- Patch stores table as today via [scripts/rfs/common.sh](scripts/rfs/common.sh:385)
- Patch route.url as today via [scripts/rfs/common.sh](scripts/rfs/common.sh:494)
- RESP may be used primarily for pack-time blob uploads or as an additional store the CLI can consume later.
Security
- Do not embed write credentials in manifests.
- Read-only credentials may be embedded in route.url if required, mirroring S3 pattern.
Next steps
- Implement RESP uploader shim called from pack scripts; keep the CLI S3 flow unchanged.
- Extend config loader in [scripts/rfs/common.sh](scripts/rfs/common.sh:82) to parse RESP_* variables.
- Add verification routines to sanity-check connectivity before pack.

View File

@@ -1,55 +1,141 @@
# Function List - scripts/lib Library
# Function List - Repository (scripts and libraries)
This document lists all functions currently defined under [scripts/lib](scripts/lib) with their source locations.
This document lists functions defined under scripts/ and scripts/lib with source locations.
Regenerated from repository on 2025-10-01.
## alpine.sh - Alpine Linux operations
File: [scripts/lib/alpine.sh](scripts/lib/alpine.sh)
- [alpine_extract_miniroot()](scripts/lib/alpine.sh:14) - Download and extract Alpine miniroot
- [alpine_setup_chroot()](scripts/lib/alpine.sh:70) - Setup chroot mounts and resolv.conf
- [alpine_cleanup_chroot()](scripts/lib/alpine.sh:115) - Unmount chroot mounts
- [alpine_install_packages()](scripts/lib/alpine.sh:142) - Install packages from packages.list
- [alpine_aggressive_cleanup()](scripts/lib/alpine.sh:211) - Reduce image size by removing docs/locales/etc
- [alpine_configure_repos()](scripts/lib/alpine.sh:321) - Configure APK repositories
- [alpine_configure_system()](scripts/lib/alpine.sh:339) - Configure hostname, hosts, timezone, profile
- [alpine_install_firmware()](scripts/lib/alpine.sh:392) - Install required firmware packages
## Top-level build scripts
File: [scripts/build.sh](scripts/build.sh)
- [show_usage()](scripts/build.sh:49)
- [parse_arguments()](scripts/build.sh:88)
- [setup_build_environment()](scripts/build.sh:133)
- [verify_configuration_files()](scripts/build.sh:174)
- [main_build_process()](scripts/build.sh:214)
- [stage_alpine_extract()](scripts/build.sh:223)
- [stage_alpine_configure()](scripts/build.sh:227)
- [stage_alpine_packages()](scripts/build.sh:232)
- [stage_alpine_firmware()](scripts/build.sh:236)
- [stage_components_build()](scripts/build.sh:240)
- [stage_components_verify()](scripts/build.sh:244)
- [stage_kernel_modules()](scripts/build.sh:248)
- [stage_zinit_setup()](scripts/build.sh:265)
- [stage_init_script()](scripts/build.sh:269)
- [stage_components_copy()](scripts/build.sh:273)
- [stage_modules_setup()](scripts/build.sh:277)
- [stage_modules_copy()](scripts/build.sh:286)
- [stage_rfs_flists()](scripts/build.sh:299)
- [stage_cleanup()](scripts/build.sh:366)
- [stage_validation()](scripts/build.sh:370)
- [stage_initramfs_create()](scripts/build.sh:374)
- [stage_initramfs_test()](scripts/build.sh:385)
- [stage_kernel_build()](scripts/build.sh:398)
- [stage_boot_tests()](scripts/build.sh:415)
- [main()](scripts/build.sh:470)
File: [scripts/clean.sh](scripts/clean.sh)
- [show_usage()](scripts/clean.sh:21)
- [parse_arguments()](scripts/clean.sh:50)
- [clean_build_artifacts()](scripts/clean.sh:90)
- [clean_downloads()](scripts/clean.sh:127)
- [clean_container_images()](scripts/clean.sh:155)
- [show_space_recovery()](scripts/clean.sh:176)
- [verify_cleanup()](scripts/clean.sh:203)
- [main()](scripts/clean.sh:240)
File: [scripts/dev-container.sh](scripts/dev-container.sh)
- [show_usage()](scripts/dev-container.sh:19)
- [ensure_builder_image()](scripts/dev-container.sh:44)
- [dev_container_start()](scripts/dev-container.sh:70)
- [dev_container_stop()](scripts/dev-container.sh:109)
- [dev_container_shell()](scripts/dev-container.sh:121)
- [dev_container_build()](scripts/dev-container.sh:139)
- [dev_container_clean()](scripts/dev-container.sh:168)
- [dev_container_status()](scripts/dev-container.sh:180)
- [dev_container_logs()](scripts/dev-container.sh:202)
- [main()](scripts/dev-container.sh:214)
File: [scripts/make-grub-usb.sh](scripts/make-grub-usb.sh)
- [error()](scripts/make-grub-usb.sh:45)
- [info()](scripts/make-grub-usb.sh:46)
- [warn()](scripts/make-grub-usb.sh:47)
- [die()](scripts/make-grub-usb.sh:48)
- [require_root()](scripts/make-grub-usb.sh:50)
- [command_exists()](scripts/make-grub-usb.sh:54)
- [parse_args()](scripts/make-grub-usb.sh:56)
- [confirm_dangerous()](scripts/make-grub-usb.sh:81)
- [check_prereqs()](scripts/make-grub-usb.sh:93)
- [resolve_defaults()](scripts/make-grub-usb.sh:101)
- [umount_partitions()](scripts/make-grub-usb.sh:116)
- [partition_device_gpt()](scripts/make-grub-usb.sh:139)
- [format_esp()](scripts/make-grub-usb.sh:158)
- [mount_esp()](scripts/make-grub-usb.sh:165)
- [install_grub()](scripts/make-grub-usb.sh:171)
- [copy_kernel_initrd()](scripts/make-grub-usb.sh:180)
- [write_grub_cfg()](scripts/make-grub-usb.sh:190)
- [cleanup()](scripts/make-grub-usb.sh:226)
- [main()](scripts/make-grub-usb.sh:235)
File: [scripts/rebuild-after-zinit.sh](scripts/rebuild-after-zinit.sh)
- [log()](scripts/rebuild-after-zinit.sh:17)
- [in_container()](scripts/rebuild-after-zinit.sh:67)
- [check_dir_changed()](scripts/rebuild-after-zinit.sh:81)
- [list_some_changes()](scripts/rebuild-after-zinit.sh:89)
- [compute_full_kver()](scripts/rebuild-after-zinit.sh:131)
- [modules_dir_for_full()](scripts/rebuild-after-zinit.sh:146)
File: [scripts/test.sh](scripts/test.sh)
- [show_usage()](scripts/test.sh:20)
- [parse_arguments()](scripts/test.sh:46)
- [run_tests()](scripts/test.sh:105)
- [main()](scripts/test.sh:182)
## Library scripts
## common.sh - Core utilities
File: [scripts/lib/common.sh](scripts/lib/common.sh)
- [log_info()](scripts/lib/common.sh:31)
- [log_warn()](scripts/lib/common.sh:36)
- [log_error()](scripts/lib/common.sh:41)
- [log_debug()](scripts/lib/common.sh:46)
- [safe_execute()](scripts/lib/common.sh:54)
- [section_header()](scripts/lib/common.sh:79)
- [command_exists()](scripts/lib/common.sh:89)
- [in_container()](scripts/lib/common.sh:94)
- [check_dependencies()](scripts/lib/common.sh:99)
- [safe_mkdir()](scripts/lib/common.sh:142)
- [safe_rmdir()](scripts/lib/common.sh:149)
- [safe_copy()](scripts/lib/common.sh:158)
- [is_absolute_path()](scripts/lib/common.sh:166)
- [resolve_path()](scripts/lib/common.sh:171)
- [get_file_size()](scripts/lib/common.sh:181)
- [wait_for_file()](scripts/lib/common.sh:191)
- [cleanup_on_exit()](scripts/lib/common.sh:205)
- [safe_execute_stream()](scripts/lib/common.sh:77)
- [section_header()](scripts/lib/common.sh:87)
- [command_exists()](scripts/lib/common.sh:97)
- [in_container()](scripts/lib/common.sh:102)
- [check_dependencies()](scripts/lib/common.sh:107)
- [safe_mkdir()](scripts/lib/common.sh:150)
- [safe_rmdir()](scripts/lib/common.sh:157)
- [safe_copy()](scripts/lib/common.sh:166)
- [is_absolute_path()](scripts/lib/common.sh:174)
- [resolve_path()](scripts/lib/common.sh:179)
- [get_file_size()](scripts/lib/common.sh:189)
- [wait_for_file()](scripts/lib/common.sh:199)
- [cleanup_on_exit()](scripts/lib/common.sh:213)
File: [scripts/lib/alpine.sh](scripts/lib/alpine.sh)
- [alpine_extract_miniroot()](scripts/lib/alpine.sh:14)
- [alpine_setup_chroot()](scripts/lib/alpine.sh:70)
- [alpine_cleanup_chroot()](scripts/lib/alpine.sh:115)
- [alpine_install_packages()](scripts/lib/alpine.sh:142)
- [alpine_aggressive_cleanup()](scripts/lib/alpine.sh:211)
- [alpine_configure_repos()](scripts/lib/alpine.sh:321)
- [alpine_configure_system()](scripts/lib/alpine.sh:339)
- [alpine_install_firmware()](scripts/lib/alpine.sh:392)
## components.sh - Component management
File: [scripts/lib/components.sh](scripts/lib/components.sh)
- [components_parse_sources_conf()](scripts/lib/components.sh:13)
- [components_download_git()](scripts/lib/components.sh:72)
- [components_download_release()](scripts/lib/components.sh:104)
- [components_process_extra_options()](scripts/lib/components.sh:144)
- [components_build_component()](scripts/lib/components.sh:183)
- [components_setup_rust_env()](scripts/lib/components.sh:217)
- [build_zinit()](scripts/lib/components.sh:252)
- [build_rfs()](scripts/lib/components.sh:299)
- [build_mycelium()](scripts/lib/components.sh:346)
- [install_rfs()](scripts/lib/components.sh:386)
- [install_corex()](scripts/lib/components.sh:409)
- [components_verify_installation()](scripts/lib/components.sh:436)
- [components_cleanup()](scripts/lib/components.sh:472)
- [components_download_release()](scripts/lib/components.sh:174)
- [components_process_extra_options()](scripts/lib/components.sh:214)
- [components_build_component()](scripts/lib/components.sh:253)
- [components_setup_rust_env()](scripts/lib/components.sh:287)
- [build_zinit()](scripts/lib/components.sh:322)
- [build_rfs()](scripts/lib/components.sh:369)
- [build_mycelium()](scripts/lib/components.sh:417)
- [install_rfs()](scripts/lib/components.sh:457)
- [install_corex()](scripts/lib/components.sh:480)
- [components_verify_installation()](scripts/lib/components.sh:507)
- [components_cleanup()](scripts/lib/components.sh:543)
## docker.sh - Container runtime management
File: [scripts/lib/docker.sh](scripts/lib/docker.sh)
- [docker_detect_runtime()](scripts/lib/docker.sh:14)
- [docker_verify_rootless()](scripts/lib/docker.sh:33)
@@ -58,36 +144,34 @@ File: [scripts/lib/docker.sh](scripts/lib/docker.sh)
- [docker_start_rootless()](scripts/lib/docker.sh:116)
- [docker_run_build()](scripts/lib/docker.sh:154)
- [docker_commit_builder()](scripts/lib/docker.sh:196)
- [docker_cleanup()](scripts/lib/docker.sh:208)
- [docker_cleanup()](scripts/lib/docker.sh:209)
- [docker_check_capabilities()](scripts/lib/docker.sh:248)
- [docker_setup_rootless()](scripts/lib/docker.sh:279)
## initramfs.sh - Initramfs assembly
File: [scripts/lib/initramfs.sh](scripts/lib/initramfs.sh)
- [initramfs_setup_zinit()](scripts/lib/initramfs.sh:13)
- [initramfs_install_init_script()](scripts/lib/initramfs.sh:70)
- [initramfs_copy_components()](scripts/lib/initramfs.sh:97)
- [initramfs_setup_modules()](scripts/lib/initramfs.sh:225)
- [initramfs_resolve_module_dependencies()](scripts/lib/initramfs.sh:313)
- [initramfs_create_module_scripts()](scripts/lib/initramfs.sh:422)
- [initramfs_strip_and_upx()](scripts/lib/initramfs.sh:486)
- [initramfs_finalize_customization()](scripts/lib/initramfs.sh:569)
- [initramfs_create_cpio()](scripts/lib/initramfs.sh:642)
- [initramfs_validate()](scripts/lib/initramfs.sh:710)
- [initramfs_test_archive()](scripts/lib/initramfs.sh:809)
- [initramfs_copy_resolved_modules()](scripts/lib/initramfs.sh:846)
- [initramfs_install_init_script()](scripts/lib/initramfs.sh:75)
- [initramfs_copy_components()](scripts/lib/initramfs.sh:102)
- [initramfs_setup_modules()](scripts/lib/initramfs.sh:230)
- [initramfs_resolve_module_dependencies()](scripts/lib/initramfs.sh:312)
- [resolve_single_module()](scripts/lib/initramfs.sh:348)
- [initramfs_create_module_scripts()](scripts/lib/initramfs.sh:421)
- [initramfs_strip_and_upx()](scripts/lib/initramfs.sh:485)
- [initramfs_finalize_customization()](scripts/lib/initramfs.sh:568)
- [initramfs_create_cpio()](scripts/lib/initramfs.sh:691)
- [initramfs_validate()](scripts/lib/initramfs.sh:820)
- [initramfs_test_archive()](scripts/lib/initramfs.sh:953)
- [initramfs_copy_resolved_modules()](scripts/lib/initramfs.sh:991)
## kernel.sh - Kernel building
File: [scripts/lib/kernel.sh](scripts/lib/kernel.sh)
- [kernel_get_full_version()](scripts/lib/kernel.sh:14)
- [kernel_download_source()](scripts/lib/kernel.sh:28)
- [kernel_apply_config()](scripts/lib/kernel.sh:82)
- [kernel_modify_config_for_initramfs()](scripts/lib/kernel.sh:129)
- [kernel_modify_config_for_initramfs()](scripts/lib/kernel.sh:130)
- [kernel_build_with_initramfs()](scripts/lib/kernel.sh:174)
- [kernel_build_modules()](scripts/lib/kernel.sh:228)
- [kernel_cleanup()](scripts/lib/kernel.sh:284)
- [kernel_build_modules()](scripts/lib/kernel.sh:243)
- [kernel_cleanup()](scripts/lib/kernel.sh:298)
## stages.sh - Build stage tracking
File: [scripts/lib/stages.sh](scripts/lib/stages.sh)
- [stages_init()](scripts/lib/stages.sh:12)
- [stage_is_completed()](scripts/lib/stages.sh:33)
@@ -97,16 +181,46 @@ File: [scripts/lib/stages.sh](scripts/lib/stages.sh)
- [stage_run()](scripts/lib/stages.sh:99)
- [stages_status()](scripts/lib/stages.sh:134)
## testing.sh - Boot testing
File: [scripts/lib/testing.sh](scripts/lib/testing.sh)
- [testing_qemu_boot()](scripts/lib/testing.sh:14)
- [testing_qemu_basic_boot()](scripts/lib/testing.sh:55)
- [testing_qemu_serial_boot()](scripts/lib/testing.sh:90)
- [testing_qemu_interactive_boot()](scripts/lib/testing.sh:113)
- [testing_qemu_interactive_boot()](scripts/lib/testing.sh:114)
- [testing_cloud_hypervisor_boot()](scripts/lib/testing.sh:135)
- [testing_cloud_hypervisor_basic()](scripts/lib/testing.sh:171)
- [testing_cloud_hypervisor_basic()](scripts/lib/testing.sh:172)
- [testing_cloud_hypervisor_serial()](scripts/lib/testing.sh:206)
- [testing_analyze_boot_log()](scripts/lib/testing.sh:227)
- [testing_analyze_boot_log()](scripts/lib/testing.sh:228)
- [testing_run_all()](scripts/lib/testing.sh:299)
## RFS tooling
File: [scripts/rfs/common.sh](scripts/rfs/common.sh)
- [rfs_common_project_root()](scripts/rfs/common.sh:12)
- [rfs_common_load_build_kernel_version()](scripts/rfs/common.sh:42)
- [rfs_common_load_rfs_s3_config()](scripts/rfs/common.sh:82)
- [rfs_common_build_s3_store_uri()](scripts/rfs/common.sh:137)
- [rfs_common_locate_rfs()](scripts/rfs/common.sh:171)
- [rfs_common_require_sqlite3()](scripts/rfs/common.sh:198)
- [rfs_common_locate_modules_dir()](scripts/rfs/common.sh:214)
- [rfs_common_locate_firmware_dir()](scripts/rfs/common.sh:244)
- [rfs_common_validate_modules_metadata()](scripts/rfs/common.sh:264)
- [rfs_common_install_all_alpine_firmware_packages()](scripts/rfs/common.sh:298)
- [rfs_common_patch_flist_stores()](scripts/rfs/common.sh:385)
- [rfs_common_build_route_url()](scripts/rfs/common.sh:453)
- [rfs_common_patch_flist_route_url()](scripts/rfs/common.sh:494)
- [rfs_common_prepare_output()](scripts/rfs/common.sh:525)
- [rfs_common_firmware_tag()](scripts/rfs/common.sh:533)
File: [scripts/rfs/pack-modules.sh](scripts/rfs/pack-modules.sh)
- [section()](scripts/rfs/pack-modules.sh:15)
File: [scripts/rfs/pack-firmware.sh](scripts/rfs/pack-firmware.sh)
- [section()](scripts/rfs/pack-firmware.sh:17)
File: [scripts/rfs/verify-flist.sh](scripts/rfs/verify-flist.sh)
- [usage()](scripts/rfs/verify-flist.sh:11)
- [section()](scripts/rfs/verify-flist.sh:26)
Notes:
- Line numbers reflect current repository state; re-run generation after edits.
- Nested/local functions are included under their parent section when applicable.