Version: 1.6beta4
Repository: https://github.com/drakmor/shadowMountPlus
Warning! Mounting images can cause shutdown problems and data corruption on internal drives! This depends on many factors, but is more common with older firmware versions. Please take this into account when testing.
ShadowMountPlus is a fully automated, background "Auto-Mounter" payload for Jailbroken PlayStation 5 consoles. It streamlines the game mounting process by eliminating the need for manual configuration or external tools (such as DumpRunner or Itemzflow). ShadowMountPlus automatically detects, mounts, and installs game dumps from both internal and external storage.
Compatibility: Supports all Jailbroken PS5 firmwares running Kstuff v1.6.6+ (Recommended 1.6.6) or Kstuff-lite v1.0+.
PFS support is experimental.
| Extension | Mounted FS | Attach backend | Status |
|---|---|---|---|
.exfat |
exfatfs |
LVD or MD (configurable) |
Optimal |
.ffpkg |
ufs |
LVD or MD (configurable) |
Legacy |
.ffpfs |
pfs |
LVD |
Experimental |
Notes:
- Backend, read-only mode, and sector size can be configured via
/data/shadowmount/config.ini. - Debug logging is enabled by default (
debug=1) and writes to console plus/data/shadowmount/debug.log(setdebug=0to disable). - exFAT is the preferred image filesystem, including on 4.xx firmware, with no known reboot/shutdown issues in typical use.
- Prefer exFAT (
.exfat) in most cases: it is generally more performant, case-insensitive, and does not have reboot/shutdown issues in typical use. - Use UFS (
.ffpkg) only when specifically needed for compatibility with your game/setup.
This file is optional. If it does not exist, built-in defaults are used.
Supported keys (all optional):
debug=1|0(1enableslog_debugoutput to console +/data/shadowmount/debug.log; default is1)quiet_mode=1|0(1suppresses plain informational popups but keeps rich toasts; default is0)mount_read_only=1|0(default:1)force_mount=1|0(mounting even damaged file systems; default:0)image_ro=<image_filename>(repeatable; force read-only mode for this image filename)image_rw=<image_filename>(repeatable; force read-write mode for this image filename)recursive_scan=1|0(0= scan only first-level subfolders,1= recursive scan without depth limit; default:0)scan_interval_seconds=<1..3600>(full scan loop interval; default:10)stability_wait_seconds=<0..3600>(minimum source age before processing; default:10)exfat_backend=lvd|md(default:lvd)ufs_backend=lvd|md(default:lvd)backport_fakelib=1|0(1mounts sandboxfakeliboverlays for running games; default:1)kstuff_game_auto_toggle=1|0(1pauses kstuff after tracked game launches and resumes it on stop; default:1)kstuff_pause_delay_image_seconds=<0..3600>(delay before pausing kstuff for image-backed launches; default:20)kstuff_pause_delay_direct_seconds=<0..3600>(delay before pausing kstuff for direct/non-image launches; default:10)kstuff_no_pause=<TITLE_ID>(repeatable; keeps kstuff enabled for matching titles)kstuff_delay=<TITLE_ID>:<0..3600>(repeatable; per-title pause delay override, last matching rule wins)scanpath=<absolute_path>(can be repeated on multiple lines; default: built-in scan path list below)lvd_exfat_sector_size=<value>(default:512)lvd_ufs_sector_size=<value>(default:4096)lvd_pfs_sector_size=<value>(default:32768)md_exfat_sector_size=<value>(default:512)md_ufs_sector_size=<value>(default:512)
Per-image mode override behavior:
- Match is done by image file name (without path).
- File names with spaces are supported.
- If multiple rules target the same file name, the last one in config wins.
- If no rule matches, global
mount_read_onlyis used. - Example:
mount_read_only=1
image_rw=PPSA1234-my-image.ffpfs
image_rw=MYGame 123.exfat
image_ro=legacy_dump.ffpkgScan path behavior:
- If at least one
scanpath=...is present, only those custom paths are used. /mnt/shadowmntis always added automatically, even with custom paths.- With
recursive_scan=0(default), only first-level subfolders are checked. - With
recursive_scan=1, subfolders are scanned recursively. - Full scan loop runs every
scan_interval_seconds(default:10). - Sources newer than
stability_wait_secondsare deferred until stable (default:10).
Backport overlay behavior:
- For each
scanpath, use:<scanpath>/backports/<TITLE_ID>/
- The
backportsfolder is ignored during normal game scanning. - A backport is applied automatically to the matching mounted game from the same scan path.
- If
/mnt/sandbox/<TITLE_ID>_XXX/app0/fakelibexists while the game is running, ShadowMount+ also mounts it into that game's sandboxcommon/lib. backport_fakelib=0disables the sandboxfakelibwatcher.- For
backport_fakelibto work correctly, the standaloneBackPorkpayload must be disabled. Running both at the same time will conflict.
Kstuff game lifecycle behavior:
- When
kstuff_game_auto_toggle=1, ShadowMount watches gameexec/exitevents in the background. - Image-backed launches use
kstuff_pause_delay_image_seconds; direct/non-image launches usekstuff_pause_delay_direct_seconds. kstuff_no_pauseskips auto-pause entirely for matching title IDs.kstuff_delayoverrides the pause delay for matching title IDs, regardless of image/direct launch type.- If both kinds of rule target the same title,
kstuff_no_pausetakes priority. - When the last tracked game stops, ShadowMount immediately enables kstuff again if it was the component that disabled it.
Validation:
- See
config.ini.examplefor a ready-to-use template.
Image mountpoints are created under:
/mnt/shadowmnt/<image_name>_<hash>
Image layout requirement (.ffpkg, .exfat, .ffpfs):
- Game files must be placed at the image root.
- Do not add an extra top-level folder inside the image.
- Valid example:
/sce_sys/param.jsonexists directly from image root. - Invalid example:
/GAME_FOLDER/sce_sys/param.json(extra nesting level).
Default scan locations:
/data/homebrew/data/etaHEN/games/mnt/ext0/homebrew/mnt/ext0/etaHEN/games/mnt/ext1/homebrew/mnt/ext1/etaHEN/games/mnt/usb0/homebrew../mnt/usb7/homebrew/mnt/usb0/etaHEN/games../mnt/usb7/etaHEN/games/mnt/usb0../mnt/usb7/mnt/ext0/mnt/ext1/mnt/shadowmnt(mounted image content scan)
You can override scan roots with scanpath=... entries in /data/shadowmount/config.ini.
Recommended folder structure:
-
Default mode (
recursive_scan=0):/data/homebrew/<TITLE_ID>//data/etaHEN/games/<TITLE_ID>//data/homebrew/backports/<TITLE_ID>//data/etaHEN/games/backports/<TITLE_ID>/
-
Recursive mode (
recursive_scan=1):/data/homebrew/PS5/<AnyFolder>/<TITLE_ID>//mnt/ext0/etaHEN/games/<Collection>/<TITLE_ID>//mnt/ext0/etaHEN/games/backports/<TITLE_ID>/
Linux (Ubuntu/Debian):
- Required components installation:
sudo apt-get update && sudo apt-get install -y exfatprogs exfat-fuse fuse3 rsync
- Script:
mkexfat.sh - Usage:
./mkexfat.sh <game_root_dir> [output_file] - Example:
chmod +x mkexfat.sh./mkexfat.sh ./APPXXXX ./PPSA12345.exfat
- Notes:
- Source folder must be the game root and contain
eboot.bin. - Auto-calculates image size using rounded file allocation + metadata + safety margin.
- Automatically selects exFAT cluster profile:
- Large-file profile:
64K - Small/mixed-file profile:
32K
- Source folder must be the game root and contain
Windows:
- Recommended: use
make_image.bat(wrapper forNew-OsfExfatImage.ps1+ OSFMount). - Requirements:
- Install OSFMount: https://www.osforensics.com/tools/mount-disk-images.html.
- Keep
make_image.batandNew-OsfExfatImage.ps1in the same folder. - Run
cmd.exeas Administrator.
- Usage:
make_image.bat "C:\images\game.exfat" "C:\payload\APPXXXX"
- Behavior:
- Auto-sizes the image to fit source content.
- Source folder must be the game root and contain
eboot.bin. - Formats and copies source folder contents into image root.
- Optional (fixed size): run PowerShell script directly:
powershell.exe -ExecutionPolicy Bypass -File .\New-OsfExfatImage.ps1 -ImagePath "C:\images\game.exfat" -SourceDir "C:\payload\APPXXXX" -Size 8G -ForceOverwrite
FreeBSD:
- Script:
mkufs2.sh - Usage:
./mkufs2.sh <game_root_dir> [output_file] - Example:
chmod +x mkufs2.sh./mkufs2.sh ./APPXXXX ./PPSA12345.ffpkg
- Notes:
- Source folder must be the game root and contain
eboot.bin. - The script auto-calculates image size using rounded file allocation + metadata + safety margin.
- Recommended
newfsparameters for UFS2: newfs -O 2 -b 65536 -f 65536 -m 0 -S 4096mkufs2.shkeeps this fixed block/fragment/sector profile and auto-tunes-ibased on source file/directory count.- Rough manual
-iestimate for manual builds: target_inodes ~= file_count + dir_count + 2048bytes_per_inode ~= image_size_bytes / target_inodes- Round
bytes_per_inodedown to a multiple of4096, then keep it in the practical range65536..262144. - Practical rule of thumb: use
262144for normal game dumps,131072for tens of thousands of files, and65536only for very file-dense images. - Example: for an
8 GiBimage with60000files and4000directories,-i ~= 8*1024^3 / (60000 + 4000 + 2048) ~= 130312, so use-i 131072.
- Source folder must be the game root and contain
Windows:
- You can create UFS2 images with UFS2Tool https://github.com/SvenGDK/UFS2Tool.
- Example:
UFS2Tool.exe newfs -O 2 -b 65536 -f 65536 -m 0 -S 4096 -i 262144 -D ./APPXXXX ./PPSA12345.ffpkg- For manual builds, use
-i 262144as the baseline and lower it for images with many small files.
Use a payload sender (such as NetCat GUI or a web-based loader) to send the files to Port 9021.
- Send
shadowmountplus.elf. - Wait for the notification: "ShadowMount+".
Add ShadowMountPlus to your autoload.txt for plk-autoloader to ensure it starts automatically on every boot.
Sample Configuration:
shadowmountplus.elf
!3000
kstuff.elfIf a game is not mounted:
- Debug log is enabled by default; if disabled, set
debug=1in/data/shadowmount/config.ini. - Check
/data/shadowmount/debug.logand system notifications from ShadowMount+. - Verify scan roots:
- if
scanpath=...is set, only these paths are scanned; /mnt/shadowmntis always scanned.
- if
- Verify scan depth:
recursive_scan=0scans only first-level subfolders;recursive_scan=1scans recursively.
- If logs show
source not stable yet, adjuststability_wait_seconds(or wait for source copy/write to finish). - Verify game structure:
- folder game:
<GAME_DIR>/sce_sys/param.json; - image game (
.ffpkg/.exfat/.ffpfs):sce_sys/param.jsonmust be at image root (no extra top-level folder).
- folder game:
- If you see
missing/invalid param.jsonfor an image, check via FTP that files are present under/mnt/shadowmnt/<image_name>_<hash>/and includesce_sys/param.json. - If you see image mount failure, check image integrity and filesystem type (
.ffpkg=UFS,.exfat=exFAT,.ffpfs=PFS). - If you see duplicate titleId notification, keep only one source per
<TITLE_ID>.
If a game is mounted but does not start:
- Check registration notifications (
Register failed ...). - If the game is not registered, try removing its launcher icon and removing it from Itemzflow.
- If this does not help, remove the game data from system settings and retry (this will delete game saves).
- First Run: If you have a large library, the initial scan may take a few seconds to register all titles.
- Large Games: For massive games (100GB+), allow a few extra seconds for the system to verify file integrity before the "Installed" notification appears.
-
Drakmor - Evolution of ShadowMount to ShadowMountPlus
-
Special Thanks:
- VoidWhisper for ShadowMount
- BestPig for BackPort
- EchoStretch for kstuff-toggle and etc
- Gezine
- earthonion
- LightningMods
- john-tornblom for SDK
- PS5 R&D Community