wolf: add fix-perms command and document app home-dir ownership fix

Wolf mounts each app's home dir from /etc/wolf/<session-id>/<App> into the
container as /home/retro. If anything there is root-owned (e.g. left over
from an earlier mount layout), the in-container retro user (uid 1000) hits
"Permission denied" creating ~/.steam and the app exits on launch.

- Add `./manage.sh fix-perms`: chowns every /etc/wolf/<id>/ app home dir
  and the on-disk game storage to uid/gid 1000
- Document the /mnt/games mount layout, first-Steam-launch library step,
  3DS/Azahar emulator path, and the fix-perms troubleshooting flow in the
  generated README

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
This commit is contained in:
Claude
2026-06-20 05:44:13 +00:00
parent 01c4dd8525
commit e7f65d127c
+50 -5
View File
@@ -1165,6 +1165,32 @@ PYEOF
backup)
echo "Set up backups with the modular system: sudo ./setup.sh backup"
;;
fix-perms)
# Wolf creates each app's home directory under /etc/wolf/<session-id>/<App>
# and mounts it as /home/retro inside the app container. If anything in
# there ends up root-owned (e.g. left over from an earlier mount layout),
# the in-container 'retro' user (uid 1000) can't write to it and the app
# bails on startup with "Permission denied" creating ~/.steam, etc.
# Re-own every Wolf app home dir to uid/gid 1000 to clear that.
echo "Fixing ownership of Wolf app home directories (uid 1000)..."
found=0
for d in /etc/wolf/[0-9]*/; do
[ -d "$d" ] || continue
sudo chown -R 1000:1000 "$d"
echo " fixed: $d"
found=1
done
# Also re-own the on-disk game storage so the retro user can write saves/installs
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
GAME_DIR=$(grep '^GAME_STORAGE_DIR=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d= -f2-)
if [ -n "$GAME_DIR" ] && [ -d "$GAME_DIR" ]; then
sudo chown -R 1000:1000 "$GAME_DIR"
echo " fixed: $GAME_DIR"
found=1
fi
[ "$found" = 0 ] && echo " Nothing to fix (no Wolf app dirs found yet)."
echo "Done. Reconnect from Moonlight to relaunch the app."
;;
pin)
# Wolf logs: "Insert pin at http://SOMEIP:47989/pin/#HEXHASH"
# Extract just the hash fragment and build URLs for every interface
@@ -1204,6 +1230,7 @@ PYEOF
echo " ./manage.sh pin - Show recent Moonlight pairing PIN link"
echo " ./manage.sh update - Pull latest Wolf image and restart"
echo " ./manage.sh apps - Add / update game launchers in Wolf"
echo " ./manage.sh fix-perms - Fix 'Permission denied' app startup errors"
echo " ./manage.sh backup - How to set up backups"
;;
esac
@@ -1557,18 +1584,36 @@ cd $WOLF_DIR
| 4799848000 | UDP | RTP video/audio/control |
## Game storage: \`$GAME_STORAGE_DIR\`
On-disk dirs are bind-mounted into each app container under \`/mnt/games/\`:
- \`roms/<system>/\` → /ROMs (EmulationStation — drop ROMs here)
- \`steam/\` → Steam library (steamapps, Proton prefixes, user data)
- \`saves/\` → RetroArch saves & states
- \`emulators/\` → AppImages (Azahar 3DS, etc.) — ES-DE finds them automatically
- \`steam/\` → /mnt/games/steam (add as a Steam Library Folder once)
- \`saves/\` → /mnt/games/saves (RetroArch saves & states)
- \`emulators/\` → /mnt/games/emulators (Azahar 3DS AppImage, etc.)
Mounting under \`/mnt/games\` (not the container's \`/home/retro\`) avoids
clobbering the app's home directory, which Wolf manages per-session under
\`/etc/wolf/<id>/<App>\`.
## First Steam launch
Steam → Settings → Storage → add \`/mnt/games/steam\` and set it default,
so game installs land on the storage disk instead of the ephemeral home.
## 3DS emulation
Azahar (open-source Citra fork) — download AppImage to \`emulators/\`:
Azahar (open-source Citra fork) AppImage lives in \`emulators/\` → mounted at
\`/mnt/games/emulators\`. Point ES-DE's 3DS system at it via Alternative
Emulators if it isn't auto-detected. Re-download with:
\`\`\`bash
# Or re-run manage.sh apps to trigger the download prompt
cd $WOLF_DIR && ./manage.sh apps
\`\`\`
## Troubleshooting: app exits immediately ("Permission denied")
If a launcher (Steam, etc.) closes the moment it opens, its Wolf-managed home
dir has root-owned files the in-container user (uid 1000) can't write. Fix:
\`\`\`bash
cd $WOLF_DIR && ./manage.sh fix-perms
\`\`\`
Then reconnect from Moonlight.
## Backup
\`\`\`bash
sudo ./setup.sh backup # covers /etc/wolf saves and ES-DE settings