Files
hermes-portable-rescue/src/hermes/scripts/mount-storage.sh
T
shawn ecda528b90 build:hermes-runtime — Portable Hermes Agent package for USB
Build scripts, configuration, and launch scripts for the Hermes Portable
Rescue runtime.

Includes:
- build-hermes-runtime.sh — Main build script (venv, config, tools)
- bootstrap-venv.sh — Standalone Python venv builder
- config.yaml — Agent configuration for rescue mode
- launch.sh/launch.ps1 — Linux and Windows entry points
- agent/hermes — Entry point for autorun.sh compatibility
- tool-manifest.json — Tool registry for diagnostic binaries
- scripts/ — check-env.sh, mount-storage.sh helpers
- autorun.inf — Windows USB auto-launch
- README — Build and runtime documentation

Part of the Hermes Portable Rescue project board.
Task: t_c816e37d
2026-07-04 03:59:06 -04:00

86 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# Hermes Portable Rescue — Storage Mount Helper
# =============================================================================
# Mounts NTFS/BTRFS/ext4 partitions for diagnostic access.
# Usage: ./scripts/mount-storage.sh [--all | --probe]
# =============================================================================
set -euo pipefail
MOUNT_BASE="/mnt/hermes-data"
PROBE_ONLY=false
while [[ $# -gt 0 ]]; do
case "$1" in
--probe) PROBE_ONLY=true; shift ;;
--all) PROBE_ONLY=false; shift ;;
*) echo "Usage: $0 [--all | --probe]"; exit 1 ;;
esac
done
mkdir -p "$MOUNT_BASE"
echo "[hermes:mount] Probing storage devices…"
# List all block devices
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL 2>/dev/null | grep -v loop | head -20
if [[ "$PROBE_ONLY" = true ]]; then
echo ""
echo "[hermes:mount] Probe complete — use --all to mount"
exit 0
fi
# Mount all unmounted NTFS, ext4, btrfs partitions (excluding live system)
echo ""
echo "[hermes:mount] Mounting accessible partitions…"
echo ""
MOUNT_COUNT=0
while IFS= read -r line; do
DEVICE=$(echo "$line" | awk '{print $1}')
FSTYPE=$(echo "$line" | awk '{print $2}')
MOUNTPOINT=$(echo "$line" | awk '{print $3}')
LABEL=$(echo "$line" | awk '{print $4}')
# Skip: already mounted, swap, live system root
if [[ "$MOUNTPOINT" != "(not mounted)" ]]; then continue; fi
if [[ "$FSTYPE" = "swap" ]]; then continue; fi
if [[ "$DEVICE" =~ (sr|loop|ram) ]]; then continue; fi
MOUNT_PATH="$MOUNT_BASE/$DEVICE"
mkdir -p "$MOUNT_PATH"
case "$FSTYPE" in
ntfs)
if command -v ntfs-3g &>/dev/null; then
ntfs-3g -o ro,noatime "/dev/$DEVICE" "$MOUNT_PATH" 2>/dev/null && \
echo " [✓] /dev/$DEVICE (NTFS${LABEL:+: $LABEL}) → $MOUNT_PATH" && \
((MOUNT_COUNT++)) || \
echo " [✗] /dev/$DEVICE mount failed"
else
echo " [ ] /dev/$DEVICE (NTFS — ntfs-3g not available)"
fi
;;
ext4|ext3|ext2|xfs|btrfs)
mount -o ro,noatime "/dev/$DEVICE" "$MOUNT_PATH" 2>/dev/null && \
echo " [✓] /dev/$DEVICE (${FSTYPE}${LABEL:+: $LABEL}) → $MOUNT_PATH" && \
((MOUNT_COUNT++)) || \
echo " [✗] /dev/$DEVICE mount failed"
;;
vfat|exfat)
mount -o ro,noatime,uid=1000 "/dev/$DEVICE" "$MOUNT_PATH" 2>/dev/null && \
echo " [✓] /dev/$DEVICE (${FSTYPE}${LABEL:+: $LABEL}) → $MOUNT_PATH" && \
((MOUNT_COUNT++)) || \
echo " [✗] /dev/$DEVICE mount failed"
;;
*)
echo " [ ] /dev/$DEVICE ($FSTYPE — unsupported)"
;;
esac
done < <(lsblk -nlo NAME,FSTYPE,MOUNTPOINT,LABEL 2>/dev/null)
echo ""
echo "[hermes:mount] $MOUNT_COUNT partitions mounted under $MOUNT_BASE"
echo "[hermes:mount] Use 'umount $MOUNT_BASE/*' when done"