forked from tfgrid/zosbuilder
feat(rfs): flist pack to S3 + read-only route embedding + zinit mount scripts; docs; dev-container tooling
Summary
- Implemented plain S3-only flist workflow (no web endpoint). rfs pack uploads blobs using write creds; flist route.url is patched to embed read-only S3 credentials so rfs mount reads directly from S3.
Changes
1) New RFS tooling (scripts/rfs/)
- common.sh:
- Compute FULL_KERNEL_VERSION from configs (no uname).
- Load S3 config and construct pack store URI.
- Build read-only S3 route URL and patch flist (sqlite).
- Helpers to locate modules/firmware trees and rfs binary.
- pack-modules.sh:
- Pack /lib/modules/<FULL_KERNEL_VERSION> to dist/flists/modules-<FULL_KERNEL_VERSION>.fl
- Patch flist route to s3://READ:READ@host:port/ROUTE_PATH?region=ROUTE_REGION (default /blobs, garage).
- Optional upload of .fl using MinIO client (mcli/mc).
- pack-firmware.sh:
- Source firmware from $PROJECT_ROOT/firmware (fallback to initramfs/lib/firmware).
- Pack to dist/flists/firmware-<TAG_OR_DATE>.fl (FIRMWARE_TAG or YYYYMMDD).
- Patch flist route to read-only S3; optional .fl upload via mcli/mc.
- verify-flist.sh:
- rfs flist inspect/tree; optional mount test (best effort).
- patch-stores.sh:
- Helper to patch stores (kept though not used by default).
2) Dev-container (Dockerfile)
- Added sqlite and MinIO client package for manifest patching/upload (expect mcli binary at runtime; scripts support both mcli/mc).
- Retains rustup and musl target for building rfs/zinit/mycelium.
3) Config and examples
- config/rfs.conf.example:
- S3_ENDPOINT/S3_REGION/S3_BUCKET/S3_PREFIX
- S3_ACCESS_KEY/S3_SECRET_KEY (write)
- READ_ACCESS_KEY/READ_SECRET_KEY (read-only)
- ROUTE_ENDPOINT (defaults to S3_ENDPOINT), ROUTE_PATH=/blobs, ROUTE_REGION=garage
- MANIFESTS_SUBPATH, UPLOAD_MANIFESTS (mcli upload optional)
- config/rfs.conf updated by user with real values (not committed here; example included).
- config/modules.conf minor tweak (staged).
4) Zinit mount scripts (config/zinit/init/)
- firmware.sh:
- Mounts firmware-latest.fl over /usr/lib/firmware using rfs mount (env override FIRMWARE_FLIST supported).
- modules.sh:
- Mounts modules-$(uname -r).fl over /lib/modules/$(uname -r) (env override MODULES_FLIST supported).
- Both skip if target already mounted and respect RFS_BIN env.
5) Documentation
- docs/rfs-flists.md:
- End-to-end flow, S3-only route URL patching, mcli upload notes.
- docs/review-rfs-integration.md:
- Integration points, build flow, and post-build standalone usage.
- docs/depmod-behavior.md:
- depmod reads .modinfo; recommend prebuilt modules.*(.bin); use depmod -A only on mismatch.
6) Utility
- scripts/functionlist.md synced with current functions.
Behavioral details
- Pack (write):
s3://S3_ACCESS_KEY:S3_SECRET_KEY@HOST:PORT/S3_BUCKET/S3_PREFIX?region=REGION
- Flist route (read, post-patch):
s3://READ_ACCESS_KEY:READ_SECRET_KEY@HOST:PORT/ROUTE_PATH?region=ROUTE_REGION
Defaults: ROUTE_PATH=/blobs, ROUTE_REGION=garage; ROUTE_ENDPOINT derived from S3_ENDPOINT if not set.
Runtime mount examples
- Modules:
rfs mount -m dist/flists/modules-6.12.44-Zero-OS.fl /lib/modules/6.12.44-Zero-OS
- Firmware:
rfs mount -m dist/flists/firmware-YYYYMMDD.fl /usr/lib/firmware
Notes
- FUSE policy: If "allow_other" error occurs, enable user_allow_other in /etc/fuse.conf or run mounts as root.
- WEB_ENDPOINT rewrite is disabled by default (set WEB_ENDPOINT=""). Plain S3 route is embedded in flists.
- MinIO client binary in dev-container is mcli; scripts support mcli (preferred) and mc (fallback).
Files added/modified
- Added: scripts/rfs/{common.sh,pack-modules.sh,pack-firmware.sh,verify-flist.sh,patch-stores.sh}
- Added: config/zinit/init/{firmware.sh,modules.sh}
- Added: docs/{rfs-flists.md,review-rfs-integration.md,depmod-behavior.md}
- Added: config/rfs.conf.example
- Modified: Dockerfile, scripts/functionlist.md, config/modules.conf, config/zinit/sshd-setup.yaml, .gitignore
This commit is contained in:
@@ -1,167 +1,110 @@
|
||||
# Function List - scripts/lib Library
|
||||
|
||||
This document provides a comprehensive description of all functions available in the `scripts/lib` library that are to be sourced by build scripts.
|
||||
This document lists all functions currently defined under [scripts/lib](scripts/lib) with their source locations.
|
||||
|
||||
## **alpine.sh** - Alpine Linux Operations
|
||||
## 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
|
||||
|
||||
### Core Functions
|
||||
- [`alpine_extract_miniroot()`](lib/alpine.sh:14) - Downloads and extracts Alpine miniroot to target directory
|
||||
- [`alpine_setup_chroot()`](lib/alpine.sh:70) - Sets up chroot environment with essential filesystem mounts
|
||||
- [`alpine_cleanup_chroot()`](lib/alpine.sh:115) - Unmounts and cleans up chroot environment
|
||||
- [`alpine_install_packages()`](lib/alpine.sh:142) - Installs packages from packages.list (excludes OpenRC)
|
||||
- [`alpine_aggressive_cleanup()`](lib/alpine.sh:211) - Removes documentation, locales, dev files for size optimization
|
||||
- [`alpine_configure_repos()`](lib/alpine.sh:302) - Configures Alpine package repositories
|
||||
- [`alpine_configure_system()`](lib/alpine.sh:320) - Sets up basic system configuration (hostname, hosts, timezone)
|
||||
- [`alpine_install_firmware()`](lib/alpine.sh:374) - Installs firmware packages for hardware support
|
||||
## 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)
|
||||
|
||||
## **common.sh** - Core Utilities
|
||||
## 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)
|
||||
|
||||
### Logging Functions
|
||||
- [`log_info()`](lib/common.sh:31) - Log informational messages with timestamp and color
|
||||
- [`log_warn()`](lib/common.sh:36) - Log warning messages with timestamp and color
|
||||
- [`log_error()`](lib/common.sh:41) - Log error messages with timestamp and color
|
||||
- [`log_debug()`](lib/common.sh:46) - Log debug messages (only when DEBUG=1)
|
||||
## 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)
|
||||
- [docker_build_container()](scripts/lib/docker.sh:47)
|
||||
- [docker_create_dockerfile()](scripts/lib/docker.sh:65)
|
||||
- [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_check_capabilities()](scripts/lib/docker.sh:248)
|
||||
- [docker_setup_rootless()](scripts/lib/docker.sh:279)
|
||||
|
||||
### Execution and System Functions
|
||||
- [`safe_execute()`](lib/common.sh:54) - Execute commands with error handling and logging
|
||||
- [`section_header()`](lib/common.sh:76) - Creates formatted section headers for output
|
||||
- [`command_exists()`](lib/common.sh:86) - Check if command is available in PATH
|
||||
- [`in_container()`](lib/common.sh:91) - Detect if running inside a container
|
||||
- [`check_dependencies()`](lib/common.sh:96) - Verify required tools are installed
|
||||
## 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)
|
||||
|
||||
### File System Operations
|
||||
- [`safe_mkdir()`](lib/common.sh:139) - Create directories safely with error handling
|
||||
- [`safe_rmdir()`](lib/common.sh:146) - Remove directories safely with error handling
|
||||
- [`safe_copy()`](lib/common.sh:155) - Copy files/directories safely with error handling
|
||||
- [`resolve_path()`](lib/common.sh:168) - Convert relative to absolute paths
|
||||
- [`get_file_size()`](lib/common.sh:178) - Get human-readable file size
|
||||
- [`wait_for_file()`](lib/common.sh:188) - Wait for file to exist with timeout
|
||||
- [`cleanup_on_exit()`](lib/common.sh:202) - Cleanup function for exit traps
|
||||
## 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_build_with_initramfs()](scripts/lib/kernel.sh:174)
|
||||
- [kernel_build_modules()](scripts/lib/kernel.sh:228)
|
||||
- [kernel_cleanup()](scripts/lib/kernel.sh:284)
|
||||
|
||||
## **components.sh** - ThreeFold Component Management
|
||||
## 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)
|
||||
- [stage_mark_completed()](scripts/lib/stages.sh:48)
|
||||
- [stage_force_rebuild()](scripts/lib/stages.sh:69)
|
||||
- [stages_clear_all()](scripts/lib/stages.sh:82)
|
||||
- [stage_run()](scripts/lib/stages.sh:99)
|
||||
- [stages_status()](scripts/lib/stages.sh:134)
|
||||
|
||||
### Component Processing
|
||||
- [`components_parse_sources_conf()`](lib/components.sh:13) - Parse and build all components from sources.conf
|
||||
- [`components_download_git()`](lib/components.sh:72) - Clone Git repositories with specific versions
|
||||
- [`components_download_release()`](lib/components.sh:104) - Download pre-built release binaries
|
||||
- [`components_process_extra_options()`](lib/components.sh:144) - Handle rename/extract options for components
|
||||
- [`components_build_component()`](lib/components.sh:183) - Build component using specified build function
|
||||
|
||||
### Build Environment
|
||||
- [`components_setup_rust_env()`](lib/components.sh:217) - Configure Rust environment for musl builds
|
||||
|
||||
### Component-Specific Build Functions
|
||||
- [`build_zinit()`](lib/components.sh:252) - Build zinit init system from source (Rust)
|
||||
- [`build_rfs()`](lib/components.sh:304) - Build rfs (rootfs) from source (Rust)
|
||||
- [`build_mycelium()`](lib/components.sh:356) - Build mycelium networking from source (Rust, subdirectory)
|
||||
- [`install_rfs()`](lib/components.sh:401) - Install pre-built rfs binary
|
||||
- [`install_corex()`](lib/components.sh:427) - Install pre-built corex binary
|
||||
|
||||
### Verification and Cleanup
|
||||
- [`components_verify_installation()`](lib/components.sh:457) - Verify all components were installed correctly
|
||||
- [`components_cleanup()`](lib/components.sh:493) - Clean build artifacts
|
||||
|
||||
## **docker.sh** - Container Runtime Management
|
||||
|
||||
### Runtime Detection and Setup
|
||||
- [`docker_detect_runtime()`](lib/docker.sh:14) - Detect available container runtime (Docker/Podman)
|
||||
- [`docker_verify_rootless()`](lib/docker.sh:33) - Verify rootless container setup works
|
||||
- [`docker_check_capabilities()`](lib/docker.sh:209) - Check container runtime capabilities
|
||||
- [`docker_setup_rootless()`](lib/docker.sh:240) - Setup rootless environment (subuid/subgid)
|
||||
|
||||
### Container Image Management
|
||||
- [`docker_build_container()`](lib/docker.sh:47) - Build container image with build tools
|
||||
- [`docker_create_dockerfile()`](lib/docker.sh:65) - Create optimized Dockerfile for build environment
|
||||
- [`docker_commit_builder()`](lib/docker.sh:178) - Commit container state for reuse
|
||||
- [`docker_cleanup()`](lib/docker.sh:191) - Clean up container images
|
||||
|
||||
### Container Execution
|
||||
- [`docker_start_rootless()`](lib/docker.sh:116) - Start rootless container for building
|
||||
- [`docker_run_build()`](lib/docker.sh:154) - Run build command in container with proper mounts
|
||||
|
||||
## **initramfs.sh** - Initramfs Assembly
|
||||
|
||||
### Core Assembly Functions
|
||||
- [`initramfs_setup_zinit()`](lib/initramfs.sh:13) - Setup zinit as init system (replaces OpenRC completely)
|
||||
- [`initramfs_install_init_script()`](lib/initramfs.sh:71) - Install critical /init script for initramfs boot
|
||||
- [`initramfs_setup_modules()`](lib/initramfs.sh:98) - Setup 2-stage module loading with dependencies
|
||||
|
||||
### Module Management
|
||||
- [`initramfs_resolve_module_dependencies()`](lib/initramfs.sh:166) - Recursively resolve module dependencies using modinfo
|
||||
- [`initramfs_create_module_scripts()`](lib/initramfs.sh:236) - Create stage1/stage2 module loading scripts for zinit
|
||||
|
||||
### Optimization and Packaging
|
||||
- [`initramfs_strip_and_upx()`](lib/initramfs.sh:300) - Strip debug symbols and UPX compress binaries for size optimization
|
||||
- [`initramfs_create_cpio()`](lib/initramfs.sh:383) - Create final compressed initramfs archive (xz/gzip/zstd/uncompressed)
|
||||
|
||||
### Validation and Testing
|
||||
- [`initramfs_validate()`](lib/initramfs.sh:449) - Validate initramfs contents and structure
|
||||
- [`initramfs_test_archive()`](lib/initramfs.sh:549) - Test initramfs archive integrity
|
||||
|
||||
## **kernel.sh** - Kernel Building
|
||||
|
||||
### Source Management
|
||||
- [`kernel_download_source()`](lib/kernel.sh:14) - Download Linux kernel source code from kernel.org
|
||||
- [`kernel_apply_config()`](lib/kernel.sh:68) - Apply kernel configuration with embedded initramfs path
|
||||
- [`kernel_modify_config_for_initramfs()`](lib/kernel.sh:116) - Modify kernel config for embedded initramfs support
|
||||
|
||||
### Build Functions
|
||||
- [`kernel_build_with_initramfs()`](lib/kernel.sh:144) - Build kernel with embedded initramfs (complete process)
|
||||
- [`kernel_build_modules()`](lib/kernel.sh:203) - Build kernel modules for initramfs inclusion
|
||||
|
||||
### Cleanup
|
||||
- [`kernel_cleanup()`](lib/kernel.sh:242) - Clean kernel build artifacts (with option to keep source)
|
||||
|
||||
## **testing.sh** - Virtualization Testing
|
||||
|
||||
### QEMU Testing
|
||||
- [`testing_qemu_boot()`](lib/testing.sh:14) - Test kernel boot with QEMU (multiple modes: basic/serial/interactive)
|
||||
- [`testing_qemu_basic_boot()`](lib/testing.sh:55) - Basic automated QEMU boot test with timeout
|
||||
- [`testing_qemu_serial_boot()`](lib/testing.sh:90) - QEMU serial console test for debugging
|
||||
- [`testing_qemu_interactive_boot()`](lib/testing.sh:114) - Interactive QEMU session (no timeout)
|
||||
|
||||
### Cloud Hypervisor Testing
|
||||
- [`testing_cloud_hypervisor_boot()`](lib/testing.sh:135) - Test with cloud-hypervisor VMM
|
||||
- [`testing_cloud_hypervisor_basic()`](lib/testing.sh:172) - Basic cloud-hypervisor test with timeout
|
||||
- [`testing_cloud_hypervisor_serial()`](lib/testing.sh:206) - cloud-hypervisor serial console test
|
||||
|
||||
### Analysis and Orchestration
|
||||
- [`testing_analyze_boot_log()`](lib/testing.sh:228) - Analyze boot logs for success/failure indicators
|
||||
- [`testing_run_all()`](lib/testing.sh:299) - Run comprehensive test suite (QEMU + cloud-hypervisor)
|
||||
|
||||
## Usage Notes
|
||||
|
||||
### Function Availability
|
||||
All functions are exported for sourcing and can be called from any script that sources the respective library file. The common pattern is:
|
||||
|
||||
```bash
|
||||
# Source the library
|
||||
source "${SCRIPT_DIR}/lib/common.sh"
|
||||
source "${SCRIPT_DIR}/lib/alpine.sh"
|
||||
# ... other libraries as needed
|
||||
|
||||
# Use the functions
|
||||
alpine_extract_miniroot "/path/to/target"
|
||||
components_parse_sources_conf "/path/to/sources.conf" "/path/to/components"
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
All functions follow consistent error handling patterns:
|
||||
- Return non-zero exit codes on failure
|
||||
- Use [`safe_execute()`](lib/common.sh:54) for command execution
|
||||
- Provide detailed logging via [`log_*()`](lib/common.sh:31) functions
|
||||
- Clean up resources on failure
|
||||
|
||||
### Dependencies
|
||||
Functions have dependencies on:
|
||||
- External tools (checked via [`check_dependencies()`](lib/common.sh:96))
|
||||
- Other library functions (noted in function descriptions)
|
||||
- Configuration files and environment variables
|
||||
- Proper directory structures
|
||||
|
||||
### Configuration
|
||||
Most functions respect environment variables for configuration:
|
||||
- `DEBUG=1` enables debug logging
|
||||
- `ALPINE_VERSION`, `KERNEL_VERSION` set versions
|
||||
- `RUST_TARGET` configures Rust builds
|
||||
- Various `*_DIR` variables set paths
|
||||
## 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_cloud_hypervisor_boot()](scripts/lib/testing.sh:135)
|
||||
- [testing_cloud_hypervisor_basic()](scripts/lib/testing.sh:171)
|
||||
- [testing_cloud_hypervisor_serial()](scripts/lib/testing.sh:206)
|
||||
- [testing_analyze_boot_log()](scripts/lib/testing.sh:227)
|
||||
- [testing_run_all()](scripts/lib/testing.sh:299)
|
||||
Reference in New Issue
Block a user